@notectl/core 2.1.3 → 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/chunks/AlignmentPlugin-h6sx-yIf.mjs +2 -0
- package/dist/chunks/AlignmentPlugin-h6sx-yIf.mjs.map +1 -0
- package/dist/chunks/AttrRegistry-DcDVyzLm.mjs +2 -0
- package/dist/chunks/AttrRegistry-DcDVyzLm.mjs.map +1 -0
- package/dist/chunks/AttributedMarkCommands-D4W2Jgpj.mjs +2 -0
- package/dist/chunks/AttributedMarkCommands-D4W2Jgpj.mjs.map +1 -0
- package/dist/chunks/BidiIsolationPlugin-Bm3h9J15.mjs +2 -0
- package/dist/chunks/BidiIsolationPlugin-Bm3h9J15.mjs.map +1 -0
- package/dist/chunks/BlockInsertion-6rR9tIGP.mjs +2 -0
- package/dist/chunks/BlockInsertion-6rR9tIGP.mjs.map +1 -0
- package/dist/chunks/BlockTypePickerRegistry-BTET9jM-.mjs +2 -0
- package/dist/chunks/BlockTypePickerRegistry-BTET9jM-.mjs.map +1 -0
- package/dist/chunks/BlockquotePlugin-CxrCA0vY.mjs +2 -0
- package/dist/chunks/BlockquotePlugin-CxrCA0vY.mjs.map +1 -0
- package/dist/chunks/CaretNavigationPlugin-Bb7W_FMg.mjs +2 -0
- package/dist/chunks/CaretNavigationPlugin-Bb7W_FMg.mjs.map +1 -0
- package/dist/chunks/CodeBlockPlugin-Uv6EXaH1.mjs +2 -0
- package/dist/chunks/CodeBlockPlugin-Uv6EXaH1.mjs.map +1 -0
- package/dist/chunks/ColorGrid-CXRdpP_n.mjs +2 -0
- package/dist/chunks/ColorGrid-CXRdpP_n.mjs.map +1 -0
- package/dist/chunks/ColorPickerPopup-C_74bqid.mjs +2 -0
- package/dist/chunks/ColorPickerPopup-C_74bqid.mjs.map +1 -0
- package/dist/chunks/ColorValidation-DAijTjG9.mjs +2 -0
- package/dist/chunks/ColorValidation-DAijTjG9.mjs.map +1 -0
- package/dist/chunks/Commands-CyT1Li7_.mjs +2 -0
- package/dist/chunks/Commands-CyT1Li7_.mjs.map +1 -0
- package/dist/chunks/Decoration-ZeyVfwJB.mjs +2 -0
- package/dist/chunks/Decoration-ZeyVfwJB.mjs.map +1 -0
- package/dist/chunks/DirectionDetection-C7XE0nxW.mjs +2 -0
- package/dist/chunks/DirectionDetection-C7XE0nxW.mjs.map +1 -0
- package/dist/chunks/DirectionIcons-Bbawl9ei.mjs +2 -0
- package/dist/chunks/DirectionIcons-Bbawl9ei.mjs.map +1 -0
- package/dist/chunks/Document-r7vLOAGA.mjs +2 -0
- package/dist/chunks/Document-r7vLOAGA.mjs.map +1 -0
- package/dist/chunks/DocumentParser-CcTSeT1B.mjs +2 -0
- package/dist/chunks/DocumentParser-CcTSeT1B.mjs.map +1 -0
- package/dist/chunks/DomUtils-Bf7JLFlx.mjs +2 -0
- package/dist/chunks/DomUtils-Bf7JLFlx.mjs.map +1 -0
- package/dist/chunks/FontPlugin-1VYDwETg.mjs +2 -0
- package/dist/chunks/FontPlugin-1VYDwETg.mjs.map +1 -0
- package/dist/chunks/FontSizePlugin-L1uDVsKY.mjs +2 -0
- package/dist/chunks/FontSizePlugin-L1uDVsKY.mjs.map +1 -0
- package/dist/chunks/FormulaPlugin-UA-9tRpY.mjs +2 -0
- package/dist/chunks/FormulaPlugin-UA-9tRpY.mjs.map +1 -0
- package/dist/chunks/GapCursorNavigation-ycNzuQVH.mjs +2 -0
- package/dist/chunks/GapCursorNavigation-ycNzuQVH.mjs.map +1 -0
- package/dist/chunks/GapCursorPlugin-B29ieXel.mjs +2 -0
- package/dist/chunks/GapCursorPlugin-B29ieXel.mjs.map +1 -0
- package/dist/chunks/HTMLUtils-C6B4UT00.mjs +2 -0
- package/dist/chunks/HTMLUtils-C6B4UT00.mjs.map +1 -0
- package/dist/chunks/HardBreakPlugin-BkgoJkjC.mjs +2 -0
- package/dist/chunks/HardBreakPlugin-BkgoJkjC.mjs.map +1 -0
- package/dist/chunks/HeadingPlugin-SICF6Tm0.mjs +2 -0
- package/dist/chunks/HeadingPlugin-SICF6Tm0.mjs.map +1 -0
- package/dist/chunks/HighlightPlugin-B3b_qe68.mjs +2 -0
- package/dist/chunks/HighlightPlugin-B3b_qe68.mjs.map +1 -0
- package/dist/chunks/HorizontalRulePlugin-BrFlrpmb.mjs +2 -0
- package/dist/chunks/HorizontalRulePlugin-BrFlrpmb.mjs.map +1 -0
- package/dist/chunks/ImagePlugin-eRVtFFou.mjs +2 -0
- package/dist/chunks/ImagePlugin-eRVtFFou.mjs.map +1 -0
- package/dist/chunks/InlineCodePlugin-D3QulApr.mjs +2 -0
- package/dist/chunks/InlineCodePlugin-D3QulApr.mjs.map +1 -0
- package/dist/chunks/InlineStyleMarkSpec-4R6DC7ij.mjs +2 -0
- package/dist/chunks/InlineStyleMarkSpec-4R6DC7ij.mjs.map +1 -0
- package/dist/chunks/KeyboardNav-D0my3wuy.mjs +2 -0
- package/dist/chunks/KeyboardNav-D0my3wuy.mjs.map +1 -0
- package/dist/chunks/LinkPlugin-B_ysjORS.mjs +2 -0
- package/dist/chunks/LinkPlugin-B_ysjORS.mjs.map +1 -0
- package/dist/chunks/ListPlugin-C0BV8CnQ.mjs +2 -0
- package/dist/chunks/ListPlugin-C0BV8CnQ.mjs.map +1 -0
- package/dist/chunks/NavigationQueries-Bt4zZ17v.mjs +2 -0
- package/dist/chunks/NavigationQueries-Bt4zZ17v.mjs.map +1 -0
- package/dist/chunks/NodeResolver-ChgLF_IP.mjs +2 -0
- package/dist/chunks/NodeResolver-ChgLF_IP.mjs.map +1 -0
- package/dist/chunks/NodeSelectionCommands-Dj4VxLdD.mjs +2 -0
- package/dist/chunks/NodeSelectionCommands-Dj4VxLdD.mjs.map +1 -0
- package/dist/chunks/NodeSpecPatching-B_yLknTl.mjs +2 -0
- package/dist/chunks/NodeSpecPatching-B_yLknTl.mjs.map +1 -0
- package/dist/chunks/Platform-ByobkiCc.mjs +2 -0
- package/dist/chunks/Platform-ByobkiCc.mjs.map +1 -0
- package/dist/chunks/PluginHelpers-D4quRJ5a.mjs +2 -0
- package/dist/chunks/PluginHelpers-D4quRJ5a.mjs.map +1 -0
- package/dist/chunks/PopupKeyboardPatterns-tUrT9TyV.mjs +2 -0
- package/dist/chunks/PopupKeyboardPatterns-tUrT9TyV.mjs.map +1 -0
- package/dist/chunks/PopupManager-CyOfZUab.mjs +2 -0
- package/dist/chunks/PopupManager-CyOfZUab.mjs.map +1 -0
- package/dist/chunks/PopupPositioning-DtUrY9bh.mjs +2 -0
- package/dist/chunks/PopupPositioning-DtUrY9bh.mjs.map +1 -0
- package/dist/chunks/PrintPlugin-CXDFFzWB.mjs +2 -0
- package/dist/chunks/PrintPlugin-CXDFFzWB.mjs.map +1 -0
- package/dist/chunks/PrintTypes-WdtgSj74.mjs +2 -0
- package/dist/chunks/PrintTypes-WdtgSj74.mjs.map +1 -0
- package/dist/chunks/RangeIterator-o8v3msQe.mjs +2 -0
- package/dist/chunks/RangeIterator-o8v3msQe.mjs.map +1 -0
- package/dist/chunks/Selection-HYoVFpAx.mjs +2 -0
- package/dist/chunks/Selection-HYoVFpAx.mjs.map +1 -0
- package/dist/chunks/SelectionSync-BSHIw1EE.mjs +2 -0
- package/dist/chunks/SelectionSync-BSHIw1EE.mjs.map +1 -0
- package/dist/chunks/ShortcutFormatting-TwiufqeV.mjs +2 -0
- package/dist/chunks/ShortcutFormatting-TwiufqeV.mjs.map +1 -0
- package/dist/chunks/SimpleMark-Db8ir_z2.mjs +2 -0
- package/dist/chunks/SimpleMark-Db8ir_z2.mjs.map +1 -0
- package/dist/chunks/SmartPastePlugin-Db1RcNJf.mjs +2 -0
- package/dist/chunks/SmartPastePlugin-Db1RcNJf.mjs.map +1 -0
- package/dist/chunks/StrikethroughPlugin-Bsg7Ma4I.mjs +2 -0
- package/dist/chunks/StrikethroughPlugin-Bsg7Ma4I.mjs.map +1 -0
- package/dist/chunks/StyleRuntime-BAutwDZT.mjs +2 -0
- package/dist/chunks/StyleRuntime-BAutwDZT.mjs.map +1 -0
- package/dist/chunks/SuperSubPlugin-ChEga-b_.mjs +2 -0
- package/dist/chunks/SuperSubPlugin-ChEga-b_.mjs.map +1 -0
- package/dist/chunks/SyntaxTokenTypes-BUCOMtL8.mjs +2 -0
- package/dist/chunks/SyntaxTokenTypes-BUCOMtL8.mjs.map +1 -0
- package/dist/chunks/TablePlugin-CRp4qSZE.mjs +2 -0
- package/dist/chunks/TablePlugin-CRp4qSZE.mjs.map +1 -0
- package/dist/chunks/TextColorPlugin-CViEiYZk.mjs +2 -0
- package/dist/chunks/TextColorPlugin-CViEiYZk.mjs.map +1 -0
- package/dist/chunks/TextDirectionAutoPlugin-CzWJjrvG.mjs +2 -0
- package/dist/chunks/TextDirectionAutoPlugin-CzWJjrvG.mjs.map +1 -0
- package/dist/chunks/TextDirectionPlugin-CQGkaS2s.mjs +2 -0
- package/dist/chunks/TextDirectionPlugin-CQGkaS2s.mjs.map +1 -0
- package/dist/chunks/TextDirectionService-OFOU6r_s.mjs +2 -0
- package/dist/chunks/TextDirectionService-OFOU6r_s.mjs.map +1 -0
- package/dist/chunks/TextFormattingPlugin-Db5SCNOF.mjs +2 -0
- package/dist/chunks/TextFormattingPlugin-Db5SCNOF.mjs.map +1 -0
- package/dist/chunks/ToolbarPlugin-B5UUc6dY.mjs +2 -0
- package/dist/chunks/ToolbarPlugin-B5UUc6dY.mjs.map +1 -0
- package/dist/chunks/TypeBrands-Ch9856Gb.mjs +2 -0
- package/dist/chunks/TypeBrands-Ch9856Gb.mjs.map +1 -0
- package/dist/chunks/TypedKeys-CA4bfw9O.mjs +2 -0
- package/dist/chunks/TypedKeys-CA4bfw9O.mjs.map +1 -0
- package/dist/chunks/VideoPlugin-mXIDODzC.mjs +2 -0
- package/dist/chunks/VideoPlugin-mXIDODzC.mjs.map +1 -0
- package/dist/chunks/WordBoundary-DxeMBRyP.mjs +2 -0
- package/dist/chunks/WordBoundary-DxeMBRyP.mjs.map +1 -0
- package/dist/chunks/XmlDetector-D7TQpw-e.mjs +2 -0
- package/dist/chunks/XmlDetector-D7TQpw-e.mjs.map +1 -0
- package/dist/chunks/XmlPatterns-RN32-0ob.mjs +2 -0
- package/dist/chunks/XmlPatterns-RN32-0ob.mjs.map +1 -0
- package/dist/chunks/XmlSupport-BYiRwlkK.mjs +2 -0
- package/dist/chunks/XmlSupport-BYiRwlkK.mjs.map +1 -0
- package/dist/chunks/ar--Isa9OHJ.mjs +2 -0
- package/dist/chunks/ar--Isa9OHJ.mjs.map +1 -0
- package/dist/chunks/ar--O0A9OTR.mjs +2 -0
- package/dist/chunks/ar--O0A9OTR.mjs.map +1 -0
- package/dist/chunks/ar-0g2bmXTn.mjs +2 -0
- package/dist/chunks/ar-0g2bmXTn.mjs.map +1 -0
- package/dist/chunks/ar-4b8e2YSc.mjs +2 -0
- package/dist/chunks/ar-4b8e2YSc.mjs.map +1 -0
- package/dist/chunks/ar-B03uY4xr.mjs +2 -0
- package/dist/chunks/ar-B03uY4xr.mjs.map +1 -0
- package/dist/chunks/ar-BAfInw85.mjs +2 -0
- package/dist/chunks/ar-BAfInw85.mjs.map +1 -0
- package/dist/chunks/ar-BRX5E_Pw.mjs +2 -0
- package/dist/chunks/ar-BRX5E_Pw.mjs.map +1 -0
- package/dist/chunks/ar-BTShmP2E.mjs +2 -0
- package/dist/chunks/ar-BTShmP2E.mjs.map +1 -0
- package/dist/chunks/ar-BWOue6jG.mjs +2 -0
- package/dist/chunks/ar-BWOue6jG.mjs.map +1 -0
- package/dist/chunks/ar-Bdmunk5h.mjs +2 -0
- package/dist/chunks/ar-Bdmunk5h.mjs.map +1 -0
- package/dist/chunks/ar-BwaoCUVN.mjs +2 -0
- package/dist/chunks/ar-BwaoCUVN.mjs.map +1 -0
- package/dist/chunks/ar-BzqAYGER.mjs +2 -0
- package/dist/chunks/ar-BzqAYGER.mjs.map +1 -0
- package/dist/chunks/ar-C9lO1jsY.mjs +2 -0
- package/dist/chunks/ar-C9lO1jsY.mjs.map +1 -0
- package/dist/chunks/ar-CMXjVzFx.mjs +2 -0
- package/dist/chunks/ar-CMXjVzFx.mjs.map +1 -0
- package/dist/chunks/ar-CR6UdFL9.mjs +2 -0
- package/dist/chunks/ar-CR6UdFL9.mjs.map +1 -0
- package/dist/chunks/ar-CrOb0jL2.mjs +2 -0
- package/dist/chunks/ar-CrOb0jL2.mjs.map +1 -0
- package/dist/chunks/ar-Ctrv6cIi.mjs +2 -0
- package/dist/chunks/ar-Ctrv6cIi.mjs.map +1 -0
- package/dist/chunks/ar-Cy_77yRf.mjs +2 -0
- package/dist/chunks/ar-Cy_77yRf.mjs.map +1 -0
- package/dist/chunks/ar-D1jFXqLJ.mjs +2 -0
- package/dist/chunks/ar-D1jFXqLJ.mjs.map +1 -0
- package/dist/chunks/ar-DahJwMI9.mjs +2 -0
- package/dist/chunks/ar-DahJwMI9.mjs.map +1 -0
- package/dist/chunks/ar-Dcl3kgtd.mjs +2 -0
- package/dist/chunks/ar-Dcl3kgtd.mjs.map +1 -0
- package/dist/chunks/ar-Dx2lO0Nm.mjs +2 -0
- package/dist/chunks/ar-Dx2lO0Nm.mjs.map +1 -0
- package/dist/chunks/ar-NV_puwI2.mjs +2 -0
- package/dist/chunks/ar-NV_puwI2.mjs.map +1 -0
- package/dist/chunks/ar-Uzo1Azdw.mjs +2 -0
- package/dist/chunks/ar-Uzo1Azdw.mjs.map +1 -0
- package/dist/chunks/ar-XmSFrtmd.mjs +2 -0
- package/dist/chunks/ar-XmSFrtmd.mjs.map +1 -0
- package/dist/chunks/ar-jbplYWkC.mjs +2 -0
- package/dist/chunks/ar-jbplYWkC.mjs.map +1 -0
- package/dist/chunks/ar-sGZ-oZqB.mjs +2 -0
- package/dist/chunks/ar-sGZ-oZqB.mjs.map +1 -0
- package/dist/chunks/color-picker-C9B2rYw-.mjs +2 -0
- package/dist/chunks/color-picker-C9B2rYw-.mjs.map +1 -0
- package/dist/chunks/de-B8-w9gPi.mjs +2 -0
- package/dist/chunks/de-B8-w9gPi.mjs.map +1 -0
- package/dist/chunks/de-B9zSHWqY.mjs +2 -0
- package/dist/chunks/de-B9zSHWqY.mjs.map +1 -0
- package/dist/chunks/de-BX4y4PlH.mjs +2 -0
- package/dist/chunks/de-BX4y4PlH.mjs.map +1 -0
- package/dist/chunks/de-BXQBXxFJ.mjs +2 -0
- package/dist/chunks/de-BXQBXxFJ.mjs.map +1 -0
- package/dist/chunks/de-BcPntcnr.mjs +2 -0
- package/dist/chunks/de-BcPntcnr.mjs.map +1 -0
- package/dist/chunks/de-BdD3DpUB.mjs +2 -0
- package/dist/chunks/de-BdD3DpUB.mjs.map +1 -0
- package/dist/chunks/de-Bwxlcuee.mjs +2 -0
- package/dist/chunks/de-Bwxlcuee.mjs.map +1 -0
- package/dist/chunks/de-BxQIt_1Y.mjs +2 -0
- package/dist/chunks/de-BxQIt_1Y.mjs.map +1 -0
- package/dist/chunks/de-C--bRmjW.mjs +2 -0
- package/dist/chunks/de-C--bRmjW.mjs.map +1 -0
- package/dist/chunks/de-C-Yf378-.mjs +2 -0
- package/dist/chunks/de-C-Yf378-.mjs.map +1 -0
- package/dist/chunks/de-C7uehgMu.mjs +2 -0
- package/dist/chunks/de-C7uehgMu.mjs.map +1 -0
- package/dist/chunks/de-C9ZhDqPi.mjs +2 -0
- package/dist/chunks/de-C9ZhDqPi.mjs.map +1 -0
- package/dist/chunks/de-CHcv_Vmf.mjs +2 -0
- package/dist/chunks/de-CHcv_Vmf.mjs.map +1 -0
- package/dist/chunks/de-CTzAMkXC.mjs +2 -0
- package/dist/chunks/de-CTzAMkXC.mjs.map +1 -0
- package/dist/chunks/de-CaeEIyzV.mjs +2 -0
- package/dist/chunks/de-CaeEIyzV.mjs.map +1 -0
- package/dist/chunks/de-DHs9i4af.mjs +2 -0
- package/dist/chunks/de-DHs9i4af.mjs.map +1 -0
- package/dist/chunks/de-DN-e6G5A.mjs +2 -0
- package/dist/chunks/de-DN-e6G5A.mjs.map +1 -0
- package/dist/chunks/de-DViI26lG.mjs +2 -0
- package/dist/chunks/de-DViI26lG.mjs.map +1 -0
- package/dist/chunks/de-DY3obIAF.mjs +2 -0
- package/dist/chunks/de-DY3obIAF.mjs.map +1 -0
- package/dist/chunks/de-DcMhfRBu.mjs +2 -0
- package/dist/chunks/de-DcMhfRBu.mjs.map +1 -0
- package/dist/chunks/de-DiPz7abS.mjs +2 -0
- package/dist/chunks/de-DiPz7abS.mjs.map +1 -0
- package/dist/chunks/de-Dl4QFHMa.mjs +2 -0
- package/dist/chunks/de-Dl4QFHMa.mjs.map +1 -0
- package/dist/chunks/de-JhGflzS5.mjs +2 -0
- package/dist/chunks/de-JhGflzS5.mjs.map +1 -0
- package/dist/chunks/de-XCCpWyg0.mjs +2 -0
- package/dist/chunks/de-XCCpWyg0.mjs.map +1 -0
- package/dist/chunks/de-e6J6nvAD.mjs +2 -0
- package/dist/chunks/de-e6J6nvAD.mjs.map +1 -0
- package/dist/chunks/de-i95F9SDy.mjs +2 -0
- package/dist/chunks/de-i95F9SDy.mjs.map +1 -0
- package/dist/chunks/de-uKR7koQe.mjs +2 -0
- package/dist/chunks/de-uKR7koQe.mjs.map +1 -0
- package/dist/chunks/es-B0Za939C.mjs +2 -0
- package/dist/chunks/es-B0Za939C.mjs.map +1 -0
- package/dist/chunks/es-B8K3Yvf3.mjs +2 -0
- package/dist/chunks/es-B8K3Yvf3.mjs.map +1 -0
- package/dist/chunks/es-BIXm2Coj.mjs +2 -0
- package/dist/chunks/es-BIXm2Coj.mjs.map +1 -0
- package/dist/chunks/es-BJHF95J_.mjs +2 -0
- package/dist/chunks/es-BJHF95J_.mjs.map +1 -0
- package/dist/chunks/es-BMm9kqjC.mjs +2 -0
- package/dist/chunks/es-BMm9kqjC.mjs.map +1 -0
- package/dist/chunks/es-BQweZX6P.mjs +2 -0
- package/dist/chunks/es-BQweZX6P.mjs.map +1 -0
- package/dist/chunks/es-BdpTTRuX.mjs +2 -0
- package/dist/chunks/es-BdpTTRuX.mjs.map +1 -0
- package/dist/chunks/es-Bv7bDbMp.mjs +2 -0
- package/dist/chunks/es-Bv7bDbMp.mjs.map +1 -0
- package/dist/chunks/es-C7uVqFYr.mjs +2 -0
- package/dist/chunks/es-C7uVqFYr.mjs.map +1 -0
- package/dist/chunks/es-CCQFu1t1.mjs +2 -0
- package/dist/chunks/es-CCQFu1t1.mjs.map +1 -0
- package/dist/chunks/es-CM55WeEN.mjs +2 -0
- package/dist/chunks/es-CM55WeEN.mjs.map +1 -0
- package/dist/chunks/es-CUKJujcb.mjs +2 -0
- package/dist/chunks/es-CUKJujcb.mjs.map +1 -0
- package/dist/chunks/es-CXuMz87y.mjs +2 -0
- package/dist/chunks/es-CXuMz87y.mjs.map +1 -0
- package/dist/chunks/es-CgMfhkJJ.mjs +2 -0
- package/dist/chunks/es-CgMfhkJJ.mjs.map +1 -0
- package/dist/chunks/es-CtOtKQCP.mjs +2 -0
- package/dist/chunks/es-CtOtKQCP.mjs.map +1 -0
- package/dist/chunks/es-DD01rZ6N.mjs +2 -0
- package/dist/chunks/es-DD01rZ6N.mjs.map +1 -0
- package/dist/chunks/es-DDoqchUq.mjs +2 -0
- package/dist/chunks/es-DDoqchUq.mjs.map +1 -0
- package/dist/chunks/es-DFUVd7eO.mjs +2 -0
- package/dist/chunks/es-DFUVd7eO.mjs.map +1 -0
- package/dist/chunks/es-DFokqQst.mjs +2 -0
- package/dist/chunks/es-DFokqQst.mjs.map +1 -0
- package/dist/chunks/es-DHxdoEzR.mjs +2 -0
- package/dist/chunks/es-DHxdoEzR.mjs.map +1 -0
- package/dist/chunks/es-DehVGwQ8.mjs +2 -0
- package/dist/chunks/es-DehVGwQ8.mjs.map +1 -0
- package/dist/chunks/es-DrJyl38L.mjs +2 -0
- package/dist/chunks/es-DrJyl38L.mjs.map +1 -0
- package/dist/chunks/es-fTW0TkYV.mjs +2 -0
- package/dist/chunks/es-fTW0TkYV.mjs.map +1 -0
- package/dist/chunks/es-kfKiqpyD.mjs +2 -0
- package/dist/chunks/es-kfKiqpyD.mjs.map +1 -0
- package/dist/chunks/es-nRLq7bgP.mjs +2 -0
- package/dist/chunks/es-nRLq7bgP.mjs.map +1 -0
- package/dist/chunks/es-paXY7HFt.mjs +2 -0
- package/dist/chunks/es-paXY7HFt.mjs.map +1 -0
- package/dist/chunks/es-xuahrvJN.mjs +2 -0
- package/dist/chunks/es-xuahrvJN.mjs.map +1 -0
- package/dist/chunks/fonts-DQC6Uj4r.mjs +2 -0
- package/dist/chunks/fonts-DQC6Uj4r.mjs.map +1 -0
- package/dist/chunks/fr-0qEo3bRP.mjs +2 -0
- package/dist/chunks/fr-0qEo3bRP.mjs.map +1 -0
- package/dist/chunks/fr-5HkMazAf.mjs +2 -0
- package/dist/chunks/fr-5HkMazAf.mjs.map +1 -0
- package/dist/chunks/fr-B9pBLaVx.mjs +2 -0
- package/dist/chunks/fr-B9pBLaVx.mjs.map +1 -0
- package/dist/chunks/fr-BRXUnq3R.mjs +2 -0
- package/dist/chunks/fr-BRXUnq3R.mjs.map +1 -0
- package/dist/chunks/fr-BSUKEtTk.mjs +2 -0
- package/dist/chunks/fr-BSUKEtTk.mjs.map +1 -0
- package/dist/chunks/fr-BaXKyPmX.mjs +2 -0
- package/dist/chunks/fr-BaXKyPmX.mjs.map +1 -0
- package/dist/chunks/fr-BeRlON1t.mjs +2 -0
- package/dist/chunks/fr-BeRlON1t.mjs.map +1 -0
- package/dist/chunks/fr-Bg937iAy.mjs +2 -0
- package/dist/chunks/fr-Bg937iAy.mjs.map +1 -0
- package/dist/chunks/fr-BwWrFThE.mjs +2 -0
- package/dist/chunks/fr-BwWrFThE.mjs.map +1 -0
- package/dist/chunks/fr-C3EKRThN.mjs +2 -0
- package/dist/chunks/fr-C3EKRThN.mjs.map +1 -0
- package/dist/chunks/fr-CKjH6tJI.mjs +2 -0
- package/dist/chunks/fr-CKjH6tJI.mjs.map +1 -0
- package/dist/chunks/fr-CQs0-pNX.mjs +2 -0
- package/dist/chunks/fr-CQs0-pNX.mjs.map +1 -0
- package/dist/chunks/fr-C_2i5Ono.mjs +2 -0
- package/dist/chunks/fr-C_2i5Ono.mjs.map +1 -0
- package/dist/chunks/fr-CfhyYN-t.mjs +2 -0
- package/dist/chunks/fr-CfhyYN-t.mjs.map +1 -0
- package/dist/chunks/fr-D0MDdoir.mjs +2 -0
- package/dist/chunks/fr-D0MDdoir.mjs.map +1 -0
- package/dist/chunks/fr-D5ulA3Z6.mjs +2 -0
- package/dist/chunks/fr-D5ulA3Z6.mjs.map +1 -0
- package/dist/chunks/fr-DEZ_oxzS.mjs +2 -0
- package/dist/chunks/fr-DEZ_oxzS.mjs.map +1 -0
- package/dist/chunks/fr-DciSEykY.mjs +2 -0
- package/dist/chunks/fr-DciSEykY.mjs.map +1 -0
- package/dist/chunks/fr-DiDhVhyV.mjs +2 -0
- package/dist/chunks/fr-DiDhVhyV.mjs.map +1 -0
- package/dist/chunks/fr-DjMZ-3K5.mjs +2 -0
- package/dist/chunks/fr-DjMZ-3K5.mjs.map +1 -0
- package/dist/chunks/fr-DtzIu6tU.mjs +2 -0
- package/dist/chunks/fr-DtzIu6tU.mjs.map +1 -0
- package/dist/chunks/fr-F2ZrfVaF.mjs +2 -0
- package/dist/chunks/fr-F2ZrfVaF.mjs.map +1 -0
- package/dist/chunks/fr-KXmbys88.mjs +2 -0
- package/dist/chunks/fr-KXmbys88.mjs.map +1 -0
- package/dist/chunks/fr-SbpHNrQ-.mjs +2 -0
- package/dist/chunks/fr-SbpHNrQ-.mjs.map +1 -0
- package/dist/chunks/fr-ZsRdLuys.mjs +2 -0
- package/dist/chunks/fr-ZsRdLuys.mjs.map +1 -0
- package/dist/chunks/fr-eC0UdAPu.mjs +2 -0
- package/dist/chunks/fr-eC0UdAPu.mjs.map +1 -0
- package/dist/chunks/fr-fshsDD66.mjs +2 -0
- package/dist/chunks/fr-fshsDD66.mjs.map +1 -0
- package/dist/chunks/full--GEBZ2xU.mjs +2 -0
- package/dist/chunks/full--GEBZ2xU.mjs.map +1 -0
- package/dist/chunks/hi-4CiAKVjT.mjs +2 -0
- package/dist/chunks/hi-4CiAKVjT.mjs.map +1 -0
- package/dist/chunks/hi-B-ZuX4aN.mjs +2 -0
- package/dist/chunks/hi-B-ZuX4aN.mjs.map +1 -0
- package/dist/chunks/hi-B2YB3Bo4.mjs +2 -0
- package/dist/chunks/hi-B2YB3Bo4.mjs.map +1 -0
- package/dist/chunks/hi-B2uhiPCN.mjs +2 -0
- package/dist/chunks/hi-B2uhiPCN.mjs.map +1 -0
- package/dist/chunks/hi-B5cl8TWK.mjs +2 -0
- package/dist/chunks/hi-B5cl8TWK.mjs.map +1 -0
- package/dist/chunks/hi-BNJIGWQQ.mjs +2 -0
- package/dist/chunks/hi-BNJIGWQQ.mjs.map +1 -0
- package/dist/chunks/hi-BOMkDPqC.mjs +2 -0
- package/dist/chunks/hi-BOMkDPqC.mjs.map +1 -0
- package/dist/chunks/hi-Bl-yeeOI.mjs +2 -0
- package/dist/chunks/hi-Bl-yeeOI.mjs.map +1 -0
- package/dist/chunks/hi-Bu799xIO.mjs +2 -0
- package/dist/chunks/hi-Bu799xIO.mjs.map +1 -0
- package/dist/chunks/hi-By8YwVIX.mjs +2 -0
- package/dist/chunks/hi-By8YwVIX.mjs.map +1 -0
- package/dist/chunks/hi-BzbMD_cP.mjs +2 -0
- package/dist/chunks/hi-BzbMD_cP.mjs.map +1 -0
- package/dist/chunks/hi-C2jEsf8v.mjs +2 -0
- package/dist/chunks/hi-C2jEsf8v.mjs.map +1 -0
- package/dist/chunks/hi-C9fvG91d.mjs +2 -0
- package/dist/chunks/hi-C9fvG91d.mjs.map +1 -0
- package/dist/chunks/hi-CTWubxLY.mjs +2 -0
- package/dist/chunks/hi-CTWubxLY.mjs.map +1 -0
- package/dist/chunks/hi-CoclKAUM.mjs +2 -0
- package/dist/chunks/hi-CoclKAUM.mjs.map +1 -0
- package/dist/chunks/hi-CrmakMVj.mjs +2 -0
- package/dist/chunks/hi-CrmakMVj.mjs.map +1 -0
- package/dist/chunks/hi-DWX6k5ZD.mjs +2 -0
- package/dist/chunks/hi-DWX6k5ZD.mjs.map +1 -0
- package/dist/chunks/hi-DY55FuDK.mjs +2 -0
- package/dist/chunks/hi-DY55FuDK.mjs.map +1 -0
- package/dist/chunks/hi-DsdXcOB6.mjs +2 -0
- package/dist/chunks/hi-DsdXcOB6.mjs.map +1 -0
- package/dist/chunks/hi-Dt89SxNy.mjs +2 -0
- package/dist/chunks/hi-Dt89SxNy.mjs.map +1 -0
- package/dist/chunks/hi-J8ErB5nB.mjs +2 -0
- package/dist/chunks/hi-J8ErB5nB.mjs.map +1 -0
- package/dist/chunks/hi-L6pJxZam.mjs +2 -0
- package/dist/chunks/hi-L6pJxZam.mjs.map +1 -0
- package/dist/chunks/hi-SECtQQzq.mjs +2 -0
- package/dist/chunks/hi-SECtQQzq.mjs.map +1 -0
- package/dist/chunks/hi-aH9HZG23.mjs +2 -0
- package/dist/chunks/hi-aH9HZG23.mjs.map +1 -0
- package/dist/chunks/hi-j3TDLMYd.mjs +2 -0
- package/dist/chunks/hi-j3TDLMYd.mjs.map +1 -0
- package/dist/chunks/hi-l6DA-aOw.mjs +2 -0
- package/dist/chunks/hi-l6DA-aOw.mjs.map +1 -0
- package/dist/chunks/hi-uACJUw53.mjs +2 -0
- package/dist/chunks/hi-uACJUw53.mjs.map +1 -0
- package/dist/chunks/minimal-D5v-raei.mjs +2 -0
- package/dist/chunks/minimal-D5v-raei.mjs.map +1 -0
- package/dist/chunks/pt-5VeuNDd2.mjs +2 -0
- package/dist/chunks/pt-5VeuNDd2.mjs.map +1 -0
- package/dist/chunks/pt-BCXgUDiU.mjs +2 -0
- package/dist/chunks/pt-BCXgUDiU.mjs.map +1 -0
- package/dist/chunks/pt-BDam9cDu.mjs +2 -0
- package/dist/chunks/pt-BDam9cDu.mjs.map +1 -0
- package/dist/chunks/pt-Bb908r0n.mjs +2 -0
- package/dist/chunks/pt-Bb908r0n.mjs.map +1 -0
- package/dist/chunks/pt-BkpVtod-.mjs +2 -0
- package/dist/chunks/pt-BkpVtod-.mjs.map +1 -0
- package/dist/chunks/pt-BlFAJZo7.mjs +2 -0
- package/dist/chunks/pt-BlFAJZo7.mjs.map +1 -0
- package/dist/chunks/pt-Bu7Mbz67.mjs +2 -0
- package/dist/chunks/pt-Bu7Mbz67.mjs.map +1 -0
- package/dist/chunks/pt-C8sOyw0V.mjs +2 -0
- package/dist/chunks/pt-C8sOyw0V.mjs.map +1 -0
- package/dist/chunks/pt-CEUgbrii.mjs +2 -0
- package/dist/chunks/pt-CEUgbrii.mjs.map +1 -0
- package/dist/chunks/pt-CMrFpUWS.mjs +2 -0
- package/dist/chunks/pt-CMrFpUWS.mjs.map +1 -0
- package/dist/chunks/pt-CMx2wPPY.mjs +2 -0
- package/dist/chunks/pt-CMx2wPPY.mjs.map +1 -0
- package/dist/chunks/pt-CR4j8gtE.mjs +2 -0
- package/dist/chunks/pt-CR4j8gtE.mjs.map +1 -0
- package/dist/chunks/pt-Cc4zysaT.mjs +2 -0
- package/dist/chunks/pt-Cc4zysaT.mjs.map +1 -0
- package/dist/chunks/pt-Cv6q7x5x.mjs +2 -0
- package/dist/chunks/pt-Cv6q7x5x.mjs.map +1 -0
- package/dist/chunks/pt-DFKJVh7k.mjs +2 -0
- package/dist/chunks/pt-DFKJVh7k.mjs.map +1 -0
- package/dist/chunks/pt-DYMyMgKQ.mjs +2 -0
- package/dist/chunks/pt-DYMyMgKQ.mjs.map +1 -0
- package/dist/chunks/pt-D__tcM2T.mjs +2 -0
- package/dist/chunks/pt-D__tcM2T.mjs.map +1 -0
- package/dist/chunks/pt-Dg2ctkug.mjs +2 -0
- package/dist/chunks/pt-Dg2ctkug.mjs.map +1 -0
- package/dist/chunks/pt-DgfMoLWR.mjs +2 -0
- package/dist/chunks/pt-DgfMoLWR.mjs.map +1 -0
- package/dist/chunks/pt-DmN9u3NX.mjs +2 -0
- package/dist/chunks/pt-DmN9u3NX.mjs.map +1 -0
- package/dist/chunks/pt-GqLw5tN0.mjs +2 -0
- package/dist/chunks/pt-GqLw5tN0.mjs.map +1 -0
- package/dist/chunks/pt-Hy-0Xnnc.mjs +2 -0
- package/dist/chunks/pt-Hy-0Xnnc.mjs.map +1 -0
- package/dist/chunks/pt-OXa_IR4Q.mjs +2 -0
- package/dist/chunks/pt-OXa_IR4Q.mjs.map +1 -0
- package/dist/chunks/pt-UPF7DBlz.mjs +2 -0
- package/dist/chunks/pt-UPF7DBlz.mjs.map +1 -0
- package/dist/chunks/pt-_qxIe7zX.mjs +2 -0
- package/dist/chunks/pt-_qxIe7zX.mjs.map +1 -0
- package/dist/chunks/pt-paXY7HFt.mjs +2 -0
- package/dist/chunks/pt-paXY7HFt.mjs.map +1 -0
- package/dist/chunks/pt-zMHcNGPk.mjs +2 -0
- package/dist/chunks/pt-zMHcNGPk.mjs.map +1 -0
- package/dist/chunks/ru-4g_qsaLr.mjs +2 -0
- package/dist/chunks/ru-4g_qsaLr.mjs.map +1 -0
- package/dist/chunks/ru-B1m8J9dl.mjs +2 -0
- package/dist/chunks/ru-B1m8J9dl.mjs.map +1 -0
- package/dist/chunks/ru-BFpEOrVp.mjs +2 -0
- package/dist/chunks/ru-BFpEOrVp.mjs.map +1 -0
- package/dist/chunks/ru-BNPUT-3S.mjs +2 -0
- package/dist/chunks/ru-BNPUT-3S.mjs.map +1 -0
- package/dist/chunks/ru-BotG0MFT.mjs +2 -0
- package/dist/chunks/ru-BotG0MFT.mjs.map +1 -0
- package/dist/chunks/ru-BxySx7an.mjs +2 -0
- package/dist/chunks/ru-BxySx7an.mjs.map +1 -0
- package/dist/chunks/ru-C-APN_dm.mjs +2 -0
- package/dist/chunks/ru-C-APN_dm.mjs.map +1 -0
- package/dist/chunks/ru-C9yFslEG.mjs +2 -0
- package/dist/chunks/ru-C9yFslEG.mjs.map +1 -0
- package/dist/chunks/ru-CkG_bpfo.mjs +2 -0
- package/dist/chunks/ru-CkG_bpfo.mjs.map +1 -0
- package/dist/chunks/ru-Cs8KCNyq.mjs +2 -0
- package/dist/chunks/ru-Cs8KCNyq.mjs.map +1 -0
- package/dist/chunks/ru-CvDl-yEd.mjs +2 -0
- package/dist/chunks/ru-CvDl-yEd.mjs.map +1 -0
- package/dist/chunks/ru-CwyPz2Va.mjs +2 -0
- package/dist/chunks/ru-CwyPz2Va.mjs.map +1 -0
- package/dist/chunks/ru-D53d-_UB.mjs +2 -0
- package/dist/chunks/ru-D53d-_UB.mjs.map +1 -0
- package/dist/chunks/ru-DJMpeuey.mjs +2 -0
- package/dist/chunks/ru-DJMpeuey.mjs.map +1 -0
- package/dist/chunks/ru-DSRv3_Rg.mjs +2 -0
- package/dist/chunks/ru-DSRv3_Rg.mjs.map +1 -0
- package/dist/chunks/ru-DV-lgEtM.mjs +2 -0
- package/dist/chunks/ru-DV-lgEtM.mjs.map +1 -0
- package/dist/chunks/ru-DiwQV30V.mjs +2 -0
- package/dist/chunks/ru-DiwQV30V.mjs.map +1 -0
- package/dist/chunks/ru-DkW9XZFy.mjs +2 -0
- package/dist/chunks/ru-DkW9XZFy.mjs.map +1 -0
- package/dist/chunks/ru-DyCTlhjg.mjs +2 -0
- package/dist/chunks/ru-DyCTlhjg.mjs.map +1 -0
- package/dist/chunks/ru-QGX8lOTs.mjs +2 -0
- package/dist/chunks/ru-QGX8lOTs.mjs.map +1 -0
- package/dist/chunks/ru-QcTo2yoL.mjs +2 -0
- package/dist/chunks/ru-QcTo2yoL.mjs.map +1 -0
- package/dist/chunks/ru-Y11wuxOB.mjs +2 -0
- package/dist/chunks/ru-Y11wuxOB.mjs.map +1 -0
- package/dist/chunks/ru-Yngw7nFP.mjs +2 -0
- package/dist/chunks/ru-Yngw7nFP.mjs.map +1 -0
- package/dist/chunks/ru-d68SZpEe.mjs +2 -0
- package/dist/chunks/ru-d68SZpEe.mjs.map +1 -0
- package/dist/chunks/ru-k7o3Qks3.mjs +2 -0
- package/dist/chunks/ru-k7o3Qks3.mjs.map +1 -0
- package/dist/chunks/ru-l73diFXn.mjs +2 -0
- package/dist/chunks/ru-l73diFXn.mjs.map +1 -0
- package/dist/chunks/ru-q8kz-237.mjs +2 -0
- package/dist/chunks/ru-q8kz-237.mjs.map +1 -0
- package/dist/chunks/src-C5Lblp2i.mjs +2 -0
- package/dist/chunks/src-C5Lblp2i.mjs.map +1 -0
- package/dist/chunks/zh-BGYJXxVl.mjs +2 -0
- package/dist/chunks/zh-BGYJXxVl.mjs.map +1 -0
- package/dist/chunks/zh-BP97XjlS.mjs +2 -0
- package/dist/chunks/zh-BP97XjlS.mjs.map +1 -0
- package/dist/chunks/zh-BQ73oqxc.mjs +2 -0
- package/dist/chunks/zh-BQ73oqxc.mjs.map +1 -0
- package/dist/chunks/zh-BQqf3wJZ.mjs +2 -0
- package/dist/chunks/zh-BQqf3wJZ.mjs.map +1 -0
- package/dist/chunks/zh-Baxh6v0j.mjs +2 -0
- package/dist/chunks/zh-Baxh6v0j.mjs.map +1 -0
- package/dist/chunks/zh-BjoyjClN.mjs +2 -0
- package/dist/chunks/zh-BjoyjClN.mjs.map +1 -0
- package/dist/chunks/zh-BvuAbM2S.mjs +2 -0
- package/dist/chunks/zh-BvuAbM2S.mjs.map +1 -0
- package/dist/chunks/zh-C-wHnDo5.mjs +2 -0
- package/dist/chunks/zh-C-wHnDo5.mjs.map +1 -0
- package/dist/chunks/zh-C7iCgCRP.mjs +2 -0
- package/dist/chunks/zh-C7iCgCRP.mjs.map +1 -0
- package/dist/chunks/zh-CRsDvfPR.mjs +2 -0
- package/dist/chunks/zh-CRsDvfPR.mjs.map +1 -0
- package/dist/chunks/zh-CWGAPVei.mjs +2 -0
- package/dist/chunks/zh-CWGAPVei.mjs.map +1 -0
- package/dist/chunks/zh-CWIzJcXi.mjs +2 -0
- package/dist/chunks/zh-CWIzJcXi.mjs.map +1 -0
- package/dist/chunks/zh-CYV-db-K.mjs +2 -0
- package/dist/chunks/zh-CYV-db-K.mjs.map +1 -0
- package/dist/chunks/zh-CnW44JEw.mjs +2 -0
- package/dist/chunks/zh-CnW44JEw.mjs.map +1 -0
- package/dist/chunks/zh-D1HSmSOf.mjs +2 -0
- package/dist/chunks/zh-D1HSmSOf.mjs.map +1 -0
- package/dist/chunks/zh-DWN1Jqn3.mjs +2 -0
- package/dist/chunks/zh-DWN1Jqn3.mjs.map +1 -0
- package/dist/chunks/zh-DYD476c5.mjs +2 -0
- package/dist/chunks/zh-DYD476c5.mjs.map +1 -0
- package/dist/chunks/zh-DdzgYD7k.mjs +2 -0
- package/dist/chunks/zh-DdzgYD7k.mjs.map +1 -0
- package/dist/chunks/zh-DeZP08HI.mjs +2 -0
- package/dist/chunks/zh-DeZP08HI.mjs.map +1 -0
- package/dist/chunks/zh-DgSmvLyw.mjs +2 -0
- package/dist/chunks/zh-DgSmvLyw.mjs.map +1 -0
- package/dist/chunks/zh-DlVfQn4z.mjs +2 -0
- package/dist/chunks/zh-DlVfQn4z.mjs.map +1 -0
- package/dist/chunks/zh-DuucmOns.mjs +2 -0
- package/dist/chunks/zh-DuucmOns.mjs.map +1 -0
- package/dist/chunks/zh-Oj-qSUEp.mjs +2 -0
- package/dist/chunks/zh-Oj-qSUEp.mjs.map +1 -0
- package/dist/chunks/zh-YfuE_m2y.mjs +2 -0
- package/dist/chunks/zh-YfuE_m2y.mjs.map +1 -0
- package/dist/chunks/zh-dGSDBBzb.mjs +2 -0
- package/dist/chunks/zh-dGSDBBzb.mjs.map +1 -0
- package/dist/chunks/zh-ikm3rSTR.mjs +2 -0
- package/dist/chunks/zh-ikm3rSTR.mjs.map +1 -0
- package/dist/chunks/zh-oZl1P_p0.mjs +2 -0
- package/dist/chunks/zh-oZl1P_p0.mjs.map +1 -0
- package/dist/commands/AttributedMarkCommands.d.ts.map +1 -1
- package/dist/commands/BlockInsertion.d.ts +74 -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 +10 -2
- 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/editor/ContentSerializer.d.ts +1 -1
- package/dist/editor/ContentSerializer.d.ts.map +1 -1
- package/dist/editor/NotectlEditor.d.ts +10 -5
- package/dist/editor/NotectlEditor.d.ts.map +1 -1
- package/dist/editor/styles/list.d.ts +1 -1
- package/dist/editor/styles/list.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 +1 -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/KeyDescriptor.d.ts +40 -0
- package/dist/input/KeyDescriptor.d.ts.map +1 -0
- package/dist/input/KeyboardHandler.d.ts +17 -5
- 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 +23 -4
- 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 +36 -2
- 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 +11 -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/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/PluginContextFactory.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.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/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.map +1 -1
- package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockPlugin.d.ts +1 -35
- 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/TokenCache.d.ts +21 -0
- package/dist/plugins/code-block/TokenCache.d.ts.map +1 -0
- 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 +49 -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 +51 -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 +19 -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/FormulaSerialization.d.ts +17 -0
- package/dist/plugins/formula/FormulaSerialization.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 +21 -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 +67 -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.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.mjs +1 -1
- package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
- package/dist/plugins/link.mjs +1 -1
- package/dist/plugins/list/ListCommands.d.ts +16 -3
- package/dist/plugins/list/ListCommands.d.ts.map +1 -1
- package/dist/plugins/list/ListLocale.d.ts +6 -0
- package/dist/plugins/list/ListLocale.d.ts.map +1 -1
- package/dist/plugins/list/ListMarker.d.ts +14 -0
- package/dist/plugins/list/ListMarker.d.ts.map +1 -0
- package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
- package/dist/plugins/list/locales/ar.d.ts.map +1 -1
- package/dist/plugins/list/locales/de.d.ts.map +1 -1
- package/dist/plugins/list/locales/es.d.ts.map +1 -1
- package/dist/plugins/list/locales/fr.d.ts.map +1 -1
- package/dist/plugins/list/locales/hi.d.ts.map +1 -1
- package/dist/plugins/list/locales/pt.d.ts.map +1 -1
- package/dist/plugins/list/locales/ru.d.ts.map +1 -1
- package/dist/plugins/list/locales/zh.d.ts.map +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.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/ToolbarPopupController.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/InlineContentOps.d.ts +5 -3
- package/dist/state/InlineContentOps.d.ts.map +1 -1
- package/dist/state/NavigationQueries.d.ts +11 -0
- package/dist/state/NavigationQueries.d.ts.map +1 -1
- package/dist/state/StepInversion.d.ts.map +1 -1
- package/dist/state/StepMaps.d.ts.map +1 -1
- package/dist/state/Steps.d.ts +20 -3
- package/dist/state/Steps.d.ts.map +1 -1
- package/dist/state/TransactionBuilder.d.ts +3 -3
- 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/SelectionSync.d.ts.map +1 -1
- package/dist/view/ViewMovementCommands.d.ts.map +1 -1
- package/package.json +423 -400
- package/dist/chunks/AlignmentPlugin-CjmLXGsv.mjs +0 -2
- package/dist/chunks/AlignmentPlugin-CjmLXGsv.mjs.map +0 -1
- package/dist/chunks/AttrRegistry-cXq6uQK2.mjs +0 -2
- package/dist/chunks/AttrRegistry-cXq6uQK2.mjs.map +0 -1
- package/dist/chunks/AttributedMarkCommands-Ctt_1xRD.mjs +0 -2
- package/dist/chunks/AttributedMarkCommands-Ctt_1xRD.mjs.map +0 -1
- package/dist/chunks/BidiIsolationPlugin-q3zoofgZ.mjs +0 -2
- package/dist/chunks/BidiIsolationPlugin-q3zoofgZ.mjs.map +0 -1
- package/dist/chunks/BlockInsertion-4QmiYRMo.mjs +0 -2
- package/dist/chunks/BlockInsertion-4QmiYRMo.mjs.map +0 -1
- package/dist/chunks/BlockTypePickerRegistry-DgI_LlNO.mjs +0 -2
- package/dist/chunks/BlockTypePickerRegistry-DgI_LlNO.mjs.map +0 -1
- package/dist/chunks/BlockquotePlugin-BTsDYB3K.mjs +0 -2
- package/dist/chunks/BlockquotePlugin-BTsDYB3K.mjs.map +0 -1
- package/dist/chunks/CaretNavigationPlugin-BFBov4H7.mjs +0 -2
- package/dist/chunks/CaretNavigationPlugin-BFBov4H7.mjs.map +0 -1
- package/dist/chunks/CodeBlockPlugin-o0Aoq9Nu.mjs +0 -2
- package/dist/chunks/CodeBlockPlugin-o0Aoq9Nu.mjs.map +0 -1
- package/dist/chunks/ColorGrid-U5NtjqyV.mjs +0 -2
- package/dist/chunks/ColorGrid-U5NtjqyV.mjs.map +0 -1
- package/dist/chunks/ColorPickerPopup-BYSMUZZx.mjs +0 -2
- package/dist/chunks/ColorPickerPopup-BYSMUZZx.mjs.map +0 -1
- package/dist/chunks/ColorValidation-3viVw_tK.mjs +0 -2
- package/dist/chunks/ColorValidation-3viVw_tK.mjs.map +0 -1
- package/dist/chunks/CommandHelpers-BqHfwW7i.mjs +0 -2
- package/dist/chunks/CommandHelpers-BqHfwW7i.mjs.map +0 -1
- package/dist/chunks/Commands-BC_EPIEx.mjs +0 -2
- package/dist/chunks/Commands-BC_EPIEx.mjs.map +0 -1
- package/dist/chunks/Decoration-BeTkTHRO.mjs +0 -2
- package/dist/chunks/Decoration-BeTkTHRO.mjs.map +0 -1
- package/dist/chunks/DirectionDetection-kAewerPz.mjs +0 -2
- package/dist/chunks/DirectionDetection-kAewerPz.mjs.map +0 -1
- package/dist/chunks/DirectionIcons-BQHHAEYU.mjs +0 -2
- package/dist/chunks/DirectionIcons-BQHHAEYU.mjs.map +0 -1
- package/dist/chunks/Document-DJmYYuBx.mjs +0 -2
- package/dist/chunks/Document-DJmYYuBx.mjs.map +0 -1
- package/dist/chunks/DocumentParser-D2hn-48i.mjs +0 -2
- package/dist/chunks/DocumentParser-D2hn-48i.mjs.map +0 -1
- package/dist/chunks/DomUtils-RKbAVBQz.mjs +0 -2
- package/dist/chunks/DomUtils-RKbAVBQz.mjs.map +0 -1
- package/dist/chunks/FontPlugin-TmUrcVn1.mjs +0 -2
- package/dist/chunks/FontPlugin-TmUrcVn1.mjs.map +0 -1
- package/dist/chunks/FontSizePlugin-Bwui7gLI.mjs +0 -2
- package/dist/chunks/FontSizePlugin-Bwui7gLI.mjs.map +0 -1
- package/dist/chunks/GapCursorNavigation-BEO5L2-O.mjs +0 -2
- package/dist/chunks/GapCursorNavigation-BEO5L2-O.mjs.map +0 -1
- package/dist/chunks/GapCursorPlugin-BiZQyVrJ.mjs +0 -2
- package/dist/chunks/GapCursorPlugin-BiZQyVrJ.mjs.map +0 -1
- package/dist/chunks/HTMLUtils-brwcaufP.mjs +0 -2
- package/dist/chunks/HTMLUtils-brwcaufP.mjs.map +0 -1
- package/dist/chunks/HardBreakPlugin-Dj4pkSk-.mjs +0 -2
- package/dist/chunks/HardBreakPlugin-Dj4pkSk-.mjs.map +0 -1
- package/dist/chunks/HeadingPlugin-D8xIRk25.mjs +0 -2
- package/dist/chunks/HeadingPlugin-D8xIRk25.mjs.map +0 -1
- package/dist/chunks/HighlightPlugin-CNX7lup0.mjs +0 -2
- package/dist/chunks/HighlightPlugin-CNX7lup0.mjs.map +0 -1
- package/dist/chunks/HorizontalRulePlugin-D-ZjKGDv.mjs +0 -2
- package/dist/chunks/HorizontalRulePlugin-D-ZjKGDv.mjs.map +0 -1
- package/dist/chunks/ImagePlugin-DwL8i3pO.mjs +0 -2
- package/dist/chunks/ImagePlugin-DwL8i3pO.mjs.map +0 -1
- package/dist/chunks/InlineCodePlugin-BpXNuKAa.mjs +0 -2
- package/dist/chunks/InlineCodePlugin-BpXNuKAa.mjs.map +0 -1
- package/dist/chunks/KeyboardNav-BZIHDPDV.mjs +0 -2
- package/dist/chunks/KeyboardNav-BZIHDPDV.mjs.map +0 -1
- package/dist/chunks/LinkPlugin-BK15pc0u.mjs +0 -2
- package/dist/chunks/LinkPlugin-BK15pc0u.mjs.map +0 -1
- package/dist/chunks/ListPlugin-B5ihlVNx.mjs +0 -2
- package/dist/chunks/ListPlugin-B5ihlVNx.mjs.map +0 -1
- package/dist/chunks/NavigationQueries-DhptdQBe.mjs +0 -2
- package/dist/chunks/NavigationQueries-DhptdQBe.mjs.map +0 -1
- package/dist/chunks/NodeSelectionCommands-DenSYOfB.mjs +0 -2
- package/dist/chunks/NodeSelectionCommands-DenSYOfB.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-BZphovwz.mjs +0 -2
- package/dist/chunks/PluginHelpers-BZphovwz.mjs.map +0 -1
- package/dist/chunks/PopupKeyboardPatterns-CgUM5kPf.mjs +0 -2
- package/dist/chunks/PopupKeyboardPatterns-CgUM5kPf.mjs.map +0 -1
- package/dist/chunks/PopupManager-B5SHhDsx.mjs +0 -2
- package/dist/chunks/PopupManager-B5SHhDsx.mjs.map +0 -1
- package/dist/chunks/PopupPositioning-BfahfPOm.mjs +0 -2
- package/dist/chunks/PopupPositioning-BfahfPOm.mjs.map +0 -1
- package/dist/chunks/PrintPlugin-CckjtZ9B.mjs +0 -2
- package/dist/chunks/PrintPlugin-CckjtZ9B.mjs.map +0 -1
- package/dist/chunks/PrintTypes-Ci3XW_s8.mjs +0 -2
- package/dist/chunks/PrintTypes-Ci3XW_s8.mjs.map +0 -1
- package/dist/chunks/RangeIterator-ZooGMxGy.mjs +0 -2
- package/dist/chunks/RangeIterator-ZooGMxGy.mjs.map +0 -1
- package/dist/chunks/Selection-aeiSsvhe.mjs +0 -2
- package/dist/chunks/Selection-aeiSsvhe.mjs.map +0 -1
- package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs +0 -2
- package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs.map +0 -1
- package/dist/chunks/SmartPastePlugin-B_zi9WT9.mjs +0 -2
- package/dist/chunks/SmartPastePlugin-B_zi9WT9.mjs.map +0 -1
- package/dist/chunks/StrikethroughPlugin-2XDKYefG.mjs +0 -2
- package/dist/chunks/StrikethroughPlugin-2XDKYefG.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-6gdrjKZv.mjs +0 -2
- package/dist/chunks/SuperSubPlugin-6gdrjKZv.mjs.map +0 -1
- package/dist/chunks/SyntaxTokenTypes-DZwhanGO.mjs +0 -2
- package/dist/chunks/SyntaxTokenTypes-DZwhanGO.mjs.map +0 -1
- package/dist/chunks/TablePlugin-DW78Y4pB.mjs +0 -2
- package/dist/chunks/TablePlugin-DW78Y4pB.mjs.map +0 -1
- package/dist/chunks/TextColorPlugin-CgHro45N.mjs +0 -2
- package/dist/chunks/TextColorPlugin-CgHro45N.mjs.map +0 -1
- package/dist/chunks/TextDirectionAutoPlugin-C88ZeXJo.mjs +0 -2
- package/dist/chunks/TextDirectionAutoPlugin-C88ZeXJo.mjs.map +0 -1
- package/dist/chunks/TextDirectionPlugin-BTTqrWbL.mjs +0 -2
- package/dist/chunks/TextDirectionPlugin-BTTqrWbL.mjs.map +0 -1
- package/dist/chunks/TextDirectionService-DzuOMFm8.mjs +0 -2
- package/dist/chunks/TextDirectionService-DzuOMFm8.mjs.map +0 -1
- package/dist/chunks/TextFormattingPlugin-BD4Qlpls.mjs +0 -2
- package/dist/chunks/TextFormattingPlugin-BD4Qlpls.mjs.map +0 -1
- package/dist/chunks/ToolbarPlugin-D5_-gWmH.mjs +0 -2
- package/dist/chunks/ToolbarPlugin-D5_-gWmH.mjs.map +0 -1
- package/dist/chunks/TypeBrands-BZDKMjR-.mjs +0 -2
- package/dist/chunks/TypeBrands-BZDKMjR-.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-Cz2bSRAU.mjs +0 -2
- package/dist/chunks/WordBoundary-Cz2bSRAU.mjs.map +0 -1
- package/dist/chunks/XmlDetector-DM-Vv-XW.mjs +0 -2
- package/dist/chunks/XmlDetector-DM-Vv-XW.mjs.map +0 -1
- package/dist/chunks/XmlPatterns-B-V-mHF4.mjs +0 -2
- package/dist/chunks/XmlPatterns-B-V-mHF4.mjs.map +0 -1
- package/dist/chunks/XmlSupport-Dr1S1HN9.mjs +0 -2
- package/dist/chunks/XmlSupport-Dr1S1HN9.mjs.map +0 -1
- package/dist/chunks/ar-4r3DgNTY.mjs +0 -2
- package/dist/chunks/ar-4r3DgNTY.mjs.map +0 -1
- package/dist/chunks/ar-7EtzKNIe.mjs +0 -2
- package/dist/chunks/ar-7EtzKNIe.mjs.map +0 -1
- package/dist/chunks/ar-B2pDI_LT.mjs +0 -2
- package/dist/chunks/ar-B2pDI_LT.mjs.map +0 -1
- package/dist/chunks/ar-BV6-zQd7.mjs +0 -2
- package/dist/chunks/ar-BV6-zQd7.mjs.map +0 -1
- package/dist/chunks/ar-BaCL4Bzy.mjs +0 -2
- package/dist/chunks/ar-BaCL4Bzy.mjs.map +0 -1
- package/dist/chunks/ar-BdGHrLSw.mjs +0 -2
- package/dist/chunks/ar-BdGHrLSw.mjs.map +0 -1
- package/dist/chunks/ar-BwYDKOvO.mjs +0 -2
- package/dist/chunks/ar-BwYDKOvO.mjs.map +0 -1
- package/dist/chunks/ar-C5eLSf71.mjs +0 -2
- package/dist/chunks/ar-C5eLSf71.mjs.map +0 -1
- package/dist/chunks/ar-CEUn6f7s.mjs +0 -2
- package/dist/chunks/ar-CEUn6f7s.mjs.map +0 -1
- package/dist/chunks/ar-CGYb1t6O.mjs +0 -2
- package/dist/chunks/ar-CGYb1t6O.mjs.map +0 -1
- package/dist/chunks/ar-CjK36QZ9.mjs +0 -2
- package/dist/chunks/ar-CjK36QZ9.mjs.map +0 -1
- package/dist/chunks/ar-D9jfC3WF.mjs +0 -2
- package/dist/chunks/ar-D9jfC3WF.mjs.map +0 -1
- package/dist/chunks/ar-DFeA_UxF.mjs +0 -2
- package/dist/chunks/ar-DFeA_UxF.mjs.map +0 -1
- package/dist/chunks/ar-DMuawOHV.mjs +0 -2
- package/dist/chunks/ar-DMuawOHV.mjs.map +0 -1
- package/dist/chunks/ar-DV30sa3s.mjs +0 -2
- package/dist/chunks/ar-DV30sa3s.mjs.map +0 -1
- package/dist/chunks/ar-DWwG54pa.mjs +0 -2
- package/dist/chunks/ar-DWwG54pa.mjs.map +0 -1
- package/dist/chunks/ar-DcJbUbml.mjs +0 -2
- package/dist/chunks/ar-DcJbUbml.mjs.map +0 -1
- package/dist/chunks/ar-DelI54_I.mjs +0 -2
- package/dist/chunks/ar-DelI54_I.mjs.map +0 -1
- package/dist/chunks/ar-DmqFnvxC.mjs +0 -2
- package/dist/chunks/ar-DmqFnvxC.mjs.map +0 -1
- package/dist/chunks/ar-DpEHjBUk.mjs +0 -2
- package/dist/chunks/ar-DpEHjBUk.mjs.map +0 -1
- package/dist/chunks/ar-EnfTpUuB.mjs +0 -2
- package/dist/chunks/ar-EnfTpUuB.mjs.map +0 -1
- package/dist/chunks/ar-ZHVy9O4c.mjs +0 -2
- package/dist/chunks/ar-ZHVy9O4c.mjs.map +0 -1
- package/dist/chunks/ar-_7aFyBGi.mjs +0 -2
- package/dist/chunks/ar-_7aFyBGi.mjs.map +0 -1
- package/dist/chunks/ar-l75rG_xT.mjs +0 -2
- package/dist/chunks/ar-l75rG_xT.mjs.map +0 -1
- package/dist/chunks/ar-qU1PohHA.mjs +0 -2
- package/dist/chunks/ar-qU1PohHA.mjs.map +0 -1
- package/dist/chunks/color-picker-BTex2Cfu.mjs +0 -2
- package/dist/chunks/color-picker-BTex2Cfu.mjs.map +0 -1
- package/dist/chunks/de-BDfimoiQ.mjs +0 -2
- package/dist/chunks/de-BDfimoiQ.mjs.map +0 -1
- package/dist/chunks/de-BSkOdXQZ.mjs +0 -2
- package/dist/chunks/de-BSkOdXQZ.mjs.map +0 -1
- package/dist/chunks/de-BooQr0-C.mjs +0 -2
- package/dist/chunks/de-BooQr0-C.mjs.map +0 -1
- package/dist/chunks/de-ByvLzlOc.mjs +0 -2
- package/dist/chunks/de-ByvLzlOc.mjs.map +0 -1
- package/dist/chunks/de-C03n6uR5.mjs +0 -2
- package/dist/chunks/de-C03n6uR5.mjs.map +0 -1
- package/dist/chunks/de-C0TfkuUd.mjs +0 -2
- package/dist/chunks/de-C0TfkuUd.mjs.map +0 -1
- package/dist/chunks/de-C0khkRSC.mjs +0 -2
- package/dist/chunks/de-C0khkRSC.mjs.map +0 -1
- package/dist/chunks/de-C4IW4BVo.mjs +0 -2
- package/dist/chunks/de-C4IW4BVo.mjs.map +0 -1
- package/dist/chunks/de-CDSG9CMy.mjs +0 -2
- package/dist/chunks/de-CDSG9CMy.mjs.map +0 -1
- package/dist/chunks/de-CkIwUE6R.mjs +0 -2
- package/dist/chunks/de-CkIwUE6R.mjs.map +0 -1
- package/dist/chunks/de-CmJ9oOiP.mjs +0 -2
- package/dist/chunks/de-CmJ9oOiP.mjs.map +0 -1
- package/dist/chunks/de-CrjOjB4F.mjs +0 -2
- package/dist/chunks/de-CrjOjB4F.mjs.map +0 -1
- package/dist/chunks/de-D5_uflBY.mjs +0 -2
- package/dist/chunks/de-D5_uflBY.mjs.map +0 -1
- package/dist/chunks/de-DH5zRyrS.mjs +0 -2
- package/dist/chunks/de-DH5zRyrS.mjs.map +0 -1
- package/dist/chunks/de-DJqgaz5N.mjs +0 -2
- package/dist/chunks/de-DJqgaz5N.mjs.map +0 -1
- package/dist/chunks/de-DMiAi5QJ.mjs +0 -2
- package/dist/chunks/de-DMiAi5QJ.mjs.map +0 -1
- package/dist/chunks/de-DT6VbHNl.mjs +0 -2
- package/dist/chunks/de-DT6VbHNl.mjs.map +0 -1
- package/dist/chunks/de-DbqObFs9.mjs +0 -2
- package/dist/chunks/de-DbqObFs9.mjs.map +0 -1
- package/dist/chunks/de-Dl0svzeh.mjs +0 -2
- package/dist/chunks/de-Dl0svzeh.mjs.map +0 -1
- package/dist/chunks/de-DzMY3LLH.mjs +0 -2
- package/dist/chunks/de-DzMY3LLH.mjs.map +0 -1
- package/dist/chunks/de-JGuzWRyC.mjs +0 -2
- package/dist/chunks/de-JGuzWRyC.mjs.map +0 -1
- package/dist/chunks/de-MOHX9tl7.mjs +0 -2
- package/dist/chunks/de-MOHX9tl7.mjs.map +0 -1
- package/dist/chunks/de-mtjvG1Li.mjs +0 -2
- package/dist/chunks/de-mtjvG1Li.mjs.map +0 -1
- package/dist/chunks/de-oNyi0r7G.mjs +0 -2
- package/dist/chunks/de-oNyi0r7G.mjs.map +0 -1
- package/dist/chunks/de-y5fJdnH9.mjs +0 -2
- package/dist/chunks/de-y5fJdnH9.mjs.map +0 -1
- package/dist/chunks/es-B-V14ELw.mjs +0 -2
- package/dist/chunks/es-B-V14ELw.mjs.map +0 -1
- package/dist/chunks/es-Bf6WRo_H.mjs +0 -2
- package/dist/chunks/es-Bf6WRo_H.mjs.map +0 -1
- package/dist/chunks/es-Bw9vJu_M.mjs +0 -2
- package/dist/chunks/es-Bw9vJu_M.mjs.map +0 -1
- package/dist/chunks/es-CCdE3xXm.mjs +0 -2
- package/dist/chunks/es-CCdE3xXm.mjs.map +0 -1
- package/dist/chunks/es-CDoZMS8v.mjs +0 -2
- package/dist/chunks/es-CDoZMS8v.mjs.map +0 -1
- package/dist/chunks/es-CO1hBMDj.mjs +0 -2
- package/dist/chunks/es-CO1hBMDj.mjs.map +0 -1
- package/dist/chunks/es-CU2TUgK3.mjs +0 -2
- package/dist/chunks/es-CU2TUgK3.mjs.map +0 -1
- package/dist/chunks/es-CXeJJ2r1.mjs +0 -2
- package/dist/chunks/es-CXeJJ2r1.mjs.map +0 -1
- package/dist/chunks/es-Cc337sYN.mjs +0 -2
- package/dist/chunks/es-Cc337sYN.mjs.map +0 -1
- package/dist/chunks/es-Ck88JtiM.mjs +0 -2
- package/dist/chunks/es-Ck88JtiM.mjs.map +0 -1
- package/dist/chunks/es-CmOFsz0P.mjs +0 -2
- package/dist/chunks/es-CmOFsz0P.mjs.map +0 -1
- package/dist/chunks/es-CpcUYxtO.mjs +0 -2
- package/dist/chunks/es-CpcUYxtO.mjs.map +0 -1
- package/dist/chunks/es-Cqp8LgVd.mjs +0 -2
- package/dist/chunks/es-Cqp8LgVd.mjs.map +0 -1
- package/dist/chunks/es-CsK826Q8.mjs +0 -2
- package/dist/chunks/es-CsK826Q8.mjs.map +0 -1
- package/dist/chunks/es-D7wyE736.mjs +0 -2
- package/dist/chunks/es-D7wyE736.mjs.map +0 -1
- package/dist/chunks/es-DGCoEaRB.mjs +0 -2
- package/dist/chunks/es-DGCoEaRB.mjs.map +0 -1
- package/dist/chunks/es-DPsoXXVT.mjs +0 -2
- package/dist/chunks/es-DPsoXXVT.mjs.map +0 -1
- package/dist/chunks/es-Df2ocRb2.mjs +0 -2
- package/dist/chunks/es-Df2ocRb2.mjs.map +0 -1
- package/dist/chunks/es-DgVSWMPU.mjs +0 -2
- package/dist/chunks/es-DgVSWMPU.mjs.map +0 -1
- package/dist/chunks/es-Dltvy1GA.mjs +0 -2
- package/dist/chunks/es-Dltvy1GA.mjs.map +0 -1
- package/dist/chunks/es-DtElbzrQ.mjs +0 -2
- package/dist/chunks/es-DtElbzrQ.mjs.map +0 -1
- package/dist/chunks/es-ERjP_b2h.mjs +0 -2
- package/dist/chunks/es-ERjP_b2h.mjs.map +0 -1
- package/dist/chunks/es-SN8M8vXY.mjs +0 -2
- package/dist/chunks/es-SN8M8vXY.mjs.map +0 -1
- package/dist/chunks/es-domW6tKg.mjs +0 -2
- package/dist/chunks/es-domW6tKg.mjs.map +0 -1
- package/dist/chunks/es-luS_ivBE.mjs +0 -2
- package/dist/chunks/es-luS_ivBE.mjs.map +0 -1
- package/dist/chunks/fonts-DVgoAAns.mjs +0 -2
- package/dist/chunks/fonts-DVgoAAns.mjs.map +0 -1
- package/dist/chunks/fr-BPa6RyuB.mjs +0 -2
- package/dist/chunks/fr-BPa6RyuB.mjs.map +0 -1
- package/dist/chunks/fr-BYK62vy-.mjs +0 -2
- package/dist/chunks/fr-BYK62vy-.mjs.map +0 -1
- package/dist/chunks/fr-BZH71A1g.mjs +0 -2
- package/dist/chunks/fr-BZH71A1g.mjs.map +0 -1
- package/dist/chunks/fr-BomQM4Qz.mjs +0 -2
- package/dist/chunks/fr-BomQM4Qz.mjs.map +0 -1
- package/dist/chunks/fr-BujOdWeE.mjs +0 -2
- package/dist/chunks/fr-BujOdWeE.mjs.map +0 -1
- package/dist/chunks/fr-C6BCt-Fk.mjs +0 -2
- package/dist/chunks/fr-C6BCt-Fk.mjs.map +0 -1
- package/dist/chunks/fr-C8NXcJOp.mjs +0 -2
- package/dist/chunks/fr-C8NXcJOp.mjs.map +0 -1
- package/dist/chunks/fr-C8aNnvoW.mjs +0 -2
- package/dist/chunks/fr-C8aNnvoW.mjs.map +0 -1
- package/dist/chunks/fr-C8jqjdbQ.mjs +0 -2
- package/dist/chunks/fr-C8jqjdbQ.mjs.map +0 -1
- package/dist/chunks/fr-Cg97syqs.mjs +0 -2
- package/dist/chunks/fr-Cg97syqs.mjs.map +0 -1
- package/dist/chunks/fr-CiT36QA9.mjs +0 -2
- package/dist/chunks/fr-CiT36QA9.mjs.map +0 -1
- package/dist/chunks/fr-D3Ho_0MV.mjs +0 -2
- package/dist/chunks/fr-D3Ho_0MV.mjs.map +0 -1
- package/dist/chunks/fr-DA37dDuJ.mjs +0 -2
- package/dist/chunks/fr-DA37dDuJ.mjs.map +0 -1
- package/dist/chunks/fr-DK9dc8bZ.mjs +0 -2
- package/dist/chunks/fr-DK9dc8bZ.mjs.map +0 -1
- package/dist/chunks/fr-DNA_bC6X.mjs +0 -2
- package/dist/chunks/fr-DNA_bC6X.mjs.map +0 -1
- package/dist/chunks/fr-DPXU2MTy.mjs +0 -2
- package/dist/chunks/fr-DPXU2MTy.mjs.map +0 -1
- package/dist/chunks/fr-DZCsB6H7.mjs +0 -2
- package/dist/chunks/fr-DZCsB6H7.mjs.map +0 -1
- package/dist/chunks/fr-Dd8f28BD.mjs +0 -2
- package/dist/chunks/fr-Dd8f28BD.mjs.map +0 -1
- package/dist/chunks/fr-DmCLgc4F.mjs +0 -2
- package/dist/chunks/fr-DmCLgc4F.mjs.map +0 -1
- package/dist/chunks/fr-DtEXB4RG.mjs +0 -2
- package/dist/chunks/fr-DtEXB4RG.mjs.map +0 -1
- package/dist/chunks/fr-FvGvPlqS.mjs +0 -2
- package/dist/chunks/fr-FvGvPlqS.mjs.map +0 -1
- package/dist/chunks/fr-V3LUcmFE.mjs +0 -2
- package/dist/chunks/fr-V3LUcmFE.mjs.map +0 -1
- package/dist/chunks/fr-eiqXGNgf.mjs +0 -2
- package/dist/chunks/fr-eiqXGNgf.mjs.map +0 -1
- package/dist/chunks/fr-fEWGSNI2.mjs +0 -2
- package/dist/chunks/fr-fEWGSNI2.mjs.map +0 -1
- package/dist/chunks/fr-w23c3SBW.mjs +0 -2
- package/dist/chunks/fr-w23c3SBW.mjs.map +0 -1
- package/dist/chunks/full-yocxIDB8.mjs +0 -2
- package/dist/chunks/full-yocxIDB8.mjs.map +0 -1
- package/dist/chunks/hi-4Xqp7mZC.mjs +0 -2
- package/dist/chunks/hi-4Xqp7mZC.mjs.map +0 -1
- package/dist/chunks/hi-8Eu7f89Y.mjs +0 -2
- package/dist/chunks/hi-8Eu7f89Y.mjs.map +0 -1
- package/dist/chunks/hi-BA9PP8mL.mjs +0 -2
- package/dist/chunks/hi-BA9PP8mL.mjs.map +0 -1
- package/dist/chunks/hi-BLCjECcV.mjs +0 -2
- package/dist/chunks/hi-BLCjECcV.mjs.map +0 -1
- package/dist/chunks/hi-BX9P0764.mjs +0 -2
- package/dist/chunks/hi-BX9P0764.mjs.map +0 -1
- package/dist/chunks/hi-BakCaBYh.mjs +0 -2
- package/dist/chunks/hi-BakCaBYh.mjs.map +0 -1
- package/dist/chunks/hi-BoITZeVd.mjs +0 -2
- package/dist/chunks/hi-BoITZeVd.mjs.map +0 -1
- package/dist/chunks/hi-C3BvlTfV.mjs +0 -2
- package/dist/chunks/hi-C3BvlTfV.mjs.map +0 -1
- package/dist/chunks/hi-C5HGb5IH.mjs +0 -2
- package/dist/chunks/hi-C5HGb5IH.mjs.map +0 -1
- package/dist/chunks/hi-CIpo_sTL.mjs +0 -2
- package/dist/chunks/hi-CIpo_sTL.mjs.map +0 -1
- package/dist/chunks/hi-CWRofsw7.mjs +0 -2
- package/dist/chunks/hi-CWRofsw7.mjs.map +0 -1
- package/dist/chunks/hi-C_eipolR.mjs +0 -2
- package/dist/chunks/hi-C_eipolR.mjs.map +0 -1
- package/dist/chunks/hi-ClaAWR5y.mjs +0 -2
- package/dist/chunks/hi-ClaAWR5y.mjs.map +0 -1
- package/dist/chunks/hi-Cn2ywhVT.mjs +0 -2
- package/dist/chunks/hi-Cn2ywhVT.mjs.map +0 -1
- package/dist/chunks/hi-CrsqMuKk.mjs +0 -2
- package/dist/chunks/hi-CrsqMuKk.mjs.map +0 -1
- package/dist/chunks/hi-D-iC4Hvv.mjs +0 -2
- package/dist/chunks/hi-D-iC4Hvv.mjs.map +0 -1
- package/dist/chunks/hi-DEN9a54c.mjs +0 -2
- package/dist/chunks/hi-DEN9a54c.mjs.map +0 -1
- package/dist/chunks/hi-DK9HmINW.mjs +0 -2
- package/dist/chunks/hi-DK9HmINW.mjs.map +0 -1
- package/dist/chunks/hi-DOnHDEqt.mjs +0 -2
- package/dist/chunks/hi-DOnHDEqt.mjs.map +0 -1
- package/dist/chunks/hi-DY0SGobQ.mjs +0 -2
- package/dist/chunks/hi-DY0SGobQ.mjs.map +0 -1
- package/dist/chunks/hi-FSXMWIXU.mjs +0 -2
- package/dist/chunks/hi-FSXMWIXU.mjs.map +0 -1
- package/dist/chunks/hi-JroSY-2k.mjs +0 -2
- package/dist/chunks/hi-JroSY-2k.mjs.map +0 -1
- package/dist/chunks/hi-WDIZzgAJ.mjs +0 -2
- package/dist/chunks/hi-WDIZzgAJ.mjs.map +0 -1
- package/dist/chunks/hi-fLLnVGix.mjs +0 -2
- package/dist/chunks/hi-fLLnVGix.mjs.map +0 -1
- package/dist/chunks/hi-f_MCrd2N.mjs +0 -2
- package/dist/chunks/hi-f_MCrd2N.mjs.map +0 -1
- package/dist/chunks/minimal-BL3kgYy-.mjs +0 -2
- package/dist/chunks/minimal-BL3kgYy-.mjs.map +0 -1
- package/dist/chunks/pt-206lqjCP.mjs +0 -2
- package/dist/chunks/pt-206lqjCP.mjs.map +0 -1
- package/dist/chunks/pt-B5wz6m3c.mjs +0 -2
- package/dist/chunks/pt-B5wz6m3c.mjs.map +0 -1
- package/dist/chunks/pt-B6KMxxw4.mjs +0 -2
- package/dist/chunks/pt-B6KMxxw4.mjs.map +0 -1
- package/dist/chunks/pt-BCg3YzEh.mjs +0 -2
- package/dist/chunks/pt-BCg3YzEh.mjs.map +0 -1
- package/dist/chunks/pt-BFr-zfd2.mjs +0 -2
- package/dist/chunks/pt-BFr-zfd2.mjs.map +0 -1
- package/dist/chunks/pt-BG1fIcHV.mjs +0 -2
- package/dist/chunks/pt-BG1fIcHV.mjs.map +0 -1
- package/dist/chunks/pt-Bhytb-k2.mjs +0 -2
- package/dist/chunks/pt-Bhytb-k2.mjs.map +0 -1
- package/dist/chunks/pt-Bjb6_1gI.mjs +0 -2
- package/dist/chunks/pt-Bjb6_1gI.mjs.map +0 -1
- package/dist/chunks/pt-BzQagqFt.mjs +0 -2
- package/dist/chunks/pt-BzQagqFt.mjs.map +0 -1
- package/dist/chunks/pt-C2rlfcQ4.mjs +0 -2
- package/dist/chunks/pt-C2rlfcQ4.mjs.map +0 -1
- package/dist/chunks/pt-C4xLSFYA.mjs +0 -2
- package/dist/chunks/pt-C4xLSFYA.mjs.map +0 -1
- package/dist/chunks/pt-CBxnU7dE.mjs +0 -2
- package/dist/chunks/pt-CBxnU7dE.mjs.map +0 -1
- package/dist/chunks/pt-CMXLiIJ3.mjs +0 -2
- package/dist/chunks/pt-CMXLiIJ3.mjs.map +0 -1
- package/dist/chunks/pt-Cn2yMIyR.mjs +0 -2
- package/dist/chunks/pt-Cn2yMIyR.mjs.map +0 -1
- package/dist/chunks/pt-DAh8UqJa.mjs +0 -2
- package/dist/chunks/pt-DAh8UqJa.mjs.map +0 -1
- package/dist/chunks/pt-DLe58Npz.mjs +0 -2
- package/dist/chunks/pt-DLe58Npz.mjs.map +0 -1
- package/dist/chunks/pt-D_DXzKyU.mjs +0 -2
- package/dist/chunks/pt-D_DXzKyU.mjs.map +0 -1
- package/dist/chunks/pt-DhC7TYvg.mjs +0 -2
- package/dist/chunks/pt-DhC7TYvg.mjs.map +0 -1
- package/dist/chunks/pt-Dl18NLl1.mjs +0 -2
- package/dist/chunks/pt-Dl18NLl1.mjs.map +0 -1
- package/dist/chunks/pt-Dz2YeCP4.mjs +0 -2
- package/dist/chunks/pt-Dz2YeCP4.mjs.map +0 -1
- package/dist/chunks/pt-GfM-nxvv.mjs +0 -2
- package/dist/chunks/pt-GfM-nxvv.mjs.map +0 -1
- package/dist/chunks/pt-PjsDW8WW.mjs +0 -2
- package/dist/chunks/pt-PjsDW8WW.mjs.map +0 -1
- package/dist/chunks/pt-X-M5uPLn.mjs +0 -2
- package/dist/chunks/pt-X-M5uPLn.mjs.map +0 -1
- package/dist/chunks/pt-appBsYpC.mjs +0 -2
- package/dist/chunks/pt-appBsYpC.mjs.map +0 -1
- package/dist/chunks/pt-i9ZFEE69.mjs +0 -2
- package/dist/chunks/pt-i9ZFEE69.mjs.map +0 -1
- package/dist/chunks/ru-B8HSQCj5.mjs +0 -2
- package/dist/chunks/ru-B8HSQCj5.mjs.map +0 -1
- package/dist/chunks/ru-BAOr7UOh.mjs +0 -2
- package/dist/chunks/ru-BAOr7UOh.mjs.map +0 -1
- package/dist/chunks/ru-BIV3iuR9.mjs +0 -2
- package/dist/chunks/ru-BIV3iuR9.mjs.map +0 -1
- package/dist/chunks/ru-BMJRGir6.mjs +0 -2
- package/dist/chunks/ru-BMJRGir6.mjs.map +0 -1
- package/dist/chunks/ru-BO59Tir1.mjs +0 -2
- package/dist/chunks/ru-BO59Tir1.mjs.map +0 -1
- package/dist/chunks/ru-BRnZSWPo.mjs +0 -2
- package/dist/chunks/ru-BRnZSWPo.mjs.map +0 -1
- package/dist/chunks/ru-Bf546sX_.mjs +0 -2
- package/dist/chunks/ru-Bf546sX_.mjs.map +0 -1
- package/dist/chunks/ru-Bfjq7sha.mjs +0 -2
- package/dist/chunks/ru-Bfjq7sha.mjs.map +0 -1
- package/dist/chunks/ru-Bm8utWf9.mjs +0 -2
- package/dist/chunks/ru-Bm8utWf9.mjs.map +0 -1
- package/dist/chunks/ru-BmneOLgh.mjs +0 -2
- package/dist/chunks/ru-BmneOLgh.mjs.map +0 -1
- package/dist/chunks/ru-Byrj1o3C.mjs +0 -2
- package/dist/chunks/ru-Byrj1o3C.mjs.map +0 -1
- package/dist/chunks/ru-C8ftQh9b.mjs +0 -2
- package/dist/chunks/ru-C8ftQh9b.mjs.map +0 -1
- package/dist/chunks/ru-CNjcfDD9.mjs +0 -2
- package/dist/chunks/ru-CNjcfDD9.mjs.map +0 -1
- package/dist/chunks/ru-Ccya5aSC.mjs +0 -2
- package/dist/chunks/ru-Ccya5aSC.mjs.map +0 -1
- package/dist/chunks/ru-Cd-mH9wa.mjs +0 -2
- package/dist/chunks/ru-Cd-mH9wa.mjs.map +0 -1
- package/dist/chunks/ru-CeZe9jTZ.mjs +0 -2
- package/dist/chunks/ru-CeZe9jTZ.mjs.map +0 -1
- package/dist/chunks/ru-Cl03u8Q0.mjs +0 -2
- package/dist/chunks/ru-Cl03u8Q0.mjs.map +0 -1
- package/dist/chunks/ru-CoCIIElm.mjs +0 -2
- package/dist/chunks/ru-CoCIIElm.mjs.map +0 -1
- package/dist/chunks/ru-CzUyZZmy.mjs +0 -2
- package/dist/chunks/ru-CzUyZZmy.mjs.map +0 -1
- package/dist/chunks/ru-D3fRdonc.mjs +0 -2
- package/dist/chunks/ru-D3fRdonc.mjs.map +0 -1
- package/dist/chunks/ru-Ddy9ONaX.mjs +0 -2
- package/dist/chunks/ru-Ddy9ONaX.mjs.map +0 -1
- package/dist/chunks/ru-Dgcyz845.mjs +0 -2
- package/dist/chunks/ru-Dgcyz845.mjs.map +0 -1
- package/dist/chunks/ru-DnIXvlfL.mjs +0 -2
- package/dist/chunks/ru-DnIXvlfL.mjs.map +0 -1
- package/dist/chunks/ru-DyBnSwCM.mjs +0 -2
- package/dist/chunks/ru-DyBnSwCM.mjs.map +0 -1
- package/dist/chunks/ru-i27SgAts.mjs +0 -2
- package/dist/chunks/ru-i27SgAts.mjs.map +0 -1
- package/dist/chunks/src-DfK2_MVH.mjs +0 -2
- package/dist/chunks/src-DfK2_MVH.mjs.map +0 -1
- package/dist/chunks/zh-6QoY3dY_.mjs +0 -2
- package/dist/chunks/zh-6QoY3dY_.mjs.map +0 -1
- package/dist/chunks/zh-9WLieF9N.mjs +0 -2
- package/dist/chunks/zh-9WLieF9N.mjs.map +0 -1
- package/dist/chunks/zh-B0VaFyeQ.mjs +0 -2
- package/dist/chunks/zh-B0VaFyeQ.mjs.map +0 -1
- package/dist/chunks/zh-B4pfqHD3.mjs +0 -2
- package/dist/chunks/zh-B4pfqHD3.mjs.map +0 -1
- package/dist/chunks/zh-BpaN1Nmc.mjs +0 -2
- package/dist/chunks/zh-BpaN1Nmc.mjs.map +0 -1
- package/dist/chunks/zh-BqCL2eZf.mjs +0 -2
- package/dist/chunks/zh-BqCL2eZf.mjs.map +0 -1
- package/dist/chunks/zh-Bvgb-e4z.mjs +0 -2
- package/dist/chunks/zh-Bvgb-e4z.mjs.map +0 -1
- package/dist/chunks/zh-C2by0u64.mjs +0 -2
- package/dist/chunks/zh-C2by0u64.mjs.map +0 -1
- package/dist/chunks/zh-C4Ia0Zrx.mjs +0 -2
- package/dist/chunks/zh-C4Ia0Zrx.mjs.map +0 -1
- package/dist/chunks/zh-CBHCLph7.mjs +0 -2
- package/dist/chunks/zh-CBHCLph7.mjs.map +0 -1
- package/dist/chunks/zh-CBJQlvWb.mjs +0 -2
- package/dist/chunks/zh-CBJQlvWb.mjs.map +0 -1
- package/dist/chunks/zh-CBNSrvly.mjs +0 -2
- package/dist/chunks/zh-CBNSrvly.mjs.map +0 -1
- package/dist/chunks/zh-CKEh4EwR.mjs +0 -2
- package/dist/chunks/zh-CKEh4EwR.mjs.map +0 -1
- package/dist/chunks/zh-CN8KiZ9v.mjs +0 -2
- package/dist/chunks/zh-CN8KiZ9v.mjs.map +0 -1
- package/dist/chunks/zh-CRJMQ4dT.mjs +0 -2
- package/dist/chunks/zh-CRJMQ4dT.mjs.map +0 -1
- package/dist/chunks/zh-CSg0qxe0.mjs +0 -2
- package/dist/chunks/zh-CSg0qxe0.mjs.map +0 -1
- package/dist/chunks/zh-CX7Bx0ia.mjs +0 -2
- package/dist/chunks/zh-CX7Bx0ia.mjs.map +0 -1
- package/dist/chunks/zh-CvlL1G9n.mjs +0 -2
- package/dist/chunks/zh-CvlL1G9n.mjs.map +0 -1
- package/dist/chunks/zh-DBKn0pzM.mjs +0 -2
- package/dist/chunks/zh-DBKn0pzM.mjs.map +0 -1
- package/dist/chunks/zh-DLOng8d-.mjs +0 -2
- package/dist/chunks/zh-DLOng8d-.mjs.map +0 -1
- package/dist/chunks/zh-DLVkXfcI.mjs +0 -2
- package/dist/chunks/zh-DLVkXfcI.mjs.map +0 -1
- package/dist/chunks/zh-DuaKGwyq.mjs +0 -2
- package/dist/chunks/zh-DuaKGwyq.mjs.map +0 -1
- package/dist/chunks/zh-KUnAhArn.mjs +0 -2
- package/dist/chunks/zh-KUnAhArn.mjs.map +0 -1
- package/dist/chunks/zh-wVp_7rfC.mjs +0 -2
- package/dist/chunks/zh-wVp_7rfC.mjs.map +0 -1
- package/dist/chunks/zh-z2wm3EA5.mjs +0 -2
- package/dist/chunks/zh-z2wm3EA5.mjs.map +0 -1
- package/dist/input/InternalClipboard.d.ts +0 -13
- package/dist/input/InternalClipboard.d.ts.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as t}from"./HTMLUtils-C6B4UT00.mjs";import{s as r}from"./StyleRuntime-BAutwDZT.mjs";function e(e){const{type:n,rank:s,valueAttr:a,domStyleProperty:o,cssProperty:l,validate:i,validateOnParse:u,transformParsed:p}=e,c=t=>String(t.attrs?.[a]??"");return{type:n,rank:s,attrs:{[a]:{default:""}},toDOM(t){const e=document.createElement("span"),n=c(t);return n&&r(e,o,n),e},toHTMLString:(r,e,n)=>{const s=c(r);if(!s||!i(s))return e;const a=`${l}: ${t(s)}`;return`<span${n?.styleAttr(a)??` style="${a}"`}>${e}</span>`},toHTMLStyle:r=>{const e=c(r);return e&&i(e)?`${l}: ${t(e)}`:null},parseHTML:[{tag:"span",getAttrs:t=>{const r=t.style[o]??"";if(!r)return!1;if(u&&!i(r))return!1;const e=p?p(r):r;return{[a]:e}}}],sanitize:{tags:["span"]}}}export{e as t};
|
|
2
|
+
//# sourceMappingURL=InlineStyleMarkSpec-4R6DC7ij.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineStyleMarkSpec-4R6DC7ij.mjs","names":[],"sources":["../../src/plugins/shared/InlineStyleMarkSpec.ts"],"sourcesContent":["/**\n * Factory for inline marks that carry a single CSS style declaration (text\n * color, highlight, font family, font size). These marks share the same DOM\n * rendering, HTML import/export, and `<span>`-based parse shape and differ only\n * in the attribute name, CSS property, and validation.\n */\n\nimport type { Mark } from '../../model/Document.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { MarkSpec } from '../../model/MarkSpec.js';\nimport type { HTMLExportContext } from '../../model/NodeSpec.js';\nimport { setStyleProperty } from '../../style/StyleRuntime.js';\n\nexport interface InlineStyleMarkConfig {\n\t/** Mark type name, e.g. `'textColor'`. */\n\treadonly type: string;\n\t/** Nesting rank (lower renders closer to the text). */\n\treadonly rank: number;\n\t/** Attribute key holding the value, e.g. `'color'` / `'family'` / `'size'`. */\n\treadonly valueAttr: string;\n\t/** camelCase DOM style property, e.g. `'backgroundColor'`. */\n\treadonly domStyleProperty: string;\n\t/** kebab-case CSS property for HTML export, e.g. `'background-color'`. */\n\treadonly cssProperty: string;\n\t/** Validates a value for HTML export (and optionally on parse). */\n\treadonly validate: (value: string) => boolean;\n\t/** When true, `validate` is also enforced while parsing HTML. */\n\treadonly validateOnParse?: boolean;\n\t/** Optional transform applied to a parsed value (e.g. CSS quote normalization). */\n\treadonly transformParsed?: (value: string) => string;\n}\n\n/** Builds a MarkSpec for a single-CSS-property inline mark. */\nexport function createInlineStyleMarkSpec(config: InlineStyleMarkConfig): MarkSpec {\n\tconst {\n\t\ttype,\n\t\trank,\n\t\tvalueAttr,\n\t\tdomStyleProperty,\n\t\tcssProperty,\n\t\tvalidate,\n\t\tvalidateOnParse,\n\t\ttransformParsed,\n\t} = config;\n\n\tconst readValue = (mark: Mark): string => String(mark.attrs?.[valueAttr] ?? '');\n\n\treturn {\n\t\ttype,\n\t\trank,\n\t\tattrs: { [valueAttr]: { default: '' } },\n\t\ttoDOM(mark) {\n\t\t\tconst span: HTMLElement = document.createElement('span');\n\t\t\tconst value: string = readValue(mark);\n\t\t\tif (value) {\n\t\t\t\tsetStyleProperty(span, domStyleProperty, value);\n\t\t\t}\n\t\t\treturn span;\n\t\t},\n\t\ttoHTMLString: (mark: Mark, content: string, ctx?: HTMLExportContext) => {\n\t\t\tconst value: string = readValue(mark);\n\t\t\tif (!value || !validate(value)) return content;\n\t\t\tconst decl: string = `${cssProperty}: ${escapeHTML(value)}`;\n\t\t\tconst attr: string = ctx?.styleAttr(decl) ?? ` style=\"${decl}\"`;\n\t\t\treturn `<span${attr}>${content}</span>`;\n\t\t},\n\t\ttoHTMLStyle: (mark: Mark) => {\n\t\t\tconst value: string = readValue(mark);\n\t\t\tif (!value || !validate(value)) return null;\n\t\t\treturn `${cssProperty}: ${escapeHTML(value)}`;\n\t\t},\n\t\tparseHTML: [\n\t\t\t{\n\t\t\t\ttag: 'span',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\tconst raw: string =\n\t\t\t\t\t\t(el.style as unknown as Record<string, string>)[domStyleProperty] ?? '';\n\t\t\t\t\tif (!raw) return false;\n\t\t\t\t\tif (validateOnParse && !validate(raw)) return false;\n\t\t\t\t\tconst value: string = transformParsed ? transformParsed(raw) : raw;\n\t\t\t\t\treturn { [valueAttr]: value };\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: ['span'] },\n\t};\n}\n"],"mappings":"6FAiCA,SAAgB,EAA0B,GACzC,MAAM,KACL,EAAA,KACA,EAAA,UACA,EAAA,iBACA,EAAA,YACA,EAAA,SACA,EAAA,gBACA,EAAA,gBACA,GACG,EAEE,EAAa,GAAuB,OAAO,EAAK,QAAQ,IAAc,IAE5E,MAAO,CACN,OACA,OACA,MAAO,CAAA,CAAG,GAAY,CAAE,QAAS,KACjC,KAAA,CAAM,GACL,MAAM,EAAoB,SAAS,cAAc,QAC3C,EAAgB,EAAU,GAIhC,OAHI,GACH,EAAiB,EAAM,EAAkB,GAEnC,CACR,EACA,aAAA,CAAe,EAAY,EAAiB,KAC3C,MAAM,EAAgB,EAAU,GAChC,IAAK,IAAU,EAAS,GAAQ,OAAO,EACvC,MAAM,EAAe,GAAG,MAAgB,EAAW,KAEnD,MAAO,QADc,GAAK,UAAU,IAAS,WAAW,QACjC,YAExB,YAAc,IACb,MAAM,EAAgB,EAAU,GAChC,OAAK,GAAU,EAAS,GACjB,GAAG,MAAgB,EAAW,KADE,MAGxC,UAAW,CACV,CACC,IAAK,OACL,SAAW,IACV,MAAM,EACJ,EAAG,MAA4C,IAAqB,GACtE,IAAK,EAAK,OAAO,EACjB,GAAI,IAAoB,EAAS,GAAM,OAAO,EAC9C,MAAM,EAAgB,EAAkB,EAAgB,GAAO,EAC/D,MAAO,CAAA,CAAG,GAAY,MAIzB,SAAU,CAAE,KAAM,CAAC,SAErB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function r(r,t){for(let n=0;n<r.length;n++){const e=r[n];e&&e.setAttribute("tabindex",n===t?"0":"-1")}}function t(r,t,n){const e=r.length;return 0===e?-1:(t+n+e)%e}function n(r,t,n,e,o,c=!1){switch(c?function(r){return"ArrowLeft"===r?"ArrowRight":"ArrowRight"===r?"ArrowLeft":r}(o):o){case"ArrowUp":return[r>1?r-1:n,t];case"ArrowDown":return[r<n?r+1:1,t];case"ArrowLeft":return[r,t>1?t-1:e];case"ArrowRight":return[r,t<e?t+1:1]}}export{t as n,n as r,r as t};
|
|
2
|
+
//# sourceMappingURL=KeyboardNav-D0my3wuy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyboardNav-D0my3wuy.mjs","names":[],"sources":["../../src/plugins/shared/KeyboardNav.ts"],"sourcesContent":["/**\n * Generic keyboard navigation helpers reused by toolbar and popup UIs.\n */\n\n/**\n * Applies roving tabindex: sets tabindex=\"0\" on the focused item,\n * tabindex=\"-1\" on all others.\n */\nexport function applyRovingTabindex(items: readonly HTMLElement[], focusedIndex: number): void {\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst item: HTMLElement | undefined = items[i];\n\t\tif (item) {\n\t\t\titem.setAttribute('tabindex', i === focusedIndex ? '0' : '-1');\n\t\t}\n\t}\n}\n\n/** Navigates dropdown items with arrow keys (wraps around). */\nexport function findNextDropdownItem(\n\titems: readonly HTMLElement[],\n\tcurrent: number,\n\tdirection: 1 | -1,\n): number {\n\tconst len = items.length;\n\tif (len === 0) return -1;\n\treturn (current + direction + len) % len;\n}\n\n/** Flips horizontal arrow keys for RTL contexts. */\nfunction flipHorizontalKey(\n\tkey: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n): 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' {\n\tif (key === 'ArrowLeft') return 'ArrowRight';\n\tif (key === 'ArrowRight') return 'ArrowLeft';\n\treturn key;\n}\n\n/**\n * Navigates a grid of cells with arrow keys.\n * Returns the new [row, col] position.\n * When `isRtl` is true, horizontal arrows are flipped to match visual direction.\n */\nexport function navigateGrid(\n\trow: number,\n\tcol: number,\n\tmaxRows: number,\n\tmaxCols: number,\n\tkey: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n\tisRtl = false,\n): [number, number] {\n\tconst resolved: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' = isRtl\n\t\t? flipHorizontalKey(key)\n\t\t: key;\n\n\tswitch (resolved) {\n\t\tcase 'ArrowUp':\n\t\t\treturn [row > 1 ? row - 1 : maxRows, col];\n\t\tcase 'ArrowDown':\n\t\t\treturn [row < maxRows ? row + 1 : 1, col];\n\t\tcase 'ArrowLeft':\n\t\t\treturn [row, col > 1 ? col - 1 : maxCols];\n\t\tcase 'ArrowRight':\n\t\t\treturn [row, col < maxCols ? col + 1 : 1];\n\t}\n}\n"],"mappings":"AAQA,SAAgB,EAAoB,EAA+B,GAClE,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CACtC,MAAM,EAAgC,EAAM,GACxC,GACH,EAAK,aAAa,WAAY,IAAM,EAAe,IAAM,KAE3D,CACD,CAGA,SAAgB,EACf,EACA,EACA,GAEA,MAAM,EAAM,EAAM,OAClB,OAAY,IAAR,GAAkB,GACd,EAAU,EAAY,GAAO,CACtC,CAgBA,SAAgB,EACf,EACA,EACA,EACA,EACA,EACA,GAAQ,GAMR,OAJuE,EArBxE,SACC,GAEA,MAAY,cAAR,EAA4B,aACpB,eAAR,EAA6B,YAC1B,CACR,CAgBI,CAAkB,GAClB,GAGF,IAAK,UACJ,MAAO,CAAC,EAAM,EAAI,EAAM,EAAI,EAAS,GACtC,IAAK,YACJ,MAAO,CAAC,EAAM,EAAU,EAAM,EAAI,EAAG,GACtC,IAAK,YACJ,MAAO,CAAC,EAAK,EAAM,EAAI,EAAM,EAAI,GAClC,IAAK,aACJ,MAAO,CAAC,EAAK,EAAM,EAAU,EAAM,EAAI,GAE1C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as t}from"./Document-r7vLOAGA.mjs";import{o as e,u as r}from"./Selection-HYoVFpAx.mjs";import{i as n}from"./TypeBrands-Ch9856Gb.mjs";import{a as i,r as o}from"./HTMLUtils-C6B4UT00.mjs";import{i as s,r as a,t as l}from"./AttributedMarkCommands-D4W2Jgpj.mjs";import{a as c,n as p,s as m}from"./PluginHelpers-D4quRJ5a.mjs";import{t as d}from"./ShortcutFormatting-TwiufqeV.mjs";var u={label:"Link",tooltip:t=>`Insert Link (${t})`,removeLink:"Remove Link",removeLinkAria:"Remove link",urlPlaceholder:"https://...",urlAria:"Link URL",apply:"Apply",applyAria:"Apply link",invalidUrl:"Only http(s), mailto, tel, fragments, and relative paths are allowed."},h=/* #__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-Ctrv6cIi.mjs"),"./locales/de.ts":()=>import("./de-JhGflzS5.mjs"),"./locales/es.ts":()=>import("./es-Bv7bDbMp.mjs"),"./locales/fr.ts":()=>import("./fr-DtzIu6tU.mjs"),"./locales/hi.ts":()=>import("./hi-Bu799xIO.mjs"),"./locales/pt.ts":()=>import("./pt-DmN9u3NX.mjs"),"./locales/ru.ts":()=>import("./ru-BxySx7an.mjs"),"./locales/zh.ts":()=>import("./zh-DuucmOns.mjs")});async function k(t){return m(h,t,u)}var g={openInNewTab:!0},f=class{id="link";name="Link";priority=25;config;locale;constructor(t){this.config={...g,...t}}async init(t){this.locale=await c(t,this.config.locale,u,k),this.registerMarkSpec(t),this.registerCommands(t),this.registerKeymap(t),this.registerToolbarItem(t)}registerMarkSpec(t){const e=this.config.openInNewTab;t.registerMarkSpec({type:"link",rank:10,inclusive:!1,attrs:{href:{default:""}},toDOM(t){const r=document.createElement("a"),n=i(String(t.attrs?.href??""));return r.setAttribute("href",n),e&&(r.setAttribute("target","_blank"),r.setAttribute("rel","noopener noreferrer")),r},toHTMLString:(t,r)=>{const n=o(i(String(t.attrs?.href??"")));return e?`<a href="${n}" target="_blank" rel="noopener noreferrer">${r}</a>`:`<a href="${n}">${r}</a>`},parseHTML:[{tag:"a",getAttrs:t=>({href:i(t.getAttribute("href")??"")})}],sanitize:{tags:["a"],attrs:["href","target","rel"]}})}registerCommands(t){t.registerCommand("toggleLink",()=>{const e=t.getState();return this.toggleLink(t,e)}),t.registerCommand("setLink",()=>!1),t.registerCommand("removeLink",()=>{const e=t.getState();return this.removeLink(t,e)})}registerKeymap(t){t.registerKeymap({"Mod-K":()=>t.executeCommand("toggleLink")})}registerToolbarItem(t){t.registerToolbarItem({id:"link",group:"insert",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>',label:this.locale.label,tooltip:this.locale.tooltip(d("Mod-K")),command:"toggleLink",popupType:"custom",renderPopup:(t,e,r)=>{this.renderLinkPopup(t,e,r)},isActive:t=>this.isLinkActive(t),isEnabled:t=>!e(t.selection)})}isLinkActive(t){return a(t,"link")}toggleLink(t,e){return!!this.isLinkActive(e)&&this.removeLink(t,e)}addLink(t,i,o){const s=i.selection;return!!r(s)&&!e(s)&&p(t,l(i,{type:n("link"),attrs:{href:o}}))}removeLink(i,o){const a=o.selection;if(!r(a))return!1;if(e(a)){const e=o.getBlock(a.anchor.blockId);if(!e)return!1;const r=[];let s=0;for(const i of e.children){if(!("text"in i))continue;const e=s+i.text.length;r.push({pos:s,end:e,hasLink:t(i.marks,n("link"))}),s=e}const l=r.findIndex(t=>a.anchor.offset>=t.pos&&a.anchor.offset<=t.end),c=l>=0?r[l]:void 0;if(-1===l||!c?.hasLink)return!1;let p=l;for(;p>0&&r[p-1]?.hasLink;)p--;let m=l;for(;m<r.length-1&&r[m+1]?.hasLink;)m++;const d=r[p],u=r[m];if(!d||!u)return!1;const h=d.pos,k=u.end,g=o.transaction("command");return g.removeMark(a.anchor.blockId,h,k,{type:n("link")}),g.setSelection(a),i.dispatch(g.build()),!0}return p(i,s(o,n("link")))}renderLinkPopup(t,e,r){t.classList.add("notectl-link-popup");const n=e.getState();if(this.isLinkActive(n)){const n=document.createElement("button");n.type="button",n.className="notectl-link-popup__button",n.textContent=this.locale.removeLink,n.setAttribute("aria-label",this.locale.removeLinkAria),n.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),e.executeCommand("removeLink"),r(),e.getContainer().focus()}),t.appendChild(n)}else{const n=document.createElement("input");n.type="url",n.className="notectl-link-popup__input",n.placeholder=this.locale.urlPlaceholder,n.setAttribute("aria-label",this.locale.urlAria);const o=document.createElement("button");o.type="button",o.className="notectl-link-popup__button notectl-link-popup__button--apply",o.textContent=this.locale.apply,o.setAttribute("aria-label",this.locale.applyAria);const s=document.createElement("div");s.className="notectl-link-popup__error",s.setAttribute("role","alert"),s.hidden=!0;const a=()=>{const t=n.value.trim();if(""===t)return;const o=i(t);if(""===o)return s.textContent=this.locale.invalidUrl,s.hidden=!1,n.setAttribute("aria-invalid","true"),void n.focus();s.hidden=!0,n.removeAttribute("aria-invalid"),this.addLink(e,e.getState(),o),r(),e.getContainer().focus()};o.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),a()}),n.addEventListener("keydown",t=>{"Enter"===t.key&&(t.preventDefault(),a())}),n.addEventListener("input",()=>{s.hidden||(s.hidden=!0,n.removeAttribute("aria-invalid"))}),t.appendChild(n),t.appendChild(o),t.appendChild(s),requestAnimationFrame(()=>n.focus())}}};export{u as n,k as r,f as t};
|
|
2
|
+
//# sourceMappingURL=LinkPlugin-B_ysjORS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkPlugin-B_ysjORS.mjs","names":[],"sources":["../../src/plugins/link/LinkLocale.ts","../../src/plugins/link/LinkPlugin.ts"],"sourcesContent":["/**\n * Locale interface and default English locale for the LinkPlugin.\n */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface LinkLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut: string) => string;\n\treadonly removeLink: string;\n\treadonly removeLinkAria: string;\n\treadonly urlPlaceholder: string;\n\treadonly urlAria: string;\n\treadonly apply: string;\n\treadonly applyAria: string;\n\treadonly invalidUrl: string;\n}\n\n// --- Default English Locale ---\n\nexport const LINK_LOCALE_EN: LinkLocale = {\n\tlabel: 'Link',\n\ttooltip: (shortcut: string) => `Insert Link (${shortcut})`,\n\tremoveLink: 'Remove Link',\n\tremoveLinkAria: 'Remove link',\n\turlPlaceholder: 'https://...',\n\turlAria: 'Link URL',\n\tapply: 'Apply',\n\tapplyAria: 'Apply link',\n\tinvalidUrl: 'Only http(s), mailto, tel, fragments, and relative paths are allowed.',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<LinkLocale> = import.meta.glob<{\n\tdefault: LinkLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadLinkLocale(lang: string): Promise<LinkLocale> {\n\treturn loadLocaleModule(localeModules, lang, LINK_LOCALE_EN);\n}\n","/**\n * LinkPlugin: registers a link mark type with href attribute,\n * toggle command, keyboard shortcut (Mod-K), and toolbar button\n * with a URL input popup.\n */\n\nimport {\n\tapplyAttributedMark,\n\tisAttributedMarkActive,\n\tremoveAttributedMark,\n} from '../../commands/AttributedMarkCommands.js';\nimport { hasMark } from '../../model/Document.js';\nimport { escapeHTML, sanitizeHref } from '../../model/HTMLUtils.js';\nimport { isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { markType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { dispatchIfPresent, resolveLocale } from '../shared/PluginHelpers.js';\nimport { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport { LINK_LOCALE_EN, type LinkLocale, loadLinkLocale } from './LinkLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tlink: { href: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface LinkConfig {\n\t/** Whether to add rel=\"noopener noreferrer\" and target=\"_blank\" by default. */\n\treadonly openInNewTab: boolean;\n\treadonly locale?: LinkLocale;\n}\n\nconst DEFAULT_CONFIG: LinkConfig = {\n\topenInNewTab: true,\n};\n\n// --- Plugin ---\n\nexport class LinkPlugin implements Plugin {\n\treadonly id = 'link';\n\treadonly name = 'Link';\n\treadonly priority = 25;\n\n\tprivate readonly config: LinkConfig;\n\tprivate locale!: LinkLocale;\n\n\tconstructor(config?: Partial<LinkConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(context, this.config.locale, LINK_LOCALE_EN, loadLinkLocale);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tconst openInNewTab = this.config.openInNewTab;\n\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'link',\n\t\t\trank: 10,\n\t\t\tinclusive: false,\n\t\t\tattrs: {\n\t\t\t\thref: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst a = document.createElement('a');\n\t\t\t\tconst href: string = sanitizeHref(String(mark.attrs?.href ?? ''));\n\t\t\t\ta.setAttribute('href', href);\n\t\t\t\tif (openInNewTab) {\n\t\t\t\t\ta.setAttribute('target', '_blank');\n\t\t\t\t\ta.setAttribute('rel', 'noopener noreferrer');\n\t\t\t\t}\n\t\t\t\treturn a;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content) => {\n\t\t\t\tconst safeHref: string = sanitizeHref(String(mark.attrs?.href ?? ''));\n\t\t\t\tconst href: string = escapeHTML(safeHref);\n\t\t\t\tif (openInNewTab) {\n\t\t\t\t\treturn `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${content}</a>`;\n\t\t\t\t}\n\t\t\t\treturn `<a href=\"${href}\">${content}</a>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'a',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\t// Returning an empty href (instead of `false`) keeps the link mark\n\t\t\t\t\t\t// applied so the parser does not fall back to the core HTMLParser's\n\t\t\t\t\t\t// raw-href default; the empty value renders as a no-op anchor.\n\t\t\t\t\t\tconst href: string = sanitizeHref(el.getAttribute('href') ?? '');\n\t\t\t\t\t\treturn { href };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['a'], attrs: ['href', 'target', 'rel'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('toggleLink', () => {\n\t\t\tconst state = context.getState();\n\t\t\treturn this.toggleLink(context, state);\n\t\t});\n\n\t\tcontext.registerCommand('setLink', () => {\n\t\t\t// setLink is called by the popup after URL input\n\t\t\t// The actual URL is set via the popup's custom render\n\t\t\treturn false;\n\t\t});\n\n\t\tcontext.registerCommand('removeLink', () => {\n\t\t\tconst state = context.getState();\n\t\t\treturn this.removeLink(context, state);\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-K': () => context.executeCommand('toggleLink'),\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst icon =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'link',\n\t\t\tgroup: 'insert',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip(formatShortcut('Mod-K')),\n\t\t\tcommand: 'toggleLink',\n\t\t\tpopupType: 'custom',\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\tthis.renderLinkPopup(container, ctx, onClose);\n\t\t\t},\n\t\t\tisActive: (state) => this.isLinkActive(state),\n\t\t\tisEnabled: (state) => !isCollapsed(state.selection),\n\t\t});\n\t}\n\n\tprivate isLinkActive(state: EditorState): boolean {\n\t\treturn isAttributedMarkActive(state, 'link');\n\t}\n\n\tprivate toggleLink(context: PluginContext, state: EditorState): boolean {\n\t\tif (this.isLinkActive(state)) {\n\t\t\treturn this.removeLink(context, state);\n\t\t}\n\t\t// Adding links requires the toolbar popup for URL input\n\t\treturn false;\n\t}\n\n\tprivate addLink(context: PluginContext, state: EditorState, href: string): boolean {\n\t\tconst sel = state.selection;\n\t\tif (!isTextSelection(sel)) return false;\n\t\tif (isCollapsed(sel)) return false;\n\n\t\tconst mark = { type: markType('link'), attrs: { href } };\n\t\treturn dispatchIfPresent(context, applyAttributedMark(state, mark));\n\t}\n\n\tprivate removeLink(context: PluginContext, state: EditorState): boolean {\n\t\tconst sel = state.selection;\n\t\tif (!isTextSelection(sel)) return false;\n\n\t\tif (isCollapsed(sel)) {\n\t\t\t// Remove link from entire link span around cursor (plugin-specific extent scan)\n\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\tif (!block) return false;\n\n\t\t\tconst textChildren: { pos: number; end: number; hasLink: boolean }[] = [];\n\t\t\tlet pos = 0;\n\t\t\tfor (const child of block.children) {\n\t\t\t\tif (!('text' in child)) continue;\n\t\t\t\tconst end = pos + child.text.length;\n\t\t\t\ttextChildren.push({ pos, end, hasLink: hasMark(child.marks, markType('link')) });\n\t\t\t\tpos = end;\n\t\t\t}\n\n\t\t\tconst cursorIdx = textChildren.findIndex(\n\t\t\t\t(c) => sel.anchor.offset >= c.pos && sel.anchor.offset <= c.end,\n\t\t\t);\n\t\t\tconst cursorEntry = cursorIdx >= 0 ? textChildren[cursorIdx] : undefined;\n\t\t\tif (cursorIdx === -1 || !cursorEntry?.hasLink) return false;\n\n\t\t\tlet startIdx = cursorIdx;\n\t\t\twhile (startIdx > 0 && textChildren[startIdx - 1]?.hasLink) {\n\t\t\t\tstartIdx--;\n\t\t\t}\n\n\t\t\tlet endIdx = cursorIdx;\n\t\t\twhile (endIdx < textChildren.length - 1 && textChildren[endIdx + 1]?.hasLink) {\n\t\t\t\tendIdx++;\n\t\t\t}\n\n\t\t\tconst startEntry = textChildren[startIdx];\n\t\t\tconst endEntry = textChildren[endIdx];\n\t\t\tif (!startEntry || !endEntry) return false;\n\n\t\t\tconst linkStart = startEntry.pos;\n\t\t\tconst linkEnd = endEntry.end;\n\n\t\t\tconst builder = state.transaction('command');\n\t\t\tbuilder.removeMark(sel.anchor.blockId, linkStart, linkEnd, { type: markType('link') });\n\t\t\tbuilder.setSelection(sel);\n\t\t\tcontext.dispatch(builder.build());\n\t\t\treturn true;\n\t\t}\n\n\t\t// Range selection: delegate to shared helper\n\t\treturn dispatchIfPresent(context, removeAttributedMark(state, markType('link')));\n\t}\n\n\tprivate renderLinkPopup(\n\t\tcontainer: HTMLElement,\n\t\tcontext: PluginContext,\n\t\tonClose: () => void,\n\t): void {\n\t\tcontainer.classList.add('notectl-link-popup');\n\n\t\tconst state = context.getState();\n\t\tconst isActive = this.isLinkActive(state);\n\n\t\tif (isActive) {\n\t\t\t// Show remove link button\n\t\t\tconst removeBtn = document.createElement('button');\n\t\t\tremoveBtn.type = 'button';\n\t\t\tremoveBtn.className = 'notectl-link-popup__button';\n\t\t\tremoveBtn.textContent = this.locale.removeLink;\n\t\t\tremoveBtn.setAttribute('aria-label', this.locale.removeLinkAria);\n\t\t\tremoveBtn.addEventListener('mousedown', (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tcontext.executeCommand('removeLink');\n\t\t\t\tonClose();\n\t\t\t\tcontext.getContainer().focus();\n\t\t\t});\n\t\t\tcontainer.appendChild(removeBtn);\n\t\t} else {\n\t\t\t// Show URL input\n\t\t\tconst input = document.createElement('input');\n\t\t\tinput.type = 'url';\n\t\t\tinput.className = 'notectl-link-popup__input';\n\t\t\tinput.placeholder = this.locale.urlPlaceholder;\n\t\t\tinput.setAttribute('aria-label', this.locale.urlAria);\n\n\t\t\tconst applyBtn = document.createElement('button');\n\t\t\tapplyBtn.type = 'button';\n\t\t\tapplyBtn.className = 'notectl-link-popup__button notectl-link-popup__button--apply';\n\t\t\tapplyBtn.textContent = this.locale.apply;\n\t\t\tapplyBtn.setAttribute('aria-label', this.locale.applyAria);\n\n\t\t\tconst errorMsg = document.createElement('div');\n\t\t\terrorMsg.className = 'notectl-link-popup__error';\n\t\t\terrorMsg.setAttribute('role', 'alert');\n\t\t\terrorMsg.hidden = true;\n\n\t\t\tconst applyLink = (): void => {\n\t\t\t\tconst raw: string = input.value.trim();\n\t\t\t\tif (raw === '') return;\n\t\t\t\tconst sanitized: string = sanitizeHref(raw);\n\t\t\t\tif (sanitized === '') {\n\t\t\t\t\terrorMsg.textContent = this.locale.invalidUrl;\n\t\t\t\t\terrorMsg.hidden = false;\n\t\t\t\t\tinput.setAttribute('aria-invalid', 'true');\n\t\t\t\t\tinput.focus();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\terrorMsg.hidden = true;\n\t\t\t\tinput.removeAttribute('aria-invalid');\n\t\t\t\tthis.addLink(context, context.getState(), sanitized);\n\t\t\t\tonClose();\n\t\t\t\tcontext.getContainer().focus();\n\t\t\t};\n\n\t\t\tapplyBtn.addEventListener('mousedown', (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tapplyLink();\n\t\t\t});\n\n\t\t\tinput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tapplyLink();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinput.addEventListener('input', () => {\n\t\t\t\tif (!errorMsg.hidden) {\n\t\t\t\t\terrorMsg.hidden = true;\n\t\t\t\t\tinput.removeAttribute('aria-invalid');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontainer.appendChild(input);\n\t\t\tcontainer.appendChild(applyBtn);\n\t\t\tcontainer.appendChild(errorMsg);\n\n\t\t\t// Auto-focus input\n\t\t\trequestAnimationFrame(() => input.focus());\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{h as t,u as e}from"./Document-r7vLOAGA.mjs";import{d as n,o as i,t as c,u as s}from"./Selection-HYoVFpAx.mjs";import{a as o,t as r}from"./TypeBrands-Ch9856Gb.mjs";import{r as l}from"./AttrRegistry-DcDVyzLm.mjs";import{n as a}from"./DomUtils-Bf7JLFlx.mjs";import{t as d}from"./RangeIterator-o8v3msQe.mjs";import{s as u}from"./StyleRuntime-BAutwDZT.mjs";import{a as h,s as m}from"./PluginHelpers-D4quRJ5a.mjs";function p(t,e,n){return"checklist"===t?{listType:t,indent:e,checked:n??!1}:{listType:t,indent:e}}function k(t,e){const i=t.getState(),c=i.selection;return!!s(c)&&(c.anchor.blockId!==c.head.blockId?function(t,e,i){const c=e.selection;if(!s(c))return!1;const r=n(c,e.getBlockOrder()),a=g(e,r,i),u=e.transaction("command");return d(e,r,t=>{const n=e.getBlock(t);if(n)if(a)u.setBlockType(t,o("paragraph"));else{const e=l(n,"list_item")?n.attrs.indent:0,c=l(n,"list_item")&&"checklist"===n.attrs.listType&&n.attrs.checked;u.setBlockType(t,o("list_item"),p(i,e,c))}}),u.setSelection(c),t.dispatch(u.build()),!0}(t,i,e):function(t,e,n){const i=e.selection;if(!s(i))return!1;const c=e.getBlock(i.anchor.blockId);if(!c)return!1;if("list_item"===c.type&&c.attrs?.listType===n){const n=e.transaction("command").setBlockType(i.anchor.blockId,o("paragraph")).setSelection(i).build();return t.dispatch(n),!0}const r=p(n,l(c,"list_item")?c.attrs.indent:0),a=e.transaction("command").setBlockType(i.anchor.blockId,o("list_item"),r).setSelection(i).build();return t.dispatch(a),!0}(t,i,e))}function b(t,e,i){const c=t.getState();if(!s(c.selection))return!1;if(c.selection.anchor.blockId!==c.selection.head.blockId)return function(t,e,i,c){const r=e.selection;if(!s(r))return!1;const a=n(r,e.getBlockOrder()),u=e.transaction("command");let h=!1;return d(e,a,t=>{const n=e.getBlock(t);if(!n||!l(n,"list_item"))return;const s=n.attrs.indent+i;s<0||s>c||(u.setBlockType(t,o("list_item"),p(n.attrs.listType,s,n.attrs.checked)),h=!0)}),!!h&&(u.setSelection(r),t.dispatch(u.build()),!0)}(t,c,e,i);const r=c.selection,a=c.getBlock(r.anchor.blockId);if(!a||!l(a,"list_item"))return!1;const u=a.attrs.indent+e;if(u<0||u>i)return!1;const h=p(a.attrs.listType,u,a.attrs.checked),m=c.transaction("command").setBlockType(r.anchor.blockId,o("list_item"),h).setSelection(r).build();return t.dispatch(m),!0}function f(t,e){const{interactiveCheckboxes:n,targetId:i,locale:c}=e;if(t.isReadOnly()&&!n)return!1;const r=t.getState(),a=i??(s(r.selection)?r.selection.anchor.blockId:null);if(!a)return!1;const d=r.getBlock(a);if(!d||!l(d,"list_item")||"checklist"!==d.attrs.listType)return!1;const u=!d.attrs.checked,h=p(d.attrs.listType,d.attrs.indent,u),m=r.transaction("command").setBlockType(a,o("list_item"),h).setSelection(r.selection).build();return t.dispatch(m),t.announce(u?c.checkedAnnouncement:c.uncheckedAnnouncement),!0}function g(t,e,n){let i=!0;return d(t,e,e=>{const c=t.getBlock(e);c&&"list_item"===c.type&&c.attrs?.listType===n||(i=!1)}),i}var y=[{type:"bullet",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z"/></svg>',inputPattern:/^[-*] $/,inputPrefix:"- "},{type:"ordered",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z"/></svg>',inputPattern:/^\d+\. $/,inputPrefix:"1. "},{type:"checklist",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22 7h-9v2h9V7zm0 8h-9v2h9v-2zM5.54 11L2 7.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 11zm0 8L2 15.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 19z"/></svg>',inputPattern:/^\[[ x]] $/,inputPrefix:"[ ] "}];function v(t,e){const n=t.getState();if(!s(n.selection))return!1;const c=n.selection;if(!i(c))return!1;const o=n.getBlock(c.anchor.blockId);return!(!o||"list_item"!==o.type)&&e({state:n,block:o,blockId:c.anchor.blockId,offset:c.anchor.offset})}var x={bulletList:"Bullet List",numberedList:"Numbered List",checklist:"Checklist",checkboxLabel:"To-do item",checkedAnnouncement:"Checked",uncheckedAnnouncement:"Unchecked"},I=/* #__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-Cy_77yRf.mjs"),"./locales/de.ts":()=>import("./de-CaeEIyzV.mjs"),"./locales/es.ts":()=>import("./es-DFokqQst.mjs"),"./locales/fr.ts":()=>import("./fr-5HkMazAf.mjs"),"./locales/hi.ts":()=>import("./hi-BzbMD_cP.mjs"),"./locales/pt.ts":()=>import("./pt-CR4j8gtE.mjs"),"./locales/ru.ts":()=>import("./ru-DiwQV30V.mjs"),"./locales/zh.ts":()=>import("./zh-BQqf3wJZ.mjs")});async function T(t){return m(I,t,x)}var B="notectl-checklist-marker";function L(t,e){return{bullet:e.bulletList,ordered:e.numberedList,checklist:e.checklist}[t]}function w(t,e){if(!s(t.selection))return!1;if(t.selection.anchor.blockId!==t.selection.head.blockId)return g(t,n(t.selection,t.getBlockOrder()),e);const i=t.getBlock(t.selection.anchor.blockId);return"list_item"===i?.type&&i.attrs?.listType===e}var S={types:["bullet","ordered","checklist"],maxIndent:4},C=class{id="list";name="List";priority=35;config;locale;context=null;checkboxClickHandler=null;constructor(t){this.config={...S,...t}}async init(n){this.context=n,this.locale=await h(n,this.config.locale,x,T);const r=this.getEnabledTypes();n.registerStyleSheet("\n/* List Wrappers — suppress native markers, we use ::before pseudo-elements */\n.notectl-list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n/* Ordered List — each <ol> wrapper resets the counter */\n.notectl-list--ordered {\n\tcounter-reset: notectl-ordered;\n}\n\n/* List Items */\n.notectl-list-item {\n\tmargin: 0;\n\tpadding: 2px 0;\n\tpadding-inline-start: 24px;\n\tmin-height: 1.6em;\n\tposition: relative;\n}\n\n.notectl-list-item::before {\n\tposition: absolute;\n\tinset-inline-start: 0;\n\tdisplay: inline-block;\n\twidth: 24px;\n\ttext-align: center;\n\t-webkit-user-select: none;\n\tuser-select: none;\n\tpointer-events: none;\n}\n\n/* Bullet List */\n.notectl-list-item--bullet::before {\n\tcontent: '\\2022';\n\tcolor: var(--notectl-fg);\n}\n\n/* Ordered List — counter increment per item */\n.notectl-list-item--ordered {\n\tcounter-increment: notectl-ordered;\n}\n\n.notectl-list-item--ordered::before {\n\tcontent: counter(notectl-ordered) '.';\n\tcolor: var(--notectl-fg);\n\tfont-size: 14px;\n}\n\n/* Checklist — the marker is a real role=\"checkbox\" element (see ListMarker.ts)\n positioned over the reserved marker zone. inline-block keeps the parent's\n line-through (on checked items) from striking the glyph. */\n.notectl-checklist-marker {\n\tposition: absolute;\n\tinset-inline-start: 0;\n\tdisplay: inline-block;\n\twidth: 24px;\n\ttext-align: center;\n\tfont-size: 16px;\n\tcolor: var(--notectl-fg-muted);\n\tcursor: pointer;\n\ttext-decoration: none;\n\t-webkit-user-select: none;\n\tuser-select: none;\n}\n\n.notectl-checklist-marker::before {\n\tcontent: '\\2610';\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"] .notectl-checklist-marker {\n\tcolor: var(--notectl-success);\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"] .notectl-checklist-marker::before {\n\tcontent: '\\2611';\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"] {\n\tcolor: var(--notectl-fg-muted);\n\ttext-decoration: line-through;\n}\n"),this.registerNodeSpec(n),function(t,e,n,i){for(const c of n)t.registerCommand(`toggleList:${c.type}`,()=>k(t,c.type));if(t.registerCommand("indentListItem",()=>b(t,1,e.maxIndent)),t.registerCommand("outdentListItem",()=>b(t,-1,e.maxIndent)),e.types.includes("checklist")){const n=()=>f(t,{interactiveCheckboxes:e.interactiveCheckboxes,locale:i});t.registerCommand("toggleChecklistItem",n,{readonlyAllowed:!0}),t.registerKeymap({"Mod-Enter":n},{priority:"navigation"})}t.registerKeymap({Tab:()=>b(t,1,e.maxIndent),"Shift-Tab":()=>b(t,-1,e.maxIndent)})}(n,this.config,r,this.locale),function(n){n.registerKeymap({Enter:()=>function(n){return v(n,i=>{if(""===t(i.block)){const t=i.state.transaction("input").setBlockType(i.blockId,o("paragraph")).setSelection(i.state.selection).build();return n.dispatch(t),!0}const s=e(),r=p(l(i.block,"list_item")?i.block.attrs.listType:"bullet",l(i.block,"list_item")?i.block.attrs.indent:0),a=i.state.transaction("input").splitBlock(i.blockId,i.offset,s).setBlockType(s,o("list_item"),r).setSelection(c(s,0)).build();return n.dispatch(a),!0})}(n),Backspace:()=>function(t){return v(t,e=>{if(0!==e.offset)return!1;const n=e.state.transaction("input").setBlockType(e.blockId,o("paragraph")).setSelection(e.state.selection).build();return t.dispatch(n),!0})}(n)})}(n),function(t,e){for(const n of e)t.registerInputRule({pattern:n.inputPattern,handler:(t,e,r,l)=>{const a=t.selection;if(!s(a))return null;if(!i(a))return null;const d=t.getBlock(a.anchor.blockId);if(!d||"paragraph"!==d.type)return null;const u=e[0]??"",h=u.length,m=p(n.type,0,u.includes("[x]"));return t.transaction("input").deleteTextAt(a.anchor.blockId,r,r+h).setBlockType(a.anchor.blockId,o("list_item"),m).setSelection(c(a.anchor.blockId,0)).build()}})}(n,r),function(t,e,n){for(const i of e)t.registerToolbarItem({id:`list-${i.type}`,group:"block",icon:i.icon,label:L(i.type,n),command:`toggleList:${i.type}`,isActive:t=>w(t,i.type)})}(n,r,this.locale),this.registerCheckboxClickHandler(n)}destroy(){this.checkboxClickHandler&&this.context&&this.context.getContainer().removeEventListener("mousedown",this.checkboxClickHandler),this.checkboxClickHandler=null,this.context=null}registerNodeSpec(t){const e=this.locale.checkboxLabel;t.registerNodeSpec({type:"list_item",group:"block",content:{allow:["text"]},attrs:{listType:{default:"bullet"},indent:{default:0},checked:{default:!1}},toDOM(t){const n=t.attrs?.listType??"bullet",i=t.attrs?.indent??0,c=t.attrs?.checked??!1,s=a("li",t.id);return s.setAttribute("role","listitem"),s.setAttribute("data-list-type",n),s.setAttribute("data-indent",String(i)),s.className=`notectl-list-item notectl-list-item--${n}`,i>0&&u(s,"marginLeft",24*i+"px"),"checklist"===n&&(s.setAttribute("data-checked",String(c)),s.appendChild(function(t,e){const n=document.createElement("span");return n.className=B,n.setAttribute("role","checkbox"),n.setAttribute("aria-checked",String(t)),n.setAttribute("aria-label",e),n.setAttribute("contenteditable","false"),n.setAttribute("data-widget","true"),n}(c,e))),s.setAttribute("aria-level",String(i+1)),s},wrapper(t){const e=t.attrs?.listType??"bullet";return{tag:"ordered"===e?"ol":"ul",key:`list-${e}`,className:`notectl-list notectl-list--${e}`,attrs:{role:"list"}}},toHTML(t,e){const n=t.attrs?.listType??"bullet",i=t.attrs?.checked??!1;return"checklist"===n?`<li role="checkbox" aria-checked="${String(i)}"><input type="checkbox" disabled${i?" checked":""}>${e||"<br>"}</li>`:`<li>${e||"<br>"}</li>`},parseHTML:[{tag:"li"}],sanitize:{tags:["ul","ol","li","input"],attrs:["type","disabled","checked","role","aria-checked"]}})}registerCheckboxClickHandler(t){this.config.types.includes("checklist")&&(this.checkboxClickHandler=e=>{if(t.isReadOnly()&&!this.config.interactiveCheckboxes)return;const n=e.target;if(!(n instanceof HTMLElement))return;const i=n.closest(`.${B}`);if(!i)return;const c=i.closest(".notectl-list-item--checklist");if(!c)return;e.preventDefault();const s=c.getAttribute("data-block-id");s&&f(t,{interactiveCheckboxes:this.config.interactiveCheckboxes,targetId:r(s),locale:this.locale})},t.getContainer().addEventListener("mousedown",this.checkboxClickHandler))}getEnabledTypes(){return y.filter(t=>this.config.types.includes(t.type))}};export{x as n,T as r,C as t};
|
|
2
|
+
//# sourceMappingURL=ListPlugin-C0BV8CnQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListPlugin-C0BV8CnQ.mjs","names":[],"sources":["../../src/editor/styles/list.ts","../../src/plugins/list/ListAttrsFactory.ts","../../src/plugins/list/ListCommands.ts","../../src/plugins/list/ListDefinitions.ts","../../src/plugins/list/ListInputRules.ts","../../src/plugins/list/ListKeyboardHandlers.ts","../../src/plugins/list/ListLocale.ts","../../src/plugins/list/ListMarker.ts","../../src/plugins/list/ListToolbarItems.ts","../../src/plugins/list/ListPlugin.ts"],"sourcesContent":["/** Width of the list marker / checkbox area in pixels. */\nexport const LIST_MARKER_WIDTH = 24;\n\n/** List styles — bullet, ordered, checklist items. */\nexport const LIST_CSS = `\n/* List Wrappers — suppress native markers, we use ::before pseudo-elements */\n.notectl-list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n/* Ordered List — each <ol> wrapper resets the counter */\n.notectl-list--ordered {\n\tcounter-reset: notectl-ordered;\n}\n\n/* List Items */\n.notectl-list-item {\n\tmargin: 0;\n\tpadding: 2px 0;\n\tpadding-inline-start: ${LIST_MARKER_WIDTH}px;\n\tmin-height: 1.6em;\n\tposition: relative;\n}\n\n.notectl-list-item::before {\n\tposition: absolute;\n\tinset-inline-start: 0;\n\tdisplay: inline-block;\n\twidth: ${LIST_MARKER_WIDTH}px;\n\ttext-align: center;\n\t-webkit-user-select: none;\n\tuser-select: none;\n\tpointer-events: none;\n}\n\n/* Bullet List */\n.notectl-list-item--bullet::before {\n\tcontent: '\\\\2022';\n\tcolor: var(--notectl-fg);\n}\n\n/* Ordered List — counter increment per item */\n.notectl-list-item--ordered {\n\tcounter-increment: notectl-ordered;\n}\n\n.notectl-list-item--ordered::before {\n\tcontent: counter(notectl-ordered) '.';\n\tcolor: var(--notectl-fg);\n\tfont-size: 14px;\n}\n\n/* Checklist — the marker is a real role=\"checkbox\" element (see ListMarker.ts)\n positioned over the reserved marker zone. inline-block keeps the parent's\n line-through (on checked items) from striking the glyph. */\n.notectl-checklist-marker {\n\tposition: absolute;\n\tinset-inline-start: 0;\n\tdisplay: inline-block;\n\twidth: ${LIST_MARKER_WIDTH}px;\n\ttext-align: center;\n\tfont-size: 16px;\n\tcolor: var(--notectl-fg-muted);\n\tcursor: pointer;\n\ttext-decoration: none;\n\t-webkit-user-select: none;\n\tuser-select: none;\n}\n\n.notectl-checklist-marker::before {\n\tcontent: '\\\\2610';\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"] .notectl-checklist-marker {\n\tcolor: var(--notectl-success);\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"] .notectl-checklist-marker::before {\n\tcontent: '\\\\2611';\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"] {\n\tcolor: var(--notectl-fg-muted);\n\ttext-decoration: line-through;\n}\n`;\n","/**\n * Factory for building list item block attributes.\n * Centralizes attribute construction to avoid repetitive inline object literals.\n */\n\nimport type { BlockAttrs } from '../../model/Document.js';\nimport type { ListType } from './ListPlugin.js';\n\n/** Builds a `BlockAttrs` object for a list_item block. */\nexport function buildListItemAttrs(\n\tlistType: ListType,\n\tindent: number,\n\tchecked?: boolean,\n): BlockAttrs {\n\tif (listType === 'checklist') {\n\t\treturn { listType, indent, checked: checked ?? false };\n\t}\n\treturn { listType, indent };\n}\n","/**\n * Command registration and implementations for list block types.\n * Handles toggle between list types and paragraph, indent/outdent,\n * and checklist toggle.\n */\n\nimport { forEachBlockIdInRange } from '../../commands/RangeIterator.js';\nimport { isNodeOfType } from '../../model/AttrRegistry.js';\nimport { isTextSelection, selectionRange } from '../../model/Selection.js';\nimport { type BlockId, nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { buildListItemAttrs } from './ListAttrsFactory.js';\nimport type { ListTypeDefinition } from './ListDefinitions.js';\nimport type { ListLocale } from './ListLocale.js';\nimport type { ListConfig, ListType } from './ListPlugin.js';\n\n/** Registers all list commands (toggleList:*, indent, outdent, toggleChecklistItem). */\nexport function registerListCommands(\n\tcontext: PluginContext,\n\tconfig: ListConfig,\n\tenabledTypes: readonly ListTypeDefinition[],\n\tlocale: ListLocale,\n): void {\n\tfor (const def of enabledTypes) {\n\t\tcontext.registerCommand(`toggleList:${def.type}`, () => {\n\t\t\treturn toggleList(context, def.type);\n\t\t});\n\t}\n\n\tcontext.registerCommand('indentListItem', () => changeIndent(context, 1, config.maxIndent));\n\n\tcontext.registerCommand('outdentListItem', () => changeIndent(context, -1, config.maxIndent));\n\n\tif (config.types.includes('checklist')) {\n\t\tconst toggleChecklistItem = (): boolean =>\n\t\t\ttoggleChecked(context, { interactiveCheckboxes: config.interactiveCheckboxes, locale });\n\n\t\tcontext.registerCommand('toggleChecklistItem', toggleChecklistItem, {\n\t\t\treadonlyAllowed: true,\n\t\t});\n\n\t\t// Mod-Enter gives keyboard-only users a way to toggle a checklist item\n\t\t// (WCAG 2.1.1). The handler declines on non-checklist blocks, so it falls\n\t\t// through to other Mod-Enter bindings (e.g. code-block insert-after).\n\t\t// Registered at navigation priority so it stays reachable in read-only mode\n\t\t// when interactiveCheckboxes is enabled, matching the mouse handler.\n\t\tcontext.registerKeymap({ 'Mod-Enter': toggleChecklistItem }, { priority: 'navigation' });\n\t}\n\n\tcontext.registerKeymap({\n\t\tTab: () => changeIndent(context, 1, config.maxIndent),\n\t\t'Shift-Tab': () => changeIndent(context, -1, config.maxIndent),\n\t});\n}\n\n// --- Command Implementations ---\n\nfunction toggleList(context: PluginContext, listType: ListType): boolean {\n\tconst state: EditorState = context.getState();\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return false;\n\n\tif (sel.anchor.blockId !== sel.head.blockId) {\n\t\treturn toggleListRange(context, state, listType);\n\t}\n\treturn toggleListSingleBlock(context, state, listType);\n}\n\nfunction toggleListSingleBlock(\n\tcontext: PluginContext,\n\tstate: EditorState,\n\tlistType: ListType,\n): boolean {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return false;\n\tconst block = state.getBlock(sel.anchor.blockId);\n\tif (!block) return false;\n\n\tif (block.type === 'list_item' && block.attrs?.listType === listType) {\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(sel.anchor.blockId, nodeType('paragraph'))\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\tconst existingIndent: number = isNodeOfType(block, 'list_item') ? block.attrs.indent : 0;\n\tconst attrs = buildListItemAttrs(listType, existingIndent);\n\n\tconst tr = state\n\t\t.transaction('command')\n\t\t.setBlockType(sel.anchor.blockId, nodeType('list_item'), attrs)\n\t\t.setSelection(sel)\n\t\t.build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\nfunction toggleListRange(context: PluginContext, state: EditorState, listType: ListType): boolean {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return false;\n\n\tconst range = selectionRange(sel, state.getBlockOrder());\n\tconst toggleOff: boolean = allBlocksMatchListType(state, range, listType);\n\tconst builder = state.transaction('command');\n\n\tforEachBlockIdInRange(state, range, (bid: BlockId) => {\n\t\tconst block = state.getBlock(bid);\n\t\tif (!block) return;\n\n\t\tif (toggleOff) {\n\t\t\tbuilder.setBlockType(bid, nodeType('paragraph'));\n\t\t} else {\n\t\t\tconst existingIndent: number = isNodeOfType(block, 'list_item') ? block.attrs.indent : 0;\n\t\t\tconst existingChecked: boolean =\n\t\t\t\tisNodeOfType(block, 'list_item') &&\n\t\t\t\tblock.attrs.listType === 'checklist' &&\n\t\t\t\tblock.attrs.checked;\n\t\t\tbuilder.setBlockType(\n\t\t\t\tbid,\n\t\t\t\tnodeType('list_item'),\n\t\t\t\tbuildListItemAttrs(listType, existingIndent, existingChecked),\n\t\t\t);\n\t\t}\n\t});\n\n\tbuilder.setSelection(sel);\n\tcontext.dispatch(builder.build());\n\treturn true;\n}\n\n// --- Indent / Outdent ---\n\nfunction changeIndent(context: PluginContext, delta: 1 | -1, maxIndent: number): boolean {\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\n\tif (state.selection.anchor.blockId !== state.selection.head.blockId) {\n\t\treturn changeIndentRange(context, state, delta, maxIndent);\n\t}\n\n\tconst sel = state.selection;\n\tconst block = state.getBlock(sel.anchor.blockId);\n\tif (!block || !isNodeOfType(block, 'list_item')) return false;\n\n\tconst newIndent: number = block.attrs.indent + delta;\n\tif (newIndent < 0 || newIndent > maxIndent) return false;\n\n\tconst attrs = buildListItemAttrs(block.attrs.listType, newIndent, block.attrs.checked);\n\tconst tr = state\n\t\t.transaction('command')\n\t\t.setBlockType(sel.anchor.blockId, nodeType('list_item'), attrs)\n\t\t.setSelection(sel)\n\t\t.build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\nfunction changeIndentRange(\n\tcontext: PluginContext,\n\tstate: EditorState,\n\tdelta: 1 | -1,\n\tmaxIndent: number,\n): boolean {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return false;\n\n\tconst range = selectionRange(sel, state.getBlockOrder());\n\tconst builder = state.transaction('command');\n\tlet changed = false;\n\n\tforEachBlockIdInRange(state, range, (bid: BlockId) => {\n\t\tconst block = state.getBlock(bid);\n\t\tif (!block || !isNodeOfType(block, 'list_item')) return;\n\n\t\tconst newIndent: number = block.attrs.indent + delta;\n\t\tif (newIndent < 0 || newIndent > maxIndent) return;\n\n\t\tbuilder.setBlockType(\n\t\t\tbid,\n\t\t\tnodeType('list_item'),\n\t\t\tbuildListItemAttrs(block.attrs.listType, newIndent, block.attrs.checked),\n\t\t);\n\t\tchanged = true;\n\t});\n\n\tif (!changed) return false;\n\n\tbuilder.setSelection(sel);\n\tcontext.dispatch(builder.build());\n\treturn true;\n}\n\n// --- Checklist Toggle ---\n\n/** Options for {@link toggleChecked}. */\nexport interface ToggleCheckedOptions {\n\t/** When true, the toggle is allowed even in read-only mode. */\n\treadonly interactiveCheckboxes?: boolean;\n\t/** Specific checklist item to toggle. Defaults to the selection's block. */\n\treadonly targetId?: BlockId;\n\t/** Locale used for the screen-reader announcement of the new state. */\n\treadonly locale: ListLocale;\n}\n\n/**\n * Toggles the checked state of a checklist item and announces the new state to\n * screen readers. Exported for use in the checkbox click handler.\n */\nexport function toggleChecked(context: PluginContext, options: ToggleCheckedOptions): boolean {\n\tconst { interactiveCheckboxes, targetId, locale } = options;\n\tif (context.isReadOnly() && !interactiveCheckboxes) return false;\n\n\tconst state: EditorState = context.getState();\n\tconst bid: BlockId | null =\n\t\ttargetId ?? (!isTextSelection(state.selection) ? null : state.selection.anchor.blockId);\n\tif (!bid) return false;\n\n\tconst block = state.getBlock(bid);\n\tif (!block || !isNodeOfType(block, 'list_item') || block.attrs.listType !== 'checklist') {\n\t\treturn false;\n\t}\n\n\tconst nextChecked: boolean = !block.attrs.checked;\n\tconst attrs = buildListItemAttrs(block.attrs.listType, block.attrs.indent, nextChecked);\n\n\tconst tr = state\n\t\t.transaction('command')\n\t\t.setBlockType(bid, nodeType('list_item'), attrs)\n\t\t.setSelection(state.selection)\n\t\t.build();\n\tcontext.dispatch(tr);\n\n\t// The marker is not focused while editing, so the aria-checked change alone is\n\t// not spoken — announce the new state explicitly (WCAG 4.1.3).\n\tcontext.announce(nextChecked ? locale.checkedAnnouncement : locale.uncheckedAnnouncement);\n\treturn true;\n}\n\n// --- Helpers ---\n\n/** Checks whether all blocks in a range are list items of the given type. Exported for toolbar. */\nexport function allBlocksMatchListType(\n\tstate: EditorState,\n\trange: ReturnType<typeof selectionRange>,\n\tlistType: ListType,\n): boolean {\n\tlet allMatch = true;\n\tforEachBlockIdInRange(state, range, (bid: BlockId) => {\n\t\tconst block = state.getBlock(bid);\n\t\tif (!block || block.type !== 'list_item' || block.attrs?.listType !== listType) {\n\t\t\tallMatch = false;\n\t\t}\n\t});\n\treturn allMatch;\n}\n","/**\n * List type metadata: icons, patterns, and type definitions.\n * Pure data constants shared across list plugin modules.\n */\n\nimport type { ListType } from './ListPlugin.js';\n\n// --- List Type Metadata ---\n\nexport interface ListTypeDefinition {\n\treadonly type: ListType;\n\treadonly icon: string;\n\treadonly inputPattern: RegExp;\n\treadonly inputPrefix: string;\n}\n\nconst BULLET_LIST_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\"/></svg>';\nconst NUMBERED_LIST_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"/></svg>';\nconst CHECKLIST_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M22 7h-9v2h9V7zm0 8h-9v2h9v-2zM5.54 11L2 7.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 11zm0 8L2 15.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 19z\"/></svg>';\n\nexport const LIST_TYPE_DEFINITIONS: readonly ListTypeDefinition[] = [\n\t{\n\t\ttype: 'bullet',\n\t\ticon: BULLET_LIST_ICON,\n\t\tinputPattern: /^[-*] $/,\n\t\tinputPrefix: '- ',\n\t},\n\t{\n\t\ttype: 'ordered',\n\t\ticon: NUMBERED_LIST_ICON,\n\t\tinputPattern: /^\\d+\\. $/,\n\t\tinputPrefix: '1. ',\n\t},\n\t{\n\t\ttype: 'checklist',\n\t\ticon: CHECKLIST_ICON,\n\t\tinputPattern: /^\\[[ x]] $/,\n\t\tinputPrefix: '[ ] ',\n\t},\n];\n","/**\n * Input rule registration for list block types.\n * Converts `- `, `* `, `1. `, `[ ] `, `[x] ` at the start of a paragraph into list items.\n */\n\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { buildListItemAttrs } from './ListAttrsFactory.js';\nimport type { ListTypeDefinition } from './ListDefinitions.js';\n\n/** Registers markdown-style input rules for configured list types. */\nexport function registerListInputRules(\n\tcontext: PluginContext,\n\tenabledTypes: readonly ListTypeDefinition[],\n): void {\n\tfor (const def of enabledTypes) {\n\t\tcontext.registerInputRule({\n\t\t\tpattern: def.inputPattern,\n\t\t\thandler: (state, match, start, _end) => {\n\t\t\t\tconst sel = state.selection;\n\t\t\t\tif (!isTextSelection(sel)) return null;\n\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\tconst matchStr = match[0] ?? '';\n\t\t\t\tconst matchLen = matchStr.length;\n\t\t\t\tconst attrs = buildListItemAttrs(def.type, 0, matchStr.includes('[x]'));\n\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, start, start + matchLen)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('list_item'), attrs)\n\t\t\t\t\t.setSelection(createCollapsedSelection(sel.anchor.blockId, 0))\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n}\n","/**\n * Keyboard handlers for list block types.\n * Handles Enter (split/exit list) and Backspace (convert to paragraph).\n */\n\nimport { isNodeOfType } from '../../model/AttrRegistry.js';\nimport type { BlockNode } from '../../model/Document.js';\nimport { generateBlockId, getBlockText } from '../../model/Document.js';\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { buildListItemAttrs } from './ListAttrsFactory.js';\n\n// --- Context Guard ---\n\ninterface ListContext {\n\treadonly state: EditorState;\n\treadonly block: BlockNode;\n\treadonly blockId: BlockId;\n\treadonly offset: number;\n}\n\n/**\n * Guards against NodeSelection, non-collapsed selections, and non-list blocks.\n * Returns false (not handled) if the cursor is not inside a list_item block.\n */\nfunction withListContext(context: PluginContext, handler: (ctx: ListContext) => boolean): boolean {\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\n\tconst sel = state.selection;\n\tif (!isCollapsed(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block || block.type !== 'list_item') return false;\n\n\treturn handler({\n\t\tstate,\n\t\tblock,\n\t\tblockId: sel.anchor.blockId,\n\t\toffset: sel.anchor.offset,\n\t});\n}\n\n/** Registers Enter and Backspace keymaps for list items. */\nexport function registerListKeymaps(context: PluginContext): void {\n\tcontext.registerKeymap({\n\t\tEnter: () => handleEnter(context),\n\t\tBackspace: () => handleBackspace(context),\n\t});\n}\n\n// --- Enter Handler ---\n\n/**\n * Handles Enter inside a list item.\n * Empty item → exit list (convert to paragraph).\n * Non-empty item → split and create a new list item with the same type.\n */\nfunction handleEnter(context: PluginContext): boolean {\n\treturn withListContext(context, (ctx) => {\n\t\tconst text: string = getBlockText(ctx.block);\n\n\t\tif (text === '') {\n\t\t\tconst tr = ctx.state\n\t\t\t\t.transaction('input')\n\t\t\t\t.setBlockType(ctx.blockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(ctx.state.selection)\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\tconst newBlockId = generateBlockId();\n\t\tconst listType = isNodeOfType(ctx.block, 'list_item') ? ctx.block.attrs.listType : 'bullet';\n\t\tconst indent: number = isNodeOfType(ctx.block, 'list_item') ? ctx.block.attrs.indent : 0;\n\t\tconst attrs = buildListItemAttrs(listType, indent);\n\n\t\tconst tr = ctx.state\n\t\t\t.transaction('input')\n\t\t\t.splitBlock(ctx.blockId, ctx.offset, newBlockId)\n\t\t\t.setBlockType(newBlockId, nodeType('list_item'), attrs)\n\t\t\t.setSelection(createCollapsedSelection(newBlockId, 0))\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t});\n}\n\n// --- Backspace Handler ---\n\n/**\n * Handles Backspace at the start of a list item.\n * Converts the list item back to a paragraph, preserving text.\n */\nfunction handleBackspace(context: PluginContext): boolean {\n\treturn withListContext(context, (ctx) => {\n\t\tif (ctx.offset !== 0) return false;\n\n\t\tconst tr = ctx.state\n\t\t\t.transaction('input')\n\t\t\t.setBlockType(ctx.blockId, nodeType('paragraph'))\n\t\t\t.setSelection(ctx.state.selection)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t});\n}\n","/**\n * Locale interface and default English locale for the ListPlugin.\n */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface ListLocale {\n\treadonly bulletList: string;\n\treadonly numberedList: string;\n\treadonly checklist: string;\n\t/** Accessible name for the checklist item's checkbox marker (screen readers). */\n\treadonly checkboxLabel: string;\n\t/** Announced when a checklist item is toggled on. */\n\treadonly checkedAnnouncement: string;\n\t/** Announced when a checklist item is toggled off. */\n\treadonly uncheckedAnnouncement: string;\n}\n\n// --- Default English Locale ---\n\nexport const LIST_LOCALE_EN: ListLocale = {\n\tbulletList: 'Bullet List',\n\tnumberedList: 'Numbered List',\n\tchecklist: 'Checklist',\n\tcheckboxLabel: 'To-do item',\n\tcheckedAnnouncement: 'Checked',\n\tuncheckedAnnouncement: 'Unchecked',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<ListLocale> = import.meta.glob<{\n\tdefault: ListLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadListLocale(lang: string): Promise<ListLocale> {\n\treturn loadLocaleModule(localeModules, lang, LIST_LOCALE_EN);\n}\n","/**\n * Accessible checkbox marker for checklist items.\n *\n * The marker is a real `role=\"checkbox\"` element so assistive technology can\n * announce the item's checked state (WCAG 4.1.2 Name, Role, Value). It is\n * rendered `contenteditable=\"false\"` and flagged `data-widget` so the selection\n * layer treats it as zero-width view chrome, never as document content or a caret\n * position. The visible checkbox glyph is drawn in CSS.\n */\n\n/** CSS class identifying the checklist checkbox marker element. */\nexport const CHECKLIST_MARKER_CLASS = 'notectl-checklist-marker';\n\n/** Creates the accessible checkbox marker for a checklist item. */\nexport function createChecklistMarker(checked: boolean, label: string): HTMLElement {\n\tconst marker: HTMLElement = document.createElement('span');\n\tmarker.className = CHECKLIST_MARKER_CLASS;\n\tmarker.setAttribute('role', 'checkbox');\n\tmarker.setAttribute('aria-checked', String(checked));\n\tmarker.setAttribute('aria-label', label);\n\tmarker.setAttribute('contenteditable', 'false');\n\tmarker.setAttribute('data-widget', 'true');\n\treturn marker;\n}\n","/**\n * Toolbar item registration for list block types.\n * Registers bullet, ordered, and checklist toolbar buttons with active-state detection.\n */\n\nimport { isTextSelection, selectionRange } from '../../model/Selection.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { allBlocksMatchListType } from './ListCommands.js';\nimport type { ListTypeDefinition } from './ListDefinitions.js';\nimport type { ListLocale } from './ListLocale.js';\nimport type { ListType } from './ListPlugin.js';\n\n/** Registers toolbar items for each enabled list type. */\nexport function registerListToolbarItems(\n\tcontext: PluginContext,\n\tenabledTypes: readonly ListTypeDefinition[],\n\tlocale: ListLocale,\n): void {\n\tfor (const def of enabledTypes) {\n\t\tcontext.registerToolbarItem({\n\t\t\tid: `list-${def.type}`,\n\t\t\tgroup: 'block',\n\t\t\ticon: def.icon,\n\t\t\tlabel: getListLabel(def.type, locale),\n\t\t\tcommand: `toggleList:${def.type}`,\n\t\t\tisActive: (state) => isListActive(state, def.type),\n\t\t});\n\t}\n}\n\n// --- Helpers ---\n\nfunction getListLabel(type: ListType, locale: ListLocale): string {\n\tconst labels: Record<ListType, string> = {\n\t\tbullet: locale.bulletList,\n\t\tordered: locale.numberedList,\n\t\tchecklist: locale.checklist,\n\t};\n\treturn labels[type];\n}\n\nfunction isListActive(state: EditorState, listType: ListType): boolean {\n\tif (!isTextSelection(state.selection)) return false;\n\n\tif (state.selection.anchor.blockId !== state.selection.head.blockId) {\n\t\tconst range = selectionRange(state.selection, state.getBlockOrder());\n\t\treturn allBlocksMatchListType(state, range, listType);\n\t}\n\n\tconst block = state.getBlock(state.selection.anchor.blockId);\n\treturn block?.type === 'list_item' && block.attrs?.listType === listType;\n}\n","/**\n * ListPlugin: registers ordered, unordered, and checklist block types\n * with NodeSpecs, toggle commands, indent/outdent (Tab/Shift-Tab),\n * input rules, and toolbar buttons.\n *\n * This file is a thin orchestrator — command logic, input rules, keyboard\n * handlers, and toolbar rendering are delegated to dedicated modules.\n *\n * List items are modeled as flat blocks with a `listType` and `indent` attribute,\n * allowing simple nesting representation without deep tree structures.\n */\n\nimport { LIST_CSS, LIST_MARKER_WIDTH } from '../../editor/styles/list.js';\nimport { blockId } from '../../model/TypeBrands.js';\nimport { setStyleProperty } from '../../style/StyleRuntime.js';\nimport { createBlockElement } from '../../view/DomUtils.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { registerListCommands, toggleChecked } from './ListCommands.js';\nimport { LIST_TYPE_DEFINITIONS, type ListTypeDefinition } from './ListDefinitions.js';\nimport { registerListInputRules } from './ListInputRules.js';\nimport { registerListKeymaps } from './ListKeyboardHandlers.js';\nimport { LIST_LOCALE_EN, type ListLocale, loadListLocale } from './ListLocale.js';\nimport { CHECKLIST_MARKER_CLASS, createChecklistMarker } from './ListMarker.js';\nimport { registerListToolbarItems } from './ListToolbarItems.js';\n\n// --- Attribute Registry Augmentation ---\n\nexport type ListType = 'bullet' | 'ordered' | 'checklist';\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\tlist_item: { listType: ListType; indent: number; checked: boolean };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface ListConfig {\n\t/** Which list types to enable. Defaults to all. */\n\treadonly types: readonly ListType[];\n\t/** Maximum indent depth. Defaults to 4. */\n\treadonly maxIndent: number;\n\t/**\n\t * When true, checklist checkboxes remain interactive even in read-only mode.\n\t * Defaults to false (checkboxes are fully read-only).\n\t */\n\treadonly interactiveCheckboxes?: boolean;\n\treadonly locale?: ListLocale;\n}\n\nconst DEFAULT_CONFIG: ListConfig = {\n\ttypes: ['bullet', 'ordered', 'checklist'],\n\tmaxIndent: 4,\n};\n\n// --- Plugin ---\n\nexport class ListPlugin implements Plugin {\n\treadonly id = 'list';\n\treadonly name = 'List';\n\treadonly priority = 35;\n\n\tprivate readonly config: ListConfig;\n\tprivate locale!: ListLocale;\n\tprivate context: PluginContext | null = null;\n\tprivate checkboxClickHandler: ((e: MouseEvent) => void) | null = null;\n\n\tconstructor(config?: Partial<ListConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.context = context;\n\t\tthis.locale = await resolveLocale(context, this.config.locale, LIST_LOCALE_EN, loadListLocale);\n\t\tconst enabledTypes = this.getEnabledTypes();\n\n\t\tcontext.registerStyleSheet(LIST_CSS);\n\t\tthis.registerNodeSpec(context);\n\t\tregisterListCommands(context, this.config, enabledTypes, this.locale);\n\t\tregisterListKeymaps(context);\n\t\tregisterListInputRules(context, enabledTypes);\n\t\tregisterListToolbarItems(context, enabledTypes, this.locale);\n\t\tthis.registerCheckboxClickHandler(context);\n\t}\n\n\tdestroy(): void {\n\t\tif (this.checkboxClickHandler && this.context) {\n\t\t\tconst container: HTMLElement = this.context.getContainer();\n\t\t\tcontainer.removeEventListener('mousedown', this.checkboxClickHandler);\n\t\t}\n\t\tthis.checkboxClickHandler = null;\n\t\tthis.context = null;\n\t}\n\n\tprivate registerNodeSpec(context: PluginContext): void {\n\t\tconst checkboxLabel: string = this.locale.checkboxLabel;\n\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'list_item',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\tattrs: {\n\t\t\t\tlistType: { default: 'bullet' },\n\t\t\t\tindent: { default: 0 },\n\t\t\t\tchecked: { default: false },\n\t\t\t},\n\t\t\ttoDOM(node) {\n\t\t\t\tconst listType = node.attrs?.listType ?? 'bullet';\n\t\t\t\tconst indent = node.attrs?.indent ?? 0;\n\t\t\t\tconst checked = node.attrs?.checked ?? false;\n\n\t\t\t\tconst li = createBlockElement('li', node.id);\n\t\t\t\tli.setAttribute('role', 'listitem');\n\t\t\t\tli.setAttribute('data-list-type', listType);\n\t\t\t\tli.setAttribute('data-indent', String(indent));\n\t\t\t\tli.className = `notectl-list-item notectl-list-item--${listType}`;\n\n\t\t\t\tif (indent > 0) {\n\t\t\t\t\tsetStyleProperty(li, 'marginLeft', `${indent * LIST_MARKER_WIDTH}px`);\n\t\t\t\t}\n\n\t\t\t\tif (listType === 'checklist') {\n\t\t\t\t\t// `data-checked` drives the CSS glyph; the checked state is exposed to\n\t\t\t\t\t// assistive technology via the marker's own role=\"checkbox\", not via an\n\t\t\t\t\t// (invalid) aria-checked on the listitem. The marker is the first child\n\t\t\t\t\t// so reconciled inline content is appended after it.\n\t\t\t\t\tli.setAttribute('data-checked', String(checked));\n\t\t\t\t\tli.appendChild(createChecklistMarker(checked, checkboxLabel));\n\t\t\t\t}\n\t\t\t\tli.setAttribute('aria-level', String(indent + 1));\n\n\t\t\t\treturn li;\n\t\t\t},\n\t\t\twrapper(node) {\n\t\t\t\tconst listType = node.attrs?.listType ?? 'bullet';\n\t\t\t\tconst tag = listType === 'ordered' ? 'ol' : 'ul';\n\t\t\t\treturn {\n\t\t\t\t\ttag,\n\t\t\t\t\tkey: `list-${listType}`,\n\t\t\t\t\tclassName: `notectl-list notectl-list--${listType}`,\n\t\t\t\t\tattrs: { role: 'list' },\n\t\t\t\t};\n\t\t\t},\n\t\t\ttoHTML(node, content) {\n\t\t\t\tconst listType: string = (node.attrs?.listType as string) ?? 'bullet';\n\t\t\t\tconst checked: boolean = (node.attrs?.checked as boolean) ?? false;\n\n\t\t\t\tif (listType === 'checklist') {\n\t\t\t\t\tconst checkedAttr: string = checked ? ' checked' : '';\n\t\t\t\t\tconst ariaChecked: string = String(checked);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t`<li role=\"checkbox\" aria-checked=\"${ariaChecked}\">` +\n\t\t\t\t\t\t`<input type=\"checkbox\" disabled${checkedAttr}>` +\n\t\t\t\t\t\t`${content || '<br>'}</li>`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn `<li>${content || '<br>'}</li>`;\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'li' }],\n\t\t\tsanitize: {\n\t\t\t\ttags: ['ul', 'ol', 'li', 'input'],\n\t\t\t\tattrs: ['type', 'disabled', 'checked', 'role', 'aria-checked'],\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate registerCheckboxClickHandler(context: PluginContext): void {\n\t\tif (!this.config.types.includes('checklist')) return;\n\n\t\tthis.checkboxClickHandler = (e: MouseEvent) => {\n\t\t\tif (context.isReadOnly() && !this.config.interactiveCheckboxes) return;\n\n\t\t\tconst target: EventTarget | null = e.target;\n\t\t\tif (!(target instanceof HTMLElement)) return;\n\n\t\t\t// Toggle only when the checkbox marker itself is clicked. The marker is a\n\t\t\t// real element, so this is precise — no geometry/RTL math needed.\n\t\t\tconst marker: Element | null = target.closest(`.${CHECKLIST_MARKER_CLASS}`);\n\t\t\tif (!marker) return;\n\n\t\t\tconst li: Element | null = marker.closest('.notectl-list-item--checklist');\n\t\t\tif (!li) return;\n\n\t\t\te.preventDefault();\n\n\t\t\tconst bid: string | null = li.getAttribute('data-block-id');\n\t\t\tif (!bid) return;\n\n\t\t\ttoggleChecked(context, {\n\t\t\t\tinteractiveCheckboxes: this.config.interactiveCheckboxes,\n\t\t\t\ttargetId: blockId(bid),\n\t\t\t\tlocale: this.locale,\n\t\t\t});\n\t\t};\n\n\t\tconst container: HTMLElement = context.getContainer();\n\t\tcontainer.addEventListener('mousedown', this.checkboxClickHandler);\n\t}\n\n\tprivate getEnabledTypes(): readonly ListTypeDefinition[] {\n\t\treturn LIST_TYPE_DEFINITIONS.filter((def) => this.config.types.includes(def.type));\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function t(t,n){const e=t.getBlock(n);if(!e)return!1;const r=t.schema.getNodeSpec;return!!r&&!0===r(e.type)?.isVoid}function n(t,n,e){const r=t.getNodePath(n),o=t.getNodePath(e);if(!r||!o)return!1;if(r.length!==o.length)return!1;for(let c=0;c<r.length-1;c++)if(r[c]!==o[c])return!1;return!0}function e(t,n){const e=t.schema.getNodeSpec;if(!e)return!1;const r=t.getNodePath(n);if(!r||r.length<=1)return!1;for(let o=0;o<r.length-1;o++){const n=r[o];if(!n)continue;const c=t.getBlock(n);if(c&&e(c.type)?.isolating)return!0}return!1}function r(t,n){const e=t.schema.getNodeSpec;if(!e)return!1;const r=t.getBlock(n);return!!r&&!0===e(r.type)?.isolating}function o(n,e,r){const o=n.getBlockOrder(),i=o.indexOf(e);if(i<0)return null;const u=r?i+1:i-1;if(u<0||u>=o.length)return null;const s=o[u];return s&&c(n,e,s)?{targetId:s,isVoid:t(n,s)}:null}function c(t,o,c){if(r(t,o)||r(t,c))return!1;const i=e(t,o),u=e(t,c);return i===u&&(!i||!u||n(t,o,c))}export{o as a,t as i,e as n,n as o,r,c as t};
|
|
2
|
+
//# sourceMappingURL=NavigationQueries-Bt4zZ17v.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationQueries-Bt4zZ17v.mjs","names":[],"sources":["../../src/state/NavigationQueries.ts"],"sourcesContent":["/**\n * Pure navigation query functions for block boundary and isolating checks.\n *\n * These utilities inspect the document structure and schema to answer\n * questions about block traversal — whether a block is void, isolating,\n * or whether navigation between two blocks is allowed.\n */\n\nimport type { BlockId } from '../model/TypeBrands.js';\nimport type { EditorState } from './EditorState.js';\n\n/** Returns true if the block with the given ID is a void block (e.g. image, HR). */\nexport function isVoidBlock(state: EditorState, bid: BlockId): boolean {\n\tconst block = state.getBlock(bid);\n\tif (!block) return false;\n\tconst getNodeSpec = state.schema.getNodeSpec;\n\tif (!getNodeSpec) return false;\n\treturn getNodeSpec(block.type)?.isVoid === true;\n}\n\n/** Checks whether two blocks share the same parent in the document tree. */\nexport function sharesParent(state: EditorState, blockIdA: BlockId, blockIdB: BlockId): boolean {\n\tconst pathA = state.getNodePath(blockIdA);\n\tconst pathB = state.getNodePath(blockIdB);\n\tif (!pathA || !pathB) return false;\n\tif (pathA.length !== pathB.length) return false;\n\t// Compare parent paths (all but last element)\n\tfor (let i = 0; i < pathA.length - 1; i++) {\n\t\tif (pathA[i] !== pathB[i]) return false;\n\t}\n\treturn true;\n}\n\n/** Checks whether a block is inside an isolating node (e.g. table_cell). */\nexport function isInsideIsolating(state: EditorState, blockId: BlockId): boolean {\n\tconst getNodeSpec = state.schema.getNodeSpec;\n\tif (!getNodeSpec) return false;\n\tconst path = state.getNodePath(blockId);\n\tif (!path || path.length <= 1) return false;\n\n\t// Check ancestors (not the block itself)\n\tfor (let i = 0; i < path.length - 1; i++) {\n\t\tconst ancestorId = path[i];\n\t\tif (!ancestorId) continue;\n\t\tconst ancestor = state.getBlock(ancestorId);\n\t\tif (!ancestor) continue;\n\t\tconst spec = getNodeSpec(ancestor.type);\n\t\tif (spec?.isolating) return true;\n\t}\n\treturn false;\n}\n\n/** Returns true if the block itself has the isolating property. */\nexport function isIsolatingBlock(state: EditorState, blockId: BlockId): boolean {\n\tconst getNodeSpec = state.schema.getNodeSpec;\n\tif (!getNodeSpec) return false;\n\tconst block = state.getBlock(blockId);\n\tif (!block) return false;\n\treturn getNodeSpec(block.type)?.isolating === true;\n}\n\n/** The block reached by crossing one block boundary, plus whether it is void. */\nexport interface AdjacentBlock {\n\treadonly targetId: BlockId;\n\treadonly isVoid: boolean;\n}\n\n/**\n * Resolves the block immediately before/after `fromBlockId` in document order\n * when the boundary may be crossed. Returns `null` at a document boundary or\n * when an isolating boundary blocks the crossing.\n */\nexport function resolveAdjacentBlock(\n\tstate: EditorState,\n\tfromBlockId: BlockId,\n\tforward: boolean,\n): AdjacentBlock | null {\n\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\tconst idx: number = blockOrder.indexOf(fromBlockId);\n\tif (idx < 0) return null;\n\n\tconst targetIdx: number = forward ? idx + 1 : idx - 1;\n\tif (targetIdx < 0 || targetIdx >= blockOrder.length) return null;\n\n\tconst targetId: BlockId | undefined = blockOrder[targetIdx];\n\tif (!targetId) return null;\n\tif (!canCrossBlockBoundary(state, fromBlockId, targetId)) return null;\n\n\treturn { targetId, isVoid: isVoidBlock(state, targetId) };\n}\n\n/**\n * Checks whether navigation between two blocks is allowed.\n * Prevents crossing isolating boundaries (e.g. table cells).\n */\nexport function canCrossBlockBoundary(state: EditorState, fromId: BlockId, toId: BlockId): boolean {\n\t// A block that is itself isolating cannot be crossed into via arrow keys\n\tif (isIsolatingBlock(state, fromId) || isIsolatingBlock(state, toId)) return false;\n\n\tconst fromInside: boolean = isInsideIsolating(state, fromId);\n\tconst toInside: boolean = isInsideIsolating(state, toId);\n\n\t// One inside isolating, the other not → disallow\n\tif (fromInside !== toInside) return false;\n\n\t// Both inside isolating → must share the same parent\n\tif (fromInside && toInside) return sharesParent(state, fromId, toId);\n\n\treturn true;\n}\n"],"mappings":"AAYA,SAAgB,EAAY,EAAoB,GAC/C,MAAM,EAAQ,EAAM,SAAS,GAC7B,IAAK,EAAO,OAAO,EACnB,MAAM,EAAc,EAAM,OAAO,YACjC,QAAK,IACsC,IAApC,EAAY,EAAM,OAAO,MACjC,CAGA,SAAgB,EAAa,EAAoB,EAAmB,GACnE,MAAM,EAAQ,EAAM,YAAY,GAC1B,EAAQ,EAAM,YAAY,GAChC,IAAK,IAAU,EAAO,OAAO,EAC7B,GAAI,EAAM,SAAW,EAAM,OAAQ,OAAO,EAE1C,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAS,EAAG,IACrC,GAAI,EAAM,KAAO,EAAM,GAAI,OAAO,EAEnC,OAAO,CACR,CAGA,SAAgB,EAAkB,EAAoB,GACrD,MAAM,EAAc,EAAM,OAAO,YACjC,IAAK,EAAa,OAAO,EACzB,MAAM,EAAO,EAAM,YAAY,GAC/B,IAAK,GAAQ,EAAK,QAAU,EAAG,OAAO,EAGtC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAS,EAAG,IAAK,CACzC,MAAM,EAAa,EAAK,GACxB,IAAK,EAAY,SACjB,MAAM,EAAW,EAAM,SAAS,GAChC,GAAK,GACQ,EAAY,EAAS,OACxB,UAAW,OAAO,CAC7B,CACA,OAAO,CACR,CAGA,SAAgB,EAAiB,EAAoB,GACpD,MAAM,EAAc,EAAM,OAAO,YACjC,IAAK,EAAa,OAAO,EACzB,MAAM,EAAQ,EAAM,SAAS,GAC7B,QAAK,IACyC,IAAvC,EAAY,EAAM,OAAO,SACjC,CAaA,SAAgB,EACf,EACA,EACA,GAEA,MAAM,EAAiC,EAAM,gBACvC,EAAc,EAAW,QAAQ,GACvC,GAAI,EAAM,EAAG,OAAO,KAEpB,MAAM,EAAoB,EAAU,EAAM,EAAI,EAAM,EACpD,GAAI,EAAY,GAAK,GAAa,EAAW,OAAQ,OAAO,KAE5D,MAAM,EAAgC,EAAW,GACjD,OAAK,GACA,EAAsB,EAAO,EAAa,GAExC,CAAE,WAAU,OAAQ,EAAY,EAAO,IAHxB,IAIvB,CAMA,SAAgB,EAAsB,EAAoB,EAAiB,GAE1E,GAAI,EAAiB,EAAO,IAAW,EAAiB,EAAO,GAAO,OAAO,EAE7E,MAAM,EAAsB,EAAkB,EAAO,GAC/C,EAAoB,EAAkB,EAAO,GAGnD,OAAI,IAAe,KAGf,IAAc,GAAiB,EAAa,EAAO,EAAQ,GAGhE"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{S as n}from"./Document-r7vLOAGA.mjs";function t(t,i){if(0===i.length)return;let r=t.children.find(n=>n.id===i[0]);if(r){for(let t=1;t<i.length;t++){const e=i[t];if(!e)return;const o=r?.children.find(t=>n(t)&&t.id===e);if(!o)return;r=o}return r}}function i(i,r,e){if(0===r.length){const t=i.children[e];return t&&n(t)?t:void 0}const o=t(i,r);if(!o)return;const f=o.children[e];return f&&n(f)?f:void 0}function r(i,r){if(0===r.length)return;if(1===r.length){const n=i.children.findIndex(n=>n.id===r[0]);if(-1===n)return;return{parent:i,index:n}}const e=t(i,r.slice(0,-1));if(!e)return;const o=r[r.length-1];if(!o)return;const f=e.children.findIndex(t=>n(t)&&t.id===o);return-1!==f?{parent:e,index:f}:void 0}function e(n,t){for(const i of n.children){if(i.id===t)return[t];const n=o(i,t);if(n)return[i.id,...n]}}function o(t,i){for(const r of t.children){if(!n(r))continue;if(r.id===i)return[i];const t=o(r,i);if(t)return[r.id,...t]}}function f(n,t){for(const i of n.children)c(i,[i.id],t)}function c(t,i,r){r(t,i);for(const e of t.children)n(e)&&c(e,[...i,e.id],r)}function u(n,t){for(const i of n.children){if(i.id===t)return i;const n=d(i,t);if(n)return n}}function d(t,i){for(const r of t.children){if(!n(r))continue;if(r.id===i)return r;const t=d(r,i);if(t)return t}}function s(n,i){const r=e(n,i);if(!r)return;const o=t(n,r);return o?{node:o,path:r}:void 0}function l(n,i,r){const o=e(n,i);if(o&&!(o.length<2))for(let e=o.length-2;e>=0;e--){const i=o.slice(0,e+1),f=t(n,i);if(f?.type===r)return{node:f,path:i}}}function h(n,t,i){return void 0!==l(n,t,i)}export{h as a,r as c,s as i,f as l,u as n,i as o,e as r,t as s,l as t};
|
|
2
|
+
//# sourceMappingURL=NodeResolver-ChgLF_IP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeResolver-ChgLF_IP.mjs","names":[],"sources":["../../src/model/NodeResolver.ts"],"sourcesContent":["/**\n * Utilities for resolving nodes by path within the document tree.\n * Supports both flat and recursive (nested) document structures.\n */\n\nimport type { BlockNode, Document } from './Document.js';\nimport { isBlockNode } from './Document.js';\n\n/**\n * Resolves a node in the document tree by its path (array of block IDs).\n * The path traces the lineage from the root block down to the target.\n */\nexport function resolveNodeByPath(doc: Document, path: readonly string[]): BlockNode | undefined {\n\tif (path.length === 0) return undefined;\n\n\tlet current: BlockNode | undefined = doc.children.find((b) => b.id === path[0]);\n\tif (!current) return undefined;\n\n\tfor (let i = 1; i < path.length; i++) {\n\t\tconst childId = path[i];\n\t\tif (!childId) return undefined;\n\t\tconst next: BlockNode | undefined = current?.children.find(\n\t\t\t(c): c is BlockNode => isBlockNode(c) && c.id === childId,\n\t\t);\n\t\tif (!next) return undefined;\n\t\tcurrent = next;\n\t}\n\n\treturn current;\n}\n\n/**\n * Resolves the block child at `(parentPath, index)`. `parentPath = []` addresses\n * the document root; otherwise the path traces from the document root to the\n * containing block. Returns `undefined` when the parent does not exist or the\n * indexed slot is missing / occupied by a non-block child.\n */\nexport function resolveChildAt(\n\tdoc: Document,\n\tparentPath: readonly string[],\n\tindex: number,\n): BlockNode | undefined {\n\tif (parentPath.length === 0) {\n\t\tconst child = doc.children[index];\n\t\treturn child && isBlockNode(child) ? child : undefined;\n\t}\n\tconst parent = resolveNodeByPath(doc, parentPath);\n\tif (!parent) return undefined;\n\tconst child = parent.children[index];\n\treturn child && isBlockNode(child) ? child : undefined;\n}\n\n/**\n * Resolves the parent of a node at the given path.\n * Returns the parent container (Document or BlockNode) and the child's index within it.\n */\nexport function resolveParentByPath(\n\tdoc: Document,\n\tpath: readonly string[],\n): { parent: Document | BlockNode; index: number } | undefined {\n\tif (path.length === 0) return undefined;\n\n\tif (path.length === 1) {\n\t\tconst index = doc.children.findIndex((b) => b.id === path[0]);\n\t\tif (index === -1) return undefined;\n\t\treturn { parent: doc, index };\n\t}\n\n\tconst parentPath = path.slice(0, -1);\n\tconst parent = resolveNodeByPath(doc, parentPath);\n\tif (!parent) return undefined;\n\n\tconst childId = path[path.length - 1];\n\tif (!childId) return undefined;\n\tconst index = parent.children.findIndex(\n\t\t(c): c is BlockNode => isBlockNode(c) && c.id === childId,\n\t);\n\tif (index === -1) return undefined;\n\n\treturn { parent, index };\n}\n\n/**\n * Finds the path (array of block IDs) to a node by its ID.\n * Performs recursive DFS through the document tree.\n */\nexport function findNodePath(doc: Document, nodeId: string): string[] | undefined {\n\tfor (const block of doc.children) {\n\t\tif (block.id === nodeId) return [nodeId];\n\n\t\tconst subPath = findNodePathInBlock(block, nodeId);\n\t\tif (subPath) return [block.id, ...subPath];\n\t}\n\treturn undefined;\n}\n\nfunction findNodePathInBlock(block: BlockNode, nodeId: string): string[] | undefined {\n\tfor (const child of block.children) {\n\t\tif (!isBlockNode(child)) continue;\n\t\tif (child.id === nodeId) return [nodeId];\n\n\t\tconst subPath = findNodePathInBlock(child, nodeId);\n\t\tif (subPath) return [child.id, ...subPath];\n\t}\n\treturn undefined;\n}\n\n/**\n * Walks all block nodes in the document tree in depth-first order.\n * Visits every BlockNode, including nested ones, with their full path.\n */\nexport function walkNodes(\n\tdoc: Document,\n\tcallback: (node: BlockNode, path: string[]) => void,\n): void {\n\tfor (const block of doc.children) {\n\t\twalkNodeRecursive(block, [block.id], callback);\n\t}\n}\n\nfunction walkNodeRecursive(\n\tnode: BlockNode,\n\tpath: string[],\n\tcallback: (node: BlockNode, path: string[]) => void,\n): void {\n\tcallback(node, path);\n\tfor (const child of node.children) {\n\t\tif (isBlockNode(child)) {\n\t\t\twalkNodeRecursive(child, [...path, child.id], callback);\n\t\t}\n\t}\n}\n\n/**\n * Finds a block node by ID anywhere in the document tree (recursive DFS).\n */\nexport function findNode(doc: Document, nodeId: string): BlockNode | undefined {\n\tfor (const block of doc.children) {\n\t\tif (block.id === nodeId) return block;\n\t\tconst found = findNodeInBlock(block, nodeId);\n\t\tif (found) return found;\n\t}\n\treturn undefined;\n}\n\nfunction findNodeInBlock(block: BlockNode, nodeId: string): BlockNode | undefined {\n\tfor (const child of block.children) {\n\t\tif (!isBlockNode(child)) continue;\n\t\tif (child.id === nodeId) return child;\n\t\tconst found = findNodeInBlock(child, nodeId);\n\t\tif (found) return found;\n\t}\n\treturn undefined;\n}\n\n/**\n * Finds a block node and returns it together with its path.\n */\nexport function findNodeWithPath(\n\tdoc: Document,\n\tnodeId: string,\n): { node: BlockNode; path: string[] } | undefined {\n\tconst path = findNodePath(doc, nodeId);\n\tif (!path) return undefined;\n\tconst node = resolveNodeByPath(doc, path);\n\tif (!node) return undefined;\n\treturn { node, path };\n}\n\n/**\n * Returns the nearest ancestor of the given node whose type matches `type`,\n * together with its path. Excludes the node itself. Returns undefined when no\n * matching ancestor exists.\n */\nexport function findAncestorOfType(\n\tdoc: Document,\n\tnodeId: string,\n\ttype: string,\n): { node: BlockNode; path: string[] } | undefined {\n\tconst path = findNodePath(doc, nodeId);\n\tif (!path || path.length < 2) return undefined;\n\t// Walk ancestors from nearest to root, skipping the node itself (last entry).\n\tfor (let i = path.length - 2; i >= 0; i--) {\n\t\tconst ancestorPath = path.slice(0, i + 1);\n\t\tconst ancestor = resolveNodeByPath(doc, ancestorPath);\n\t\tif (ancestor?.type === type) return { node: ancestor, path: ancestorPath };\n\t}\n\treturn undefined;\n}\n\n/** Returns true if the node has an ancestor (excluding itself) of the given type. */\nexport function hasAncestorOfType(doc: Document, nodeId: string, type: string): boolean {\n\treturn findAncestorOfType(doc, nodeId, type) !== undefined;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{S as t,o as n,p as e,u as i}from"./Document-r7vLOAGA.mjs";import{c as o,l as r,n as s,o as c,r as l,t as u}from"./Selection-HYoVFpAx.mjs";import{r as a}from"./NodeResolver-ChgLF_IP.mjs";import{T as d,_ as f,l as p}from"./BlockInsertion-6rR9tIGP.mjs";import{i as b}from"./NavigationQueries-Bt4zZ17v.mjs";function m(e,o){const{parentPath:r,siblings:s,index:c}=d(e,o.nodeId);if(c<0)return null;const l=e.transaction("input");if(1===s.length){const t=i();return l.insertNode(r,0,n(t)),l.removeNode(r,1),l.setSelection(u(t,0)),l.build()}l.removeNode(r,c);const a=s[c-1];if(a&&t(a)){const t=f(e,a.id,"end");if(t)return l.setSelection(t),l.build()}const p=s[c+1];if(p&&t(p)){const t=f(e,p.id,"start");if(t)return l.setSelection(t),l.build()}return null}function S(n,e){if(e<0)return;const i=n[e+1];return i&&t(i)&&p(i)?i:void 0}function g(t,e){const{parentPath:o,siblings:r,index:s}=d(t,e.nodeId);if(s<0)return null;const c=S(r,s);if(c)return t.transaction("input").setSelection(u(c.id,0)).build();const l=i(),a=t.transaction("input");return a.insertNode(o,s+1,n(l)),a.setSelection(u(l,0)),a.build()}function h(t,e,o,r){const{parentPath:s,siblings:c,index:l}=d(t,e.nodeId),a=t.transaction(r),f=S(c,l);if(f)return a.insertText(f.id,0,o,[]),a.setSelection(u(f.id,o.length)),a.build();const p=i(),b=l>=0?l+1:c.length;return a.insertNode(s,b,n(p)),a.insertText(p,0,o,[]),a.setSelection(u(p,o.length)),a.build()}function I(t,n,i){const d=t.selection,f=t.getBlockOrder(),p=!i||"left"!==n&&"right"!==n?n:"left"===n?"right":"left";return r(d)?function(t,n,i,o){const r=o.indexOf(n.nodeId),c=a(t.doc,n.nodeId)??[];if("left"===i||"up"===i){if(r>0){const i=o[r-1];if(!i)return null;if(b(t,i))return t.transaction("input").setSelection(s(n.nodeId,"before",c)).build();const l=t.getBlock(i),a=l?e(l):0;return t.transaction("input").setSelection(u(i,a)).build()}return t.transaction("input").setSelection(s(n.nodeId,"before",c)).build()}if(r<o.length-1){const e=o[r+1];return e?b(t,e)?t.transaction("input").setSelection(s(n.nodeId,"after",c)).build():t.transaction("input").setSelection(u(e,0)).build():null}return t.transaction("input").setSelection(s(n.nodeId,"after",c)).build()}(t,d,p,f):o(d)?null:c(d)?function(t,n,i,o){const r=o.indexOf(n.anchor.blockId),s=t.getBlock(n.anchor.blockId);if(!s)return null;const c=e(s);if(("right"===i||"down"===i)&&n.anchor.offset===c&&r<o.length-1){const n=o[r+1];if(n&&b(t,n)){const e=a(t.doc,n)??[];return t.transaction("input").setSelection(l(n,e)).build()}}if(("left"===i||"up"===i)&&0===n.anchor.offset&&r>0){const n=o[r-1];if(n&&b(t,n)){const e=a(t.doc,n)??[];return t.transaction("input").setSelection(l(n,e)).build()}}return null}(t,d,p,f):null}export{I as i,g as n,h as r,m as t};
|
|
2
|
+
//# sourceMappingURL=NodeSelectionCommands-Dj4VxLdD.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeSelectionCommands-Dj4VxLdD.mjs","names":[],"sources":["../../src/commands/NodeSelectionCommands.ts"],"sourcesContent":["/**\n * Commands for NodeSelection: deleting void blocks, inserting paragraphs\n * after void blocks, and navigating arrow keys into/out of void blocks.\n */\n\nimport type { BlockNode, ChildNode } from '../model/Document.js';\nimport {\n\tcreateEmptyParagraph,\n\tgenerateBlockId,\n\tgetBlockLength,\n\tisBlockNode,\n} from '../model/Document.js';\nimport { findNodePath } from '../model/NodeResolver.js';\nimport type { NodeSelection } from '../model/Selection.js';\nimport {\n\tcreateCollapsedSelection,\n\tcreateGapCursor,\n\tcreateNodeSelection,\n\tisCollapsed,\n\tisGapCursor,\n\tisNodeSelection,\n} from '../model/Selection.js';\nimport type { BlockId } from '../model/TypeBrands.js';\nimport type { EditorState } from '../state/EditorState.js';\nimport { isVoidBlock } from '../state/NavigationQueries.js';\nimport type { Transaction } from '../state/Transaction.js';\nimport { isEmptyParagraph } from './BlockInsertion.js';\nimport { createSelectionForBlockBoundary, resolveSiblingContext } from './CommandHelpers.js';\n\nexport { findFirstLeafBlockId, findLastLeafBlockId } from './CommandHelpers.js';\n\n/**\n * Deletes the selected block and places cursor on a valid adjacent position.\n * If it is the only child in its parent, replaces it with an empty paragraph.\n */\nexport function deleteNodeSelection(state: EditorState, sel: NodeSelection): Transaction | null {\n\tconst { parentPath, siblings, index } = resolveSiblingContext(state, sel.nodeId);\n\tif (index < 0) return null;\n\n\tconst builder = state.transaction('input');\n\n\t// Keep container invariants intact when removing the only child in any parent.\n\tif (siblings.length === 1) {\n\t\tconst newId = generateBlockId();\n\t\tbuilder.insertNode(parentPath, 0, createEmptyParagraph(newId));\n\t\tbuilder.removeNode(parentPath, 1);\n\t\tbuilder.setSelection(createCollapsedSelection(newId, 0));\n\t\treturn builder.build();\n\t}\n\n\tbuilder.removeNode(parentPath, index);\n\n\t// Prefer the previous sibling, matching Backspace/Delete semantics.\n\tconst prevSibling = siblings[index - 1];\n\tif (prevSibling && isBlockNode(prevSibling)) {\n\t\tconst selection = createSelectionForBlockBoundary(state, prevSibling.id, 'end');\n\t\tif (selection) {\n\t\t\tbuilder.setSelection(selection);\n\t\t\treturn builder.build();\n\t\t}\n\t}\n\n\tconst nextSibling = siblings[index + 1];\n\tif (nextSibling && isBlockNode(nextSibling)) {\n\t\tconst selection = createSelectionForBlockBoundary(state, nextSibling.id, 'start');\n\t\tif (selection) {\n\t\t\tbuilder.setSelection(selection);\n\t\t\treturn builder.build();\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * The void block's trailing escape line, when it already exists as an empty\n * paragraph. A void block at the document root always owns such a paragraph\n * (#152/#158), so reusing it stops a second blank line from stacking up when\n * text or a paragraph is inserted while the void is node-selected (#163).\n * Returns undefined when there is no reusable line (a non-empty sibling, or the\n * void is the last block), so callers fall back to creating one.\n */\nfunction trailingEscapeParagraph(\n\tsiblings: readonly ChildNode[],\n\tindex: number,\n): BlockNode | undefined {\n\tif (index < 0) return undefined;\n\tconst next: ChildNode | undefined = siblings[index + 1];\n\treturn next && isBlockNode(next) && isEmptyParagraph(next) ? next : undefined;\n}\n\n/**\n * Places a collapsed cursor on an empty paragraph after a node-selected void\n * block (Enter). Reuses the void's existing trailing escape line when present so\n * no blank line stacks up (#163); otherwise inserts a fresh paragraph.\n */\nexport function insertParagraphAfterNodeSelection(\n\tstate: EditorState,\n\tsel: NodeSelection,\n): Transaction | null {\n\tconst { parentPath, siblings, index } = resolveSiblingContext(state, sel.nodeId);\n\tif (index < 0) return null;\n\n\tconst trailing: BlockNode | undefined = trailingEscapeParagraph(siblings, index);\n\tif (trailing) {\n\t\treturn state\n\t\t\t.transaction('input')\n\t\t\t.setSelection(createCollapsedSelection(trailing.id, 0))\n\t\t\t.build();\n\t}\n\n\tconst newId = generateBlockId();\n\tconst builder = state.transaction('input');\n\tbuilder.insertNode(parentPath, index + 1, createEmptyParagraph(newId));\n\tbuilder.setSelection(createCollapsedSelection(newId, 0));\n\treturn builder.build();\n}\n\n/**\n * Inserts text on a paragraph after a node-selected void block (typing). Reuses\n * the void's existing trailing escape line when present so no blank line stacks\n * up (#163); otherwise inserts a fresh paragraph to hold the text.\n */\nexport function insertTextAfterNodeSelection(\n\tstate: EditorState,\n\tsel: NodeSelection,\n\ttext: string,\n\torigin: 'input' | 'paste',\n): Transaction {\n\tconst { parentPath, siblings, index } = resolveSiblingContext(state, sel.nodeId);\n\tconst builder = state.transaction(origin);\n\n\tconst trailing: BlockNode | undefined = trailingEscapeParagraph(siblings, index);\n\tif (trailing) {\n\t\tbuilder.insertText(trailing.id, 0, text, []);\n\t\tbuilder.setSelection(createCollapsedSelection(trailing.id, text.length));\n\t\treturn builder.build();\n\t}\n\n\tconst newId = generateBlockId();\n\tconst insertIdx = index >= 0 ? index + 1 : siblings.length;\n\tbuilder.insertNode(parentPath, insertIdx, createEmptyParagraph(newId));\n\tbuilder.insertText(newId, 0, text, []);\n\tbuilder.setSelection(createCollapsedSelection(newId, text.length));\n\treturn builder.build();\n}\n\n/**\n * Navigates arrow keys into/out of void blocks.\n * Returns a transaction if navigation should create a NodeSelection, or null.\n *\n * @param isRtl — When true, flips left/right to account for RTL block direction.\n */\nexport function navigateArrowIntoVoid(\n\tstate: EditorState,\n\tdirection: 'left' | 'right' | 'up' | 'down',\n\tisRtl?: boolean,\n): Transaction | null {\n\tconst sel = state.selection;\n\tconst blockOrder = state.getBlockOrder();\n\tconst effectiveDir: 'left' | 'right' | 'up' | 'down' =\n\t\tisRtl && (direction === 'left' || direction === 'right')\n\t\t\t? direction === 'left'\n\t\t\t\t? 'right'\n\t\t\t\t: 'left'\n\t\t\t: direction;\n\n\t// If currently on a NodeSelection, navigate away from it\n\tif (isNodeSelection(sel)) {\n\t\treturn navigateAwayFromNodeSelection(state, sel, effectiveDir, blockOrder);\n\t}\n\n\t// GapCursor is handled by navigateFromGapCursor in CaretNavigation\n\tif (isGapCursor(sel)) return null;\n\n\t// Text selection: check if navigating into a void block\n\tif (!isCollapsed(sel)) return null;\n\n\treturn navigateIntoVoid(state, sel, effectiveDir, blockOrder);\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Handles navigation away from a NodeSelection (arrow keys while void is selected). */\nfunction navigateAwayFromNodeSelection(\n\tstate: EditorState,\n\tsel: NodeSelection,\n\tdirection: 'left' | 'right' | 'up' | 'down',\n\tblockOrder: readonly BlockId[],\n): Transaction | null {\n\tconst nodeIdx = blockOrder.indexOf(sel.nodeId);\n\tconst nodePath = (findNodePath(state.doc, sel.nodeId) ?? []) as BlockId[];\n\n\tif (direction === 'left' || direction === 'up') {\n\t\tif (nodeIdx > 0) {\n\t\t\tconst prevId = blockOrder[nodeIdx - 1];\n\t\t\tif (!prevId) return null;\n\t\t\tif (isVoidBlock(state, prevId)) {\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.setSelection(createGapCursor(sel.nodeId, 'before', nodePath))\n\t\t\t\t\t.build();\n\t\t\t}\n\t\t\tconst prevBlock = state.getBlock(prevId);\n\t\t\tconst prevLen = prevBlock ? getBlockLength(prevBlock) : 0;\n\t\t\treturn state\n\t\t\t\t.transaction('input')\n\t\t\t\t.setSelection(createCollapsedSelection(prevId, prevLen))\n\t\t\t\t.build();\n\t\t}\n\t\treturn state\n\t\t\t.transaction('input')\n\t\t\t.setSelection(createGapCursor(sel.nodeId, 'before', nodePath))\n\t\t\t.build();\n\t}\n\n\t// right or down\n\tif (nodeIdx < blockOrder.length - 1) {\n\t\tconst nextId = blockOrder[nodeIdx + 1];\n\t\tif (!nextId) return null;\n\t\tif (isVoidBlock(state, nextId)) {\n\t\t\treturn state\n\t\t\t\t.transaction('input')\n\t\t\t\t.setSelection(createGapCursor(sel.nodeId, 'after', nodePath))\n\t\t\t\t.build();\n\t\t}\n\t\treturn state.transaction('input').setSelection(createCollapsedSelection(nextId, 0)).build();\n\t}\n\treturn state\n\t\t.transaction('input')\n\t\t.setSelection(createGapCursor(sel.nodeId, 'after', nodePath))\n\t\t.build();\n}\n\n/** Handles text selection navigating into an adjacent void block. */\nfunction navigateIntoVoid(\n\tstate: EditorState,\n\tsel: { readonly anchor: { readonly blockId: BlockId; readonly offset: number } },\n\tdirection: 'left' | 'right' | 'up' | 'down',\n\tblockOrder: readonly BlockId[],\n): Transaction | null {\n\tconst blockIdx = blockOrder.indexOf(sel.anchor.blockId);\n\tconst block = state.getBlock(sel.anchor.blockId);\n\tif (!block) return null;\n\tconst blockLen = getBlockLength(block);\n\n\tif (direction === 'right' || direction === 'down') {\n\t\tif (sel.anchor.offset === blockLen && blockIdx < blockOrder.length - 1) {\n\t\t\tconst nextId = blockOrder[blockIdx + 1];\n\t\t\tif (nextId && isVoidBlock(state, nextId)) {\n\t\t\t\tconst path = findNodePath(state.doc, nextId) ?? [];\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.setSelection(createNodeSelection(nextId, path as BlockId[]))\n\t\t\t\t\t.build();\n\t\t\t}\n\t\t}\n\t}\n\n\tif (direction === 'left' || direction === 'up') {\n\t\tif (sel.anchor.offset === 0 && blockIdx > 0) {\n\t\t\tconst prevId = blockOrder[blockIdx - 1];\n\t\t\tif (prevId && isVoidBlock(state, prevId)) {\n\t\t\t\tconst path = findNodePath(state.doc, prevId) ?? [];\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.setSelection(createNodeSelection(prevId, path as BlockId[]))\n\t\t\t\t\t.build();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function t(t,e,o){for(const a of e){const e=t.getNodeSpec(a);if(!e)continue;if(e.attrs?.[o.attrName])continue;const r=e.toDOM;t.removeNodeSpec(a),t.registerNodeSpec({...e,attrs:{...e.attrs,[o.attrName]:{default:o.getDefault(a)}},toDOM(t){const a=r.call(e,t);return o.applyToDOM(a,t),a}})}}export{t};
|
|
2
|
+
//# sourceMappingURL=NodeSpecPatching-B_yLknTl.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeSpecPatching-B_yLknTl.mjs","names":[],"sources":["../../src/plugins/shared/NodeSpecPatching.ts"],"sourcesContent":["/**\n * Helper for plugins that augment existing block NodeSpecs with an extra\n * attribute rendered as a DOM effect (e.g. alignment's `align`, text\n * direction's `dir`). Re-registers each target spec with the added attribute\n * and a `toDOM` wrapper that applies the effect after the original render.\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport type { SchemaRegistry } from '../../model/SchemaRegistry.js';\n\nexport interface NodeSpecAttrPatch {\n\t/** Attribute name to add (skipped for specs that already declare it). */\n\treadonly attrName: string;\n\t/** Default value for the attribute, possibly per block type. */\n\treadonly getDefault: (type: string) => string;\n\t/** Applies the attribute-derived effect to the rendered element. */\n\treadonly applyToDOM: (el: HTMLElement, node: BlockNode) => void;\n}\n\n/**\n * Adds `patch.attrName` to each of `types` whose NodeSpec does not already\n * declare it, wrapping `toDOM` so `patch.applyToDOM` runs after the original.\n */\nexport function patchNodeSpecAttr(\n\tregistry: SchemaRegistry,\n\ttypes: Iterable<string>,\n\tpatch: NodeSpecAttrPatch,\n): void {\n\tfor (const type of types) {\n\t\tconst spec = registry.getNodeSpec(type);\n\t\tif (!spec) continue;\n\t\tif (spec.attrs?.[patch.attrName]) continue;\n\n\t\tconst originalToDOM = spec.toDOM;\n\n\t\tregistry.removeNodeSpec(type);\n\t\tregistry.registerNodeSpec({\n\t\t\t...spec,\n\t\t\tattrs: {\n\t\t\t\t...spec.attrs,\n\t\t\t\t[patch.attrName]: { default: patch.getDefault(type) },\n\t\t\t},\n\t\t\ttoDOM(node) {\n\t\t\t\tconst el = originalToDOM.call(spec, node);\n\t\t\t\tpatch.applyToDOM(el, node);\n\t\t\t\treturn el;\n\t\t\t},\n\t\t});\n\t}\n}\n"],"mappings":"AAuBA,SAAgB,EACf,EACA,EACA,GAEA,IAAK,MAAM,KAAQ,EAAO,CACzB,MAAM,EAAO,EAAS,YAAY,GAClC,IAAK,EAAM,SACX,GAAI,EAAK,QAAQ,EAAM,UAAW,SAElC,MAAM,EAAgB,EAAK,MAE3B,EAAS,eAAe,GACxB,EAAS,iBAAiB,IACtB,EACH,MAAO,IACH,EAAK,OACP,EAAM,UAAW,CAAE,QAAS,EAAM,WAAW,KAE/C,KAAA,CAAM,GACL,MAAM,EAAK,EAAc,KAAK,EAAM,GAEpC,OADA,EAAM,WAAW,EAAI,GACd,CACR,GAEF,CACD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var t,n,r;function e(){if(void 0!==t)return t;if("undefined"==typeof navigator)return t=!1,!1;if("userAgentData"in navigator){const n=navigator.userAgentData;if(n.platform)return t=/macOS/i.test(n.platform)}return t=/Mac|iP(hone|[oa]d)/.test(navigator.platform)}function a(){return void 0!==n?n:"undefined"==typeof navigator?(n=!1,!1):n=/Firefox\//.test(navigator.userAgent)}function i(){return void 0!==r?r:"undefined"==typeof navigator?(r=!1,!1):r=/AppleWebKit\//.test(navigator.userAgent)&&!/Chrome\//.test(navigator.userAgent)}function o(t){return"rtl"===getComputedStyle(t).direction?"rtl":"ltr"}function u(t){return"rtl"===o(t)}export{i as a,u as i,a as n,e as r,o as t};
|
|
2
|
+
//# sourceMappingURL=Platform-ByobkiCc.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Platform-ByobkiCc.mjs","names":[],"sources":["../../src/platform/Platform.ts"],"sourcesContent":["/**\n * Platform and browser detection utilities.\n *\n * Determines the current platform (macOS/iOS) and browser engine, which\n * affects keyboard shortcut bindings and browser-specific workarounds.\n * Also provides BiDi text direction detection.\n *\n * All detection results are cached after first evaluation for performance.\n */\n\ninterface NavigatorUAData {\n\treadonly platform?: string;\n}\n\nlet cachedIsMac: boolean | undefined;\nlet cachedIsFirefox: boolean | undefined;\nlet cachedIsWebKit: boolean | undefined;\n\n/** Returns `true` when running on macOS or iOS. */\nexport function isMac(): boolean {\n\tif (cachedIsMac !== undefined) return cachedIsMac;\n\tif (typeof navigator === 'undefined') {\n\t\tcachedIsMac = false;\n\t\treturn false;\n\t}\n\tif ('userAgentData' in navigator) {\n\t\tconst uaData: NavigatorUAData = navigator.userAgentData as NavigatorUAData;\n\t\tif (uaData.platform) {\n\t\t\tcachedIsMac = /macOS/i.test(uaData.platform);\n\t\t\treturn cachedIsMac;\n\t\t}\n\t}\n\tcachedIsMac = /Mac|iP(hone|[oa]d)/.test(navigator.platform);\n\treturn cachedIsMac;\n}\n\n/**\n * Returns `true` when running on Firefox (Gecko engine).\n * Only use for genuine browser workarounds, not feature detection.\n */\nexport function isFirefox(): boolean {\n\tif (cachedIsFirefox !== undefined) return cachedIsFirefox;\n\tif (typeof navigator === 'undefined') {\n\t\tcachedIsFirefox = false;\n\t\treturn false;\n\t}\n\tcachedIsFirefox = /Firefox\\//.test(navigator.userAgent);\n\treturn cachedIsFirefox;\n}\n\n/**\n * Returns `true` when running on WebKit (Safari engine).\n * Only use for genuine browser workarounds, not feature detection.\n */\nexport function isWebKit(): boolean {\n\tif (cachedIsWebKit !== undefined) return cachedIsWebKit;\n\tif (typeof navigator === 'undefined') {\n\t\tcachedIsWebKit = false;\n\t\treturn false;\n\t}\n\tcachedIsWebKit =\n\t\t/AppleWebKit\\//.test(navigator.userAgent) && !/Chrome\\//.test(navigator.userAgent);\n\treturn cachedIsWebKit;\n}\n\n/** Returns the computed text direction of the given element. */\nexport function getTextDirection(element: HTMLElement): 'ltr' | 'rtl' {\n\tconst dir: string = getComputedStyle(element).direction;\n\treturn dir === 'rtl' ? 'rtl' : 'ltr';\n}\n\n/** Returns `true` when the element is in an RTL context (computed direction is RTL). */\nexport function isRtlContext(element: HTMLElement): boolean {\n\treturn getTextDirection(element) === 'rtl';\n}\n\n/**\n * Resets cached detection results.\n * Only intended for use in tests.\n */\nexport function resetPlatformCache(): void {\n\tcachedIsMac = undefined;\n\tcachedIsFirefox = undefined;\n\tcachedIsWebKit = undefined;\n}\n"],"mappings":"AAcA,IAAI,EACA,EACA,EAGJ,SAAgB,IACf,QAAoB,IAAhB,EAA2B,OAAO,EACtC,GAAyB,oBAAd,UAEV,OADA,GAAc,GACP,EAER,GAAI,kBAAmB,UAAW,CACjC,MAAM,EAA0B,UAAU,cAC1C,GAAI,EAAO,SAEV,OADA,EAAc,SAAS,KAAK,EAAO,SAGrC,CAEA,OADA,EAAc,qBAAqB,KAAK,UAAU,SAEnD,CAMA,SAAgB,IACf,YAAwB,IAApB,EAAsC,EACjB,oBAAd,WACV,GAAkB,GACX,GAER,EAAkB,YAAY,KAAK,UAAU,UAE9C,CAMA,SAAgB,IACf,YAAuB,IAAnB,EAAqC,EAChB,oBAAd,WACV,GAAiB,GACV,GAER,EACC,gBAAgB,KAAK,UAAU,aAAe,WAAW,KAAK,UAAU,UAE1E,CAGA,SAAgB,EAAiB,GAEhC,MAAe,QADK,iBAAiB,GAAS,UACvB,MAAQ,KAChC,CAGA,SAAgB,EAAa,GAC5B,MAAqC,QAA9B,EAAiB,EACzB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{l as e,u as n}from"./Selection-HYoVFpAx.mjs";import{n as t}from"./TypedKeys-CA4bfw9O.mjs";var o=class{resolvedLocale;constructor(e){this.resolvedLocale="browser"===e?"undefined"!=typeof navigator?navigator.language.split("-")[0]??"en":"en":e}getLocale(){return this.resolvedLocale}},r=new t("locale");async function a(e,n,t){if("en"===n)return t;const o=e[`./locales/${n}.ts`];if(!o)return t;try{return(await o()).default}catch{return t}}function c(e,n){return!!n&&(e.dispatch(n),!0)}function s(e){return e.charAt(0).toUpperCase()+e.slice(1)}function i(e){return`toggle${s(e)}`}async function l(e,n,t,o){if(n)return n;const a=e.getService(r)?.getLocale()??"en";return"en"===a?t:o(a)}function u(t){const o=t.selection;return e(o)?t.getBlock(o.nodeId):n(o)?t.getBlock(o.anchor.blockId):void 0}function d(t){const o=t.selection;return e(o)?o.nodeId:n(o)?o.anchor.blockId:void 0}export{l as a,o as c,d as i,r as l,c as n,i as o,u as r,a as s,s as t};
|
|
2
|
+
//# sourceMappingURL=PluginHelpers-D4quRJ5a.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginHelpers-D4quRJ5a.mjs","names":[],"sources":["../../src/i18n/LocaleService.ts","../../src/plugins/shared/LocaleLoader.ts","../../src/plugins/shared/PluginHelpers.ts"],"sourcesContent":["/**\n * Global locale service that resolves the active language.\n * Registered as a system-level service before plugin init.\n */\n\nimport { ServiceKey } from '../model/TypedKeys.js';\n\nexport class LocaleService {\n\tprivate readonly resolvedLocale: string;\n\n\tconstructor(locale: string) {\n\t\tthis.resolvedLocale =\n\t\t\tlocale === 'browser'\n\t\t\t\t? typeof navigator !== 'undefined'\n\t\t\t\t\t? (navigator.language.split('-')[0] ?? 'en')\n\t\t\t\t\t: 'en'\n\t\t\t\t: locale;\n\t}\n\n\tgetLocale(): string {\n\t\treturn this.resolvedLocale;\n\t}\n}\n\nexport const LocaleServiceKey = new ServiceKey<LocaleService>('locale');\n","/**\n * Shared helper for loading plugin locale bundles.\n *\n * Rationale:\n * Every notectl plugin used to ship its own copy of a ~15-line locale\n * loader: English shortcut, glob lookup, lazy import, try/catch fallback.\n * The logic is identical across ~23 plugins — only the locale type and\n * the default value change. This helper centralizes the pattern so each\n * plugin's `XxxLocale.ts` shrinks to a handful of lines.\n *\n * Why the glob map still lives in the plugin:\n * `import.meta.glob` is statically resolved by the bundler **relative to\n * the file that calls it**. The helper therefore cannot build the glob\n * itself — each plugin must pass in its own `import.meta.glob(...)`\n * result, and the helper takes care of everything else.\n */\n\n/**\n * Signature of a single locale loader as produced by `import.meta.glob`.\n * The bundler wraps each matched module in a thunk returning a Promise\n * that resolves to an ES module whose default export is the locale.\n */\nexport type LocaleModuleLoader<TLocale> = () => Promise<{ default: TLocale }>;\n\n/**\n * Map from the path string emitted by `import.meta.glob` (e.g.\n * `./locales/de.ts`) to its corresponding lazy loader.\n */\nexport type LocaleModuleMap<TLocale> = Record<string, LocaleModuleLoader<TLocale>>;\n\n/**\n * Loads a plugin locale for the requested language with three fallbacks:\n *\n * 1. `lang === 'en'` — returns the default locale immediately, no import.\n * 2. No matching module in the map — returns the default locale.\n * 3. Module import throws — returns the default locale.\n *\n * This is the exact behavior every plugin needs; sharing it removes ~15\n * lines of boilerplate per plugin and guarantees consistent fallback\n * semantics across the entire editor.\n *\n * @param modules The `import.meta.glob('./locales/*.ts', ...)` map from\n * the caller's module. Passing this in from the plugin\n * is mandatory — globs are resolved at the call site.\n * @param lang IETF-style language tag, e.g. `'de'`, `'zh'`, `'en'`.\n * @param fallback English default locale to return when lookup or\n * import fails. Must already be a fully-formed locale.\n */\nexport async function loadLocaleModule<TLocale>(\n\tmodules: LocaleModuleMap<TLocale>,\n\tlang: string,\n\tfallback: TLocale,\n): Promise<TLocale> {\n\tif (lang === 'en') return fallback;\n\n\tconst loader: LocaleModuleLoader<TLocale> | undefined = modules[`./locales/${lang}.ts`];\n\tif (!loader) return fallback;\n\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n","/**\n * Shared helper utilities for plugins.\n * Common operations extracted to avoid code duplication across plugins.\n */\n\nimport { LocaleServiceKey } from '../../i18n/LocaleService.js';\nimport type { BlockNode } from '../../model/Document.js';\nimport { isNodeSelection, isTextSelection } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\n\n/**\n * Dispatches `tr` when it is non-null and reports whether anything happened.\n * Collapses the command body `if (tr) { dispatch(tr); return true; } return false;`\n * shared by mark toggle commands and attributed-mark operations into a single\n * call: `return dispatchIfPresent(context, tr);`.\n */\nexport function dispatchIfPresent(context: PluginContext, tr: Transaction | null): boolean {\n\tif (!tr) return false;\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Capitalizes the first character of a string. */\nexport function capitalize(s: string): string {\n\treturn s.charAt(0).toUpperCase() + s.slice(1);\n}\n\n/** Converts a mark type to its toggle command name (e.g. 'bold' → 'toggleBold'). */\nexport function toCommandName(markType: string): string {\n\treturn `toggle${capitalize(markType)}`;\n}\n\n/**\n * Resolves the locale for a plugin, using config override, default, or dynamic loader.\n * Plugins provide their config locale, a default English locale, and a loader for other languages.\n */\nexport async function resolveLocale<T>(\n\tcontext: PluginContext,\n\tconfigLocale: T | undefined,\n\tdefaultLocale: T,\n\tloader: (lang: string) => Promise<T>,\n): Promise<T> {\n\tif (configLocale) return configLocale;\n\tconst service = context.getService(LocaleServiceKey);\n\tconst lang: string = service?.getLocale() ?? 'en';\n\treturn lang === 'en' ? defaultLocale : loader(lang);\n}\n\n/** Returns the block under the cursor, handling both TextSelection and NodeSelection. */\nexport function getSelectedBlock(state: EditorState): BlockNode | undefined {\n\tconst sel = state.selection;\n\tif (isNodeSelection(sel)) return state.getBlock(sel.nodeId);\n\tif (isTextSelection(sel)) return state.getBlock(sel.anchor.blockId);\n\treturn undefined;\n}\n\n/** Returns the block ID under the cursor, handling both TextSelection and NodeSelection. */\nexport function getSelectedBlockId(state: EditorState): BlockId | undefined {\n\tconst sel = state.selection;\n\tif (isNodeSelection(sel)) return sel.nodeId;\n\tif (isTextSelection(sel)) return sel.anchor.blockId;\n\treturn undefined;\n}\n"],"mappings":"iGAOA,IAAa,EAAb,MACC,eAEA,WAAA,CAAY,GACX,KAAK,eACO,YAAX,EACwB,oBAAd,UACL,UAAU,SAAS,MAAM,KAAK,IAAM,KACrC,KACD,CACL,CAEA,SAAA,GACC,OAAO,KAAK,cACb,GAGY,EAAmB,IAAI,EAA0B,UCwB9D,eAAsB,EACrB,EACA,EACA,GAEA,GAAa,OAAT,EAAe,OAAO,EAE1B,MAAM,EAAkD,EAAQ,aAAa,QAC7E,IAAK,EAAQ,OAAO,EAEpB,IAEC,aADkB,KACP,OACZ,CAAA,MACC,OAAO,CACR,CACD,CC7CA,SAAgB,EAAkB,EAAwB,GACzD,QAAK,IACL,EAAQ,SAAS,IACV,EACR,CAGA,SAAgB,EAAW,GAC1B,OAAO,EAAE,OAAO,GAAG,cAAgB,EAAE,MAAM,EAC5C,CAGA,SAAgB,EAAc,GAC7B,MAAO,SAAS,EAAW,IAC5B,CAMA,eAAsB,EACrB,EACA,EACA,EACA,GAEA,GAAI,EAAc,OAAO,EAEzB,MAAM,EADU,EAAQ,WAAW,IACL,aAAe,KAC7C,MAAgB,OAAT,EAAgB,EAAgB,EAAO,EAC/C,CAGA,SAAgB,EAAiB,GAChC,MAAM,EAAM,EAAM,UAClB,OAAI,EAAgB,GAAa,EAAM,SAAS,EAAI,QAChD,EAAgB,GAAa,EAAM,SAAS,EAAI,OAAO,cAA3D,CAED,CAGA,SAAgB,EAAmB,GAClC,MAAM,EAAM,EAAM,UAClB,OAAI,EAAgB,GAAa,EAAI,OACjC,EAAgB,GAAa,EAAI,OAAO,aAA5C,CAED"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e,r as t,t as r}from"./KeyboardNav-D0my3wuy.mjs";var n=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]);function o(t){let n=0;const o=o=>{o.stopPropagation();const a=Array.from(t.container.querySelectorAll(t.itemSelector));if(0!==a.length)switch(o.key){case"Escape":return o.preventDefault(),void t.onClose();case"ArrowDown":return o.preventDefault(),n=e(a,n,1),r(a,n),void a[n]?.focus();case"ArrowUp":return o.preventDefault(),n=e(a,n,-1),r(a,n),void a[n]?.focus();case"Enter":case" ":{o.preventDefault();const e=a[n];return void(e&&t.onActivate(e))}case"Home":return o.preventDefault(),n=0,r(a,n),void a[n]?.focus();case"End":return o.preventDefault(),n=a.length-1,r(a,n),void a[n]?.focus()}};return t.container.addEventListener("keydown",o),()=>t.container.removeEventListener("keydown",o)}function a(t){let n=0;const o=o=>{const a=Array.from(t.container.querySelectorAll(t.itemSelector));if(0!==a.length)switch(o.key){case"Escape":return o.preventDefault(),void t.onClose();case"ArrowDown":return o.preventDefault(),n=e(a,n,1),r(a,n),void a[n]?.focus();case"ArrowUp":return o.preventDefault(),n=e(a,n,-1),r(a,n),void a[n]?.focus();case"Enter":case" ":{o.preventDefault();const e=a[n];return void(e&&t.onSelect(e))}}};return t.container.addEventListener("keydown",o),()=>t.container.removeEventListener("keydown",o)}function c(e){let o=0;const a=e.columns,c=e.totalCells,s=Math.ceil(c/a),i=i=>{const l=Array.from(e.container.querySelectorAll(e.cellSelector));if(0!==l.length){if("Escape"===i.key)return i.preventDefault(),void e.onClose();if("Enter"===i.key||" "===i.key){i.preventDefault();const t=l[o];return void(t&&e.onSelect(t))}if(n.has(i.key)){i.preventDefault();const[n,u]=t(Math.floor(o/a)+1,o%a+1,s,a,i.key);let v=(n-1)*a+(u-1);return v>=c&&(v=c-1),o=v,r(l,o),l[o]?.focus(),void e.onNavigate?.(o)}if("Home"===i.key||"End"===i.key){i.preventDefault();const t=Math.floor(o/a)*a,n=Math.min(t+a-1,c-1);o="Home"===i.key?t:n,r(l,o),l[o]?.focus(),e.onNavigate?.(o)}}};return e.container.addEventListener("keydown",i),()=>e.container.removeEventListener("keydown",i)}export{a as n,o as r,c as t};
|
|
2
|
+
//# sourceMappingURL=PopupKeyboardPatterns-tUrT9TyV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopupKeyboardPatterns-tUrT9TyV.mjs","names":[],"sources":["../../src/plugins/shared/PopupKeyboardPatterns.ts"],"sourcesContent":["/**\n * Pure functions that attach WAI-ARIA keyboard patterns to popup containers.\n * Supports menu, listbox, and grid navigation patterns.\n * Delegates to shared keyboard navigation helpers.\n */\n\nimport { applyRovingTabindex, findNextDropdownItem, navigateGrid } from './KeyboardNav.js';\n\n// --- Types ---\n\nexport interface MenuKeyboardConfig {\n\treadonly container: HTMLElement;\n\treadonly itemSelector: string;\n\treadonly onActivate: (item: HTMLElement) => void;\n\treadonly onClose: () => void;\n\treadonly getActiveElement: () => Element | null;\n}\n\nexport interface ListboxKeyboardConfig {\n\treadonly container: HTMLElement;\n\treadonly itemSelector: string;\n\treadonly onSelect: (item: HTMLElement) => void;\n\treadonly onClose: () => void;\n}\n\nexport interface GridKeyboardConfig {\n\treadonly container: HTMLElement;\n\treadonly cellSelector: string;\n\treadonly columns: number;\n\treadonly totalCells: number;\n\treadonly onSelect: (cell: HTMLElement) => void;\n\treadonly onClose: () => void;\n\treadonly onNavigate?: (index: number) => void;\n}\n\n// --- Constants ---\n\nconst GRID_NAV_KEYS: ReadonlySet<string> = new Set([\n\t'ArrowUp',\n\t'ArrowDown',\n\t'ArrowLeft',\n\t'ArrowRight',\n]);\n\n// --- Menu Keyboard ---\n\n/**\n * Attaches menu keyboard navigation (ArrowUp/Down, Enter/Space, Home/End, Escape).\n * Returns a cleanup function that removes the event listener.\n */\nexport function attachMenuKeyboard(config: MenuKeyboardConfig): () => void {\n\tlet focusedIndex = 0;\n\n\tconst handler = (e: KeyboardEvent): void => {\n\t\te.stopPropagation();\n\t\tconst items: HTMLElement[] = Array.from(\n\t\t\tconfig.container.querySelectorAll(config.itemSelector),\n\t\t) as HTMLElement[];\n\t\tif (items.length === 0) return;\n\n\t\tswitch (e.key) {\n\t\t\tcase 'Escape': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconfig.onClose();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tfocusedIndex = findNextDropdownItem(items, focusedIndex, 1);\n\t\t\t\tapplyRovingTabindex(items as HTMLButtonElement[], focusedIndex);\n\t\t\t\titems[focusedIndex]?.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tfocusedIndex = findNextDropdownItem(items, focusedIndex, -1);\n\t\t\t\tapplyRovingTabindex(items as HTMLButtonElement[], focusedIndex);\n\t\t\t\titems[focusedIndex]?.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst item: HTMLElement | undefined = items[focusedIndex];\n\t\t\t\tif (item) config.onActivate(item);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'Home': {\n\t\t\t\te.preventDefault();\n\t\t\t\tfocusedIndex = 0;\n\t\t\t\tapplyRovingTabindex(items as HTMLButtonElement[], focusedIndex);\n\t\t\t\titems[focusedIndex]?.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'End': {\n\t\t\t\te.preventDefault();\n\t\t\t\tfocusedIndex = items.length - 1;\n\t\t\t\tapplyRovingTabindex(items as HTMLButtonElement[], focusedIndex);\n\t\t\t\titems[focusedIndex]?.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t};\n\n\tconfig.container.addEventListener('keydown', handler);\n\treturn () => config.container.removeEventListener('keydown', handler);\n}\n\n// --- Listbox Keyboard ---\n\n/**\n * Attaches listbox keyboard navigation (ArrowUp/Down, Enter/Space, Escape).\n * Returns a cleanup function.\n */\nexport function attachListboxKeyboard(config: ListboxKeyboardConfig): () => void {\n\tlet focusedIndex = 0;\n\n\tconst handler = (e: KeyboardEvent): void => {\n\t\tconst items: HTMLElement[] = Array.from(\n\t\t\tconfig.container.querySelectorAll(config.itemSelector),\n\t\t) as HTMLElement[];\n\t\tif (items.length === 0) return;\n\n\t\tswitch (e.key) {\n\t\t\tcase 'Escape': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconfig.onClose();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tfocusedIndex = findNextDropdownItem(items, focusedIndex, 1);\n\t\t\t\tapplyRovingTabindex(items as HTMLButtonElement[], focusedIndex);\n\t\t\t\titems[focusedIndex]?.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tfocusedIndex = findNextDropdownItem(items, focusedIndex, -1);\n\t\t\t\tapplyRovingTabindex(items as HTMLButtonElement[], focusedIndex);\n\t\t\t\titems[focusedIndex]?.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst item: HTMLElement | undefined = items[focusedIndex];\n\t\t\t\tif (item) config.onSelect(item);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t};\n\n\tconfig.container.addEventListener('keydown', handler);\n\treturn () => config.container.removeEventListener('keydown', handler);\n}\n\n// --- Grid Keyboard ---\n\n/**\n * Attaches grid keyboard navigation (2D arrows, Home/End per row, Enter/Space, Escape).\n * Returns a cleanup function.\n */\nexport function attachGridKeyboard(config: GridKeyboardConfig): () => void {\n\tlet focusedIndex = 0;\n\tconst columns: number = config.columns;\n\tconst totalCells: number = config.totalCells;\n\tconst totalRows: number = Math.ceil(totalCells / columns);\n\n\tconst handler = (e: KeyboardEvent): void => {\n\t\tconst cells: HTMLElement[] = Array.from(\n\t\t\tconfig.container.querySelectorAll(config.cellSelector),\n\t\t) as HTMLElement[];\n\t\tif (cells.length === 0) return;\n\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tconfig.onClose();\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\tconst cell: HTMLElement | undefined = cells[focusedIndex];\n\t\t\tif (cell) config.onSelect(cell);\n\t\t\treturn;\n\t\t}\n\n\t\tif (GRID_NAV_KEYS.has(e.key)) {\n\t\t\te.preventDefault();\n\t\t\tconst currentRow: number = Math.floor(focusedIndex / columns) + 1;\n\t\t\tconst currentCol: number = (focusedIndex % columns) + 1;\n\n\t\t\tconst [newRow, newCol] = navigateGrid(\n\t\t\t\tcurrentRow,\n\t\t\t\tcurrentCol,\n\t\t\t\ttotalRows,\n\t\t\t\tcolumns,\n\t\t\t\te.key as 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n\t\t\t);\n\n\t\t\tlet newIdx: number = (newRow - 1) * columns + (newCol - 1);\n\t\t\tif (newIdx >= totalCells) {\n\t\t\t\tnewIdx = totalCells - 1;\n\t\t\t}\n\n\t\t\tfocusedIndex = newIdx;\n\t\t\tapplyRovingTabindex(cells as HTMLButtonElement[], focusedIndex);\n\t\t\tcells[focusedIndex]?.focus();\n\t\t\tconfig.onNavigate?.(focusedIndex);\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === 'Home' || e.key === 'End') {\n\t\t\te.preventDefault();\n\t\t\tconst currentRow: number = Math.floor(focusedIndex / columns);\n\t\t\tconst rowStart: number = currentRow * columns;\n\t\t\tconst rowEnd: number = Math.min(rowStart + columns - 1, totalCells - 1);\n\n\t\t\tfocusedIndex = e.key === 'Home' ? rowStart : rowEnd;\n\t\t\tapplyRovingTabindex(cells as HTMLButtonElement[], focusedIndex);\n\t\t\tcells[focusedIndex]?.focus();\n\t\t\tconfig.onNavigate?.(focusedIndex);\n\t\t}\n\t};\n\n\tconfig.container.addEventListener('keydown', handler);\n\treturn () => config.container.removeEventListener('keydown', handler);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e}from"./Platform-ByobkiCc.mjs";import{n as t}from"./TypedKeys-CA4bfw9O.mjs";import{i as s,r as n,t as o}from"./PopupPositioning-DtUrY9bh.mjs";var r=new t("popup"),i=class{stack=[];referenceNode;constructor(e){this.referenceNode=e}open(e){const t=document.createElement("div");t.className=e.className?`notectl-popup ${e.className}`:"notectl-popup",e.ariaRole&&t.setAttribute("role",e.ariaRole),e.ariaLabel&&t.setAttribute("aria-label",e.ariaLabel);const r=e.parent?this.findEntryByHandle(e.parent):null;let i;const c={close:e=>this.closeEntry(i,e),getElement:()=>t},l=s=>{const n=s.composedPath();if(!n.includes(t)){for(const e of this.stack)if(n.includes(e.element))return;e.anchor instanceof HTMLElement&&n.includes(e.anchor)||this.closeEntry(i)}};i={element:t,config:e,clickOutsideHandler:l,parent:r,listenerRegistrationTimer:null,documentListenerAttached:!1},this.stack.push(i);try{e.content(t,e=>this.closeEntry(i,e))}catch(a){throw this.removeEntry(i),a}return this.stack.includes(i)?(o(t,e.referenceNode??this.referenceNode),s(t),n(t,e.anchor instanceof HTMLElement?e.anchor.getBoundingClientRect():e.anchor,{position:e.position??"below-start",isRtl:this.isRtlContext()}),i.listenerRegistrationTimer=setTimeout(()=>{i.listenerRegistrationTimer=null,this.stack.includes(i)&&(document.addEventListener("mousedown",l),i.documentListenerAttached=!0)},0),this.focusFirstItem(t),c):c}close(){const e=this.stack[this.stack.length-1];e&&this.closeEntry(e)}closeAll(){for(;this.stack.length>0;){const e=this.stack[this.stack.length-1];e&&this.closeEntry(e)}}isOpen(){return this.stack.length>0}destroy(){this.closeAll()}closeEntry(e,t){const s=this.stack.indexOf(e);if(-1!==s){for(;this.stack.length>s+1;){const e=this.stack[this.stack.length-1];e&&this.removeEntry(e)}this.removeEntry(e),void 0!==t&&"restoreFocusTo"in t?t.restoreFocusTo?.focus():e.config.restoreFocusTo&&e.config.restoreFocusTo.focus(),e.config.onClose?.()}}removeEntry(e){const t=this.stack.indexOf(e);-1!==t&&(this.stack.splice(t,1),null!==e.listenerRegistrationTimer&&(clearTimeout(e.listenerRegistrationTimer),e.listenerRegistrationTimer=null),e.element.remove(),e.documentListenerAttached&&(document.removeEventListener("mousedown",e.clickOutsideHandler),e.documentListenerAttached=!1))}findEntryByHandle(e){const t=e.getElement();return this.stack.find(e=>e.element===t)??null}isRtlContext(){return this.referenceNode instanceof HTMLElement&&e(this.referenceNode)}focusFirstItem(e){requestAnimationFrame(()=>{(e.querySelector('[role="menuitem"]')??e.querySelector('[role="option"]')??e.querySelector('[role="gridcell"]')??e.querySelector("input, textarea")??e.querySelector("button"))?.focus()})}};export{r as n,i as t};
|
|
2
|
+
//# sourceMappingURL=PopupManager-CyOfZUab.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopupManager-CyOfZUab.mjs","names":[],"sources":["../../src/plugins/shared/PopupManager.ts"],"sourcesContent":["/**\n * Central popup lifecycle manager. Handles creation, positioning,\n * click-outside closing, Escape key, focus restoration, and popup stacking\n * for submenus/nested popups.\n */\n\nimport { isRtlContext } from '../../platform/Platform.js';\nimport { ServiceKey } from '../Plugin.js';\nimport {\n\ttype PopupPosition,\n\tappendToRoot,\n\tpositionPopup,\n\tpromoteToTopLayer,\n} from './PopupPositioning.js';\n\n// --- Types ---\n\n/** Options for overriding focus restoration when closing a popup. */\nexport interface PopupCloseOptions {\n\t/**\n\t * Override the default focus target on close.\n\t * - `HTMLElement` → focus that element instead of `config.restoreFocusTo`\n\t * - `null` → skip focus restoration entirely\n\t * - `undefined` / omitted → use default `config.restoreFocusTo`\n\t */\n\treadonly restoreFocusTo?: HTMLElement | null;\n}\n\nexport interface PopupConfig {\n\treadonly anchor: HTMLElement | DOMRect;\n\treadonly content: (container: HTMLElement, close: (options?: PopupCloseOptions) => void) => void;\n\treadonly className?: string;\n\treadonly ariaRole?: 'menu' | 'listbox' | 'grid' | 'dialog';\n\treadonly ariaLabel?: string;\n\treadonly restoreFocusTo?: HTMLElement;\n\treadonly onClose?: () => void;\n\treadonly position?: PopupPosition;\n\treadonly parent?: PopupHandle;\n\treadonly referenceNode?: Node;\n}\n\nexport interface PopupHandle {\n\tclose(options?: PopupCloseOptions): void;\n\tgetElement(): HTMLElement;\n}\n\nexport interface PopupServiceAPI {\n\topen(config: PopupConfig): PopupHandle;\n\tclose(): void;\n\tcloseAll(): void;\n\tisOpen(): boolean;\n}\n\nexport const PopupServiceKey = new ServiceKey<PopupServiceAPI>('popup');\n\n// --- Internal Entry ---\n\ninterface PopupEntry {\n\treadonly element: HTMLElement;\n\treadonly config: PopupConfig;\n\treadonly clickOutsideHandler: (e: MouseEvent) => void;\n\treadonly parent: PopupEntry | null;\n\tlistenerRegistrationTimer: ReturnType<typeof setTimeout> | null;\n\tdocumentListenerAttached: boolean;\n}\n\n// --- Manager ---\n\nexport class PopupManager implements PopupServiceAPI {\n\tprivate readonly stack: PopupEntry[] = [];\n\tprivate readonly referenceNode: Node;\n\n\tconstructor(referenceNode: Node) {\n\t\tthis.referenceNode = referenceNode;\n\t}\n\n\t/** Opens a popup with the given configuration. Returns a handle for closing it. */\n\topen(config: PopupConfig): PopupHandle {\n\t\tconst popup: HTMLDivElement = document.createElement('div');\n\t\tpopup.className = config.className ? `notectl-popup ${config.className}` : 'notectl-popup';\n\n\t\tif (config.ariaRole) {\n\t\t\tpopup.setAttribute('role', config.ariaRole);\n\t\t}\n\t\tif (config.ariaLabel) {\n\t\t\tpopup.setAttribute('aria-label', config.ariaLabel);\n\t\t}\n\n\t\tconst parentEntry: PopupEntry | null = config.parent\n\t\t\t? this.findEntryByHandle(config.parent)\n\t\t\t: null;\n\n\t\tlet entry!: PopupEntry;\n\t\tconst handle: PopupHandle = {\n\t\t\tclose: (options?: PopupCloseOptions) => this.closeEntry(entry, options),\n\t\t\tgetElement: () => popup,\n\t\t};\n\n\t\tconst clickOutsideHandler = (e: MouseEvent): void => {\n\t\t\tconst path: EventTarget[] = e.composedPath();\n\t\t\tif (path.includes(popup)) return;\n\n\t\t\t// Don't close if click is inside any ancestor popup in the stack\n\t\t\tfor (const stackEntry of this.stack) {\n\t\t\t\tif (path.includes(stackEntry.element)) return;\n\t\t\t}\n\n\t\t\t// Don't close if click is on the anchor element\n\t\t\tif (config.anchor instanceof HTMLElement && path.includes(config.anchor)) return;\n\n\t\t\tthis.closeEntry(entry);\n\t\t};\n\n\t\tentry = {\n\t\t\telement: popup,\n\t\t\tconfig,\n\t\t\tclickOutsideHandler,\n\t\t\tparent: parentEntry,\n\t\t\tlistenerRegistrationTimer: null,\n\t\t\tdocumentListenerAttached: false,\n\t\t};\n\n\t\tthis.stack.push(entry);\n\n\t\ttry {\n\t\t\tconfig.content(popup, (options?: PopupCloseOptions) => this.closeEntry(entry, options));\n\t\t} catch (error) {\n\t\t\tthis.removeEntry(entry);\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (!this.stack.includes(entry)) {\n\t\t\treturn handle;\n\t\t}\n\n\t\tconst refNode: Node = config.referenceNode ?? this.referenceNode;\n\t\tappendToRoot(popup, refNode);\n\t\t// Promote to the top layer before measuring/positioning so the popup\n\t\t// escapes any ancestor stacking context in the host page.\n\t\tpromoteToTopLayer(popup);\n\n\t\tconst anchorRect: DOMRect =\n\t\t\tconfig.anchor instanceof HTMLElement ? config.anchor.getBoundingClientRect() : config.anchor;\n\t\tpositionPopup(popup, anchorRect, {\n\t\t\tposition: config.position ?? 'below-start',\n\t\t\tisRtl: this.isRtlContext(),\n\t\t});\n\n\t\tentry.listenerRegistrationTimer = setTimeout(() => {\n\t\t\tentry.listenerRegistrationTimer = null;\n\t\t\tif (!this.stack.includes(entry)) return;\n\t\t\tdocument.addEventListener('mousedown', clickOutsideHandler);\n\t\t\tentry.documentListenerAttached = true;\n\t\t}, 0);\n\n\t\tthis.focusFirstItem(popup);\n\n\t\treturn handle;\n\t}\n\n\t/** Closes the topmost popup in the stack. */\n\tclose(): void {\n\t\tconst top: PopupEntry | undefined = this.stack[this.stack.length - 1];\n\t\tif (top) {\n\t\t\tthis.closeEntry(top);\n\t\t}\n\t}\n\n\t/** Closes all open popups. */\n\tcloseAll(): void {\n\t\twhile (this.stack.length > 0) {\n\t\t\tconst top: PopupEntry | undefined = this.stack[this.stack.length - 1];\n\t\t\tif (top) {\n\t\t\t\tthis.closeEntry(top);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Returns true if any popup is currently open. */\n\tisOpen(): boolean {\n\t\treturn this.stack.length > 0;\n\t}\n\n\t/** Cleans up all popups and event listeners. */\n\tdestroy(): void {\n\t\tthis.closeAll();\n\t}\n\n\t// --- Internal ---\n\n\tprivate closeEntry(entry: PopupEntry, options?: PopupCloseOptions): void {\n\t\tconst index: number = this.stack.indexOf(entry);\n\t\tif (index === -1) return;\n\n\t\t// Close all child popups first (anything above this entry in the stack)\n\t\twhile (this.stack.length > index + 1) {\n\t\t\tconst child: PopupEntry | undefined = this.stack[this.stack.length - 1];\n\t\t\tif (child) {\n\t\t\t\tthis.removeEntry(child);\n\t\t\t}\n\t\t}\n\n\t\tthis.removeEntry(entry);\n\n\t\tif (options !== undefined && 'restoreFocusTo' in options) {\n\t\t\toptions.restoreFocusTo?.focus();\n\t\t} else if (entry.config.restoreFocusTo) {\n\t\t\tentry.config.restoreFocusTo.focus();\n\t\t}\n\t\tentry.config.onClose?.();\n\t}\n\n\tprivate removeEntry(entry: PopupEntry): void {\n\t\tconst index: number = this.stack.indexOf(entry);\n\t\tif (index === -1) return;\n\n\t\tthis.stack.splice(index, 1);\n\t\tif (entry.listenerRegistrationTimer !== null) {\n\t\t\tclearTimeout(entry.listenerRegistrationTimer);\n\t\t\tentry.listenerRegistrationTimer = null;\n\t\t}\n\t\tentry.element.remove();\n\t\tif (entry.documentListenerAttached) {\n\t\t\tdocument.removeEventListener('mousedown', entry.clickOutsideHandler);\n\t\t\tentry.documentListenerAttached = false;\n\t\t}\n\t}\n\n\tprivate findEntryByHandle(handle: PopupHandle): PopupEntry | null {\n\t\tconst element: HTMLElement = handle.getElement();\n\t\treturn this.stack.find((e) => e.element === element) ?? null;\n\t}\n\n\t/** Detects whether the editor context is RTL from the computed style. */\n\tprivate isRtlContext(): boolean {\n\t\tif (this.referenceNode instanceof HTMLElement) {\n\t\t\treturn isRtlContext(this.referenceNode);\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate focusFirstItem(popup: HTMLElement): void {\n\t\trequestAnimationFrame(() => {\n\t\t\tconst firstFocusable: HTMLElement | null =\n\t\t\t\tpopup.querySelector('[role=\"menuitem\"]') ??\n\t\t\t\tpopup.querySelector('[role=\"option\"]') ??\n\t\t\t\tpopup.querySelector('[role=\"gridcell\"]') ??\n\t\t\t\t// `input, textarea` returns whichever comes first in the DOM, so a\n\t\t\t\t// popup whose primary field is a textarea (e.g. the formula editor's\n\t\t\t\t// LaTeX field) focuses that rather than a later text input.\n\t\t\t\tpopup.querySelector('input, textarea') ??\n\t\t\t\tpopup.querySelector('button');\n\t\t\tfirstFocusable?.focus();\n\t\t});\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{o as t}from"./StyleRuntime-BAutwDZT.mjs";function e(t){const e=t.style.top,o=t.style.left,i=t.style.right;t.style.top="0px",t.style.left="0px",t.style.right="auto";const l=t.getBoundingClientRect(),n=l.left,p=l.top;t.style.left="auto",t.style.right="0px";const s=t.getBoundingClientRect(),r=window.innerWidth-s.right;return t.style.top=e,t.style.left=o,t.style.right=i,{x:n,y:p,rightX:r}}function o(o,i,l){const n=l.offset??2,p=window.innerWidth,s=window.innerHeight;t(o,{position:"fixed",zIndex:"10000"});const r=e(o),f=o.offsetWidth,h=o.offsetHeight,a={};switch(l.position){case"below-start":{let t=i.bottom+n;if(l.isRtl){let e=p-i.right;e+f>p-4&&(e=p-f-4),t+h>s-4&&(t=i.top-h-n),e<4&&(e=4),t<4&&(t=4),a.top=t-r.y+"px",a.right=e-r.rightX+"px",a.left="auto"}else{let e=i.left;e+f>p-4&&(e=p-f-4),t+h>s-4&&(t=i.top-h-n),e<4&&(e=4),t<4&&(t=4),a.top=t-r.y+"px",a.left=e-r.x+"px",a.right="auto"}break}case"below-end":{let t=i.bottom+n;if(l.isRtl){let e=i.left;e+f>p-4&&(e=p-f-4),t+h>s-4&&(t=i.top-h-n),e<4&&(e=4),t<4&&(t=4),a.top=t-r.y+"px",a.left=e-r.x+"px",a.right="auto"}else{let e=p-i.right;e+f>p-4&&(e=p-f-4),t+h>s-4&&(t=i.top-h-n),e<4&&(e=4),t<4&&(t=4),a.top=t-r.y+"px",a.right=e-r.rightX+"px",a.left="auto"}break}case"right":{let t=i.top;if(l.isRtl){let e=i.left-f-n;e<4&&(e=i.right+n),t+h>s-4&&(t=s-h-4),e<4&&(e=4),t<4&&(t=4),a.top=t-r.y+"px",a.left=e-r.x+"px",a.right="auto"}else{let e=i.right+n;e+f>p-4&&(e=i.left-f-n),t+h>s-4&&(t=s-h-4),e<4&&(e=4),t<4&&(t=4),a.top=t-r.y+"px",a.left=e-r.x+"px",a.right="auto"}break}}t(o,a)}function i(t,e){const o=e.getRootNode();o instanceof ShadowRoot?o.appendChild(t):document.body.appendChild(t)}function l(e){if("function"==typeof e.showPopover){e.setAttribute("popover","manual");try{e.showPopover()}catch{return void e.removeAttribute("popover")}t(e,{margin:"0",inset:"auto"})}}export{l as i,e as n,o as r,i as t};
|
|
2
|
+
//# sourceMappingURL=PopupPositioning-DtUrY9bh.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopupPositioning-DtUrY9bh.mjs","names":[],"sources":["../../src/plugins/shared/PopupPositioning.ts"],"sourcesContent":["/**\n * Shared popup positioning logic. Positions a popup element relative to an\n * anchor rectangle, clamping to the viewport. Also provides a shadow DOM-aware\n * append helper.\n */\n\nimport { setStyleProperties } from '../../style/StyleRuntime.js';\n\n// --- Types ---\n\nexport type PopupPosition = 'below-start' | 'below-end' | 'right';\n\nexport interface PositionOptions {\n\treadonly position: PopupPosition;\n\treadonly offset?: number;\n\treadonly isRtl?: boolean;\n}\n\nexport interface ContainingBlockOffset {\n\treadonly x: number;\n\treadonly y: number;\n\treadonly rightX: number;\n}\n\n// --- Constants ---\n\nconst DEFAULT_OFFSET = 2;\nconst Z_INDEX = '10000';\nconst POPUP_MIN_MARGIN = 4;\n\n// --- Containing Block Offset ---\n\n/**\n * Measures the offset between the popup's CSS containing block and the\n * viewport. When an ancestor has `transform`, `will-change: transform`,\n * `filter`, or `perspective`, `position: fixed` resolves relative to that\n * ancestor — not the viewport. This probe detects the shift so callers\n * can compensate.\n *\n * Technique: temporarily set `top: 0; left: 0` on the fixed-position\n * element and read `getBoundingClientRect()`. If no containing-block\n * ancestor exists the rect origin is `(0, 0)`; otherwise it equals the\n * ancestor's offset.\n */\nexport function measureContainingBlockOffset(popup: HTMLElement): ContainingBlockOffset {\n\tconst prevTop: string = popup.style.top;\n\tconst prevLeft: string = popup.style.left;\n\tconst prevRight: string = popup.style.right;\n\n\t// Probe 1: left-edge offset\n\tpopup.style.top = '0px';\n\tpopup.style.left = '0px';\n\tpopup.style.right = 'auto';\n\n\tconst leftRect: DOMRect = popup.getBoundingClientRect();\n\tconst x: number = leftRect.left;\n\tconst y: number = leftRect.top;\n\n\t// Probe 2: right-edge offset\n\tpopup.style.left = 'auto';\n\tpopup.style.right = '0px';\n\n\tconst rightRect: DOMRect = popup.getBoundingClientRect();\n\tconst rightX: number = window.innerWidth - rightRect.right;\n\n\tpopup.style.top = prevTop;\n\tpopup.style.left = prevLeft;\n\tpopup.style.right = prevRight;\n\n\treturn { x, y, rightX };\n}\n\n// --- Positioning ---\n\n/**\n * Positions a popup element relative to the given anchor rectangle.\n * Uses fixed positioning and clamps to the viewport edges.\n * Automatically compensates for ancestors that create a new containing\n * block (e.g. `transform`, `will-change: transform`).\n */\nexport function positionPopup(popup: HTMLElement, anchor: DOMRect, options: PositionOptions): void {\n\tconst offset: number = options.offset ?? DEFAULT_OFFSET;\n\tconst vpWidth: number = window.innerWidth;\n\tconst vpHeight: number = window.innerHeight;\n\n\t// Apply fixed positioning first so offsetWidth/offsetHeight reflect\n\t// shrink-to-fit sizing rather than normal-flow block width.\n\tsetStyleProperties(popup, { position: 'fixed', zIndex: Z_INDEX });\n\n\t// Detect containing-block offset caused by ancestor transforms etc.\n\tconst cbOffset: ContainingBlockOffset = measureContainingBlockOffset(popup);\n\n\tconst popupWidth: number = popup.offsetWidth;\n\tconst popupHeight: number = popup.offsetHeight;\n\n\tconst styles: Record<string, string> = {};\n\n\tswitch (options.position) {\n\t\tcase 'below-start': {\n\t\t\tlet top: number = anchor.bottom + offset;\n\n\t\t\tif (options.isRtl) {\n\t\t\t\t// RTL: anchor to physical right edge (visual start)\n\t\t\t\tlet right: number = vpWidth - anchor.right;\n\t\t\t\tif (right + popupWidth > vpWidth - POPUP_MIN_MARGIN) {\n\t\t\t\t\tright = vpWidth - popupWidth - POPUP_MIN_MARGIN;\n\t\t\t\t}\n\t\t\t\tif (top + popupHeight > vpHeight - POPUP_MIN_MARGIN) {\n\t\t\t\t\ttop = anchor.top - popupHeight - offset;\n\t\t\t\t}\n\t\t\t\tif (right < POPUP_MIN_MARGIN) right = POPUP_MIN_MARGIN;\n\t\t\t\tif (top < POPUP_MIN_MARGIN) top = POPUP_MIN_MARGIN;\n\t\t\t\tstyles.top = `${top - cbOffset.y}px`;\n\t\t\t\tstyles.right = `${right - cbOffset.rightX}px`;\n\t\t\t\tstyles.left = 'auto';\n\t\t\t} else {\n\t\t\t\tlet left: number = anchor.left;\n\t\t\t\tif (left + popupWidth > vpWidth - POPUP_MIN_MARGIN) {\n\t\t\t\t\tleft = vpWidth - popupWidth - POPUP_MIN_MARGIN;\n\t\t\t\t}\n\t\t\t\tif (top + popupHeight > vpHeight - POPUP_MIN_MARGIN) {\n\t\t\t\t\ttop = anchor.top - popupHeight - offset;\n\t\t\t\t}\n\t\t\t\tif (left < POPUP_MIN_MARGIN) left = POPUP_MIN_MARGIN;\n\t\t\t\tif (top < POPUP_MIN_MARGIN) top = POPUP_MIN_MARGIN;\n\t\t\t\tstyles.top = `${top - cbOffset.y}px`;\n\t\t\t\tstyles.left = `${left - cbOffset.x}px`;\n\t\t\t\tstyles.right = 'auto';\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'below-end': {\n\t\t\tlet top: number = anchor.bottom + offset;\n\n\t\t\tif (options.isRtl) {\n\t\t\t\t// RTL: \"end\" = physical left edge\n\t\t\t\tlet left: number = anchor.left;\n\t\t\t\tif (left + popupWidth > vpWidth - POPUP_MIN_MARGIN) {\n\t\t\t\t\tleft = vpWidth - popupWidth - POPUP_MIN_MARGIN;\n\t\t\t\t}\n\t\t\t\tif (top + popupHeight > vpHeight - POPUP_MIN_MARGIN) {\n\t\t\t\t\ttop = anchor.top - popupHeight - offset;\n\t\t\t\t}\n\t\t\t\tif (left < POPUP_MIN_MARGIN) left = POPUP_MIN_MARGIN;\n\t\t\t\tif (top < POPUP_MIN_MARGIN) top = POPUP_MIN_MARGIN;\n\t\t\t\tstyles.top = `${top - cbOffset.y}px`;\n\t\t\t\tstyles.left = `${left - cbOffset.x}px`;\n\t\t\t\tstyles.right = 'auto';\n\t\t\t} else {\n\t\t\t\t// LTR: \"end\" = physical right edge\n\t\t\t\tlet right: number = vpWidth - anchor.right;\n\t\t\t\tif (right + popupWidth > vpWidth - POPUP_MIN_MARGIN) {\n\t\t\t\t\tright = vpWidth - popupWidth - POPUP_MIN_MARGIN;\n\t\t\t\t}\n\t\t\t\tif (top + popupHeight > vpHeight - POPUP_MIN_MARGIN) {\n\t\t\t\t\ttop = anchor.top - popupHeight - offset;\n\t\t\t\t}\n\t\t\t\tif (right < POPUP_MIN_MARGIN) right = POPUP_MIN_MARGIN;\n\t\t\t\tif (top < POPUP_MIN_MARGIN) top = POPUP_MIN_MARGIN;\n\t\t\t\tstyles.top = `${top - cbOffset.y}px`;\n\t\t\t\tstyles.right = `${right - cbOffset.rightX}px`;\n\t\t\t\tstyles.left = 'auto';\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'right': {\n\t\t\tlet top: number = anchor.top;\n\n\t\t\tif (options.isRtl) {\n\t\t\t\t// RTL: open submenu to the physical left\n\t\t\t\tlet left: number = anchor.left - popupWidth - offset;\n\t\t\t\tif (left < POPUP_MIN_MARGIN) {\n\t\t\t\t\tleft = anchor.right + offset;\n\t\t\t\t}\n\t\t\t\tif (top + popupHeight > vpHeight - POPUP_MIN_MARGIN) {\n\t\t\t\t\ttop = vpHeight - popupHeight - POPUP_MIN_MARGIN;\n\t\t\t\t}\n\t\t\t\tif (left < POPUP_MIN_MARGIN) left = POPUP_MIN_MARGIN;\n\t\t\t\tif (top < POPUP_MIN_MARGIN) top = POPUP_MIN_MARGIN;\n\t\t\t\tstyles.top = `${top - cbOffset.y}px`;\n\t\t\t\tstyles.left = `${left - cbOffset.x}px`;\n\t\t\t\tstyles.right = 'auto';\n\t\t\t} else {\n\t\t\t\tlet left: number = anchor.right + offset;\n\t\t\t\tif (left + popupWidth > vpWidth - POPUP_MIN_MARGIN) {\n\t\t\t\t\tleft = anchor.left - popupWidth - offset;\n\t\t\t\t}\n\t\t\t\tif (top + popupHeight > vpHeight - POPUP_MIN_MARGIN) {\n\t\t\t\t\ttop = vpHeight - popupHeight - POPUP_MIN_MARGIN;\n\t\t\t\t}\n\t\t\t\tif (left < POPUP_MIN_MARGIN) left = POPUP_MIN_MARGIN;\n\t\t\t\tif (top < POPUP_MIN_MARGIN) top = POPUP_MIN_MARGIN;\n\t\t\t\tstyles.top = `${top - cbOffset.y}px`;\n\t\t\t\tstyles.left = `${left - cbOffset.x}px`;\n\t\t\t\tstyles.right = 'auto';\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetStyleProperties(popup, styles);\n}\n\n/**\n * Appends an element to the appropriate root: the shadow root if the\n * reference node lives inside one, otherwise `document.body`.\n */\nexport function appendToRoot(element: HTMLElement, referenceNode: Node): void {\n\tconst root: Node = referenceNode.getRootNode();\n\tif (root instanceof ShadowRoot) {\n\t\troot.appendChild(element);\n\t} else {\n\t\tdocument.body.appendChild(element);\n\t}\n}\n\n/**\n * Promotes a popup/overlay to the browser's top layer via the Popover API so it\n * paints above — and receives pointer events ahead of — every stacking context\n * in the host page. A high `z-index` alone is not enough: an ancestor that forms\n * a stacking context (e.g. Starlight's `isolation: isolate` content wrapper)\n * traps the popup below a sibling such as the fixed table-of-contents sidebar,\n * so clicks on the overlapped region hit the sidebar and dismiss the popup.\n *\n * The element keeps living in the editor's shadow DOM, so its registered styles\n * still apply; only its paint layer changes. Must be called while the element is\n * connected to the document and BEFORE positioning, so subsequent\n * `offsetWidth`/containing-block measurements reflect the displayed top-layer\n * box.\n *\n * No-ops when the Popover API is unavailable (older engines, happy-dom in unit\n * tests); callers then fall back to plain `z-index` stacking. Neutralizes the UA\n * popover box styles (`inset: 0; margin: auto`) so the caller's explicit\n * `top`/`left` placement is what positions the element.\n */\nexport function promoteToTopLayer(element: HTMLElement): void {\n\tif (typeof element.showPopover !== 'function') return;\n\telement.setAttribute('popover', 'manual');\n\ttry {\n\t\telement.showPopover();\n\t} catch {\n\t\telement.removeAttribute('popover');\n\t\treturn;\n\t}\n\tsetStyleProperties(element, { margin: '0', inset: 'auto' });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as t,o as e}from"./StyleRuntime-BAutwDZT.mjs";import{a as o,c as n,f as r,i,m as s,n as c,r as a,t as l}from"./PrintTypes-WdtgSj74.mjs";import{a as p,s as u}from"./PluginHelpers-D4quRJ5a.mjs";import{t as m}from"./ShortcutFormatting-TwiufqeV.mjs";import h from"dompurify";var d={label:"Print",tooltip:t=>`Print (${t})`,printingAnnouncement:"Printing"},f=/* #__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-Uzo1Azdw.mjs"),"./locales/de.ts":()=>import("./de-DcMhfRBu.mjs"),"./locales/es.ts":()=>import("./es-BJHF95J_.mjs"),"./locales/fr.ts":()=>import("./fr-KXmbys88.mjs"),"./locales/hi.ts":()=>import("./hi-l6DA-aOw.mjs"),"./locales/pt.ts":()=>import("./pt-C8sOyw0V.mjs"),"./locales/ru.ts":()=>import("./ru-B1m8J9dl.mjs"),"./locales/zh.ts":()=>import("./zh-dGSDBBzb.mjs")});async function g(t){return u(f,t,d)}var v=["h1","h2","h3","h4","h5","h6","p","div","span","br","hr","strong","b","em","i","u","s","sub","sup","small","ul","ol","li","table","thead","tbody","tr","th","td","img"],y=["style","class","src","alt","width","height","colspan","rowspan"];function b(t){const e="function"==typeof t?t():t;return h.sanitize(e,{ALLOWED_TAGS:[...v],ALLOWED_ATTR:[...y]})}var j={print(){},toHTML:()=>""},w=class{id="print";name="Print";config;service=null;locale;constructor(t){this.config=t??{}}async init(o){this.locale=await p(o,this.config.locale,d,g);const i=o.getContainer(),u=i.getRootNode();if(u instanceof ShadowRoot){const a=u.host,p=o.getEventBus();this.service=function(o,i,a,p){function u(t){return t??{}}function m(t){const u={options:t,cancelled:!1};if(p.emit(c,u),u.cancelled)return null;const m=u.options,h=function(t,e,o,n="en"){return["<!DOCTYPE html>",`<html lang="${n}">`,"<head>",'<meta charset="utf-8">',`<title>${o.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}</title>`,`<style>${t}</style>`,"</head>",`<body>${e}</body>`,"</html>"].join("\n")}(function(t,e,o){const i=[],c=function(t){const e=[];for(const o of t.adoptedStyleSheets)for(const t of o.cssRules)e.push(t.cssText);return e.join("\n")}(t);c&&i.push(c);const a=!1!==o.forceLightTheme;if(a)i.push(r(s).replace(":host {",":root {"));else{const t=function(t){const e=getComputedStyle(t),o=[];for(let n=0;n<e.length;n++){const t=e[n]??"";if(t.startsWith("--notectl-")){const n=e.getPropertyValue(t).trim();n&&o.push(` ${t}: ${n};`)}}return 0===o.length?"":`:root {\n${o.join("\n")}\n}`}(e);t&&i.push(t)}const l=a?s.primitives.foreground:void 0;i.push(function(t,e){const o=getComputedStyle(t),n=["font-family","font-size","font-weight","line-height","letter-spacing","word-spacing","color"],r=[" margin: 0;"];for(const i of n){if("color"===i&&e){r.push(` color: ${e};`);continue}const t=o.getPropertyValue(i).trim();t&&r.push(` ${i}: ${t};`)}return`body {\n${r.join("\n")}\n}`}(e,l));const p=function(t){const e=[],o=[];if(t.margin?o.push(` margin: ${t.margin};`):t.paperSize&&o.push(" margin: 0;"),t.paperSize||t.orientation){const e=[t.paperSize?n(t.paperSize):"A4"];t.orientation&&e.push(t.orientation),o.push(` size: ${e.join(" ")};`)}o.length>0&&e.push(`@page {\n${o.join("\n")}\n}`),t.paperSize&&e.push(".notectl-content { padding: 48px 56px !important; }");const r=[];return r.push("[data-notectl-no-print] { display: none !important; }"),r.push(".notectl-code-block { white-space: pre-wrap !important; word-break: break-all !important; page-break-inside: avoid; }"),r.push("img { page-break-inside: avoid; }"),r.push(".notectl-table { break-inside: avoid; }"),!1!==t.printBackground&&r.push("* { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }"),e.push(`@media print {\n ${r.join("\n ")}\n}`),e.join("\n\n")}(o);return p&&i.push(p),o.customCSS&&i.push(o.customCSS),i.join("\n\n")}(o,i,m),function(t,o){const n=function(t){return(t.querySelector(".notectl-content")??t).cloneNode(!0)}(t);return function(t){t.removeAttribute("contenteditable");for(const e of["notectl-node-selected","notectl-content--empty"]){t.classList.remove(e);for(const o of t.querySelectorAll(`.${e}`))o.classList.remove(e)}t.removeAttribute("data-placeholder")}(n),function(t,o){if(o.excludeBlockTypes)for(const e of o.excludeBlockTypes){const o=t.querySelectorAll(`[data-block-type="${e}"]`);for(const t of o)t.remove()}if(o.pageBreakBefore)for(const n of o.pageBreakBefore){const o=t.querySelectorAll(`[data-block-type="${n}"]`);for(const t of o)e(t,{breakBefore:"page",pageBreakBefore:"always"})}}(n,o),function(t,e){if(e.header){const o=document.createElement("div");o.className="notectl-print-header",o.innerHTML=b(e.header),t.insertBefore(o,t.firstChild)}if(e.footer){const o=document.createElement("div");o.className="notectl-print-footer",o.innerHTML=b(e.footer),t.appendChild(o)}}(n,o),n}(a,m).outerHTML,m.title??"",i.closest("[lang]")?.getAttribute("lang")??(document.documentElement.lang||"en")),d={html:h};return p.emit(l,d),h}return{print(e){const o=m(u(e));if(!o)return;const n=document.createElement("iframe");t(n,"position:fixed;left:-9999px;width:0;height:0;border:none"),document.body.appendChild(n);const r=n.contentDocument;if(!r)return void document.body.removeChild(n);r.open(),r.write(o),r.close();const i=()=>{n.remove()};n.contentWindow?(n.contentWindow.addEventListener("afterprint",i,{once:!0}),n.contentWindow.print()):i()},toHTML:t=>m(u(t))??""}}(u,a,i,p)}else this.service=j;o.registerService(a,this.service);const h=this.config.defaults??{},f=this.service,v=this.locale;o.registerCommand("print",()=>(o.announce(v.printingAnnouncement),f.print(h),!0));const y=this.config.keyBinding??"Mod-P";if(o.registerKeymap({[y]:()=>(o.executeCommand("print"),!0)}),!1!==this.config.showToolbarItem){const t=m(y);o.registerToolbarItem({id:"print",group:"actions",label:this.locale.label,tooltip:this.locale.tooltip(t),icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/></svg>',command:"print"})}}destroy(){this.service=null}};export{d as n,g as r,w as t};
|
|
2
|
+
//# sourceMappingURL=PrintPlugin-CXDFFzWB.mjs.map
|