@notectl/core 2.1.2 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1544) hide show
  1. package/dist/chunks/AlignmentPlugin-BLzRjrUl.mjs +2 -0
  2. package/dist/chunks/AlignmentPlugin-BLzRjrUl.mjs.map +1 -0
  3. package/dist/chunks/AttrRegistry-CRnXTPha.mjs +2 -0
  4. package/dist/chunks/AttrRegistry-CRnXTPha.mjs.map +1 -0
  5. package/dist/chunks/AttributedMarkCommands-CxhdUsuE.mjs +2 -0
  6. package/dist/chunks/AttributedMarkCommands-CxhdUsuE.mjs.map +1 -0
  7. package/dist/chunks/BidiIsolationPlugin-DNPXe5ga.mjs +2 -0
  8. package/dist/chunks/BidiIsolationPlugin-DNPXe5ga.mjs.map +1 -0
  9. package/dist/chunks/BlockInsertion-C7jFEeYB.mjs +2 -0
  10. package/dist/chunks/BlockInsertion-C7jFEeYB.mjs.map +1 -0
  11. package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs +2 -0
  12. package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs.map +1 -0
  13. package/dist/chunks/BlockquotePlugin-YgXcV4mT.mjs +2 -0
  14. package/dist/chunks/BlockquotePlugin-YgXcV4mT.mjs.map +1 -0
  15. package/dist/chunks/CaretNavigationPlugin-P6OYaTSq.mjs +2 -0
  16. package/dist/chunks/CaretNavigationPlugin-P6OYaTSq.mjs.map +1 -0
  17. package/dist/chunks/CodeBlockPlugin-ChPv3Edf.mjs +2 -0
  18. package/dist/chunks/CodeBlockPlugin-ChPv3Edf.mjs.map +1 -0
  19. package/dist/chunks/ColorGrid-D5-teEjD.mjs +2 -0
  20. package/dist/chunks/ColorGrid-D5-teEjD.mjs.map +1 -0
  21. package/dist/chunks/ColorPickerPopup-_Gp09pdx.mjs +2 -0
  22. package/dist/chunks/ColorPickerPopup-_Gp09pdx.mjs.map +1 -0
  23. package/dist/chunks/ColorValidation-okAvytHQ.mjs +2 -0
  24. package/dist/chunks/ColorValidation-okAvytHQ.mjs.map +1 -0
  25. package/dist/chunks/CommandHelpers-NV80Ff1G.mjs +2 -0
  26. package/dist/chunks/CommandHelpers-NV80Ff1G.mjs.map +1 -0
  27. package/dist/chunks/Commands-ixGhPiRG.mjs +2 -0
  28. package/dist/chunks/Commands-ixGhPiRG.mjs.map +1 -0
  29. package/dist/chunks/Decoration-DZK7hrL1.mjs +2 -0
  30. package/dist/chunks/Decoration-DZK7hrL1.mjs.map +1 -0
  31. package/dist/chunks/DirectionDetection-7HmMUZrx.mjs +2 -0
  32. package/dist/chunks/DirectionDetection-7HmMUZrx.mjs.map +1 -0
  33. package/dist/chunks/DirectionIcons-DhRvPVoz.mjs +2 -0
  34. package/dist/chunks/DirectionIcons-DhRvPVoz.mjs.map +1 -0
  35. package/dist/chunks/Document-znhIcvM9.mjs +2 -0
  36. package/dist/chunks/Document-znhIcvM9.mjs.map +1 -0
  37. package/dist/chunks/DocumentParser-DCjOW3us.mjs +2 -0
  38. package/dist/chunks/DocumentParser-DCjOW3us.mjs.map +1 -0
  39. package/dist/chunks/FontPlugin-COYtG1Uo.mjs +2 -0
  40. package/dist/chunks/FontPlugin-COYtG1Uo.mjs.map +1 -0
  41. package/dist/chunks/FontSizePlugin-CLcfdTm3.mjs +2 -0
  42. package/dist/chunks/FontSizePlugin-CLcfdTm3.mjs.map +1 -0
  43. package/dist/chunks/FormulaPlugin-DphHU4Rn.mjs +2 -0
  44. package/dist/chunks/FormulaPlugin-DphHU4Rn.mjs.map +1 -0
  45. package/dist/chunks/GapCursorNavigation-Bkuu_Ek8.mjs +2 -0
  46. package/dist/chunks/GapCursorNavigation-Bkuu_Ek8.mjs.map +1 -0
  47. package/dist/chunks/GapCursorPlugin-CRDmQEi1.mjs +2 -0
  48. package/dist/chunks/GapCursorPlugin-CRDmQEi1.mjs.map +1 -0
  49. package/dist/chunks/HardBreakPlugin-Cr6dMQ-H.mjs +2 -0
  50. package/dist/chunks/HardBreakPlugin-Cr6dMQ-H.mjs.map +1 -0
  51. package/dist/chunks/HeadingPlugin-3NL4ARPp.mjs +2 -0
  52. package/dist/chunks/HeadingPlugin-3NL4ARPp.mjs.map +1 -0
  53. package/dist/chunks/HighlightPlugin-dHxnAuoW.mjs +2 -0
  54. package/dist/chunks/HighlightPlugin-dHxnAuoW.mjs.map +1 -0
  55. package/dist/chunks/HorizontalRulePlugin-BYPaI4TR.mjs +2 -0
  56. package/dist/chunks/HorizontalRulePlugin-BYPaI4TR.mjs.map +1 -0
  57. package/dist/chunks/ImagePlugin-kgokm-a1.mjs +2 -0
  58. package/dist/chunks/ImagePlugin-kgokm-a1.mjs.map +1 -0
  59. package/dist/chunks/InlineCodePlugin-Bl1jyDwk.mjs +2 -0
  60. package/dist/chunks/InlineCodePlugin-Bl1jyDwk.mjs.map +1 -0
  61. package/dist/chunks/InlineStyleMarkSpec-Cc-b1tlm.mjs +2 -0
  62. package/dist/chunks/InlineStyleMarkSpec-Cc-b1tlm.mjs.map +1 -0
  63. package/dist/chunks/KeyboardNav-DZXdTg-_.mjs +2 -0
  64. package/dist/chunks/KeyboardNav-DZXdTg-_.mjs.map +1 -0
  65. package/dist/chunks/LinkPlugin-Dmcfo3On.mjs +2 -0
  66. package/dist/chunks/LinkPlugin-Dmcfo3On.mjs.map +1 -0
  67. package/dist/chunks/ListPlugin-Ch-5CsFc.mjs +2 -0
  68. package/dist/chunks/ListPlugin-Ch-5CsFc.mjs.map +1 -0
  69. package/dist/chunks/NavigationQueries-3zTaNBlp.mjs +2 -0
  70. package/dist/chunks/NavigationQueries-3zTaNBlp.mjs.map +1 -0
  71. package/dist/chunks/NodeResolver-BplmzA7c.mjs +2 -0
  72. package/dist/chunks/NodeResolver-BplmzA7c.mjs.map +1 -0
  73. package/dist/chunks/NodeSelectionCommands-dUmbRoZ2.mjs +2 -0
  74. package/dist/chunks/NodeSelectionCommands-dUmbRoZ2.mjs.map +1 -0
  75. package/dist/chunks/NodeSpecPatching-DToX09gc.mjs +2 -0
  76. package/dist/chunks/NodeSpecPatching-DToX09gc.mjs.map +1 -0
  77. package/dist/chunks/Platform-wPvKFB9m.mjs +2 -0
  78. package/dist/chunks/Platform-wPvKFB9m.mjs.map +1 -0
  79. package/dist/chunks/PluginHelpers-C3aCCGfX.mjs +2 -0
  80. package/dist/chunks/PluginHelpers-C3aCCGfX.mjs.map +1 -0
  81. package/dist/chunks/PopupKeyboardPatterns-ZdAQB78m.mjs +2 -0
  82. package/dist/chunks/PopupKeyboardPatterns-ZdAQB78m.mjs.map +1 -0
  83. package/dist/chunks/PopupManager-DsT1uRWi.mjs +2 -0
  84. package/dist/chunks/PopupManager-DsT1uRWi.mjs.map +1 -0
  85. package/dist/chunks/PopupPositioning-BEnz90Oh.mjs +2 -0
  86. package/dist/chunks/PopupPositioning-BEnz90Oh.mjs.map +1 -0
  87. package/dist/chunks/PrintPlugin-Bq-Z14K1.mjs +2 -0
  88. package/dist/chunks/PrintPlugin-Bq-Z14K1.mjs.map +1 -0
  89. package/dist/chunks/PrintTypes-DA0Cc--M.mjs +2 -0
  90. package/dist/chunks/PrintTypes-DA0Cc--M.mjs.map +1 -0
  91. package/dist/chunks/RangeIterator-Cl4_k8cx.mjs +2 -0
  92. package/dist/chunks/RangeIterator-Cl4_k8cx.mjs.map +1 -0
  93. package/dist/chunks/SelectionSync-DCJpNFat.mjs +2 -0
  94. package/dist/chunks/SelectionSync-DCJpNFat.mjs.map +1 -0
  95. package/dist/chunks/ShortcutFormatting-DZK70CN9.mjs +2 -0
  96. package/dist/chunks/ShortcutFormatting-DZK70CN9.mjs.map +1 -0
  97. package/dist/chunks/SimpleMark-CezTJnXh.mjs +2 -0
  98. package/dist/chunks/SimpleMark-CezTJnXh.mjs.map +1 -0
  99. package/dist/chunks/SmartPastePlugin-DlApY6Vw.mjs +2 -0
  100. package/dist/chunks/SmartPastePlugin-DlApY6Vw.mjs.map +1 -0
  101. package/dist/chunks/StrikethroughPlugin-BuFDABvz.mjs +2 -0
  102. package/dist/chunks/StrikethroughPlugin-BuFDABvz.mjs.map +1 -0
  103. package/dist/chunks/StyleRuntime-Bwde5icB.mjs +2 -0
  104. package/dist/chunks/StyleRuntime-Bwde5icB.mjs.map +1 -0
  105. package/dist/chunks/SuperSubPlugin-CiLJ7i4s.mjs +2 -0
  106. package/dist/chunks/SuperSubPlugin-CiLJ7i4s.mjs.map +1 -0
  107. package/dist/chunks/SyntaxTokenTypes-C9dGwufi.mjs +2 -0
  108. package/dist/chunks/SyntaxTokenTypes-C9dGwufi.mjs.map +1 -0
  109. package/dist/chunks/TablePlugin-5ru-y-YX.mjs +2 -0
  110. package/dist/chunks/TablePlugin-5ru-y-YX.mjs.map +1 -0
  111. package/dist/chunks/TextColorPlugin-Vz-Nz8aH.mjs +2 -0
  112. package/dist/chunks/TextColorPlugin-Vz-Nz8aH.mjs.map +1 -0
  113. package/dist/chunks/TextDirectionAutoPlugin-Behl6KMe.mjs +2 -0
  114. package/dist/chunks/TextDirectionAutoPlugin-Behl6KMe.mjs.map +1 -0
  115. package/dist/chunks/TextDirectionPlugin-C3h1n-aA.mjs +2 -0
  116. package/dist/chunks/TextDirectionPlugin-C3h1n-aA.mjs.map +1 -0
  117. package/dist/chunks/TextDirectionService-DRfeQnF6.mjs +2 -0
  118. package/dist/chunks/TextDirectionService-DRfeQnF6.mjs.map +1 -0
  119. package/dist/chunks/TextFormattingPlugin-D_nRMeBn.mjs +2 -0
  120. package/dist/chunks/TextFormattingPlugin-D_nRMeBn.mjs.map +1 -0
  121. package/dist/chunks/ToolbarPlugin-CSMSgjPM.mjs +2 -0
  122. package/dist/chunks/ToolbarPlugin-CSMSgjPM.mjs.map +1 -0
  123. package/dist/chunks/TypedKeys-E3jOGByL.mjs +2 -0
  124. package/dist/chunks/TypedKeys-E3jOGByL.mjs.map +1 -0
  125. package/dist/chunks/VideoPlugin-BUCGIYXr.mjs +2 -0
  126. package/dist/chunks/VideoPlugin-BUCGIYXr.mjs.map +1 -0
  127. package/dist/chunks/WordBoundary-CYDAtEks.mjs +2 -0
  128. package/dist/chunks/WordBoundary-CYDAtEks.mjs.map +1 -0
  129. package/dist/chunks/XmlDetector-DxBGXqua.mjs +2 -0
  130. package/dist/chunks/XmlDetector-DxBGXqua.mjs.map +1 -0
  131. package/dist/chunks/XmlPatterns-BiHS8w3k.mjs +2 -0
  132. package/dist/chunks/XmlPatterns-BiHS8w3k.mjs.map +1 -0
  133. package/dist/chunks/XmlSupport-B_F65M8G.mjs +2 -0
  134. package/dist/chunks/XmlSupport-B_F65M8G.mjs.map +1 -0
  135. package/dist/chunks/ar-B38MlRRN.mjs +2 -0
  136. package/dist/chunks/ar-B38MlRRN.mjs.map +1 -0
  137. package/dist/chunks/ar-BIeE0C5A.mjs +2 -0
  138. package/dist/chunks/ar-BIeE0C5A.mjs.map +1 -0
  139. package/dist/chunks/ar-BK0rFxF_.mjs +2 -0
  140. package/dist/chunks/ar-BK0rFxF_.mjs.map +1 -0
  141. package/dist/chunks/ar-BK4O36ep.mjs +2 -0
  142. package/dist/chunks/ar-BK4O36ep.mjs.map +1 -0
  143. package/dist/chunks/ar-BNUWuZe3.mjs +2 -0
  144. package/dist/chunks/ar-BNUWuZe3.mjs.map +1 -0
  145. package/dist/chunks/ar-BSXH8acw.mjs +2 -0
  146. package/dist/chunks/ar-BSXH8acw.mjs.map +1 -0
  147. package/dist/chunks/ar-BY8yNlGe.mjs +2 -0
  148. package/dist/chunks/ar-BY8yNlGe.mjs.map +1 -0
  149. package/dist/chunks/ar-BgHkduPE.mjs +2 -0
  150. package/dist/chunks/ar-BgHkduPE.mjs.map +1 -0
  151. package/dist/chunks/ar-BnfWtLhK.mjs +2 -0
  152. package/dist/chunks/ar-BnfWtLhK.mjs.map +1 -0
  153. package/dist/chunks/ar-BwCPhCf6.mjs +2 -0
  154. package/dist/chunks/ar-BwCPhCf6.mjs.map +1 -0
  155. package/dist/chunks/ar-Bymjd9Z_.mjs +2 -0
  156. package/dist/chunks/ar-Bymjd9Z_.mjs.map +1 -0
  157. package/dist/chunks/ar-CKPpdJ7F.mjs +2 -0
  158. package/dist/chunks/ar-CKPpdJ7F.mjs.map +1 -0
  159. package/dist/chunks/ar-C_ir5Uf4.mjs +2 -0
  160. package/dist/chunks/ar-C_ir5Uf4.mjs.map +1 -0
  161. package/dist/chunks/ar-CkE6GDVA.mjs +2 -0
  162. package/dist/chunks/ar-CkE6GDVA.mjs.map +1 -0
  163. package/dist/chunks/ar-ClgA1KQM.mjs +2 -0
  164. package/dist/chunks/ar-ClgA1KQM.mjs.map +1 -0
  165. package/dist/chunks/ar-Cm1DOK74.mjs +2 -0
  166. package/dist/chunks/ar-Cm1DOK74.mjs.map +1 -0
  167. package/dist/chunks/ar-CseGhQtS.mjs +2 -0
  168. package/dist/chunks/ar-CseGhQtS.mjs.map +1 -0
  169. package/dist/chunks/ar-D0bqkviV.mjs +2 -0
  170. package/dist/chunks/ar-D0bqkviV.mjs.map +1 -0
  171. package/dist/chunks/ar-D5d185g0.mjs +2 -0
  172. package/dist/chunks/ar-D5d185g0.mjs.map +1 -0
  173. package/dist/chunks/ar-DSwUyX47.mjs +2 -0
  174. package/dist/chunks/ar-DSwUyX47.mjs.map +1 -0
  175. package/dist/chunks/ar-DfSNWZX7.mjs +2 -0
  176. package/dist/chunks/ar-DfSNWZX7.mjs.map +1 -0
  177. package/dist/chunks/ar-Dghtfs46.mjs +2 -0
  178. package/dist/chunks/ar-Dghtfs46.mjs.map +1 -0
  179. package/dist/chunks/ar-DvNKBrJd.mjs +2 -0
  180. package/dist/chunks/ar-DvNKBrJd.mjs.map +1 -0
  181. package/dist/chunks/ar-KNULRI8r.mjs +2 -0
  182. package/dist/chunks/ar-KNULRI8r.mjs.map +1 -0
  183. package/dist/chunks/ar-NtGRavHz.mjs +2 -0
  184. package/dist/chunks/ar-NtGRavHz.mjs.map +1 -0
  185. package/dist/chunks/ar-Y9KjJLX8.mjs +2 -0
  186. package/dist/chunks/ar-Y9KjJLX8.mjs.map +1 -0
  187. package/dist/chunks/ar-odM5gkvw.mjs +2 -0
  188. package/dist/chunks/ar-odM5gkvw.mjs.map +1 -0
  189. package/dist/chunks/color-picker-C89H4SVX.mjs +2 -0
  190. package/dist/chunks/color-picker-C89H4SVX.mjs.map +1 -0
  191. package/dist/chunks/de-B1TXiyll.mjs +2 -0
  192. package/dist/chunks/de-B1TXiyll.mjs.map +1 -0
  193. package/dist/chunks/de-BDRaxLyi.mjs +2 -0
  194. package/dist/chunks/de-BDRaxLyi.mjs.map +1 -0
  195. package/dist/chunks/de-BGOpZ8Ls.mjs +2 -0
  196. package/dist/chunks/de-BGOpZ8Ls.mjs.map +1 -0
  197. package/dist/chunks/de-BfZ5qXWz.mjs +2 -0
  198. package/dist/chunks/de-BfZ5qXWz.mjs.map +1 -0
  199. package/dist/chunks/de-BibufNIa.mjs +2 -0
  200. package/dist/chunks/de-BibufNIa.mjs.map +1 -0
  201. package/dist/chunks/de-BkZqCmzL.mjs +2 -0
  202. package/dist/chunks/de-BkZqCmzL.mjs.map +1 -0
  203. package/dist/chunks/de-BzRd2oyR.mjs +2 -0
  204. package/dist/chunks/de-BzRd2oyR.mjs.map +1 -0
  205. package/dist/chunks/de-C4gnHDmk.mjs +2 -0
  206. package/dist/chunks/de-C4gnHDmk.mjs.map +1 -0
  207. package/dist/chunks/de-C4iw9SEp.mjs +2 -0
  208. package/dist/chunks/de-C4iw9SEp.mjs.map +1 -0
  209. package/dist/chunks/de-CLWzcDoW.mjs +2 -0
  210. package/dist/chunks/de-CLWzcDoW.mjs.map +1 -0
  211. package/dist/chunks/de-Cbv0otYM.mjs +2 -0
  212. package/dist/chunks/de-Cbv0otYM.mjs.map +1 -0
  213. package/dist/chunks/de-Cinp7zmo.mjs +2 -0
  214. package/dist/chunks/de-Cinp7zmo.mjs.map +1 -0
  215. package/dist/chunks/de-CvnyjI_X.mjs +2 -0
  216. package/dist/chunks/de-CvnyjI_X.mjs.map +1 -0
  217. package/dist/chunks/de-DCx3Shj3.mjs +2 -0
  218. package/dist/chunks/de-DCx3Shj3.mjs.map +1 -0
  219. package/dist/chunks/de-Dav2GzjV.mjs +2 -0
  220. package/dist/chunks/de-Dav2GzjV.mjs.map +1 -0
  221. package/dist/chunks/de-Dc7GRbWc.mjs +2 -0
  222. package/dist/chunks/de-Dc7GRbWc.mjs.map +1 -0
  223. package/dist/chunks/de-DdntlpT3.mjs +2 -0
  224. package/dist/chunks/de-DdntlpT3.mjs.map +1 -0
  225. package/dist/chunks/de-DefykdF-.mjs +2 -0
  226. package/dist/chunks/de-DefykdF-.mjs.map +1 -0
  227. package/dist/chunks/de-DfQQIP8Y.mjs +2 -0
  228. package/dist/chunks/de-DfQQIP8Y.mjs.map +1 -0
  229. package/dist/chunks/de-DkcKDkbA.mjs +2 -0
  230. package/dist/chunks/de-DkcKDkbA.mjs.map +1 -0
  231. package/dist/chunks/de-DqGfLfeV.mjs +2 -0
  232. package/dist/chunks/de-DqGfLfeV.mjs.map +1 -0
  233. package/dist/chunks/de-DudqIJho.mjs +2 -0
  234. package/dist/chunks/de-DudqIJho.mjs.map +1 -0
  235. package/dist/chunks/de-LCXA2xWj.mjs +2 -0
  236. package/dist/chunks/de-LCXA2xWj.mjs.map +1 -0
  237. package/dist/chunks/de-YygmrxGp.mjs +2 -0
  238. package/dist/chunks/de-YygmrxGp.mjs.map +1 -0
  239. package/dist/chunks/de-asI3UlFG.mjs +2 -0
  240. package/dist/chunks/de-asI3UlFG.mjs.map +1 -0
  241. package/dist/chunks/de-kvMvD3AJ.mjs +2 -0
  242. package/dist/chunks/de-kvMvD3AJ.mjs.map +1 -0
  243. package/dist/chunks/de-pnfTnS03.mjs +2 -0
  244. package/dist/chunks/de-pnfTnS03.mjs.map +1 -0
  245. package/dist/chunks/es-4tbAR0If.mjs +2 -0
  246. package/dist/chunks/es-4tbAR0If.mjs.map +1 -0
  247. package/dist/chunks/es-B9z2Xwj0.mjs +2 -0
  248. package/dist/chunks/es-B9z2Xwj0.mjs.map +1 -0
  249. package/dist/chunks/es-BJxjRQSg.mjs +2 -0
  250. package/dist/chunks/es-BJxjRQSg.mjs.map +1 -0
  251. package/dist/chunks/es-BSyxBRjn.mjs +2 -0
  252. package/dist/chunks/es-BSyxBRjn.mjs.map +1 -0
  253. package/dist/chunks/es-Bcpq2xfU.mjs +2 -0
  254. package/dist/chunks/es-Bcpq2xfU.mjs.map +1 -0
  255. package/dist/chunks/es-BhUjc8mO.mjs +2 -0
  256. package/dist/chunks/es-BhUjc8mO.mjs.map +1 -0
  257. package/dist/chunks/es-Bm7hoJSI.mjs +2 -0
  258. package/dist/chunks/es-Bm7hoJSI.mjs.map +1 -0
  259. package/dist/chunks/es-C0E-lFIC.mjs +2 -0
  260. package/dist/chunks/es-C0E-lFIC.mjs.map +1 -0
  261. package/dist/chunks/es-C2wBBQ7N.mjs +2 -0
  262. package/dist/chunks/es-C2wBBQ7N.mjs.map +1 -0
  263. package/dist/chunks/es-C9vhYpfP.mjs +2 -0
  264. package/dist/chunks/es-C9vhYpfP.mjs.map +1 -0
  265. package/dist/chunks/es-Cgslt0Hp.mjs +2 -0
  266. package/dist/chunks/es-Cgslt0Hp.mjs.map +1 -0
  267. package/dist/chunks/es-CksXDFxg.mjs +2 -0
  268. package/dist/chunks/es-CksXDFxg.mjs.map +1 -0
  269. package/dist/chunks/es-CnQUZlfY.mjs +2 -0
  270. package/dist/chunks/es-CnQUZlfY.mjs.map +1 -0
  271. package/dist/chunks/es-CrRNOn2Q.mjs +2 -0
  272. package/dist/chunks/es-CrRNOn2Q.mjs.map +1 -0
  273. package/dist/chunks/es-D0427MIH.mjs +2 -0
  274. package/dist/chunks/es-D0427MIH.mjs.map +1 -0
  275. package/dist/chunks/es-D19xfXus.mjs +2 -0
  276. package/dist/chunks/es-D19xfXus.mjs.map +1 -0
  277. package/dist/chunks/es-Dk6lCcOt.mjs +2 -0
  278. package/dist/chunks/es-Dk6lCcOt.mjs.map +1 -0
  279. package/dist/chunks/es-Dls_xPCW.mjs +2 -0
  280. package/dist/chunks/es-Dls_xPCW.mjs.map +1 -0
  281. package/dist/chunks/es-DrcsyDvI.mjs +2 -0
  282. package/dist/chunks/es-DrcsyDvI.mjs.map +1 -0
  283. package/dist/chunks/es-DwKejbO9.mjs +2 -0
  284. package/dist/chunks/es-DwKejbO9.mjs.map +1 -0
  285. package/dist/chunks/es-NcrWuNe1.mjs +2 -0
  286. package/dist/chunks/es-NcrWuNe1.mjs.map +1 -0
  287. package/dist/chunks/es-RaZerssd.mjs +2 -0
  288. package/dist/chunks/es-RaZerssd.mjs.map +1 -0
  289. package/dist/chunks/es-TIjHCFNF.mjs +2 -0
  290. package/dist/chunks/es-TIjHCFNF.mjs.map +1 -0
  291. package/dist/chunks/es-eZcDkBb-.mjs +2 -0
  292. package/dist/chunks/es-eZcDkBb-.mjs.map +1 -0
  293. package/dist/chunks/es-j_-KW9-4.mjs +2 -0
  294. package/dist/chunks/es-j_-KW9-4.mjs.map +1 -0
  295. package/dist/chunks/es-kGLwn8EB.mjs +2 -0
  296. package/dist/chunks/es-kGLwn8EB.mjs.map +1 -0
  297. package/dist/chunks/es-qQRDC0Ge.mjs +2 -0
  298. package/dist/chunks/es-qQRDC0Ge.mjs.map +1 -0
  299. package/dist/chunks/fonts-ZXAIMT3b.mjs +2 -0
  300. package/dist/chunks/fonts-ZXAIMT3b.mjs.map +1 -0
  301. package/dist/chunks/fr-B27zAq0X.mjs +2 -0
  302. package/dist/chunks/fr-B27zAq0X.mjs.map +1 -0
  303. package/dist/chunks/fr-BEd3ZHO4.mjs +2 -0
  304. package/dist/chunks/fr-BEd3ZHO4.mjs.map +1 -0
  305. package/dist/chunks/fr-BHXLpdaH.mjs +2 -0
  306. package/dist/chunks/fr-BHXLpdaH.mjs.map +1 -0
  307. package/dist/chunks/fr-BKu4eU3V.mjs +2 -0
  308. package/dist/chunks/fr-BKu4eU3V.mjs.map +1 -0
  309. package/dist/chunks/fr-BUrUZ5UQ.mjs +2 -0
  310. package/dist/chunks/fr-BUrUZ5UQ.mjs.map +1 -0
  311. package/dist/chunks/fr-BlqlUQ3b.mjs +2 -0
  312. package/dist/chunks/fr-BlqlUQ3b.mjs.map +1 -0
  313. package/dist/chunks/fr-BruEqDw1.mjs +2 -0
  314. package/dist/chunks/fr-BruEqDw1.mjs.map +1 -0
  315. package/dist/chunks/fr-BwuuFBkA.mjs +2 -0
  316. package/dist/chunks/fr-BwuuFBkA.mjs.map +1 -0
  317. package/dist/chunks/fr-C2lLh5Ti.mjs +2 -0
  318. package/dist/chunks/fr-C2lLh5Ti.mjs.map +1 -0
  319. package/dist/chunks/fr-C7N2_AlK.mjs +2 -0
  320. package/dist/chunks/fr-C7N2_AlK.mjs.map +1 -0
  321. package/dist/chunks/fr-COfd6sLW.mjs +2 -0
  322. package/dist/chunks/fr-COfd6sLW.mjs.map +1 -0
  323. package/dist/chunks/fr-COx4cSxc.mjs +2 -0
  324. package/dist/chunks/fr-COx4cSxc.mjs.map +1 -0
  325. package/dist/chunks/fr-CX37XjPO.mjs +2 -0
  326. package/dist/chunks/fr-CX37XjPO.mjs.map +1 -0
  327. package/dist/chunks/fr-CYn6fMiH.mjs +2 -0
  328. package/dist/chunks/fr-CYn6fMiH.mjs.map +1 -0
  329. package/dist/chunks/fr-CbsiyDEa.mjs +2 -0
  330. package/dist/chunks/fr-CbsiyDEa.mjs.map +1 -0
  331. package/dist/chunks/fr-CcZiELJY.mjs +2 -0
  332. package/dist/chunks/fr-CcZiELJY.mjs.map +1 -0
  333. package/dist/chunks/fr-CeHzUPVT.mjs +2 -0
  334. package/dist/chunks/fr-CeHzUPVT.mjs.map +1 -0
  335. package/dist/chunks/fr-Cv73J4QZ.mjs +2 -0
  336. package/dist/chunks/fr-Cv73J4QZ.mjs.map +1 -0
  337. package/dist/chunks/fr-DDLuorz7.mjs +2 -0
  338. package/dist/chunks/fr-DDLuorz7.mjs.map +1 -0
  339. package/dist/chunks/fr-DMA4CAyo.mjs +2 -0
  340. package/dist/chunks/fr-DMA4CAyo.mjs.map +1 -0
  341. package/dist/chunks/fr-DNJuGtO1.mjs +2 -0
  342. package/dist/chunks/fr-DNJuGtO1.mjs.map +1 -0
  343. package/dist/chunks/fr-DQOE8O6_.mjs +2 -0
  344. package/dist/chunks/fr-DQOE8O6_.mjs.map +1 -0
  345. package/dist/chunks/fr-DXjOwGew.mjs +2 -0
  346. package/dist/chunks/fr-DXjOwGew.mjs.map +1 -0
  347. package/dist/chunks/fr-DilrEvE_.mjs +2 -0
  348. package/dist/chunks/fr-DilrEvE_.mjs.map +1 -0
  349. package/dist/chunks/fr-P7iY3ntE.mjs +2 -0
  350. package/dist/chunks/fr-P7iY3ntE.mjs.map +1 -0
  351. package/dist/chunks/fr-ViUNGo_J.mjs +2 -0
  352. package/dist/chunks/fr-ViUNGo_J.mjs.map +1 -0
  353. package/dist/chunks/fr-gdIyLcGC.mjs +2 -0
  354. package/dist/chunks/fr-gdIyLcGC.mjs.map +1 -0
  355. package/dist/chunks/full-h88Sb2MR.mjs +2 -0
  356. package/dist/chunks/full-h88Sb2MR.mjs.map +1 -0
  357. package/dist/chunks/hi-BC82Jxjl.mjs +2 -0
  358. package/dist/chunks/hi-BC82Jxjl.mjs.map +1 -0
  359. package/dist/chunks/hi-BCTarnem.mjs +2 -0
  360. package/dist/chunks/hi-BCTarnem.mjs.map +1 -0
  361. package/dist/chunks/hi-BMStjhJF.mjs +2 -0
  362. package/dist/chunks/hi-BMStjhJF.mjs.map +1 -0
  363. package/dist/chunks/hi-BQ2Fyx7t.mjs +2 -0
  364. package/dist/chunks/hi-BQ2Fyx7t.mjs.map +1 -0
  365. package/dist/chunks/hi-Bg4-z2Os.mjs +2 -0
  366. package/dist/chunks/hi-Bg4-z2Os.mjs.map +1 -0
  367. package/dist/chunks/hi-BgqI_gOH.mjs +2 -0
  368. package/dist/chunks/hi-BgqI_gOH.mjs.map +1 -0
  369. package/dist/chunks/hi-CEPSeUBX.mjs +2 -0
  370. package/dist/chunks/hi-CEPSeUBX.mjs.map +1 -0
  371. package/dist/chunks/hi-CRaZj5Uo.mjs +2 -0
  372. package/dist/chunks/hi-CRaZj5Uo.mjs.map +1 -0
  373. package/dist/chunks/hi-CT0uK1Me.mjs +2 -0
  374. package/dist/chunks/hi-CT0uK1Me.mjs.map +1 -0
  375. package/dist/chunks/hi-CnIpMd8L.mjs +2 -0
  376. package/dist/chunks/hi-CnIpMd8L.mjs.map +1 -0
  377. package/dist/chunks/hi-CnSv0JhL.mjs +2 -0
  378. package/dist/chunks/hi-CnSv0JhL.mjs.map +1 -0
  379. package/dist/chunks/hi-DLLBZu67.mjs +2 -0
  380. package/dist/chunks/hi-DLLBZu67.mjs.map +1 -0
  381. package/dist/chunks/hi-DMg_aiSR.mjs +2 -0
  382. package/dist/chunks/hi-DMg_aiSR.mjs.map +1 -0
  383. package/dist/chunks/hi-DWwLzOX5.mjs +2 -0
  384. package/dist/chunks/hi-DWwLzOX5.mjs.map +1 -0
  385. package/dist/chunks/hi-D_4Xi4Nv.mjs +2 -0
  386. package/dist/chunks/hi-D_4Xi4Nv.mjs.map +1 -0
  387. package/dist/chunks/hi-D_Jtykmj.mjs +2 -0
  388. package/dist/chunks/hi-D_Jtykmj.mjs.map +1 -0
  389. package/dist/chunks/hi-Da5pRz8E.mjs +2 -0
  390. package/dist/chunks/hi-Da5pRz8E.mjs.map +1 -0
  391. package/dist/chunks/hi-DqL20WmM.mjs +2 -0
  392. package/dist/chunks/hi-DqL20WmM.mjs.map +1 -0
  393. package/dist/chunks/hi-DwQopxRg.mjs +2 -0
  394. package/dist/chunks/hi-DwQopxRg.mjs.map +1 -0
  395. package/dist/chunks/hi-IuMohSSw.mjs +2 -0
  396. package/dist/chunks/hi-IuMohSSw.mjs.map +1 -0
  397. package/dist/chunks/hi-PUX7dDPm.mjs +2 -0
  398. package/dist/chunks/hi-PUX7dDPm.mjs.map +1 -0
  399. package/dist/chunks/hi-RmfZAmwT.mjs +2 -0
  400. package/dist/chunks/hi-RmfZAmwT.mjs.map +1 -0
  401. package/dist/chunks/hi-UIBrTEVu.mjs +2 -0
  402. package/dist/chunks/hi-UIBrTEVu.mjs.map +1 -0
  403. package/dist/chunks/hi-_SjWnfeh.mjs +2 -0
  404. package/dist/chunks/hi-_SjWnfeh.mjs.map +1 -0
  405. package/dist/chunks/hi-dV2GZgH_.mjs +2 -0
  406. package/dist/chunks/hi-dV2GZgH_.mjs.map +1 -0
  407. package/dist/chunks/hi-ehh5oKz3.mjs +2 -0
  408. package/dist/chunks/hi-ehh5oKz3.mjs.map +1 -0
  409. package/dist/chunks/hi-yXnRBFJK.mjs +2 -0
  410. package/dist/chunks/hi-yXnRBFJK.mjs.map +1 -0
  411. package/dist/chunks/minimal-a40NeBQ_.mjs +2 -0
  412. package/dist/chunks/minimal-a40NeBQ_.mjs.map +1 -0
  413. package/dist/chunks/pt-2a8Oto6x.mjs +2 -0
  414. package/dist/chunks/pt-2a8Oto6x.mjs.map +1 -0
  415. package/dist/chunks/pt-ALzIyTiI.mjs +2 -0
  416. package/dist/chunks/pt-ALzIyTiI.mjs.map +1 -0
  417. package/dist/chunks/pt-B2hMlTc6.mjs +2 -0
  418. package/dist/chunks/pt-B2hMlTc6.mjs.map +1 -0
  419. package/dist/chunks/pt-BCIkSb0w.mjs +2 -0
  420. package/dist/chunks/pt-BCIkSb0w.mjs.map +1 -0
  421. package/dist/chunks/pt-BFotmq5x.mjs +2 -0
  422. package/dist/chunks/pt-BFotmq5x.mjs.map +1 -0
  423. package/dist/chunks/pt-BM7OScX6.mjs +2 -0
  424. package/dist/chunks/pt-BM7OScX6.mjs.map +1 -0
  425. package/dist/chunks/pt-BM7zXWxW.mjs +2 -0
  426. package/dist/chunks/pt-BM7zXWxW.mjs.map +1 -0
  427. package/dist/chunks/pt-BchCuzFq.mjs +2 -0
  428. package/dist/chunks/pt-BchCuzFq.mjs.map +1 -0
  429. package/dist/chunks/pt-BmcHFWoR.mjs +2 -0
  430. package/dist/chunks/pt-BmcHFWoR.mjs.map +1 -0
  431. package/dist/chunks/pt-C53W99RV.mjs +2 -0
  432. package/dist/chunks/pt-C53W99RV.mjs.map +1 -0
  433. package/dist/chunks/pt-CORQy8qv.mjs +2 -0
  434. package/dist/chunks/pt-CORQy8qv.mjs.map +1 -0
  435. package/dist/chunks/pt-CUPKr943.mjs +2 -0
  436. package/dist/chunks/pt-CUPKr943.mjs.map +1 -0
  437. package/dist/chunks/pt-CYkKDsLa.mjs +2 -0
  438. package/dist/chunks/pt-CYkKDsLa.mjs.map +1 -0
  439. package/dist/chunks/pt-Cd_SXHKt.mjs +2 -0
  440. package/dist/chunks/pt-Cd_SXHKt.mjs.map +1 -0
  441. package/dist/chunks/pt-CjN3Oq-6.mjs +2 -0
  442. package/dist/chunks/pt-CjN3Oq-6.mjs.map +1 -0
  443. package/dist/chunks/pt-CrKrgktr.mjs +2 -0
  444. package/dist/chunks/pt-CrKrgktr.mjs.map +1 -0
  445. package/dist/chunks/pt-Crmbkj0e.mjs +2 -0
  446. package/dist/chunks/pt-Crmbkj0e.mjs.map +1 -0
  447. package/dist/chunks/pt-D19IWOM_.mjs +2 -0
  448. package/dist/chunks/pt-D19IWOM_.mjs.map +1 -0
  449. package/dist/chunks/pt-D6zY7l2E.mjs +2 -0
  450. package/dist/chunks/pt-D6zY7l2E.mjs.map +1 -0
  451. package/dist/chunks/pt-DA5hufLZ.mjs +2 -0
  452. package/dist/chunks/pt-DA5hufLZ.mjs.map +1 -0
  453. package/dist/chunks/pt-DEfBqu-c.mjs +2 -0
  454. package/dist/chunks/pt-DEfBqu-c.mjs.map +1 -0
  455. package/dist/chunks/pt-DG3rw6nK.mjs +2 -0
  456. package/dist/chunks/pt-DG3rw6nK.mjs.map +1 -0
  457. package/dist/chunks/pt-DRoAHNZi.mjs +2 -0
  458. package/dist/chunks/pt-DRoAHNZi.mjs.map +1 -0
  459. package/dist/chunks/pt-Eml9QiUL.mjs +2 -0
  460. package/dist/chunks/pt-Eml9QiUL.mjs.map +1 -0
  461. package/dist/chunks/pt-Haa3wVmA.mjs +2 -0
  462. package/dist/chunks/pt-Haa3wVmA.mjs.map +1 -0
  463. package/dist/chunks/pt-aj7zOxTg.mjs +2 -0
  464. package/dist/chunks/pt-aj7zOxTg.mjs.map +1 -0
  465. package/dist/chunks/pt-l6dTmkQk.mjs +2 -0
  466. package/dist/chunks/pt-l6dTmkQk.mjs.map +1 -0
  467. package/dist/chunks/ru--JPEpdcJ.mjs +2 -0
  468. package/dist/chunks/ru--JPEpdcJ.mjs.map +1 -0
  469. package/dist/chunks/ru-B76ORyqe.mjs +2 -0
  470. package/dist/chunks/ru-B76ORyqe.mjs.map +1 -0
  471. package/dist/chunks/ru-BDQ62WuE.mjs +2 -0
  472. package/dist/chunks/ru-BDQ62WuE.mjs.map +1 -0
  473. package/dist/chunks/ru-BQ6W3lwr.mjs +2 -0
  474. package/dist/chunks/ru-BQ6W3lwr.mjs.map +1 -0
  475. package/dist/chunks/ru-BQpaitci.mjs +2 -0
  476. package/dist/chunks/ru-BQpaitci.mjs.map +1 -0
  477. package/dist/chunks/ru-Bm9VwJLu.mjs +2 -0
  478. package/dist/chunks/ru-Bm9VwJLu.mjs.map +1 -0
  479. package/dist/chunks/ru-BnNdik6i.mjs +2 -0
  480. package/dist/chunks/ru-BnNdik6i.mjs.map +1 -0
  481. package/dist/chunks/ru-Bo4am8cd.mjs +2 -0
  482. package/dist/chunks/ru-Bo4am8cd.mjs.map +1 -0
  483. package/dist/chunks/ru-C1k56xWQ.mjs +2 -0
  484. package/dist/chunks/ru-C1k56xWQ.mjs.map +1 -0
  485. package/dist/chunks/ru-C4rnSQlI.mjs +2 -0
  486. package/dist/chunks/ru-C4rnSQlI.mjs.map +1 -0
  487. package/dist/chunks/ru-CKM3t1sv.mjs +2 -0
  488. package/dist/chunks/ru-CKM3t1sv.mjs.map +1 -0
  489. package/dist/chunks/ru-CO6eCsxU.mjs +2 -0
  490. package/dist/chunks/ru-CO6eCsxU.mjs.map +1 -0
  491. package/dist/chunks/ru-CTaYpQ9_.mjs +2 -0
  492. package/dist/chunks/ru-CTaYpQ9_.mjs.map +1 -0
  493. package/dist/chunks/ru-CdY8d80t.mjs +2 -0
  494. package/dist/chunks/ru-CdY8d80t.mjs.map +1 -0
  495. package/dist/chunks/ru-CsDtaWRd.mjs +2 -0
  496. package/dist/chunks/ru-CsDtaWRd.mjs.map +1 -0
  497. package/dist/chunks/ru-Cy_4nn8h.mjs +2 -0
  498. package/dist/chunks/ru-Cy_4nn8h.mjs.map +1 -0
  499. package/dist/chunks/ru-DACtjNuJ.mjs +2 -0
  500. package/dist/chunks/ru-DACtjNuJ.mjs.map +1 -0
  501. package/dist/chunks/ru-DN6yN_w9.mjs +2 -0
  502. package/dist/chunks/ru-DN6yN_w9.mjs.map +1 -0
  503. package/dist/chunks/ru-DThFtd76.mjs +2 -0
  504. package/dist/chunks/ru-DThFtd76.mjs.map +1 -0
  505. package/dist/chunks/ru-Dd_P7hP7.mjs +2 -0
  506. package/dist/chunks/ru-Dd_P7hP7.mjs.map +1 -0
  507. package/dist/chunks/ru-Dhuxwzwy.mjs +2 -0
  508. package/dist/chunks/ru-Dhuxwzwy.mjs.map +1 -0
  509. package/dist/chunks/ru-Dn6UDGIG.mjs +2 -0
  510. package/dist/chunks/ru-Dn6UDGIG.mjs.map +1 -0
  511. package/dist/chunks/ru-DojHc5wu.mjs +2 -0
  512. package/dist/chunks/ru-DojHc5wu.mjs.map +1 -0
  513. package/dist/chunks/ru-DyWzWBjV.mjs +2 -0
  514. package/dist/chunks/ru-DyWzWBjV.mjs.map +1 -0
  515. package/dist/chunks/ru-NBxCkjlP.mjs +2 -0
  516. package/dist/chunks/ru-NBxCkjlP.mjs.map +1 -0
  517. package/dist/chunks/ru-_MQaVHam.mjs +2 -0
  518. package/dist/chunks/ru-_MQaVHam.mjs.map +1 -0
  519. package/dist/chunks/ru-wv17PPrd.mjs +2 -0
  520. package/dist/chunks/ru-wv17PPrd.mjs.map +1 -0
  521. package/dist/chunks/src-ooaZ_Egu.mjs +2 -0
  522. package/dist/chunks/src-ooaZ_Egu.mjs.map +1 -0
  523. package/dist/chunks/zh-2-Y3Limy.mjs +2 -0
  524. package/dist/chunks/zh-2-Y3Limy.mjs.map +1 -0
  525. package/dist/chunks/zh-B02VPMqX.mjs +2 -0
  526. package/dist/chunks/zh-B02VPMqX.mjs.map +1 -0
  527. package/dist/chunks/zh-BYjLBWWN.mjs +2 -0
  528. package/dist/chunks/zh-BYjLBWWN.mjs.map +1 -0
  529. package/dist/chunks/zh-Bt2ZdHcS.mjs +2 -0
  530. package/dist/chunks/zh-Bt2ZdHcS.mjs.map +1 -0
  531. package/dist/chunks/zh-BuN_C4o-.mjs +2 -0
  532. package/dist/chunks/zh-BuN_C4o-.mjs.map +1 -0
  533. package/dist/chunks/zh-CA3BDj0Y.mjs +2 -0
  534. package/dist/chunks/zh-CA3BDj0Y.mjs.map +1 -0
  535. package/dist/chunks/zh-CHuGP7RS.mjs +2 -0
  536. package/dist/chunks/zh-CHuGP7RS.mjs.map +1 -0
  537. package/dist/chunks/zh-CIPsF5P8.mjs +2 -0
  538. package/dist/chunks/zh-CIPsF5P8.mjs.map +1 -0
  539. package/dist/chunks/zh-C_YS18re.mjs +2 -0
  540. package/dist/chunks/zh-C_YS18re.mjs.map +1 -0
  541. package/dist/chunks/zh-CfMPFWUg.mjs +2 -0
  542. package/dist/chunks/zh-CfMPFWUg.mjs.map +1 -0
  543. package/dist/chunks/zh-CfjCcBIB.mjs +2 -0
  544. package/dist/chunks/zh-CfjCcBIB.mjs.map +1 -0
  545. package/dist/chunks/zh-CqQph809.mjs +2 -0
  546. package/dist/chunks/zh-CqQph809.mjs.map +1 -0
  547. package/dist/chunks/zh-Cxe42GC5.mjs +2 -0
  548. package/dist/chunks/zh-Cxe42GC5.mjs.map +1 -0
  549. package/dist/chunks/zh-CyMU2cTf.mjs +2 -0
  550. package/dist/chunks/zh-CyMU2cTf.mjs.map +1 -0
  551. package/dist/chunks/zh-Cynz1sBa.mjs +2 -0
  552. package/dist/chunks/zh-Cynz1sBa.mjs.map +1 -0
  553. package/dist/chunks/zh-DRKs6Q0a.mjs +2 -0
  554. package/dist/chunks/zh-DRKs6Q0a.mjs.map +1 -0
  555. package/dist/chunks/zh-DTuIJjx6.mjs +2 -0
  556. package/dist/chunks/zh-DTuIJjx6.mjs.map +1 -0
  557. package/dist/chunks/zh-DTz9l6mp.mjs +2 -0
  558. package/dist/chunks/zh-DTz9l6mp.mjs.map +1 -0
  559. package/dist/chunks/zh-DZwjiJmn.mjs +2 -0
  560. package/dist/chunks/zh-DZwjiJmn.mjs.map +1 -0
  561. package/dist/chunks/zh-D_VJDQl4.mjs +2 -0
  562. package/dist/chunks/zh-D_VJDQl4.mjs.map +1 -0
  563. package/dist/chunks/zh-Dt20Om7Z.mjs +2 -0
  564. package/dist/chunks/zh-Dt20Om7Z.mjs.map +1 -0
  565. package/dist/chunks/zh-SgsZ9f-W.mjs +2 -0
  566. package/dist/chunks/zh-SgsZ9f-W.mjs.map +1 -0
  567. package/dist/chunks/zh-XR7Ls7m-.mjs +2 -0
  568. package/dist/chunks/zh-XR7Ls7m-.mjs.map +1 -0
  569. package/dist/chunks/zh-aXPI9lKF.mjs +2 -0
  570. package/dist/chunks/zh-aXPI9lKF.mjs.map +1 -0
  571. package/dist/chunks/zh-cLXIKkZQ.mjs +2 -0
  572. package/dist/chunks/zh-cLXIKkZQ.mjs.map +1 -0
  573. package/dist/chunks/zh-cZUtN871.mjs +2 -0
  574. package/dist/chunks/zh-cZUtN871.mjs.map +1 -0
  575. package/dist/chunks/zh-hcdnCGUp.mjs +2 -0
  576. package/dist/chunks/zh-hcdnCGUp.mjs.map +1 -0
  577. package/dist/commands/AttributedMarkCommands.d.ts.map +1 -1
  578. package/dist/commands/BlockInsertion.d.ts +27 -0
  579. package/dist/commands/BlockInsertion.d.ts.map +1 -1
  580. package/dist/commands/CommandHelpers.d.ts +12 -0
  581. package/dist/commands/CommandHelpers.d.ts.map +1 -1
  582. package/dist/commands/Commands.d.ts.map +1 -1
  583. package/dist/commands/ContainerCommands.d.ts +24 -0
  584. package/dist/commands/ContainerCommands.d.ts.map +1 -0
  585. package/dist/commands/CursorMarks.d.ts +13 -0
  586. package/dist/commands/CursorMarks.d.ts.map +1 -0
  587. package/dist/commands/GapCursorCommands.d.ts.map +1 -1
  588. package/dist/commands/MarkCommands.d.ts.map +1 -1
  589. package/dist/commands/NodeSelectionCommands.d.ts.map +1 -1
  590. package/dist/commands/PasteCommand.d.ts.map +1 -1
  591. package/dist/commands/SelectionDeletion.d.ts +25 -0
  592. package/dist/commands/SelectionDeletion.d.ts.map +1 -0
  593. package/dist/decorations/Decoration.d.ts +6 -0
  594. package/dist/decorations/Decoration.d.ts.map +1 -1
  595. package/dist/decorations/PositionMapping.d.ts +13 -3
  596. package/dist/decorations/PositionMapping.d.ts.map +1 -1
  597. package/dist/editor/ContentSerializer.d.ts +1 -1
  598. package/dist/editor/ContentSerializer.d.ts.map +1 -1
  599. package/dist/editor/EditorConfig.d.ts +14 -2
  600. package/dist/editor/EditorConfig.d.ts.map +1 -1
  601. package/dist/editor/EditorDOM.d.ts.map +1 -1
  602. package/dist/editor/EditorInitializer.d.ts.map +1 -1
  603. package/dist/editor/NotectlEditor.d.ts +12 -7
  604. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  605. package/dist/editor/PluginBootstrapper.d.ts.map +1 -1
  606. package/dist/editor/styles/base.d.ts +1 -1
  607. package/dist/editor/styles/base.d.ts.map +1 -1
  608. package/dist/editor/styles/table.d.ts +1 -1
  609. package/dist/editor/styles/table.d.ts.map +1 -1
  610. package/dist/editor/styles/toolbar.d.ts +1 -1
  611. package/dist/editor/styles/toolbar.d.ts.map +1 -1
  612. package/dist/fonts.d.ts +11 -0
  613. package/dist/fonts.d.ts.map +1 -1
  614. package/dist/fonts.mjs +1 -1
  615. package/dist/full.d.ts +2 -0
  616. package/dist/full.d.ts.map +1 -1
  617. package/dist/full.mjs +1 -1
  618. package/dist/html.d.ts +1 -1
  619. package/dist/html.d.ts.map +1 -1
  620. package/dist/html.mjs +1 -1
  621. package/dist/index.d.ts +4 -1
  622. package/dist/index.d.ts.map +1 -1
  623. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  624. package/dist/input/HTMLParser.d.ts +3 -0
  625. package/dist/input/HTMLParser.d.ts.map +1 -1
  626. package/dist/input/InputHandler.d.ts +9 -0
  627. package/dist/input/InputHandler.d.ts.map +1 -1
  628. package/dist/input/InputManager.d.ts +2 -0
  629. package/dist/input/InputManager.d.ts.map +1 -1
  630. package/dist/input/KeyboardHandler.d.ts.map +1 -1
  631. package/dist/input/PasteHTMLHandler.d.ts +1 -1
  632. package/dist/input/PasteHTMLHandler.d.ts.map +1 -1
  633. package/dist/input/PasteRichBlockHandler.d.ts +1 -1
  634. package/dist/input/PasteRichBlockHandler.d.ts.map +1 -1
  635. package/dist/input/SelectionDocument.d.ts.map +1 -1
  636. package/dist/model/ContentSlice.d.ts +6 -7
  637. package/dist/model/ContentSlice.d.ts.map +1 -1
  638. package/dist/model/Document.d.ts +34 -0
  639. package/dist/model/Document.d.ts.map +1 -1
  640. package/dist/model/GraphemeUtils.d.ts +8 -2
  641. package/dist/model/GraphemeUtils.d.ts.map +1 -1
  642. package/dist/model/MarkSpec.d.ts +6 -0
  643. package/dist/model/MarkSpec.d.ts.map +1 -1
  644. package/dist/model/NodeResolver.d.ts +18 -0
  645. package/dist/model/NodeResolver.d.ts.map +1 -1
  646. package/dist/model/Schema.d.ts +6 -0
  647. package/dist/model/Schema.d.ts.map +1 -1
  648. package/dist/model/SchemaRegistry.d.ts.map +1 -1
  649. package/dist/model/TextInputInterceptor.d.ts +21 -0
  650. package/dist/model/TextInputInterceptor.d.ts.map +1 -0
  651. package/dist/notectl-core.mjs +1 -1
  652. package/dist/notectl-core.umd.js +1 -1
  653. package/dist/notectl-core.umd.js.map +1 -1
  654. package/dist/plugins/MiddlewareChain.d.ts +11 -0
  655. package/dist/plugins/MiddlewareChain.d.ts.map +1 -1
  656. package/dist/plugins/Plugin.d.ts +7 -0
  657. package/dist/plugins/Plugin.d.ts.map +1 -1
  658. package/dist/plugins/PluginContextFactory.d.ts +6 -0
  659. package/dist/plugins/PluginContextFactory.d.ts.map +1 -1
  660. package/dist/plugins/PluginManager.d.ts +5 -0
  661. package/dist/plugins/PluginManager.d.ts.map +1 -1
  662. package/dist/plugins/RegistrationTracker.d.ts.map +1 -1
  663. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
  664. package/dist/plugins/alignment.mjs +1 -1
  665. package/dist/plugins/bidi-isolation/BidiIsolationPlugin.d.ts.map +1 -1
  666. package/dist/plugins/bidi-isolation.mjs +1 -1
  667. package/dist/plugins/blockquote/BlockquoteKeyboardHandlers.d.ts +1 -1
  668. package/dist/plugins/blockquote/BlockquoteKeyboardHandlers.d.ts.map +1 -1
  669. package/dist/plugins/blockquote/BlockquotePlugin.d.ts +13 -3
  670. package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -1
  671. package/dist/plugins/blockquote/BlockquoteStyles.d.ts +1 -1
  672. package/dist/plugins/blockquote/BlockquoteStyles.d.ts.map +1 -1
  673. package/dist/plugins/blockquote.mjs +1 -1
  674. package/dist/plugins/caret-navigation.mjs +1 -1
  675. package/dist/plugins/code-block/AutoPairController.d.ts +50 -0
  676. package/dist/plugins/code-block/AutoPairController.d.ts.map +1 -0
  677. package/dist/plugins/code-block/BracketPairing.d.ts +49 -0
  678. package/dist/plugins/code-block/BracketPairing.d.ts.map +1 -0
  679. package/dist/plugins/code-block/CodeBlockDecorations.d.ts +16 -0
  680. package/dist/plugins/code-block/CodeBlockDecorations.d.ts.map +1 -0
  681. package/dist/plugins/code-block/CodeBlockHighlighting.d.ts +10 -0
  682. package/dist/plugins/code-block/CodeBlockHighlighting.d.ts.map +1 -0
  683. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts +11 -2
  684. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -1
  685. package/dist/plugins/code-block/CodeBlockLocale.d.ts +4 -0
  686. package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -1
  687. package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -1
  688. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +4 -14
  689. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  690. package/dist/plugins/code-block/CodeBlockSchema.d.ts +11 -0
  691. package/dist/plugins/code-block/CodeBlockSchema.d.ts.map +1 -0
  692. package/dist/plugins/code-block/CodeBlockTypes.d.ts +66 -0
  693. package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
  694. package/dist/plugins/code-block/IndentHelpers.d.ts +71 -0
  695. package/dist/plugins/code-block/IndentHelpers.d.ts.map +1 -0
  696. package/dist/plugins/code-block/PairStack.d.ts +37 -0
  697. package/dist/plugins/code-block/PairStack.d.ts.map +1 -0
  698. package/dist/plugins/code-block/TokenCache.d.ts +21 -0
  699. package/dist/plugins/code-block/TokenCache.d.ts.map +1 -0
  700. package/dist/plugins/code-block/highlighter/RegexTokenizer.d.ts.map +1 -1
  701. package/dist/plugins/code-block/highlighter/TokenIteration.d.ts +18 -0
  702. package/dist/plugins/code-block/highlighter/TokenIteration.d.ts.map +1 -0
  703. package/dist/plugins/code-block/highlighter/languages/index.d.ts +1 -0
  704. package/dist/plugins/code-block/highlighter/languages/index.d.ts.map +1 -1
  705. package/dist/plugins/code-block/highlighter/languages/java.d.ts.map +1 -1
  706. package/dist/plugins/code-block/highlighter/languages/typescript.d.ts +3 -0
  707. package/dist/plugins/code-block/highlighter/languages/typescript.d.ts.map +1 -0
  708. package/dist/plugins/code-block/index.d.ts +1 -0
  709. package/dist/plugins/code-block/index.d.ts.map +1 -1
  710. package/dist/plugins/code-block/locales/ar.d.ts.map +1 -1
  711. package/dist/plugins/code-block/locales/de.d.ts.map +1 -1
  712. package/dist/plugins/code-block/locales/es.d.ts.map +1 -1
  713. package/dist/plugins/code-block/locales/fr.d.ts.map +1 -1
  714. package/dist/plugins/code-block/locales/hi.d.ts.map +1 -1
  715. package/dist/plugins/code-block/locales/pt.d.ts.map +1 -1
  716. package/dist/plugins/code-block/locales/ru.d.ts.map +1 -1
  717. package/dist/plugins/code-block/locales/zh.d.ts.map +1 -1
  718. package/dist/plugins/code-block.mjs +1 -1
  719. package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
  720. package/dist/plugins/font-size/FontSizeOperations.d.ts +7 -3
  721. package/dist/plugins/font-size/FontSizeOperations.d.ts.map +1 -1
  722. package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
  723. package/dist/plugins/font-size.mjs +1 -1
  724. package/dist/plugins/font.mjs +1 -1
  725. package/dist/plugins/formula/DisplayMathNodeSpec.d.ts +5 -0
  726. package/dist/plugins/formula/DisplayMathNodeSpec.d.ts.map +1 -0
  727. package/dist/plugins/formula/DisplayMathNodeView.d.ts +12 -0
  728. package/dist/plugins/formula/DisplayMathNodeView.d.ts.map +1 -0
  729. package/dist/plugins/formula/FormulaCommands.d.ts +35 -0
  730. package/dist/plugins/formula/FormulaCommands.d.ts.map +1 -0
  731. package/dist/plugins/formula/FormulaEditTrigger.d.ts +12 -0
  732. package/dist/plugins/formula/FormulaEditTrigger.d.ts.map +1 -0
  733. package/dist/plugins/formula/FormulaEditorMount.d.ts +19 -0
  734. package/dist/plugins/formula/FormulaEditorMount.d.ts.map +1 -0
  735. package/dist/plugins/formula/FormulaInputRules.d.ts +4 -0
  736. package/dist/plugins/formula/FormulaInputRules.d.ts.map +1 -0
  737. package/dist/plugins/formula/FormulaLocale.d.ts +45 -0
  738. package/dist/plugins/formula/FormulaLocale.d.ts.map +1 -0
  739. package/dist/plugins/formula/FormulaOverlay.d.ts +38 -0
  740. package/dist/plugins/formula/FormulaOverlay.d.ts.map +1 -0
  741. package/dist/plugins/formula/FormulaPasteInterceptor.d.ts +10 -0
  742. package/dist/plugins/formula/FormulaPasteInterceptor.d.ts.map +1 -0
  743. package/dist/plugins/formula/FormulaPlugin.d.ts +22 -0
  744. package/dist/plugins/formula/FormulaPlugin.d.ts.map +1 -0
  745. package/dist/plugins/formula/FormulaRendering.d.ts +18 -0
  746. package/dist/plugins/formula/FormulaRendering.d.ts.map +1 -0
  747. package/dist/plugins/formula/FormulaStyles.d.ts +12 -0
  748. package/dist/plugins/formula/FormulaStyles.d.ts.map +1 -0
  749. package/dist/plugins/formula/FormulaToolbar.d.ts +5 -0
  750. package/dist/plugins/formula/FormulaToolbar.d.ts.map +1 -0
  751. package/dist/plugins/formula/FormulaTypes.d.ts +64 -0
  752. package/dist/plugins/formula/FormulaTypes.d.ts.map +1 -0
  753. package/dist/plugins/formula/InlineMathNodeSpec.d.ts +5 -0
  754. package/dist/plugins/formula/InlineMathNodeSpec.d.ts.map +1 -0
  755. package/dist/plugins/formula/MathFont.d.ts +4 -0
  756. package/dist/plugins/formula/MathFont.d.ts.map +1 -0
  757. package/dist/plugins/formula/MathFontFace.d.ts +4 -0
  758. package/dist/plugins/formula/MathFontFace.d.ts.map +1 -0
  759. package/dist/plugins/formula/index.d.ts +14 -0
  760. package/dist/plugins/formula/index.d.ts.map +1 -0
  761. package/dist/plugins/formula/latex/LatexParser.d.ts +8 -0
  762. package/dist/plugins/formula/latex/LatexParser.d.ts.map +1 -0
  763. package/dist/plugins/formula/latex/LatexParserTypes.d.ts +61 -0
  764. package/dist/plugins/formula/latex/LatexParserTypes.d.ts.map +1 -0
  765. package/dist/plugins/formula/latex/LatexSymbols.d.ts +87 -0
  766. package/dist/plugins/formula/latex/LatexSymbols.d.ts.map +1 -0
  767. package/dist/plugins/formula/latex/LatexToMathML.d.ts +33 -0
  768. package/dist/plugins/formula/latex/LatexToMathML.d.ts.map +1 -0
  769. package/dist/plugins/formula/latex/LatexTokenizer.d.ts +45 -0
  770. package/dist/plugins/formula/latex/LatexTokenizer.d.ts.map +1 -0
  771. package/dist/plugins/formula/latex/MathAlphabet.d.ts +42 -0
  772. package/dist/plugins/formula/latex/MathAlphabet.d.ts.map +1 -0
  773. package/dist/plugins/formula/latex/handlers/Accents.d.ts +6 -0
  774. package/dist/plugins/formula/latex/handlers/Accents.d.ts.map +1 -0
  775. package/dist/plugins/formula/latex/handlers/Delimiters.d.ts +12 -0
  776. package/dist/plugins/formula/latex/handlers/Delimiters.d.ts.map +1 -0
  777. package/dist/plugins/formula/latex/handlers/Environments.d.ts +9 -0
  778. package/dist/plugins/formula/latex/handlers/Environments.d.ts.map +1 -0
  779. package/dist/plugins/formula/latex/handlers/Fonts.d.ts +6 -0
  780. package/dist/plugins/formula/latex/handlers/Fonts.d.ts.map +1 -0
  781. package/dist/plugins/formula/latex/handlers/Spacing.d.ts +13 -0
  782. package/dist/plugins/formula/latex/handlers/Spacing.d.ts.map +1 -0
  783. package/dist/plugins/formula/latex/handlers/Structures.d.ts +19 -0
  784. package/dist/plugins/formula/latex/handlers/Structures.d.ts.map +1 -0
  785. package/dist/plugins/formula/latex/index.d.ts +11 -0
  786. package/dist/plugins/formula/latex/index.d.ts.map +1 -0
  787. package/dist/plugins/formula/locales/ar.d.ts +4 -0
  788. package/dist/plugins/formula/locales/ar.d.ts.map +1 -0
  789. package/dist/plugins/formula/locales/de.d.ts +4 -0
  790. package/dist/plugins/formula/locales/de.d.ts.map +1 -0
  791. package/dist/plugins/formula/locales/es.d.ts +4 -0
  792. package/dist/plugins/formula/locales/es.d.ts.map +1 -0
  793. package/dist/plugins/formula/locales/fr.d.ts +4 -0
  794. package/dist/plugins/formula/locales/fr.d.ts.map +1 -0
  795. package/dist/plugins/formula/locales/hi.d.ts +4 -0
  796. package/dist/plugins/formula/locales/hi.d.ts.map +1 -0
  797. package/dist/plugins/formula/locales/pt.d.ts +4 -0
  798. package/dist/plugins/formula/locales/pt.d.ts.map +1 -0
  799. package/dist/plugins/formula/locales/ru.d.ts +4 -0
  800. package/dist/plugins/formula/locales/ru.d.ts.map +1 -0
  801. package/dist/plugins/formula/locales/zh.d.ts +4 -0
  802. package/dist/plugins/formula/locales/zh.d.ts.map +1 -0
  803. package/dist/plugins/formula/math-field/MathField.d.ts +45 -0
  804. package/dist/plugins/formula/math-field/MathField.d.ts.map +1 -0
  805. package/dist/plugins/formula/math-field/MathFieldTypes.d.ts +73 -0
  806. package/dist/plugins/formula/math-field/MathFieldTypes.d.ts.map +1 -0
  807. package/dist/plugins/formula/math-field/MathPalette.d.ts +16 -0
  808. package/dist/plugins/formula/math-field/MathPalette.d.ts.map +1 -0
  809. package/dist/plugins/formula/math-field/MathPaletteData.d.ts +15 -0
  810. package/dist/plugins/formula/math-field/MathPaletteData.d.ts.map +1 -0
  811. package/dist/plugins/formula/math-field/index.d.ts +9 -0
  812. package/dist/plugins/formula/math-field/index.d.ts.map +1 -0
  813. package/dist/plugins/formula/mathml/MathMLBuilder.d.ts +58 -0
  814. package/dist/plugins/formula/mathml/MathMLBuilder.d.ts.map +1 -0
  815. package/dist/plugins/formula/mathml/MathMLDocument.d.ts +54 -0
  816. package/dist/plugins/formula/mathml/MathMLDocument.d.ts.map +1 -0
  817. package/dist/plugins/formula/mathml/MathMLSanitize.d.ts +15 -0
  818. package/dist/plugins/formula/mathml/MathMLSanitize.d.ts.map +1 -0
  819. package/dist/plugins/formula/mathml/index.d.ts +8 -0
  820. package/dist/plugins/formula/mathml/index.d.ts.map +1 -0
  821. package/dist/plugins/formula.mjs +1 -0
  822. package/dist/plugins/gap-cursor.mjs +1 -1
  823. package/dist/plugins/hard-break.mjs +1 -1
  824. package/dist/plugins/heading.mjs +1 -1
  825. package/dist/plugins/highlight/HighlightPalette.d.ts +7 -0
  826. package/dist/plugins/highlight/HighlightPalette.d.ts.map +1 -0
  827. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  828. package/dist/plugins/highlight.mjs +1 -1
  829. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
  830. package/dist/plugins/horizontal-rule.mjs +1 -1
  831. package/dist/plugins/image/ImageCommands.d.ts.map +1 -1
  832. package/dist/plugins/image/ImageNodeView.d.ts.map +1 -1
  833. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
  834. package/dist/plugins/image/ImagePopup.d.ts.map +1 -1
  835. package/dist/plugins/image/ImagePopupStyles.d.ts +3 -0
  836. package/dist/plugins/image/ImagePopupStyles.d.ts.map +1 -0
  837. package/dist/plugins/image.mjs +1 -1
  838. package/dist/plugins/inline-code/InlineCodePlugin.d.ts +1 -4
  839. package/dist/plugins/inline-code/InlineCodePlugin.d.ts.map +1 -1
  840. package/dist/plugins/inline-code.mjs +1 -1
  841. package/dist/plugins/language/bundles/JavaSupport.d.ts.map +1 -1
  842. package/dist/plugins/language/bundles/TypeScriptSupport.d.ts +3 -0
  843. package/dist/plugins/language/bundles/TypeScriptSupport.d.ts.map +1 -0
  844. package/dist/plugins/language/bundles/index.d.ts +1 -0
  845. package/dist/plugins/language/bundles/index.d.ts.map +1 -1
  846. package/dist/plugins/language/index.d.ts +1 -1
  847. package/dist/plugins/language/index.d.ts.map +1 -1
  848. package/dist/plugins/language.mjs +1 -1
  849. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  850. package/dist/plugins/link.mjs +1 -1
  851. package/dist/plugins/list.mjs +1 -1
  852. package/dist/plugins/print.mjs +1 -1
  853. package/dist/plugins/shared/InlineStyleMarkSpec.d.ts +22 -0
  854. package/dist/plugins/shared/InlineStyleMarkSpec.d.ts.map +1 -0
  855. package/dist/plugins/shared/NodeSpecPatching.d.ts +16 -0
  856. package/dist/plugins/shared/NodeSpecPatching.d.ts.map +1 -0
  857. package/dist/plugins/shared/PluginHelpers.d.ts +8 -0
  858. package/dist/plugins/shared/PluginHelpers.d.ts.map +1 -1
  859. package/dist/plugins/shared/PopupManager.d.ts.map +1 -1
  860. package/dist/plugins/shared/PopupPositioning.d.ts +20 -0
  861. package/dist/plugins/shared/PopupPositioning.d.ts.map +1 -1
  862. package/dist/plugins/shared/SimpleMark.d.ts +22 -0
  863. package/dist/plugins/shared/SimpleMark.d.ts.map +1 -0
  864. package/dist/plugins/shared.mjs +1 -1
  865. package/dist/plugins/smart-paste/detectors/DetectionScorer.d.ts +17 -0
  866. package/dist/plugins/smart-paste/detectors/DetectionScorer.d.ts.map +1 -0
  867. package/dist/plugins/smart-paste/detectors/LexerDetector.d.ts +36 -0
  868. package/dist/plugins/smart-paste/detectors/LexerDetector.d.ts.map +1 -0
  869. package/dist/plugins/smart-paste/detectors/TokenStats.d.ts +44 -0
  870. package/dist/plugins/smart-paste/detectors/TokenStats.d.ts.map +1 -0
  871. package/dist/plugins/smart-paste/index.d.ts +3 -1
  872. package/dist/plugins/smart-paste/index.d.ts.map +1 -1
  873. package/dist/plugins/smart-paste.mjs +1 -1
  874. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts +0 -4
  875. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -1
  876. package/dist/plugins/strikethrough.mjs +1 -1
  877. package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -1
  878. package/dist/plugins/super-sub.mjs +1 -1
  879. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  880. package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
  881. package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
  882. package/dist/plugins/table.mjs +1 -1
  883. package/dist/plugins/text-color/TextColorPalette.d.ts +6 -0
  884. package/dist/plugins/text-color/TextColorPalette.d.ts.map +1 -0
  885. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  886. package/dist/plugins/text-color.mjs +1 -1
  887. package/dist/plugins/text-direction/TextDirectionPlugin.d.ts.map +1 -1
  888. package/dist/plugins/text-direction-auto.mjs +1 -1
  889. package/dist/plugins/text-direction.mjs +1 -1
  890. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -1
  891. package/dist/plugins/text-formatting.mjs +1 -1
  892. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts +14 -1
  893. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -1
  894. package/dist/plugins/toolbar/ToolbarPlugin.d.ts +13 -1
  895. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
  896. package/dist/plugins/toolbar/ToolbarRenderers.d.ts.map +1 -1
  897. package/dist/plugins/toolbar/index.d.ts +1 -1
  898. package/dist/plugins/toolbar/index.d.ts.map +1 -1
  899. package/dist/plugins/toolbar.mjs +1 -1
  900. package/dist/plugins/video/VideoCommands.d.ts +62 -0
  901. package/dist/plugins/video/VideoCommands.d.ts.map +1 -0
  902. package/dist/plugins/video/VideoEditOverlay.d.ts +30 -0
  903. package/dist/plugins/video/VideoEditOverlay.d.ts.map +1 -0
  904. package/dist/plugins/video/VideoEmbedPrompt.d.ts +18 -0
  905. package/dist/plugins/video/VideoEmbedPrompt.d.ts.map +1 -0
  906. package/dist/plugins/video/VideoFacade.d.ts +46 -0
  907. package/dist/plugins/video/VideoFacade.d.ts.map +1 -0
  908. package/dist/plugins/video/VideoLocale.d.ts +53 -0
  909. package/dist/plugins/video/VideoLocale.d.ts.map +1 -0
  910. package/dist/plugins/video/VideoNodeSpec.d.ts +24 -0
  911. package/dist/plugins/video/VideoNodeSpec.d.ts.map +1 -0
  912. package/dist/plugins/video/VideoNodeView.d.ts +16 -0
  913. package/dist/plugins/video/VideoNodeView.d.ts.map +1 -0
  914. package/dist/plugins/video/VideoPasteInterceptor.d.ts +9 -0
  915. package/dist/plugins/video/VideoPasteInterceptor.d.ts.map +1 -0
  916. package/dist/plugins/video/VideoPlugin.d.ts +31 -0
  917. package/dist/plugins/video/VideoPlugin.d.ts.map +1 -0
  918. package/dist/plugins/video/VideoPopup.d.ts +28 -0
  919. package/dist/plugins/video/VideoPopup.d.ts.map +1 -0
  920. package/dist/plugins/video/VideoPopupStyles.d.ts +3 -0
  921. package/dist/plugins/video/VideoPopupStyles.d.ts.map +1 -0
  922. package/dist/plugins/video/VideoProviders.d.ts +98 -0
  923. package/dist/plugins/video/VideoProviders.d.ts.map +1 -0
  924. package/dist/plugins/video/VideoResize.d.ts +35 -0
  925. package/dist/plugins/video/VideoResize.d.ts.map +1 -0
  926. package/dist/plugins/video/VideoSanitizeHook.d.ts +23 -0
  927. package/dist/plugins/video/VideoSanitizeHook.d.ts.map +1 -0
  928. package/dist/plugins/video/VideoSelectionToolbar.d.ts +20 -0
  929. package/dist/plugins/video/VideoSelectionToolbar.d.ts.map +1 -0
  930. package/dist/plugins/video/VideoStyles.d.ts +3 -0
  931. package/dist/plugins/video/VideoStyles.d.ts.map +1 -0
  932. package/dist/plugins/video/VideoTypes.d.ts +102 -0
  933. package/dist/plugins/video/VideoTypes.d.ts.map +1 -0
  934. package/dist/plugins/video/VideoViewHelpers.d.ts +13 -0
  935. package/dist/plugins/video/VideoViewHelpers.d.ts.map +1 -0
  936. package/dist/plugins/video/index.d.ts +6 -0
  937. package/dist/plugins/video/index.d.ts.map +1 -0
  938. package/dist/plugins/video/locales/ar.d.ts +4 -0
  939. package/dist/plugins/video/locales/ar.d.ts.map +1 -0
  940. package/dist/plugins/video/locales/de.d.ts +4 -0
  941. package/dist/plugins/video/locales/de.d.ts.map +1 -0
  942. package/dist/plugins/video/locales/es.d.ts +4 -0
  943. package/dist/plugins/video/locales/es.d.ts.map +1 -0
  944. package/dist/plugins/video/locales/fr.d.ts +4 -0
  945. package/dist/plugins/video/locales/fr.d.ts.map +1 -0
  946. package/dist/plugins/video/locales/hi.d.ts +4 -0
  947. package/dist/plugins/video/locales/hi.d.ts.map +1 -0
  948. package/dist/plugins/video/locales/pt.d.ts +4 -0
  949. package/dist/plugins/video/locales/pt.d.ts.map +1 -0
  950. package/dist/plugins/video/locales/ru.d.ts +4 -0
  951. package/dist/plugins/video/locales/ru.d.ts.map +1 -0
  952. package/dist/plugins/video/locales/zh.d.ts +4 -0
  953. package/dist/plugins/video/locales/zh.d.ts.map +1 -0
  954. package/dist/plugins/video.mjs +1 -0
  955. package/dist/presets/FullPreset.d.ts +1 -1
  956. package/dist/presets/FullPreset.d.ts.map +1 -1
  957. package/dist/presets/PresetTypes.d.ts +4 -0
  958. package/dist/presets/PresetTypes.d.ts.map +1 -1
  959. package/dist/presets/full.mjs +1 -1
  960. package/dist/presets/minimal.mjs +1 -1
  961. package/dist/presets.mjs +1 -1
  962. package/dist/serialization/CSSClassCollector.d.ts.map +1 -1
  963. package/dist/serialization/ContentHTMLTypes.d.ts +19 -1
  964. package/dist/serialization/ContentHTMLTypes.d.ts.map +1 -1
  965. package/dist/serialization/DocumentParser.d.ts.map +1 -1
  966. package/dist/serialization/DocumentSerializer.d.ts +3 -3
  967. package/dist/serialization/DocumentSerializer.d.ts.map +1 -1
  968. package/dist/serialization/HTMLWhitespace.d.ts +22 -0
  969. package/dist/serialization/HTMLWhitespace.d.ts.map +1 -0
  970. package/dist/serialization/MarkSerializer.d.ts.map +1 -1
  971. package/dist/serialization/index.d.ts +1 -1
  972. package/dist/serialization/index.d.ts.map +1 -1
  973. package/dist/state/BlockTreeOps.d.ts +8 -1
  974. package/dist/state/BlockTreeOps.d.ts.map +1 -1
  975. package/dist/state/EditorState.d.ts.map +1 -1
  976. package/dist/state/History.d.ts +20 -0
  977. package/dist/state/History.d.ts.map +1 -1
  978. package/dist/state/InlineContentOps.d.ts +30 -0
  979. package/dist/state/InlineContentOps.d.ts.map +1 -1
  980. package/dist/state/Mapping.d.ts +261 -0
  981. package/dist/state/Mapping.d.ts.map +1 -0
  982. package/dist/state/NavigationQueries.d.ts +11 -0
  983. package/dist/state/NavigationQueries.d.ts.map +1 -1
  984. package/dist/state/SelectionMapping.d.ts +25 -0
  985. package/dist/state/SelectionMapping.d.ts.map +1 -0
  986. package/dist/state/StepApplication.d.ts +20 -3
  987. package/dist/state/StepApplication.d.ts.map +1 -1
  988. package/dist/state/StepHandlers.d.ts +68 -0
  989. package/dist/state/StepHandlers.d.ts.map +1 -0
  990. package/dist/state/StepInversion.d.ts +22 -5
  991. package/dist/state/StepInversion.d.ts.map +1 -1
  992. package/dist/state/StepMapping.d.ts +18 -0
  993. package/dist/state/StepMapping.d.ts.map +1 -0
  994. package/dist/state/StepMaps.d.ts +25 -0
  995. package/dist/state/StepMaps.d.ts.map +1 -0
  996. package/dist/state/Steps.d.ts +38 -0
  997. package/dist/state/Steps.d.ts.map +1 -1
  998. package/dist/state/Transaction.d.ts +25 -1
  999. package/dist/state/Transaction.d.ts.map +1 -1
  1000. package/dist/state/TransactionBuilder.d.ts +51 -7
  1001. package/dist/state/TransactionBuilder.d.ts.map +1 -1
  1002. package/dist/test/TestUtils.d.ts +3 -1
  1003. package/dist/test/TestUtils.d.ts.map +1 -1
  1004. package/dist/view/CaretNavigation.d.ts.map +1 -1
  1005. package/dist/view/EditorView.d.ts.map +1 -1
  1006. package/dist/view/SelectionSync.d.ts.map +1 -1
  1007. package/dist/view/ViewMovementCommands.d.ts.map +1 -1
  1008. package/package.json +16 -1
  1009. package/dist/chunks/AlignmentPlugin-bqK6ze-E.mjs +0 -2
  1010. package/dist/chunks/AlignmentPlugin-bqK6ze-E.mjs.map +0 -1
  1011. package/dist/chunks/AttrRegistry-nDKtHK87.mjs +0 -2
  1012. package/dist/chunks/AttrRegistry-nDKtHK87.mjs.map +0 -1
  1013. package/dist/chunks/AttributedMarkCommands-35jTbVRg.mjs +0 -2
  1014. package/dist/chunks/AttributedMarkCommands-35jTbVRg.mjs.map +0 -1
  1015. package/dist/chunks/BidiIsolationPlugin-SIKxfWXp.mjs +0 -2
  1016. package/dist/chunks/BidiIsolationPlugin-SIKxfWXp.mjs.map +0 -1
  1017. package/dist/chunks/BlockInsertion-DsnHLcvM.mjs +0 -2
  1018. package/dist/chunks/BlockInsertion-DsnHLcvM.mjs.map +0 -1
  1019. package/dist/chunks/BlockTypePickerRegistry-C_jLddOz.mjs +0 -2
  1020. package/dist/chunks/BlockTypePickerRegistry-C_jLddOz.mjs.map +0 -1
  1021. package/dist/chunks/BlockquotePlugin-BEaZSoVT.mjs +0 -2
  1022. package/dist/chunks/BlockquotePlugin-BEaZSoVT.mjs.map +0 -1
  1023. package/dist/chunks/CaretNavigationPlugin-DHl61oc6.mjs +0 -2
  1024. package/dist/chunks/CaretNavigationPlugin-DHl61oc6.mjs.map +0 -1
  1025. package/dist/chunks/CodeBlockPlugin-DglqiSNK.mjs +0 -2
  1026. package/dist/chunks/CodeBlockPlugin-DglqiSNK.mjs.map +0 -1
  1027. package/dist/chunks/ColorGrid-Czm0p2E9.mjs +0 -2
  1028. package/dist/chunks/ColorGrid-Czm0p2E9.mjs.map +0 -1
  1029. package/dist/chunks/ColorPickerPopup-CL-W380M.mjs +0 -2
  1030. package/dist/chunks/ColorPickerPopup-CL-W380M.mjs.map +0 -1
  1031. package/dist/chunks/ColorValidation-CiGxVsqd.mjs +0 -2
  1032. package/dist/chunks/ColorValidation-CiGxVsqd.mjs.map +0 -1
  1033. package/dist/chunks/CommandHelpers-DTlQcGv5.mjs +0 -2
  1034. package/dist/chunks/CommandHelpers-DTlQcGv5.mjs.map +0 -1
  1035. package/dist/chunks/Commands-BuYF23lf.mjs +0 -2
  1036. package/dist/chunks/Commands-BuYF23lf.mjs.map +0 -1
  1037. package/dist/chunks/Decoration-oeHDjWWq.mjs +0 -2
  1038. package/dist/chunks/Decoration-oeHDjWWq.mjs.map +0 -1
  1039. package/dist/chunks/DirectionDetection-Hun6-7ER.mjs +0 -2
  1040. package/dist/chunks/DirectionDetection-Hun6-7ER.mjs.map +0 -1
  1041. package/dist/chunks/DirectionIcons-CfaDcQ9a.mjs +0 -2
  1042. package/dist/chunks/DirectionIcons-CfaDcQ9a.mjs.map +0 -1
  1043. package/dist/chunks/Document-_qdGR4vh.mjs +0 -2
  1044. package/dist/chunks/Document-_qdGR4vh.mjs.map +0 -1
  1045. package/dist/chunks/DocumentParser-CyATBOz-.mjs +0 -2
  1046. package/dist/chunks/DocumentParser-CyATBOz-.mjs.map +0 -1
  1047. package/dist/chunks/FontPlugin-B-Sxa0UW.mjs +0 -2
  1048. package/dist/chunks/FontPlugin-B-Sxa0UW.mjs.map +0 -1
  1049. package/dist/chunks/FontSizePlugin-C1zlyXL2.mjs +0 -2
  1050. package/dist/chunks/FontSizePlugin-C1zlyXL2.mjs.map +0 -1
  1051. package/dist/chunks/GapCursorNavigation-BaXDnjFf.mjs +0 -2
  1052. package/dist/chunks/GapCursorNavigation-BaXDnjFf.mjs.map +0 -1
  1053. package/dist/chunks/GapCursorPlugin-nldun8cE.mjs +0 -2
  1054. package/dist/chunks/GapCursorPlugin-nldun8cE.mjs.map +0 -1
  1055. package/dist/chunks/HardBreakPlugin-DZRdsE15.mjs +0 -2
  1056. package/dist/chunks/HardBreakPlugin-DZRdsE15.mjs.map +0 -1
  1057. package/dist/chunks/HeadingPlugin-EPAmsEGt.mjs +0 -2
  1058. package/dist/chunks/HeadingPlugin-EPAmsEGt.mjs.map +0 -1
  1059. package/dist/chunks/HighlightPlugin-RN3l6pVJ.mjs +0 -2
  1060. package/dist/chunks/HighlightPlugin-RN3l6pVJ.mjs.map +0 -1
  1061. package/dist/chunks/HorizontalRulePlugin-BJPXzTtJ.mjs +0 -2
  1062. package/dist/chunks/HorizontalRulePlugin-BJPXzTtJ.mjs.map +0 -1
  1063. package/dist/chunks/ImagePlugin-CCEevNfJ.mjs +0 -2
  1064. package/dist/chunks/ImagePlugin-CCEevNfJ.mjs.map +0 -1
  1065. package/dist/chunks/InlineCodePlugin-B7IOgUSI.mjs +0 -2
  1066. package/dist/chunks/InlineCodePlugin-B7IOgUSI.mjs.map +0 -1
  1067. package/dist/chunks/KeyboardNav-CsdlWnNl.mjs +0 -2
  1068. package/dist/chunks/KeyboardNav-CsdlWnNl.mjs.map +0 -1
  1069. package/dist/chunks/LinkPlugin-Bhwg24lH.mjs +0 -2
  1070. package/dist/chunks/LinkPlugin-Bhwg24lH.mjs.map +0 -1
  1071. package/dist/chunks/ListPlugin-BkG6UO4x.mjs +0 -2
  1072. package/dist/chunks/ListPlugin-BkG6UO4x.mjs.map +0 -1
  1073. package/dist/chunks/NavigationQueries-CgYPG6oY.mjs +0 -2
  1074. package/dist/chunks/NavigationQueries-CgYPG6oY.mjs.map +0 -1
  1075. package/dist/chunks/NodeResolver-DVPpO5nC.mjs +0 -2
  1076. package/dist/chunks/NodeResolver-DVPpO5nC.mjs.map +0 -1
  1077. package/dist/chunks/NodeSelectionCommands-Ddxu5Qck.mjs +0 -2
  1078. package/dist/chunks/NodeSelectionCommands-Ddxu5Qck.mjs.map +0 -1
  1079. package/dist/chunks/Platform-D9TRT4Mn.mjs +0 -2
  1080. package/dist/chunks/Platform-D9TRT4Mn.mjs.map +0 -1
  1081. package/dist/chunks/PluginHelpers-D-MvWR98.mjs +0 -2
  1082. package/dist/chunks/PluginHelpers-D-MvWR98.mjs.map +0 -1
  1083. package/dist/chunks/PopupKeyboardPatterns-DQdL7RHx.mjs +0 -2
  1084. package/dist/chunks/PopupKeyboardPatterns-DQdL7RHx.mjs.map +0 -1
  1085. package/dist/chunks/PopupManager-CxPzNm-P.mjs +0 -2
  1086. package/dist/chunks/PopupManager-CxPzNm-P.mjs.map +0 -1
  1087. package/dist/chunks/PopupPositioning-DRNwWB0U.mjs +0 -2
  1088. package/dist/chunks/PopupPositioning-DRNwWB0U.mjs.map +0 -1
  1089. package/dist/chunks/PrintPlugin-DOk5IZRO.mjs +0 -2
  1090. package/dist/chunks/PrintPlugin-DOk5IZRO.mjs.map +0 -1
  1091. package/dist/chunks/PrintTypes-Drk6kLcl.mjs +0 -2
  1092. package/dist/chunks/PrintTypes-Drk6kLcl.mjs.map +0 -1
  1093. package/dist/chunks/RangeIterator-DytL1lUT.mjs +0 -2
  1094. package/dist/chunks/RangeIterator-DytL1lUT.mjs.map +0 -1
  1095. package/dist/chunks/ShortcutFormatting-DE6B8iGs.mjs +0 -2
  1096. package/dist/chunks/ShortcutFormatting-DE6B8iGs.mjs.map +0 -1
  1097. package/dist/chunks/SmartPastePlugin-DqKx94sH.mjs +0 -2
  1098. package/dist/chunks/SmartPastePlugin-DqKx94sH.mjs.map +0 -1
  1099. package/dist/chunks/StrikethroughPlugin-vYNzfxdy.mjs +0 -2
  1100. package/dist/chunks/StrikethroughPlugin-vYNzfxdy.mjs.map +0 -1
  1101. package/dist/chunks/StyleRuntime-D3d1XFFe.mjs +0 -2
  1102. package/dist/chunks/StyleRuntime-D3d1XFFe.mjs.map +0 -1
  1103. package/dist/chunks/SuperSubPlugin-BNsoXWHS.mjs +0 -2
  1104. package/dist/chunks/SuperSubPlugin-BNsoXWHS.mjs.map +0 -1
  1105. package/dist/chunks/SyntaxTokenTypes-CVUAMov0.mjs +0 -2
  1106. package/dist/chunks/SyntaxTokenTypes-CVUAMov0.mjs.map +0 -1
  1107. package/dist/chunks/TablePlugin-R-hmydrM.mjs +0 -2
  1108. package/dist/chunks/TablePlugin-R-hmydrM.mjs.map +0 -1
  1109. package/dist/chunks/TextColorPlugin-DQ-CB9cr.mjs +0 -2
  1110. package/dist/chunks/TextColorPlugin-DQ-CB9cr.mjs.map +0 -1
  1111. package/dist/chunks/TextDirectionAutoPlugin-kZ1tcu0d.mjs +0 -2
  1112. package/dist/chunks/TextDirectionAutoPlugin-kZ1tcu0d.mjs.map +0 -1
  1113. package/dist/chunks/TextDirectionPlugin-Bk3CkbYh.mjs +0 -2
  1114. package/dist/chunks/TextDirectionPlugin-Bk3CkbYh.mjs.map +0 -1
  1115. package/dist/chunks/TextDirectionService-DY4M8EwU.mjs +0 -2
  1116. package/dist/chunks/TextDirectionService-DY4M8EwU.mjs.map +0 -1
  1117. package/dist/chunks/TextFormattingPlugin-D13eP6nF.mjs +0 -2
  1118. package/dist/chunks/TextFormattingPlugin-D13eP6nF.mjs.map +0 -1
  1119. package/dist/chunks/ToolbarPlugin-DeH8n5d2.mjs +0 -2
  1120. package/dist/chunks/ToolbarPlugin-DeH8n5d2.mjs.map +0 -1
  1121. package/dist/chunks/TypedKeys-CU7aToqY.mjs +0 -2
  1122. package/dist/chunks/TypedKeys-CU7aToqY.mjs.map +0 -1
  1123. package/dist/chunks/WordBoundary-BE2u997Q.mjs +0 -2
  1124. package/dist/chunks/WordBoundary-BE2u997Q.mjs.map +0 -1
  1125. package/dist/chunks/XmlDetector-BtYxzBDa.mjs +0 -2
  1126. package/dist/chunks/XmlDetector-BtYxzBDa.mjs.map +0 -1
  1127. package/dist/chunks/XmlPatterns-DuP8GWVt.mjs +0 -2
  1128. package/dist/chunks/XmlPatterns-DuP8GWVt.mjs.map +0 -1
  1129. package/dist/chunks/XmlSupport-D54BdAJZ.mjs +0 -2
  1130. package/dist/chunks/XmlSupport-D54BdAJZ.mjs.map +0 -1
  1131. package/dist/chunks/ar-2Fkz_6nI.mjs +0 -2
  1132. package/dist/chunks/ar-2Fkz_6nI.mjs.map +0 -1
  1133. package/dist/chunks/ar-4ZPC8daa.mjs +0 -2
  1134. package/dist/chunks/ar-4ZPC8daa.mjs.map +0 -1
  1135. package/dist/chunks/ar-6I20_Djq.mjs +0 -2
  1136. package/dist/chunks/ar-6I20_Djq.mjs.map +0 -1
  1137. package/dist/chunks/ar-B7-Dm70S.mjs +0 -2
  1138. package/dist/chunks/ar-B7-Dm70S.mjs.map +0 -1
  1139. package/dist/chunks/ar-BRe0t96G.mjs +0 -2
  1140. package/dist/chunks/ar-BRe0t96G.mjs.map +0 -1
  1141. package/dist/chunks/ar-BnNyrtdi.mjs +0 -2
  1142. package/dist/chunks/ar-BnNyrtdi.mjs.map +0 -1
  1143. package/dist/chunks/ar-BsMfhWs5.mjs +0 -2
  1144. package/dist/chunks/ar-BsMfhWs5.mjs.map +0 -1
  1145. package/dist/chunks/ar-Bvja-bjE.mjs +0 -2
  1146. package/dist/chunks/ar-Bvja-bjE.mjs.map +0 -1
  1147. package/dist/chunks/ar-BxVbBvSa.mjs +0 -2
  1148. package/dist/chunks/ar-BxVbBvSa.mjs.map +0 -1
  1149. package/dist/chunks/ar-C5dW-co3.mjs +0 -2
  1150. package/dist/chunks/ar-C5dW-co3.mjs.map +0 -1
  1151. package/dist/chunks/ar-CARMr30L.mjs +0 -2
  1152. package/dist/chunks/ar-CARMr30L.mjs.map +0 -1
  1153. package/dist/chunks/ar-CB-pehGw.mjs +0 -2
  1154. package/dist/chunks/ar-CB-pehGw.mjs.map +0 -1
  1155. package/dist/chunks/ar-CEYgAxTM.mjs +0 -2
  1156. package/dist/chunks/ar-CEYgAxTM.mjs.map +0 -1
  1157. package/dist/chunks/ar-CO60qpZJ.mjs +0 -2
  1158. package/dist/chunks/ar-CO60qpZJ.mjs.map +0 -1
  1159. package/dist/chunks/ar-CtI_snUM.mjs +0 -2
  1160. package/dist/chunks/ar-CtI_snUM.mjs.map +0 -1
  1161. package/dist/chunks/ar-Cv1RQvhK.mjs +0 -2
  1162. package/dist/chunks/ar-Cv1RQvhK.mjs.map +0 -1
  1163. package/dist/chunks/ar-D5jV20Tu.mjs +0 -2
  1164. package/dist/chunks/ar-D5jV20Tu.mjs.map +0 -1
  1165. package/dist/chunks/ar-DJN9fQ7Z.mjs +0 -2
  1166. package/dist/chunks/ar-DJN9fQ7Z.mjs.map +0 -1
  1167. package/dist/chunks/ar-DPTsUnwA.mjs +0 -2
  1168. package/dist/chunks/ar-DPTsUnwA.mjs.map +0 -1
  1169. package/dist/chunks/ar-DZJIBD1Q.mjs +0 -2
  1170. package/dist/chunks/ar-DZJIBD1Q.mjs.map +0 -1
  1171. package/dist/chunks/ar-DkkbwV93.mjs +0 -2
  1172. package/dist/chunks/ar-DkkbwV93.mjs.map +0 -1
  1173. package/dist/chunks/ar-DmeMor8Y.mjs +0 -2
  1174. package/dist/chunks/ar-DmeMor8Y.mjs.map +0 -1
  1175. package/dist/chunks/ar-LnE7jPai.mjs +0 -2
  1176. package/dist/chunks/ar-LnE7jPai.mjs.map +0 -1
  1177. package/dist/chunks/ar-P3wW0fmA.mjs +0 -2
  1178. package/dist/chunks/ar-P3wW0fmA.mjs.map +0 -1
  1179. package/dist/chunks/ar-uum0DCfv.mjs +0 -2
  1180. package/dist/chunks/ar-uum0DCfv.mjs.map +0 -1
  1181. package/dist/chunks/color-picker-DlXhHBZ6.mjs +0 -2
  1182. package/dist/chunks/color-picker-DlXhHBZ6.mjs.map +0 -1
  1183. package/dist/chunks/de-8SHQu0rr.mjs +0 -2
  1184. package/dist/chunks/de-8SHQu0rr.mjs.map +0 -1
  1185. package/dist/chunks/de-B8a71A0X.mjs +0 -2
  1186. package/dist/chunks/de-B8a71A0X.mjs.map +0 -1
  1187. package/dist/chunks/de-B9weXoA1.mjs +0 -2
  1188. package/dist/chunks/de-B9weXoA1.mjs.map +0 -1
  1189. package/dist/chunks/de-BKm53tVU.mjs +0 -2
  1190. package/dist/chunks/de-BKm53tVU.mjs.map +0 -1
  1191. package/dist/chunks/de-BLWrnMfX.mjs +0 -2
  1192. package/dist/chunks/de-BLWrnMfX.mjs.map +0 -1
  1193. package/dist/chunks/de-BOujs1pF.mjs +0 -2
  1194. package/dist/chunks/de-BOujs1pF.mjs.map +0 -1
  1195. package/dist/chunks/de-B_1XleAG.mjs +0 -2
  1196. package/dist/chunks/de-B_1XleAG.mjs.map +0 -1
  1197. package/dist/chunks/de-BpmjrOMc.mjs +0 -2
  1198. package/dist/chunks/de-BpmjrOMc.mjs.map +0 -1
  1199. package/dist/chunks/de-C8OHD1fm.mjs +0 -2
  1200. package/dist/chunks/de-C8OHD1fm.mjs.map +0 -1
  1201. package/dist/chunks/de-CAVCXBBR.mjs +0 -2
  1202. package/dist/chunks/de-CAVCXBBR.mjs.map +0 -1
  1203. package/dist/chunks/de-CkMnuozT.mjs +0 -2
  1204. package/dist/chunks/de-CkMnuozT.mjs.map +0 -1
  1205. package/dist/chunks/de-CtDnvnnm.mjs +0 -2
  1206. package/dist/chunks/de-CtDnvnnm.mjs.map +0 -1
  1207. package/dist/chunks/de-Cz26vtXW.mjs +0 -2
  1208. package/dist/chunks/de-Cz26vtXW.mjs.map +0 -1
  1209. package/dist/chunks/de-D0BPSP3j.mjs +0 -2
  1210. package/dist/chunks/de-D0BPSP3j.mjs.map +0 -1
  1211. package/dist/chunks/de-D74v0paw.mjs +0 -2
  1212. package/dist/chunks/de-D74v0paw.mjs.map +0 -1
  1213. package/dist/chunks/de-DKj55F9g.mjs +0 -2
  1214. package/dist/chunks/de-DKj55F9g.mjs.map +0 -1
  1215. package/dist/chunks/de-DYuRb98l.mjs +0 -2
  1216. package/dist/chunks/de-DYuRb98l.mjs.map +0 -1
  1217. package/dist/chunks/de-DaK0-sdo.mjs +0 -2
  1218. package/dist/chunks/de-DaK0-sdo.mjs.map +0 -1
  1219. package/dist/chunks/de-Dia08Wsq.mjs +0 -2
  1220. package/dist/chunks/de-Dia08Wsq.mjs.map +0 -1
  1221. package/dist/chunks/de-Dp_uj2Z3.mjs +0 -2
  1222. package/dist/chunks/de-Dp_uj2Z3.mjs.map +0 -1
  1223. package/dist/chunks/de-DwX1CDNO.mjs +0 -2
  1224. package/dist/chunks/de-DwX1CDNO.mjs.map +0 -1
  1225. package/dist/chunks/de-DyF2mRfw.mjs +0 -2
  1226. package/dist/chunks/de-DyF2mRfw.mjs.map +0 -1
  1227. package/dist/chunks/de-X3BLBlF8.mjs +0 -2
  1228. package/dist/chunks/de-X3BLBlF8.mjs.map +0 -1
  1229. package/dist/chunks/de-dPC3Qk7N.mjs +0 -2
  1230. package/dist/chunks/de-dPC3Qk7N.mjs.map +0 -1
  1231. package/dist/chunks/de-pLGt5S7j.mjs +0 -2
  1232. package/dist/chunks/de-pLGt5S7j.mjs.map +0 -1
  1233. package/dist/chunks/es--xozZF4T.mjs +0 -2
  1234. package/dist/chunks/es--xozZF4T.mjs.map +0 -1
  1235. package/dist/chunks/es-2BjtTusm.mjs +0 -2
  1236. package/dist/chunks/es-2BjtTusm.mjs.map +0 -1
  1237. package/dist/chunks/es-B2rEK7_f.mjs +0 -2
  1238. package/dist/chunks/es-B2rEK7_f.mjs.map +0 -1
  1239. package/dist/chunks/es-B9esmUm1.mjs +0 -2
  1240. package/dist/chunks/es-B9esmUm1.mjs.map +0 -1
  1241. package/dist/chunks/es-BJxkHalP.mjs +0 -2
  1242. package/dist/chunks/es-BJxkHalP.mjs.map +0 -1
  1243. package/dist/chunks/es-BMKsnh3y.mjs +0 -2
  1244. package/dist/chunks/es-BMKsnh3y.mjs.map +0 -1
  1245. package/dist/chunks/es-BXFflrrU.mjs +0 -2
  1246. package/dist/chunks/es-BXFflrrU.mjs.map +0 -1
  1247. package/dist/chunks/es-BbX_lEEN.mjs +0 -2
  1248. package/dist/chunks/es-BbX_lEEN.mjs.map +0 -1
  1249. package/dist/chunks/es-BlHe_tc0.mjs +0 -2
  1250. package/dist/chunks/es-BlHe_tc0.mjs.map +0 -1
  1251. package/dist/chunks/es-Bu6nnEeT.mjs +0 -2
  1252. package/dist/chunks/es-Bu6nnEeT.mjs.map +0 -1
  1253. package/dist/chunks/es-Bx0CbUoY.mjs +0 -2
  1254. package/dist/chunks/es-Bx0CbUoY.mjs.map +0 -1
  1255. package/dist/chunks/es-CE9Tbsb7.mjs +0 -2
  1256. package/dist/chunks/es-CE9Tbsb7.mjs.map +0 -1
  1257. package/dist/chunks/es-COSomns3.mjs +0 -2
  1258. package/dist/chunks/es-COSomns3.mjs.map +0 -1
  1259. package/dist/chunks/es-C_7qthHu.mjs +0 -2
  1260. package/dist/chunks/es-C_7qthHu.mjs.map +0 -1
  1261. package/dist/chunks/es-CirfP3x1.mjs +0 -2
  1262. package/dist/chunks/es-CirfP3x1.mjs.map +0 -1
  1263. package/dist/chunks/es-CpF8eiPr.mjs +0 -2
  1264. package/dist/chunks/es-CpF8eiPr.mjs.map +0 -1
  1265. package/dist/chunks/es-D787y0ui.mjs +0 -2
  1266. package/dist/chunks/es-D787y0ui.mjs.map +0 -1
  1267. package/dist/chunks/es-D8iB5vwQ.mjs +0 -2
  1268. package/dist/chunks/es-D8iB5vwQ.mjs.map +0 -1
  1269. package/dist/chunks/es-DBb78XWu.mjs +0 -2
  1270. package/dist/chunks/es-DBb78XWu.mjs.map +0 -1
  1271. package/dist/chunks/es-DC6mYTD3.mjs +0 -2
  1272. package/dist/chunks/es-DC6mYTD3.mjs.map +0 -1
  1273. package/dist/chunks/es-Dh--mRZs.mjs +0 -2
  1274. package/dist/chunks/es-Dh--mRZs.mjs.map +0 -1
  1275. package/dist/chunks/es-DvPsYqFj.mjs +0 -2
  1276. package/dist/chunks/es-DvPsYqFj.mjs.map +0 -1
  1277. package/dist/chunks/es-DxXimuUa.mjs +0 -2
  1278. package/dist/chunks/es-DxXimuUa.mjs.map +0 -1
  1279. package/dist/chunks/es-mWJptxq3.mjs +0 -2
  1280. package/dist/chunks/es-mWJptxq3.mjs.map +0 -1
  1281. package/dist/chunks/es-qYV--o6U.mjs +0 -2
  1282. package/dist/chunks/es-qYV--o6U.mjs.map +0 -1
  1283. package/dist/chunks/fonts-CxtWyeNB.mjs +0 -2
  1284. package/dist/chunks/fonts-CxtWyeNB.mjs.map +0 -1
  1285. package/dist/chunks/fr--F426oao.mjs +0 -2
  1286. package/dist/chunks/fr--F426oao.mjs.map +0 -1
  1287. package/dist/chunks/fr-B0BPbbNB.mjs +0 -2
  1288. package/dist/chunks/fr-B0BPbbNB.mjs.map +0 -1
  1289. package/dist/chunks/fr-B4UQy0j-.mjs +0 -2
  1290. package/dist/chunks/fr-B4UQy0j-.mjs.map +0 -1
  1291. package/dist/chunks/fr-B4XLxkci.mjs +0 -2
  1292. package/dist/chunks/fr-B4XLxkci.mjs.map +0 -1
  1293. package/dist/chunks/fr-BC1Rfp9S.mjs +0 -2
  1294. package/dist/chunks/fr-BC1Rfp9S.mjs.map +0 -1
  1295. package/dist/chunks/fr-BRGGu0E2.mjs +0 -2
  1296. package/dist/chunks/fr-BRGGu0E2.mjs.map +0 -1
  1297. package/dist/chunks/fr-BoSz1pa9.mjs +0 -2
  1298. package/dist/chunks/fr-BoSz1pa9.mjs.map +0 -1
  1299. package/dist/chunks/fr-Bom3RFIN.mjs +0 -2
  1300. package/dist/chunks/fr-Bom3RFIN.mjs.map +0 -1
  1301. package/dist/chunks/fr-BtnwMUII.mjs +0 -2
  1302. package/dist/chunks/fr-BtnwMUII.mjs.map +0 -1
  1303. package/dist/chunks/fr-C6pglM3H.mjs +0 -2
  1304. package/dist/chunks/fr-C6pglM3H.mjs.map +0 -1
  1305. package/dist/chunks/fr-CDBpS6xE.mjs +0 -2
  1306. package/dist/chunks/fr-CDBpS6xE.mjs.map +0 -1
  1307. package/dist/chunks/fr-CN0ihkUg.mjs +0 -2
  1308. package/dist/chunks/fr-CN0ihkUg.mjs.map +0 -1
  1309. package/dist/chunks/fr-CNNBBeLM.mjs +0 -2
  1310. package/dist/chunks/fr-CNNBBeLM.mjs.map +0 -1
  1311. package/dist/chunks/fr-CVOY2y07.mjs +0 -2
  1312. package/dist/chunks/fr-CVOY2y07.mjs.map +0 -1
  1313. package/dist/chunks/fr-CZAbL_o0.mjs +0 -2
  1314. package/dist/chunks/fr-CZAbL_o0.mjs.map +0 -1
  1315. package/dist/chunks/fr-DJkPmQG_.mjs +0 -2
  1316. package/dist/chunks/fr-DJkPmQG_.mjs.map +0 -1
  1317. package/dist/chunks/fr-DkWdFDsR.mjs +0 -2
  1318. package/dist/chunks/fr-DkWdFDsR.mjs.map +0 -1
  1319. package/dist/chunks/fr-DnQHoPVo.mjs +0 -2
  1320. package/dist/chunks/fr-DnQHoPVo.mjs.map +0 -1
  1321. package/dist/chunks/fr-DsdueaiG.mjs +0 -2
  1322. package/dist/chunks/fr-DsdueaiG.mjs.map +0 -1
  1323. package/dist/chunks/fr-DxNdsa11.mjs +0 -2
  1324. package/dist/chunks/fr-DxNdsa11.mjs.map +0 -1
  1325. package/dist/chunks/fr-IO4_LYvE.mjs +0 -2
  1326. package/dist/chunks/fr-IO4_LYvE.mjs.map +0 -1
  1327. package/dist/chunks/fr-ZKDCEpww.mjs +0 -2
  1328. package/dist/chunks/fr-ZKDCEpww.mjs.map +0 -1
  1329. package/dist/chunks/fr-coufP_et.mjs +0 -2
  1330. package/dist/chunks/fr-coufP_et.mjs.map +0 -1
  1331. package/dist/chunks/fr-lYSOgOK7.mjs +0 -2
  1332. package/dist/chunks/fr-lYSOgOK7.mjs.map +0 -1
  1333. package/dist/chunks/fr-wobtRjcF.mjs +0 -2
  1334. package/dist/chunks/fr-wobtRjcF.mjs.map +0 -1
  1335. package/dist/chunks/full-5hGvv-bG.mjs +0 -2
  1336. package/dist/chunks/full-5hGvv-bG.mjs.map +0 -1
  1337. package/dist/chunks/hi-B0o90MFd.mjs +0 -2
  1338. package/dist/chunks/hi-B0o90MFd.mjs.map +0 -1
  1339. package/dist/chunks/hi-BFko34WG.mjs +0 -2
  1340. package/dist/chunks/hi-BFko34WG.mjs.map +0 -1
  1341. package/dist/chunks/hi-BVxSgaNT.mjs +0 -2
  1342. package/dist/chunks/hi-BVxSgaNT.mjs.map +0 -1
  1343. package/dist/chunks/hi-BirBQ5Ef.mjs +0 -2
  1344. package/dist/chunks/hi-BirBQ5Ef.mjs.map +0 -1
  1345. package/dist/chunks/hi-BnsbcSIX.mjs +0 -2
  1346. package/dist/chunks/hi-BnsbcSIX.mjs.map +0 -1
  1347. package/dist/chunks/hi-BoFuxLtG.mjs +0 -2
  1348. package/dist/chunks/hi-BoFuxLtG.mjs.map +0 -1
  1349. package/dist/chunks/hi-BptyTwAv.mjs +0 -2
  1350. package/dist/chunks/hi-BptyTwAv.mjs.map +0 -1
  1351. package/dist/chunks/hi-BulaYhi_.mjs +0 -2
  1352. package/dist/chunks/hi-BulaYhi_.mjs.map +0 -1
  1353. package/dist/chunks/hi-BzflHG6Y.mjs +0 -2
  1354. package/dist/chunks/hi-BzflHG6Y.mjs.map +0 -1
  1355. package/dist/chunks/hi-C7Hb-gQ_.mjs +0 -2
  1356. package/dist/chunks/hi-C7Hb-gQ_.mjs.map +0 -1
  1357. package/dist/chunks/hi-C_lY7kA9.mjs +0 -2
  1358. package/dist/chunks/hi-C_lY7kA9.mjs.map +0 -1
  1359. package/dist/chunks/hi-CkylXoIm.mjs +0 -2
  1360. package/dist/chunks/hi-CkylXoIm.mjs.map +0 -1
  1361. package/dist/chunks/hi-DGJTbrQi.mjs +0 -2
  1362. package/dist/chunks/hi-DGJTbrQi.mjs.map +0 -1
  1363. package/dist/chunks/hi-DGJgX0fG.mjs +0 -2
  1364. package/dist/chunks/hi-DGJgX0fG.mjs.map +0 -1
  1365. package/dist/chunks/hi-DKDYpjdr.mjs +0 -2
  1366. package/dist/chunks/hi-DKDYpjdr.mjs.map +0 -1
  1367. package/dist/chunks/hi-DfAX8S-T.mjs +0 -2
  1368. package/dist/chunks/hi-DfAX8S-T.mjs.map +0 -1
  1369. package/dist/chunks/hi-Dhq91ipt.mjs +0 -2
  1370. package/dist/chunks/hi-Dhq91ipt.mjs.map +0 -1
  1371. package/dist/chunks/hi-Dup389dM.mjs +0 -2
  1372. package/dist/chunks/hi-Dup389dM.mjs.map +0 -1
  1373. package/dist/chunks/hi-DzRFsYYN.mjs +0 -2
  1374. package/dist/chunks/hi-DzRFsYYN.mjs.map +0 -1
  1375. package/dist/chunks/hi-ObZRwITd.mjs +0 -2
  1376. package/dist/chunks/hi-ObZRwITd.mjs.map +0 -1
  1377. package/dist/chunks/hi-VvUzjfH_.mjs +0 -2
  1378. package/dist/chunks/hi-VvUzjfH_.mjs.map +0 -1
  1379. package/dist/chunks/hi-jWQDQkOX.mjs +0 -2
  1380. package/dist/chunks/hi-jWQDQkOX.mjs.map +0 -1
  1381. package/dist/chunks/hi-l3hIrp8J.mjs +0 -2
  1382. package/dist/chunks/hi-l3hIrp8J.mjs.map +0 -1
  1383. package/dist/chunks/hi-o8Gsu5Ly.mjs +0 -2
  1384. package/dist/chunks/hi-o8Gsu5Ly.mjs.map +0 -1
  1385. package/dist/chunks/hi-sxC2nk3h.mjs +0 -2
  1386. package/dist/chunks/hi-sxC2nk3h.mjs.map +0 -1
  1387. package/dist/chunks/minimal-pBhi4EJI.mjs +0 -2
  1388. package/dist/chunks/minimal-pBhi4EJI.mjs.map +0 -1
  1389. package/dist/chunks/pt--57Ug7ig.mjs +0 -2
  1390. package/dist/chunks/pt--57Ug7ig.mjs.map +0 -1
  1391. package/dist/chunks/pt-4j8Km9Db.mjs +0 -2
  1392. package/dist/chunks/pt-4j8Km9Db.mjs.map +0 -1
  1393. package/dist/chunks/pt-BTGFKCns.mjs +0 -2
  1394. package/dist/chunks/pt-BTGFKCns.mjs.map +0 -1
  1395. package/dist/chunks/pt-BU8Qfuoz.mjs +0 -2
  1396. package/dist/chunks/pt-BU8Qfuoz.mjs.map +0 -1
  1397. package/dist/chunks/pt-BYAOJxIB.mjs +0 -2
  1398. package/dist/chunks/pt-BYAOJxIB.mjs.map +0 -1
  1399. package/dist/chunks/pt-BjNWQm9A.mjs +0 -2
  1400. package/dist/chunks/pt-BjNWQm9A.mjs.map +0 -1
  1401. package/dist/chunks/pt-Bvnb_NpT.mjs +0 -2
  1402. package/dist/chunks/pt-Bvnb_NpT.mjs.map +0 -1
  1403. package/dist/chunks/pt-C2pkn7vo.mjs +0 -2
  1404. package/dist/chunks/pt-C2pkn7vo.mjs.map +0 -1
  1405. package/dist/chunks/pt-C8MhLnWx.mjs +0 -2
  1406. package/dist/chunks/pt-C8MhLnWx.mjs.map +0 -1
  1407. package/dist/chunks/pt-CJfYLSTe.mjs +0 -2
  1408. package/dist/chunks/pt-CJfYLSTe.mjs.map +0 -1
  1409. package/dist/chunks/pt-CdwVIYOK.mjs +0 -2
  1410. package/dist/chunks/pt-CdwVIYOK.mjs.map +0 -1
  1411. package/dist/chunks/pt-CwrVo90O.mjs +0 -2
  1412. package/dist/chunks/pt-CwrVo90O.mjs.map +0 -1
  1413. package/dist/chunks/pt-DD26CKCA.mjs +0 -2
  1414. package/dist/chunks/pt-DD26CKCA.mjs.map +0 -1
  1415. package/dist/chunks/pt-DLbf6uoo.mjs +0 -2
  1416. package/dist/chunks/pt-DLbf6uoo.mjs.map +0 -1
  1417. package/dist/chunks/pt-DNyNHwKh.mjs +0 -2
  1418. package/dist/chunks/pt-DNyNHwKh.mjs.map +0 -1
  1419. package/dist/chunks/pt-DVfMAcXb.mjs +0 -2
  1420. package/dist/chunks/pt-DVfMAcXb.mjs.map +0 -1
  1421. package/dist/chunks/pt-DWSFad3n.mjs +0 -2
  1422. package/dist/chunks/pt-DWSFad3n.mjs.map +0 -1
  1423. package/dist/chunks/pt-DZXY4i4G.mjs +0 -2
  1424. package/dist/chunks/pt-DZXY4i4G.mjs.map +0 -1
  1425. package/dist/chunks/pt-DfUpRhK1.mjs +0 -2
  1426. package/dist/chunks/pt-DfUpRhK1.mjs.map +0 -1
  1427. package/dist/chunks/pt-DlvNEDeW.mjs +0 -2
  1428. package/dist/chunks/pt-DlvNEDeW.mjs.map +0 -1
  1429. package/dist/chunks/pt-DzFyGwB4.mjs +0 -2
  1430. package/dist/chunks/pt-DzFyGwB4.mjs.map +0 -1
  1431. package/dist/chunks/pt-HhQcARW6.mjs +0 -2
  1432. package/dist/chunks/pt-HhQcARW6.mjs.map +0 -1
  1433. package/dist/chunks/pt-SjvTF40s.mjs +0 -2
  1434. package/dist/chunks/pt-SjvTF40s.mjs.map +0 -1
  1435. package/dist/chunks/pt-ihNE0VQJ.mjs +0 -2
  1436. package/dist/chunks/pt-ihNE0VQJ.mjs.map +0 -1
  1437. package/dist/chunks/pt-zfCjhIgy.mjs +0 -2
  1438. package/dist/chunks/pt-zfCjhIgy.mjs.map +0 -1
  1439. package/dist/chunks/ru-0AHodbWv.mjs +0 -2
  1440. package/dist/chunks/ru-0AHodbWv.mjs.map +0 -1
  1441. package/dist/chunks/ru-2MDGmLw0.mjs +0 -2
  1442. package/dist/chunks/ru-2MDGmLw0.mjs.map +0 -1
  1443. package/dist/chunks/ru-3VfYKfTm.mjs +0 -2
  1444. package/dist/chunks/ru-3VfYKfTm.mjs.map +0 -1
  1445. package/dist/chunks/ru-B-gRJ6nQ.mjs +0 -2
  1446. package/dist/chunks/ru-B-gRJ6nQ.mjs.map +0 -1
  1447. package/dist/chunks/ru-B6ITUB-Y.mjs +0 -2
  1448. package/dist/chunks/ru-B6ITUB-Y.mjs.map +0 -1
  1449. package/dist/chunks/ru-BKDWkabk.mjs +0 -2
  1450. package/dist/chunks/ru-BKDWkabk.mjs.map +0 -1
  1451. package/dist/chunks/ru-BMxJsSe3.mjs +0 -2
  1452. package/dist/chunks/ru-BMxJsSe3.mjs.map +0 -1
  1453. package/dist/chunks/ru-Bep1iHQL.mjs +0 -2
  1454. package/dist/chunks/ru-Bep1iHQL.mjs.map +0 -1
  1455. package/dist/chunks/ru-Blj0nqoL.mjs +0 -2
  1456. package/dist/chunks/ru-Blj0nqoL.mjs.map +0 -1
  1457. package/dist/chunks/ru-BqnHkmii.mjs +0 -2
  1458. package/dist/chunks/ru-BqnHkmii.mjs.map +0 -1
  1459. package/dist/chunks/ru-C-4AaPUK.mjs +0 -2
  1460. package/dist/chunks/ru-C-4AaPUK.mjs.map +0 -1
  1461. package/dist/chunks/ru-C9Nv7JJI.mjs +0 -2
  1462. package/dist/chunks/ru-C9Nv7JJI.mjs.map +0 -1
  1463. package/dist/chunks/ru-CJFtr1Ks.mjs +0 -2
  1464. package/dist/chunks/ru-CJFtr1Ks.mjs.map +0 -1
  1465. package/dist/chunks/ru-CN63yWk_.mjs +0 -2
  1466. package/dist/chunks/ru-CN63yWk_.mjs.map +0 -1
  1467. package/dist/chunks/ru-CcFX97-2.mjs +0 -2
  1468. package/dist/chunks/ru-CcFX97-2.mjs.map +0 -1
  1469. package/dist/chunks/ru-D8PhWFSp.mjs +0 -2
  1470. package/dist/chunks/ru-D8PhWFSp.mjs.map +0 -1
  1471. package/dist/chunks/ru-DYAncidS.mjs +0 -2
  1472. package/dist/chunks/ru-DYAncidS.mjs.map +0 -1
  1473. package/dist/chunks/ru-D_zXo-FA.mjs +0 -2
  1474. package/dist/chunks/ru-D_zXo-FA.mjs.map +0 -1
  1475. package/dist/chunks/ru-DhSPV6m0.mjs +0 -2
  1476. package/dist/chunks/ru-DhSPV6m0.mjs.map +0 -1
  1477. package/dist/chunks/ru-LNbpjKCw.mjs +0 -2
  1478. package/dist/chunks/ru-LNbpjKCw.mjs.map +0 -1
  1479. package/dist/chunks/ru-LXi1ONW4.mjs +0 -2
  1480. package/dist/chunks/ru-LXi1ONW4.mjs.map +0 -1
  1481. package/dist/chunks/ru-db7wsWkx.mjs +0 -2
  1482. package/dist/chunks/ru-db7wsWkx.mjs.map +0 -1
  1483. package/dist/chunks/ru-nZ4BjiD0.mjs +0 -2
  1484. package/dist/chunks/ru-nZ4BjiD0.mjs.map +0 -1
  1485. package/dist/chunks/ru-v9zumXd2.mjs +0 -2
  1486. package/dist/chunks/ru-v9zumXd2.mjs.map +0 -1
  1487. package/dist/chunks/ru-wK2ytv3A.mjs +0 -2
  1488. package/dist/chunks/ru-wK2ytv3A.mjs.map +0 -1
  1489. package/dist/chunks/src-CNK6vpUU.mjs +0 -2
  1490. package/dist/chunks/src-CNK6vpUU.mjs.map +0 -1
  1491. package/dist/chunks/zh-9AcCSFm0.mjs +0 -2
  1492. package/dist/chunks/zh-9AcCSFm0.mjs.map +0 -1
  1493. package/dist/chunks/zh-B3bJCfdB.mjs +0 -2
  1494. package/dist/chunks/zh-B3bJCfdB.mjs.map +0 -1
  1495. package/dist/chunks/zh-B46Dt1h7.mjs +0 -2
  1496. package/dist/chunks/zh-B46Dt1h7.mjs.map +0 -1
  1497. package/dist/chunks/zh-BRy2B6Og.mjs +0 -2
  1498. package/dist/chunks/zh-BRy2B6Og.mjs.map +0 -1
  1499. package/dist/chunks/zh-BfYi8wB2.mjs +0 -2
  1500. package/dist/chunks/zh-BfYi8wB2.mjs.map +0 -1
  1501. package/dist/chunks/zh-C0I3L6NA.mjs +0 -2
  1502. package/dist/chunks/zh-C0I3L6NA.mjs.map +0 -1
  1503. package/dist/chunks/zh-C33e4gfg.mjs +0 -2
  1504. package/dist/chunks/zh-C33e4gfg.mjs.map +0 -1
  1505. package/dist/chunks/zh-C9sNwnC1.mjs +0 -2
  1506. package/dist/chunks/zh-C9sNwnC1.mjs.map +0 -1
  1507. package/dist/chunks/zh-CACr0qSo.mjs +0 -2
  1508. package/dist/chunks/zh-CACr0qSo.mjs.map +0 -1
  1509. package/dist/chunks/zh-CU0hd8zq.mjs +0 -2
  1510. package/dist/chunks/zh-CU0hd8zq.mjs.map +0 -1
  1511. package/dist/chunks/zh-CX2zUoWR.mjs +0 -2
  1512. package/dist/chunks/zh-CX2zUoWR.mjs.map +0 -1
  1513. package/dist/chunks/zh-CblZ-34H.mjs +0 -2
  1514. package/dist/chunks/zh-CblZ-34H.mjs.map +0 -1
  1515. package/dist/chunks/zh-CicpU0g8.mjs +0 -2
  1516. package/dist/chunks/zh-CicpU0g8.mjs.map +0 -1
  1517. package/dist/chunks/zh-Cr3KdEZV.mjs +0 -2
  1518. package/dist/chunks/zh-Cr3KdEZV.mjs.map +0 -1
  1519. package/dist/chunks/zh-D24dsCiw.mjs +0 -2
  1520. package/dist/chunks/zh-D24dsCiw.mjs.map +0 -1
  1521. package/dist/chunks/zh-DQtLxQ3s.mjs +0 -2
  1522. package/dist/chunks/zh-DQtLxQ3s.mjs.map +0 -1
  1523. package/dist/chunks/zh-DR1OF5vm.mjs +0 -2
  1524. package/dist/chunks/zh-DR1OF5vm.mjs.map +0 -1
  1525. package/dist/chunks/zh-DS82x1KL.mjs +0 -2
  1526. package/dist/chunks/zh-DS82x1KL.mjs.map +0 -1
  1527. package/dist/chunks/zh-DdJA-AEY.mjs +0 -2
  1528. package/dist/chunks/zh-DdJA-AEY.mjs.map +0 -1
  1529. package/dist/chunks/zh-DpVlDZ9n.mjs +0 -2
  1530. package/dist/chunks/zh-DpVlDZ9n.mjs.map +0 -1
  1531. package/dist/chunks/zh-OWVKcbVR.mjs +0 -2
  1532. package/dist/chunks/zh-OWVKcbVR.mjs.map +0 -1
  1533. package/dist/chunks/zh-d19V68ib.mjs +0 -2
  1534. package/dist/chunks/zh-d19V68ib.mjs.map +0 -1
  1535. package/dist/chunks/zh-fSMt1FnB.mjs +0 -2
  1536. package/dist/chunks/zh-fSMt1FnB.mjs.map +0 -1
  1537. package/dist/chunks/zh-mLlk9Wki.mjs +0 -2
  1538. package/dist/chunks/zh-mLlk9Wki.mjs.map +0 -1
  1539. package/dist/chunks/zh-nnMt8E6m.mjs +0 -2
  1540. package/dist/chunks/zh-nnMt8E6m.mjs.map +0 -1
  1541. package/dist/input/InternalClipboard.d.ts +0 -13
  1542. package/dist/input/InternalClipboard.d.ts.map +0 -1
  1543. package/dist/plugins/smart-paste/detectors/JavaDetector.d.ts +0 -7
  1544. package/dist/plugins/smart-paste/detectors/JavaDetector.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"HeadingPlugin-EPAmsEGt.mjs","names":[],"sources":["../../src/editor/styles/heading-select.ts","../../src/plugins/heading/HeadingBlockTypePicker.ts","../../src/plugins/heading/HeadingCommands.ts","../../src/plugins/heading/HeadingInputRules.ts","../../src/plugins/heading/HeadingKeyboardHandlers.ts","../../src/plugins/heading/HeadingLocale.ts","../../src/plugins/heading/HeadingPlugin.ts"],"sourcesContent":["/** Heading picker toolbar combobox + popup styles. */\nexport const HEADING_SELECT_CSS = `\n/* Heading Select — Width overrides for combobox button */\n.notectl-toolbar-btn--heading {\n\tmin-width: 100px;\n\tmax-width: 160px;\n}\n\n/* Heading Picker Popup */\n.notectl-heading-picker {\n\tmin-width: 200px;\n\tmax-height: 320px;\n\toverflow-y: auto;\n}\n\n.notectl-heading-picker__list {\n\tpadding: 4px 0;\n}\n\n.notectl-heading-picker__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tpadding: 7px 12px;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\ttext-align: start;\n\twhite-space: nowrap;\n\tfont-family: inherit;\n\ttransition: background 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-heading-picker__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-heading-picker__item--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n@media (hover: hover) {\n\t.notectl-heading-picker__item--active:hover {\n\t\tbackground: var(--notectl-active-bg);\n\t}\n}\n\n.notectl-heading-picker__check {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\tflex-shrink: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-heading-picker__label {\n\tflex: 1;\n}\n`;\n","/**\n * Block type picker entries and toolbar dropdown for heading block types.\n * Registers picker entries for paragraph, title, subtitle, and all heading levels,\n * plus a combobox-style toolbar item with a custom popup.\n */\n\nimport { isTextSelection } from '../../model/Selection.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperties } from '../../style/StyleRuntime.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { PopupCloseOptions } from '../shared/PopupManager.js';\nimport type { PickerEntryStyle } from './BlockTypePickerEntry.js';\nimport type { HeadingLocale } from './HeadingLocale.js';\nimport type { HeadingConfig } from './HeadingPlugin.js';\nimport type { HeadingLevel } from './HeadingPlugin.js';\n\n// --- Picker Entry Registration ---\n\n/** Registers block type picker entries for paragraph, title, subtitle, and heading levels. */\nexport function registerHeadingPickerEntries(\n\tcontext: PluginContext,\n\tconfig: HeadingConfig,\n\tlocale: HeadingLocale,\n): void {\n\tcontext.registerBlockTypePickerEntry({\n\t\tid: 'paragraph',\n\t\tlabel: locale.paragraph,\n\t\tcommand: 'setParagraph',\n\t\tpriority: 10,\n\t\tisActive: (state) => {\n\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\treturn block?.type === 'paragraph';\n\t\t},\n\t});\n\n\tcontext.registerBlockTypePickerEntry({\n\t\tid: 'title',\n\t\tlabel: locale.title,\n\t\tcommand: 'setTitle',\n\t\tpriority: 20,\n\t\tstyle: { fontSize: '1.6em', fontWeight: '700' },\n\t\tisActive: (state) => {\n\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\treturn block?.type === 'title';\n\t\t},\n\t});\n\n\tcontext.registerBlockTypePickerEntry({\n\t\tid: 'subtitle',\n\t\tlabel: locale.subtitle,\n\t\tcommand: 'setSubtitle',\n\t\tpriority: 30,\n\t\tstyle: { fontSize: '1.3em', fontWeight: '500' },\n\t\tisActive: (state) => {\n\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\treturn block?.type === 'subtitle';\n\t\t},\n\t});\n\n\tfor (const level of config.levels) {\n\t\tcontext.registerBlockTypePickerEntry({\n\t\t\tid: `heading-${level}`,\n\t\t\tlabel: getHeadingLabel(locale, level),\n\t\t\tcommand: `setHeading${level}`,\n\t\t\tpriority: 100 + level,\n\t\t\tstyle: { fontSize: `${1.4 - level * 0.1}em`, fontWeight: '600' },\n\t\t\tisActive: (state) => {\n\t\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\t\treturn block?.type === 'heading' && block.attrs?.level === level;\n\t\t\t},\n\t\t});\n\t}\n}\n\n// --- Toolbar Item ---\n\n/** Registers the heading toolbar dropdown with a combobox picker popup. */\nexport function registerHeadingToolbarItem(context: PluginContext, locale: HeadingLocale): void {\n\tcontext.registerToolbarItem({\n\t\tid: 'heading',\n\t\tgroup: 'block',\n\t\tlabel: locale.blockTypeLabel,\n\t\ttooltip: locale.blockTypeLabel,\n\t\tcommand: 'setParagraph',\n\t\tpopupType: 'combobox',\n\t\tgetLabel: (state: EditorState): string => getActiveLabel(state, context, locale),\n\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\trenderHeadingPopup(container, ctx, locale, onClose);\n\t\t},\n\t\tisActive: (state) => {\n\t\t\tconst entries = context.getBlockTypePickerRegistry().getBlockTypePickerEntries();\n\t\t\treturn entries.some((entry) => entry.id !== 'paragraph' && entry.isActive(state));\n\t\t},\n\t});\n}\n\n// --- Popup Rendering ---\n\nfunction renderHeadingPopup(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\tlocale: HeadingLocale,\n\tonClose: (options?: PopupCloseOptions) => void,\n): void {\n\tcontainer.classList.add('notectl-heading-picker');\n\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return;\n\n\tconst contentElement: HTMLElement = context.getContainer();\n\n\tconst list: HTMLDivElement = document.createElement('div');\n\tlist.className = 'notectl-heading-picker__list';\n\tlist.setAttribute('role', 'listbox');\n\tlist.setAttribute('aria-label', locale.blockTypesAria);\n\n\tconst entries = context.getBlockTypePickerRegistry().getBlockTypePickerEntries();\n\tfor (const entry of entries) {\n\t\tconst active: boolean = entry.isActive(state);\n\t\tlist.appendChild(\n\t\t\tcreatePickerItem(\n\t\t\t\tentry.label,\n\t\t\t\tactive,\n\t\t\t\t(e: MouseEvent) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tcontext.executeCommand(entry.command);\n\t\t\t\t\tonClose({ restoreFocusTo: contentElement });\n\t\t\t\t},\n\t\t\t\tentry.style,\n\t\t\t),\n\t\t);\n\t}\n\n\tcontainer.appendChild(list);\n}\n\nfunction createPickerItem(\n\tlabel: string,\n\tisActive: boolean,\n\thandler: (e: MouseEvent) => void,\n\tstyle?: PickerEntryStyle,\n): HTMLButtonElement {\n\tconst item: HTMLButtonElement = document.createElement('button');\n\titem.type = 'button';\n\titem.className = 'notectl-heading-picker__item';\n\titem.setAttribute('role', 'option');\n\titem.setAttribute('aria-selected', String(isActive));\n\n\tif (isActive) {\n\t\titem.classList.add('notectl-heading-picker__item--active');\n\t}\n\n\tconst check: HTMLSpanElement = document.createElement('span');\n\tcheck.className = 'notectl-heading-picker__check';\n\tcheck.textContent = isActive ? '\\u2713' : '';\n\titem.appendChild(check);\n\n\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\tlabelSpan.className = 'notectl-heading-picker__label';\n\tlabelSpan.textContent = label;\n\tif (style) {\n\t\tsetStyleProperties(labelSpan, {\n\t\t\tfontSize: style.fontSize,\n\t\t\tfontWeight: style.fontWeight,\n\t\t});\n\t}\n\titem.appendChild(labelSpan);\n\n\titem.addEventListener('mousedown', handler);\n\treturn item;\n}\n\n// --- Helpers ---\n\nfunction getHeadingLabel(locale: HeadingLocale, level: HeadingLevel): string {\n\tconst key = `heading${level}` as keyof HeadingLocale;\n\treturn locale[key] as string;\n}\n\nfunction getActiveLabel(state: EditorState, context: PluginContext, locale: HeadingLocale): string {\n\tif (!isTextSelection(state.selection)) return locale.paragraph;\n\tconst entries = context.getBlockTypePickerRegistry().getBlockTypePickerEntries();\n\tfor (const entry of entries) {\n\t\tif (entry.isActive(state)) return entry.label;\n\t}\n\treturn locale.paragraph;\n}\n","/**\n * Command registration and implementations for heading block types.\n * Handles toggle between heading/title/subtitle and paragraph,\n * plus excluded-mark stripping when switching block types.\n */\n\nimport type { BlockNode, Mark } from '../../model/Document.js';\nimport { getBlockLength, getInlineChildren, isTextNode } from '../../model/Document.js';\nimport { isTextSelection } from '../../model/Selection.js';\nimport { type NodeTypeName, nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { TransactionBuilder } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { HeadingConfig, HeadingLevel } from './HeadingPlugin.js';\n\n/** Registers all heading commands (setTitle, setSubtitle, setHeadingN, toggleHeading, setParagraph). */\nexport function registerHeadingCommands(context: PluginContext, config: HeadingConfig): void {\n\tcontext.registerCommand('setTitle', () => toggleSpecialBlock(context, 'title'));\n\n\tcontext.registerCommand('setSubtitle', () => toggleSpecialBlock(context, 'subtitle'));\n\n\tfor (const level of config.levels) {\n\t\tcontext.registerCommand(`setHeading${level}`, () => toggleHeading(context, level));\n\t}\n\n\tcontext.registerCommand('toggleHeading', () => toggleHeading(context, 1));\n\n\tcontext.registerCommand('setParagraph', () => setBlockType(context, nodeType('paragraph')));\n}\n\n// --- Command Implementations ---\n\n/**\n * Toggles between a special block type (title/subtitle) and paragraph.\n * If the block is already that type, resets to paragraph.\n */\nfunction toggleSpecialBlock(context: PluginContext, type: string): boolean {\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(state.selection.anchor.blockId);\n\tif (!block) return false;\n\n\tif (block.type === type) {\n\t\treturn setBlockType(context, nodeType('paragraph'));\n\t}\n\n\treturn setBlockType(context, nodeType(type) as NodeTypeName);\n}\n\n/**\n * Toggles between heading (at given level) and paragraph.\n * If the block is already a heading at the same level, resets to paragraph.\n */\nfunction toggleHeading(context: PluginContext, level: HeadingLevel): boolean {\n\tconst state: EditorState = context.getState();\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block) return false;\n\n\tif (block.type === 'heading' && block.attrs?.level === level) {\n\t\treturn setBlockType(context, nodeType('paragraph'));\n\t}\n\n\treturn setBlockType(context, nodeType('heading'), { level });\n}\n\nfunction setBlockType(\n\tcontext: PluginContext,\n\ttype: NodeTypeName,\n\tattrs?: Record<string, string | number | boolean>,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block) return false;\n\n\tconst builder: TransactionBuilder = state.transaction('command');\n\n\tconst spec = context.getSchemaRegistry().getNodeSpec(type);\n\tif (spec?.excludeMarks && spec.excludeMarks.length > 0) {\n\t\tstripExcludedMarks(builder, block, spec.excludeMarks);\n\t\tclearExcludedStoredMarks(builder, state, spec.excludeMarks);\n\t}\n\n\tconst tr = builder.setBlockType(sel.anchor.blockId, type, attrs).setSelection(sel).build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n// --- Mark Stripping Helpers ---\n\n/**\n * Adds removeMark steps for each excluded mark type found\n * on the block's inline text content.\n */\nfunction stripExcludedMarks(\n\tbuilder: TransactionBuilder,\n\tblock: BlockNode,\n\texcludeMarks: readonly string[],\n): void {\n\tconst blockLength: number = getBlockLength(block);\n\tif (blockLength === 0) return;\n\n\tconst excludeSet: Set<string> = new Set(excludeMarks);\n\tconst inlineChildren = getInlineChildren(block);\n\tlet offset = 0;\n\n\tfor (const child of inlineChildren) {\n\t\tif (isTextNode(child)) {\n\t\t\tif (child.text.length > 0) {\n\t\t\t\tfor (const mark of child.marks) {\n\t\t\t\t\tif (excludeSet.has(mark.type)) {\n\t\t\t\t\t\tbuilder.removeMark(block.id, offset, offset + child.text.length, mark);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\toffset += child.text.length;\n\t\t} else {\n\t\t\toffset += 1;\n\t\t}\n\t}\n}\n\n/**\n * Clears excluded mark types from stored marks so that\n * subsequent typing does not reintroduce them.\n */\nfunction clearExcludedStoredMarks(\n\tbuilder: TransactionBuilder,\n\tstate: EditorState,\n\texcludeMarks: readonly string[],\n): void {\n\tif (!state.storedMarks) return;\n\n\tconst excludeSet: Set<string> = new Set(excludeMarks);\n\tconst filtered: readonly Mark[] = state.storedMarks.filter((m: Mark) => !excludeSet.has(m.type));\n\n\tif (filtered.length !== state.storedMarks.length) {\n\t\tbuilder.setStoredMarks(filtered.length > 0 ? filtered : null, state.storedMarks);\n\t}\n}\n","/**\n * Input rule registration for heading block types.\n * Converts `# `, `## `, etc. at the start of a paragraph into headings.\n */\n\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { HeadingConfig } from './HeadingPlugin.js';\n\n/** Registers markdown-style input rules (e.g. `# ` → H1) for configured heading levels. */\nexport function registerHeadingInputRules(context: PluginContext, config: HeadingConfig): void {\n\tfor (const level of config.levels) {\n\t\tconst hashes: string = '#'.repeat(level);\n\t\tconst pattern: RegExp = new RegExp(`^${hashes} $`);\n\n\t\tcontext.registerInputRule({\n\t\t\tpattern,\n\t\t\thandler(state, _match, start, _end) {\n\t\t\t\tconst sel = state.selection;\n\t\t\t\tif (!isTextSelection(sel)) return null;\n\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, start, start + level + 1)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('heading'), { level })\n\t\t\t\t\t.setSelection(createCollapsedSelection(sel.anchor.blockId, 0))\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n}\n","/**\n * Keyboard handlers for heading block types.\n * Handles Enter key behavior: empty heading → paragraph, cursor at end → split + paragraph.\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport { generateBlockId, getBlockLength, getBlockText } from '../../model/Document.js';\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { HeadingConfig } from './HeadingPlugin.js';\n\n// --- Context Guard ---\n\nconst HEADING_TYPES: ReadonlySet<string> = new Set(['heading', 'title', 'subtitle']);\n\ninterface HeadingContext {\n\treadonly state: EditorState;\n\treadonly block: BlockNode;\n\treadonly blockId: BlockId;\n\treadonly offset: number;\n}\n\n/**\n * Guards against NodeSelection, non-collapsed selections, and non-heading blocks.\n * Returns false (not handled) if the cursor is not inside a heading-type block.\n */\nfunction withHeadingContext(\n\tcontext: PluginContext,\n\thandler: (ctx: HeadingContext) => boolean,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\n\tconst sel = state.selection;\n\tif (!isCollapsed(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block || !HEADING_TYPES.has(block.type)) return false;\n\n\treturn handler({\n\t\tstate,\n\t\tblock,\n\t\tblockId: sel.anchor.blockId,\n\t\toffset: sel.anchor.offset,\n\t});\n}\n\n/** Registers all heading keyboard handlers (Enter, Mod-Shift-N shortcuts). */\nexport function registerHeadingKeymaps(context: PluginContext, config: HeadingConfig): void {\n\tconst keymap: Record<string, () => boolean> = {\n\t\tEnter: () => handleEnter(context),\n\t};\n\n\tfor (const level of config.levels) {\n\t\tif (level <= 6) {\n\t\t\tkeymap[`Mod-Shift-${level}`] = () => context.executeCommand(`setHeading${level}`);\n\t\t}\n\t}\n\n\tcontext.registerKeymap(keymap);\n}\n\n// --- Enter Handler ---\n\n/**\n * Handles Enter inside a heading block.\n * Empty heading → convert to paragraph.\n * Cursor at end → split and convert new block to paragraph.\n * Cursor in middle → normal split (both stay heading).\n */\nfunction handleEnter(context: PluginContext): boolean {\n\treturn withHeadingContext(context, (ctx) => {\n\t\tconst text: string = getBlockText(ctx.block);\n\n\t\tif (text === '') {\n\t\t\tconst tr = ctx.state\n\t\t\t\t.transaction('input')\n\t\t\t\t.setBlockType(ctx.blockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(ctx.state.selection)\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\tconst blockLength: number = getBlockLength(ctx.block);\n\n\t\tif (ctx.offset >= blockLength) {\n\t\t\tconst newBlockId = generateBlockId();\n\t\t\tconst tr = ctx.state\n\t\t\t\t.transaction('input')\n\t\t\t\t.splitBlock(ctx.blockId, ctx.offset, newBlockId)\n\t\t\t\t.setBlockType(newBlockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(createCollapsedSelection(newBlockId, 0))\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t});\n}\n","/**\n * Locale interface and default English locale for the HeadingPlugin.\n */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface HeadingLocale {\n\treadonly paragraph: string;\n\treadonly title: string;\n\treadonly subtitle: string;\n\treadonly heading1: string;\n\treadonly heading2: string;\n\treadonly heading3: string;\n\treadonly heading4: string;\n\treadonly heading5: string;\n\treadonly heading6: string;\n\treadonly blockTypeLabel: string;\n\treadonly blockTypesAria: string;\n}\n\n// --- Default English Locale ---\n\nexport const HEADING_LOCALE_EN: HeadingLocale = {\n\tparagraph: 'Paragraph',\n\ttitle: 'Title',\n\tsubtitle: 'Subtitle',\n\theading1: 'Heading 1',\n\theading2: 'Heading 2',\n\theading3: 'Heading 3',\n\theading4: 'Heading 4',\n\theading5: 'Heading 5',\n\theading6: 'Heading 6',\n\tblockTypeLabel: 'Block Type',\n\tblockTypesAria: 'Block types',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<HeadingLocale> = import.meta.glob<{\n\tdefault: HeadingLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadHeadingLocale(lang: string): Promise<HeadingLocale> {\n\treturn loadLocaleModule(localeModules, lang, HEADING_LOCALE_EN);\n}\n","/**\n * HeadingPlugin: registers Title, Subtitle, and H1–H6 heading block types\n * with NodeSpec, toggle commands, keyboard shortcuts, input rules, and a\n * combobox-style toolbar dropdown that reflects the current block type.\n *\n * This file is a thin orchestrator — command logic, input rules, keyboard\n * handlers, and picker/toolbar rendering are delegated to dedicated modules.\n */\n\nimport { HEADING_SELECT_CSS } from '../../editor/styles/heading-select.js';\nimport type { BlockAlignment } from '../../model/BlockAlignment.js';\nimport { createBlockElement } from '../../view/DomUtils.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport {\n\tregisterHeadingPickerEntries,\n\tregisterHeadingToolbarItem,\n} from './HeadingBlockTypePicker.js';\nimport { registerHeadingCommands } from './HeadingCommands.js';\nimport { registerHeadingInputRules } from './HeadingInputRules.js';\nimport { registerHeadingKeymaps } from './HeadingKeyboardHandlers.js';\nimport { HEADING_LOCALE_EN, type HeadingLocale, loadHeadingLocale } from './HeadingLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\theading: { level: HeadingLevel; align?: BlockAlignment };\n\t\ttitle: { align?: BlockAlignment };\n\t\tsubtitle: { align?: BlockAlignment };\n\t}\n}\n\n// --- Configuration ---\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface HeadingConfig {\n\t/** Which heading levels to enable. Defaults to [1, 2, 3, 4, 5, 6]. */\n\treadonly levels: readonly HeadingLevel[];\n\treadonly locale?: HeadingLocale;\n}\n\nconst DEFAULT_CONFIG: HeadingConfig = {\n\tlevels: [1, 2, 3, 4, 5, 6],\n};\n\n// --- Heading Tag Mapping ---\n\nconst HEADING_TAGS: Record<HeadingLevel, string> = {\n\t1: 'h1',\n\t2: 'h2',\n\t3: 'h3',\n\t4: 'h4',\n\t5: 'h5',\n\t6: 'h6',\n};\n\n// --- Plugin ---\n\nexport class HeadingPlugin implements Plugin {\n\treadonly id = 'heading';\n\treadonly name = 'Heading';\n\treadonly priority = 30;\n\n\tprivate readonly config: HeadingConfig;\n\tprivate locale!: HeadingLocale;\n\n\tconstructor(config?: Partial<HeadingConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tHEADING_LOCALE_EN,\n\t\t\tloadHeadingLocale,\n\t\t);\n\t\tcontext.registerStyleSheet(HEADING_SELECT_CSS);\n\n\t\tthis.registerNodeSpecs(context);\n\t\tregisterHeadingCommands(context, this.config);\n\t\tregisterHeadingKeymaps(context, this.config);\n\t\tregisterHeadingInputRules(context, this.config);\n\t\tregisterHeadingPickerEntries(context, this.config, this.locale);\n\t\tregisterHeadingToolbarItem(context, this.locale);\n\t}\n\n\tprivate registerNodeSpecs(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'title',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\texcludeMarks: ['fontSize'],\n\t\t\ttoDOM(node) {\n\t\t\t\tconst el = createBlockElement('h1', node.id);\n\t\t\t\tel.classList.add('notectl-title');\n\t\t\t\treturn el;\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<h1 class=\"notectl-title\">${content || '<br>'}</h1>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'h1',\n\t\t\t\t\tpriority: 60,\n\t\t\t\t\tgetAttrs: (el) => (el.classList.contains('notectl-title') ? {} : false),\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['h1'], attrs: ['class'] },\n\t\t});\n\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'subtitle',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\texcludeMarks: ['fontSize'],\n\t\t\ttoDOM(node) {\n\t\t\t\tconst el = createBlockElement('h2', node.id);\n\t\t\t\tel.classList.add('notectl-subtitle');\n\t\t\t\treturn el;\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<h2 class=\"notectl-subtitle\">${content || '<br>'}</h2>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'h2',\n\t\t\t\t\tpriority: 60,\n\t\t\t\t\tgetAttrs: (el) => (el.classList.contains('notectl-subtitle') ? {} : false),\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['h2'], attrs: ['class'] },\n\t\t});\n\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'heading',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\texcludeMarks: ['fontSize'],\n\t\t\tattrs: {\n\t\t\t\tlevel: { default: 1 },\n\t\t\t},\n\t\t\ttoDOM(node) {\n\t\t\t\tconst level = node.attrs?.level ?? 1;\n\t\t\t\tconst tag = HEADING_TAGS[level] ?? 'h1';\n\t\t\t\treturn createBlockElement(tag, node.id);\n\t\t\t},\n\t\t\ttoHTML(node, content) {\n\t\t\t\tconst level = (node.attrs?.level ?? 1) as HeadingLevel;\n\t\t\t\tconst tag: string = HEADING_TAGS[level] ?? 'h1';\n\t\t\t\treturn `<${tag}>${content || '<br>'}</${tag}>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{ tag: 'h1', getAttrs: () => ({ level: 1 }) },\n\t\t\t\t{ tag: 'h2', getAttrs: () => ({ level: 2 }) },\n\t\t\t\t{ tag: 'h3', getAttrs: () => ({ level: 3 }) },\n\t\t\t\t{ tag: 'h4', getAttrs: () => ({ level: 4 }) },\n\t\t\t\t{ tag: 'h5', getAttrs: () => ({ level: 5 }) },\n\t\t\t\t{ tag: 'h6', getAttrs: () => ({ level: 6 }) },\n\t\t\t],\n\t\t\tsanitize: { tags: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] },\n\t\t});\n\t}\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{r as e}from"./HTMLUtils-brwcaufP.mjs";import{s as t}from"./StyleRuntime-D3d1XFFe.mjs";import{i as r,o}from"./PluginHelpers-D-MvWR98.mjs";import{a as s,t as a}from"./ColorValidation-CiGxVsqd.mjs";import{t as i}from"./color-picker-DlXhHBZ6.mjs";import{a as l,i as f,t as c}from"./ColorPickerPopup-CL-W380M.mjs";var g={label:"Highlight",tooltip:"Highlight Color",resetLabel:"None",ariaLabelPrefix:"Highlight color"},m=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-DZJIBD1Q.mjs"),"./locales/de.ts":()=>import("./de-B8a71A0X.mjs"),"./locales/es.ts":()=>import("./es-Dh--mRZs.mjs"),"./locales/fr.ts":()=>import("./fr-CN0ihkUg.mjs"),"./locales/hi.ts":()=>import("./hi-DGJTbrQi.mjs"),"./locales/pt.ts":()=>import("./pt-CdwVIYOK.mjs"),"./locales/ru.ts":()=>import("./ru-DhSPV6m0.mjs"),"./locales/zh.ts":()=>import("./zh-CU0hd8zq.mjs")});async function h(e){return o(m,e,g)}var n=["#fff176","#aed581","#4dd0e1","#64b5f6","#ce93d8","#f48fb1","#ffab91","#ff8a65","#e6ee9c","#80cbc4","#fff9c4","#dcedc8","#e0f7fa","#e3f2fd","#f3e5f5","#fce4ec","#fff3e0","#fbe9e7","#f9fbe7","#e0f2f1","#fff59d","#c5e1a5","#80deea","#90caf9","#e1bee7","#f8bbd0","#ffcc80","#ffab91","#e6ee9c","#a5d6a7","#ffee58","#9ccc65","#26c6da","#42a5f5","#ab47bc","#ec407a","#ffa726","#ff7043","#d4e157","#66bb6a","#ffffff","#fafafa","#f5f5f5","#eeeeee","#e0e0e0","#bdbdbd","#e8eaf6","#efebe9","#eceff1","#fafafa"],p=class{id="highlight";name="Highlight";priority=24;config;colors;locale;constructor(e){this.config={...e},this.colors=s(e?.colors,n,"HighlightPlugin")}async init(e){this.locale=await r(e,this.config.locale,g,h),e.registerStyleSheet(i),this.registerMarkSpec(e),this.registerCommands(e),this.registerToolbarItem(e)}registerMarkSpec(r){r.registerMarkSpec({type:"highlight",rank:4,attrs:{color:{default:""}},toDOM(e){const r=document.createElement("span");return t(r,"backgroundColor",e.attrs?.color??""),r},toHTMLString:(t,r,o)=>{const s=String(t.attrs?.color??"");if(!s||!a(s))return r;const i=`background-color: ${e(s)}`;return`<span${o?.styleAttr(i)??` style="${i}"`}>${r}</span>`},toHTMLStyle:t=>{const r=String(t.attrs?.color??"");return r&&a(r)?`background-color: ${e(r)}`:null},parseHTML:[{tag:"span",getAttrs:e=>{const t=e.style.backgroundColor;return!(!t||!a(t))&&{color:t}}}],sanitize:{tags:["span"]}})}registerCommands(e){e.registerCommand("removeHighlight",()=>l(e,e.getState(),"highlight"))}registerToolbarItem(e){const t=['<svg xmlns="http://www.w3.org/2000/svg"',' viewBox="0 0 24 24">','<path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/>','<rect x="3" y="17" width="18" height="6"',' rx="0.5" fill="#fff176"/>',"</svg>"].join("");e.registerToolbarItem({id:"highlight",group:"format",icon:t,label:this.locale.label,tooltip:this.locale.tooltip,command:"removeHighlight",popupType:"custom",renderPopup:(e,t,r)=>{c(e,t,{markType:"highlight",colors:this.colors,columns:10,resetLabel:this.locale.resetLabel,resetCommand:"removeHighlight",ariaLabelPrefix:this.locale.ariaLabelPrefix,onClose:r})},isActive:e=>f(e,"highlight")})}};export{g as n,h as r,p as t};
2
- //# sourceMappingURL=HighlightPlugin-RN3l6pVJ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HighlightPlugin-RN3l6pVJ.mjs","names":[],"sources":["../../src/plugins/highlight/HighlightLocale.ts","../../src/plugins/highlight/HighlightPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the HighlightPlugin. */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface HighlightLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n\treadonly resetLabel: string;\n\treadonly ariaLabelPrefix: string;\n}\n\n// --- Default English Locale ---\n\nexport const HIGHLIGHT_LOCALE_EN: HighlightLocale = {\n\tlabel: 'Highlight',\n\ttooltip: 'Highlight Color',\n\tresetLabel: 'None',\n\tariaLabelPrefix: 'Highlight color',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<HighlightLocale> = import.meta.glob<{\n\tdefault: HighlightLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadHighlightLocale(lang: string): Promise<HighlightLocale> {\n\treturn loadLocaleModule(localeModules, lang, HIGHLIGHT_LOCALE_EN);\n}\n","/**\n * HighlightPlugin: registers a highlight (background-color) mark with attrs,\n * toolbar button with a color picker popup, and removeHighlight command.\n */\n\nimport { COLOR_PICKER_CSS } from '../../editor/styles/color-picker.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { HTMLExportContext } from '../../model/NodeSpec.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isColorMarkActive, removeColorMark } from '../shared/ColorMarkOperations.js';\nimport { renderColorPickerPopup } from '../shared/ColorPickerPopup.js';\nimport { isValidCSSColor, resolveColors } from '../shared/ColorValidation.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport {\n\tHIGHLIGHT_LOCALE_EN,\n\ttype HighlightLocale,\n\tloadHighlightLocale,\n} from './HighlightLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\thighlight: { color: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface HighlightConfig {\n\t/**\n\t * Restricts the color picker to a specific set of hex colors.\n\t * Each value must be a valid hex color code (`#RGB` or `#RRGGBB`).\n\t * Duplicates are removed automatically (case-insensitive).\n\t * When omitted, the full default palette is shown.\n\t */\n\treadonly colors?: readonly string[];\n\treadonly locale?: HighlightLocale;\n}\n\n// --- Color Palette (Highlight-optimized: 10 columns x 5 rows) ---\n\nconst HIGHLIGHT_PALETTE: readonly string[] = [\n\t// Row 1 — Classic highlighter colors (bright, vivid)\n\t'#fff176',\n\t'#aed581',\n\t'#4dd0e1',\n\t'#64b5f6',\n\t'#ce93d8',\n\t'#f48fb1',\n\t'#ffab91',\n\t'#ff8a65',\n\t'#e6ee9c',\n\t'#80cbc4',\n\t// Row 2 — Light pastels\n\t'#fff9c4',\n\t'#dcedc8',\n\t'#e0f7fa',\n\t'#e3f2fd',\n\t'#f3e5f5',\n\t'#fce4ec',\n\t'#fff3e0',\n\t'#fbe9e7',\n\t'#f9fbe7',\n\t'#e0f2f1',\n\t// Row 3 — Medium pastels\n\t'#fff59d',\n\t'#c5e1a5',\n\t'#80deea',\n\t'#90caf9',\n\t'#e1bee7',\n\t'#f8bbd0',\n\t'#ffcc80',\n\t'#ffab91',\n\t'#e6ee9c',\n\t'#a5d6a7',\n\t// Row 4 — Bold pastels\n\t'#ffee58',\n\t'#9ccc65',\n\t'#26c6da',\n\t'#42a5f5',\n\t'#ab47bc',\n\t'#ec407a',\n\t'#ffa726',\n\t'#ff7043',\n\t'#d4e157',\n\t'#66bb6a',\n\t// Row 5 — Grays and neutral highlights\n\t'#ffffff',\n\t'#fafafa',\n\t'#f5f5f5',\n\t'#eeeeee',\n\t'#e0e0e0',\n\t'#bdbdbd',\n\t'#e8eaf6',\n\t'#efebe9',\n\t'#eceff1',\n\t'#fafafa',\n];\n\n// --- Plugin ---\n\nexport class HighlightPlugin implements Plugin {\n\treadonly id = 'highlight';\n\treadonly name = 'Highlight';\n\treadonly priority = 24;\n\n\tprivate readonly config: HighlightConfig;\n\tprivate readonly colors: readonly string[];\n\tprivate locale!: HighlightLocale;\n\n\tconstructor(config?: Partial<HighlightConfig>) {\n\t\tthis.config = { ...config };\n\t\tthis.colors = resolveColors(config?.colors, HIGHLIGHT_PALETTE, 'HighlightPlugin');\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tHIGHLIGHT_LOCALE_EN,\n\t\t\tloadHighlightLocale,\n\t\t);\n\n\t\tcontext.registerStyleSheet(COLOR_PICKER_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'highlight',\n\t\t\trank: 4,\n\t\t\tattrs: {\n\t\t\t\tcolor: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tconst color = mark.attrs?.color ?? '';\n\t\t\t\tsetStyleProperty(span, 'backgroundColor', color);\n\t\t\t\treturn span;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content, ctx?: HTMLExportContext) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\tif (!color || !isValidCSSColor(color)) return content;\n\t\t\t\tconst decl: string = `background-color: ${escapeHTML(color)}`;\n\t\t\t\tconst attr: string = ctx?.styleAttr(decl) ?? ` style=\"${decl}\"`;\n\t\t\t\treturn `<span${attr}>${content}</span>`;\n\t\t\t},\n\t\t\ttoHTMLStyle: (mark) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\tif (!color || !isValidCSSColor(color)) return null;\n\t\t\t\treturn `background-color: ${escapeHTML(color)}`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst color: string = el.style.backgroundColor;\n\t\t\t\t\t\tif (!color || !isValidCSSColor(color)) return false;\n\t\t\t\t\t\treturn { color };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['span'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeHighlight', () => {\n\t\t\treturn removeColorMark(context, context.getState(), 'highlight');\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst pathD =\n\t\t\t'M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2z' + 'm-1.38 9L12 5.67 14.38 12H9.62z';\n\t\tconst icon: string = [\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\"',\n\t\t\t' viewBox=\"0 0 24 24\">',\n\t\t\t`<path d=\"${pathD}\"/>`,\n\t\t\t'<rect x=\"3\" y=\"17\" width=\"18\" height=\"6\"',\n\t\t\t' rx=\"0.5\" fill=\"#fff176\"/>',\n\t\t\t'</svg>',\n\t\t].join('');\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'highlight',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeHighlight',\n\t\t\tpopupType: 'custom',\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderColorPickerPopup(container, ctx, {\n\t\t\t\t\tmarkType: 'highlight',\n\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\tcolumns: 10,\n\t\t\t\t\tresetLabel: this.locale.resetLabel,\n\t\t\t\t\tresetCommand: 'removeHighlight',\n\t\t\t\t\tariaLabelPrefix: this.locale.ariaLabelPrefix,\n\t\t\t\t\tonClose,\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (state: EditorState) => isColorMarkActive(state, 'highlight'),\n\t\t});\n\t}\n}\n"],"mappings":"4TAeA,IAAa,EAAuC,CACnD,MAAO,YACP,QAAS,kBACT,WAAY,OACZ,gBAAiB,mBAKZ,iBAAkD,OAAA,OAAA,CAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,uBAIxD,eAAsB,EAAoB,GACzC,OAAO,EAAiB,EAAe,EAAM,GCe9C,IAAM,EAAuC,CAE5C,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAKY,EAAb,MACC,GAAc,YACd,KAAgB,YAChB,SAAoB,GAEpB,OACA,OACA,OAEA,WAAA,CAAY,GACX,KAAK,OAAS,IAAK,GACnB,KAAK,OAAS,EAAc,GAAQ,OAAQ,EAAmB,mBAGhE,UAAM,CAAK,GACV,KAAK,aAAe,EACnB,EACA,KAAK,OAAO,OACZ,EACA,GAGD,EAAQ,mBAAmB,GAC3B,KAAK,iBAAiB,GACtB,KAAK,iBAAiB,GACtB,KAAK,oBAAoB,GAG1B,gBAAA,CAAyB,GACxB,EAAQ,iBAAiB,CACxB,KAAM,YACN,KAAM,EACN,MAAO,CACN,MAAO,CAAE,QAAS,KAEnB,KAAA,CAAM,GACL,MAAM,EAAO,SAAS,cAAc,QAGpC,OADA,EAAiB,EAAM,kBADT,EAAK,OAAO,OAAS,IAE5B,GAER,aAAA,CAAe,EAAM,EAAS,KAC7B,MAAM,EAAgB,OAAO,EAAK,OAAO,OAAS,IAClD,IAAK,IAAU,EAAgB,GAAQ,OAAO,EAC9C,MAAM,EAAe,qBAAqB,EAAW,KAErD,MAAO,QADc,GAAK,UAAU,IAAS,WAAW,QACjC,YAExB,YAAc,IACb,MAAM,EAAgB,OAAO,EAAK,OAAO,OAAS,IAClD,OAAK,GAAU,EAAgB,GACxB,qBAAqB,EAAW,KADO,MAG/C,UAAW,CACV,CACC,IAAK,OACL,SAAW,IACV,MAAM,EAAgB,EAAG,MAAM,gBAC/B,SAAK,IAAU,EAAgB,KACxB,CAAE,YAIZ,SAAU,CAAE,KAAM,CAAC,WAIrB,gBAAA,CAAyB,GACxB,EAAQ,gBAAgB,kBAAA,IAChB,EAAgB,EAAS,EAAQ,WAAY,cAItD,mBAAA,CAA4B,GAG3B,MAAM,EAAe,CACpB,0CACA,wBACA,gGACA,2CACA,6BACA,UACC,KAAK,IAEP,EAAQ,oBAAoB,CAC3B,GAAI,YACJ,MAAO,SACP,OACA,MAAO,KAAK,OAAO,MACnB,QAAS,KAAK,OAAO,QACrB,QAAS,kBACT,UAAW,SACX,YAAA,CAAc,EAAW,EAAK,KAC7B,EAAuB,EAAW,EAAK,CACtC,SAAU,YACV,OAAQ,KAAK,OACb,QAAS,GACT,WAAY,KAAK,OAAO,WACxB,aAAc,kBACd,gBAAiB,KAAK,OAAO,gBAC7B,aAGF,SAAW,GAAuB,EAAkB,EAAO"}
@@ -1,2 +0,0 @@
1
- import{r as t}from"./Document-_qdGR4vh.mjs";import{o as r,t as e,u as o}from"./Selection-aeiSsvhe.mjs";import{a as i}from"./TypeBrands-BZDKMjR-.mjs";import{n as s}from"./DomUtils-RKbAVBQz.mjs";import{i as l,o as a}from"./PluginHelpers-D-MvWR98.mjs";import{t as n}from"./ShortcutFormatting-DE6B8iGs.mjs";var c={label:"Horizontal Rule",tooltip:t=>`Horizontal Rule (${t})`},m=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-C5dW-co3.mjs"),"./locales/de.ts":()=>import("./de-CAVCXBBR.mjs"),"./locales/es.ts":()=>import("./es-Bu6nnEeT.mjs"),"./locales/fr.ts":()=>import("./fr-Bom3RFIN.mjs"),"./locales/hi.ts":()=>import("./hi-BoFuxLtG.mjs"),"./locales/pt.ts":()=>import("./pt-SjvTF40s.mjs"),"./locales/ru.ts":()=>import("./ru-2MDGmLw0.mjs"),"./locales/zh.ts":()=>import("./zh-C33e4gfg.mjs")});async function p(t){return a(m,t,c)}var u={};function h(t){const r=t.selection;return o(r)?t.doc.children.findIndex(t=>t.id===r.anchor.blockId):-1}var d=class{id="horizontal-rule";name="Horizontal Rule";priority=40;config;locale;constructor(t){this.config={...u,...t}}async init(t){this.locale=await l(t,this.config.locale,c,p),this.registerNodeSpec(t),this.registerCommands(t),this.registerKeymap(t),this.registerInputRule(t),this.registerToolbarItem(t)}registerNodeSpec(t){t.registerNodeSpec({type:"horizontal_rule",group:"block",isVoid:!0,toDOM:t=>s("hr",t.id),toHTML:()=>"<hr>",parseHTML:[{tag:"hr"}],sanitize:{tags:["hr"]}})}registerCommands(t){t.registerCommand("insertHorizontalRule",()=>this.insertHorizontalRule(t))}registerKeymap(t){t.registerKeymap({"Mod-Shift-H":()=>t.executeCommand("insertHorizontalRule")})}registerInputRule(s){s.registerInputRule({pattern:/^-{3,} $/,handler(s,l,a,n){const c=s.selection;if(!o(c))return null;if(!r(c))return null;const m=s.getBlock(c.anchor.blockId);if(!m||"paragraph"!==m.type)return null;const p=h(s);if(-1===p)return null;const u=t(i("paragraph"));return s.transaction("input").deleteTextAt(c.anchor.blockId,0,n).setBlockType(c.anchor.blockId,i("horizontal_rule")).insertNode([],p+1,u).setSelection(e(u.id,0)).build()}})}registerToolbarItem(t){t.registerToolbarItem({id:"horizontal-rule",group:"block",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11h16v2H4z"/></svg>',label:this.locale.label,tooltip:this.locale.tooltip(n("Mod-Shift-H")),command:"insertHorizontalRule",isActive:()=>!1})}insertHorizontalRule(r){const s=r.getState();if(!o(s.selection))return!1;const l=h(s);if(-1===l)return!1;const a=t(i("horizontal_rule")),n=t(i("paragraph")),c=s.transaction("command").insertNode([],l+1,a).insertNode([],l+2,n).setSelection(e(n.id,0)).build();return r.dispatch(c),!0}};export{c as n,p as r,d as t};
2
- //# sourceMappingURL=HorizontalRulePlugin-BJPXzTtJ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HorizontalRulePlugin-BJPXzTtJ.mjs","names":[],"sources":["../../src/plugins/horizontal-rule/HorizontalRuleLocale.ts","../../src/plugins/horizontal-rule/HorizontalRulePlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the HorizontalRulePlugin. */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface HorizontalRuleLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const HORIZONTAL_RULE_LOCALE_EN: HorizontalRuleLocale = {\n\tlabel: 'Horizontal Rule',\n\ttooltip: (shortcut: string) => `Horizontal Rule (${shortcut})`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<HorizontalRuleLocale> = import.meta.glob<{\n\tdefault: HorizontalRuleLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadHorizontalRuleLocale(lang: string): Promise<HorizontalRuleLocale> {\n\treturn loadLocaleModule(localeModules, lang, HORIZONTAL_RULE_LOCALE_EN);\n}\n","/**\n * HorizontalRulePlugin: registers a horizontal rule (divider) void block type\n * with NodeSpec, insert command, input rule, keyboard shortcut, and toolbar button.\n */\n\nimport { createBlockNode } from '../../model/Document.js';\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { createBlockElement } from '../../view/DomUtils.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport {\n\tHORIZONTAL_RULE_LOCALE_EN,\n\ttype HorizontalRuleLocale,\n\tloadHorizontalRuleLocale,\n} from './HorizontalRuleLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\thorizontal_rule: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\nexport interface HorizontalRuleConfig {\n\t/** Locale override for user-facing strings. */\n\treadonly locale?: HorizontalRuleLocale;\n}\n\nconst DEFAULT_CONFIG: HorizontalRuleConfig = {};\n\n// --- Helpers ---\n\n/** Finds the index of the cursor's block among top-level document children. */\nfunction findBlockIndexForCursor(state: EditorState): number {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return -1;\n\treturn state.doc.children.findIndex((b) => b.id === sel.anchor.blockId);\n}\n\n// --- Plugin ---\n\nexport class HorizontalRulePlugin implements Plugin {\n\treadonly id = 'horizontal-rule';\n\treadonly name = 'Horizontal Rule';\n\treadonly priority = 40;\n\n\tprivate readonly config: HorizontalRuleConfig;\n\tprivate locale!: HorizontalRuleLocale;\n\n\tconstructor(config?: Partial<HorizontalRuleConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tHORIZONTAL_RULE_LOCALE_EN,\n\t\t\tloadHorizontalRuleLocale,\n\t\t);\n\t\tthis.registerNodeSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t\tthis.registerInputRule(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerNodeSpec(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'horizontal_rule',\n\t\t\tgroup: 'block',\n\t\t\tisVoid: true,\n\t\t\ttoDOM(node) {\n\t\t\t\treturn createBlockElement('hr', node.id);\n\t\t\t},\n\t\t\ttoHTML() {\n\t\t\t\treturn '<hr>';\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'hr' }],\n\t\t\tsanitize: { tags: ['hr'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('insertHorizontalRule', () => {\n\t\t\treturn this.insertHorizontalRule(context);\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-Shift-H': () => context.executeCommand('insertHorizontalRule'),\n\t\t});\n\t}\n\n\tprivate registerInputRule(context: PluginContext): void {\n\t\tcontext.registerInputRule({\n\t\t\tpattern: /^-{3,} $/,\n\t\t\thandler(state, _match, _start, end) {\n\t\t\t\tconst sel = state.selection;\n\t\t\t\tif (!isTextSelection(sel)) return null;\n\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\tconst blockIndex: number = findBlockIndexForCursor(state);\n\t\t\t\tif (blockIndex === -1) return null;\n\n\t\t\t\tconst newParagraph = createBlockNode(nodeType('paragraph'));\n\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, 0, end)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('horizontal_rule'))\n\t\t\t\t\t.insertNode([], blockIndex + 1, newParagraph)\n\t\t\t\t\t.setSelection(createCollapsedSelection(newParagraph.id, 0))\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst icon =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 11h16v2H4z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'horizontal-rule',\n\t\t\tgroup: 'block',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip(formatShortcut('Mod-Shift-H')),\n\t\t\tcommand: 'insertHorizontalRule',\n\t\t\tisActive: () => false,\n\t\t});\n\t}\n\n\t/**\n\t * Inserts a horizontal rule after the current block,\n\t * followed by a new paragraph for continued editing.\n\t */\n\tprivate insertHorizontalRule(context: PluginContext): boolean {\n\t\tconst state: EditorState = context.getState();\n\t\tif (!isTextSelection(state.selection)) return false;\n\t\tconst blockIndex: number = findBlockIndexForCursor(state);\n\t\tif (blockIndex === -1) return false;\n\n\t\tconst hrBlock = createBlockNode(nodeType('horizontal_rule'));\n\t\tconst newParagraph = createBlockNode(nodeType('paragraph'));\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.insertNode([], blockIndex + 1, hrBlock)\n\t\t\t.insertNode([], blockIndex + 2, newParagraph)\n\t\t\t.setSelection(createCollapsedSelection(newParagraph.id, 0))\n\t\t\t.build();\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n}\n"],"mappings":"+SAaA,IAAa,EAAkD,CAC9D,MAAO,kBACP,QAAU,GAAqB,oBAAoB,MAK9C,iBAAuD,OAAA,OAAA,CAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,uBAI7D,eAAsB,EAAyB,GAC9C,OAAO,EAAiB,EAAe,EAAM,GCS9C,IAAM,EAAuC,CAAA,EAK7C,SAAS,EAAwB,GAChC,MAAM,EAAM,EAAM,UAClB,OAAK,EAAgB,GACd,EAAM,IAAI,SAAS,UAAW,GAAM,EAAE,KAAO,EAAI,OAAO,UAD7B,EAMnC,IAAa,EAAb,MACC,GAAc,kBACd,KAAgB,kBAChB,SAAoB,GAEpB,OACA,OAEA,WAAA,CAAY,GACX,KAAK,OAAS,IAAK,KAAmB,GAGvC,UAAM,CAAK,GACV,KAAK,aAAe,EACnB,EACA,KAAK,OAAO,OACZ,EACA,GAED,KAAK,iBAAiB,GACtB,KAAK,iBAAiB,GACtB,KAAK,eAAe,GACpB,KAAK,kBAAkB,GACvB,KAAK,oBAAoB,GAG1B,gBAAA,CAAyB,GACxB,EAAQ,iBAAiB,CACxB,KAAM,kBACN,MAAO,QACP,QAAQ,EACR,MAAM,GACE,EAAmB,KAAM,EAAK,IAEtC,OAAA,IACQ,OAER,UAAW,CAAC,CAAE,IAAK,OACnB,SAAU,CAAE,KAAM,CAAC,SAIrB,gBAAA,CAAyB,GACxB,EAAQ,gBAAgB,uBAAA,IAChB,KAAK,qBAAqB,IAInC,cAAA,CAAuB,GACtB,EAAQ,eAAe,CACtB,cAAA,IAAqB,EAAQ,eAAe,0BAI9C,iBAAA,CAA0B,GACzB,EAAQ,kBAAkB,CACzB,QAAS,WACT,OAAA,CAAQ,EAAO,EAAQ,EAAQ,GAC9B,MAAM,EAAM,EAAM,UAClB,IAAK,EAAgB,GAAM,OAAO,KAClC,IAAK,EAAY,GAAM,OAAO,KAE9B,MAAM,EAAQ,EAAM,SAAS,EAAI,OAAO,SACxC,IAAK,GAAwB,cAAf,EAAM,KAAsB,OAAO,KAEjD,MAAM,EAAqB,EAAwB,GACnD,IAAmB,IAAf,EAAmB,OAAO,KAE9B,MAAM,EAAe,EAAgB,EAAS,cAE9C,OAAO,EACL,YAAY,SACZ,aAAa,EAAI,OAAO,QAAS,EAAG,GACpC,aAAa,EAAI,OAAO,QAAS,EAAS,oBAC1C,WAAW,GAAI,EAAa,EAAG,GAC/B,aAAa,EAAyB,EAAa,GAAI,IACvD,WAKL,mBAAA,CAA4B,GAI3B,EAAQ,oBAAoB,CAC3B,GAAI,kBACJ,MAAO,QACP,KALA,8FAMA,MAAO,KAAK,OAAO,MACnB,QAAS,KAAK,OAAO,QAAQ,EAAe,gBAC5C,QAAS,uBACT,SAAA,KAAgB,IAQlB,oBAAA,CAA6B,GAC5B,MAAM,EAAqB,EAAQ,WACnC,IAAK,EAAgB,EAAM,WAAY,OAAO,EAC9C,MAAM,EAAqB,EAAwB,GACnD,IAAmB,IAAf,EAAmB,OAAO,EAE9B,MAAM,EAAU,EAAgB,EAAS,oBACnC,EAAe,EAAgB,EAAS,cAExC,EAAK,EACT,YAAY,WACZ,WAAW,GAAI,EAAa,EAAG,GAC/B,WAAW,GAAI,EAAa,EAAG,GAC/B,aAAa,EAAyB,EAAa,GAAI,IACvD,QAGF,OADA,EAAQ,SAAS,IACV"}
@@ -1,2 +0,0 @@
1
- import{l as t,r as e,y as n}from"./Document-_qdGR4vh.mjs";import{c as i,l as r,r as o}from"./Selection-aeiSsvhe.mjs";import{a}from"./TypeBrands-BZDKMjR-.mjs";import{n as s}from"./DomUtils-RKbAVBQz.mjs";import{r as l}from"./HTMLUtils-brwcaufP.mjs";import{t as c}from"./NodeSelectionCommands-Ddxu5Qck.mjs";import{t as d}from"./Platform-D9TRT4Mn.mjs";import{c as g,o as m,r as u,s as p}from"./StyleRuntime-D3d1XFFe.mjs";import{n as h}from"./TypedKeys-CU7aToqY.mjs";import{i as f,o as b}from"./PluginHelpers-D-MvWR98.mjs";import{t as v}from"./ShortcutFormatting-DE6B8iGs.mjs";function x(s,l){const c=s.getState(),d=c.selection,g={src:l.src,alt:l.alt??"",align:l.align??"center",...void 0!==l.width?{width:l.width}:{},...void 0!==l.height?{height:l.height}:{}};if(i(d))return!1;const m=r(d)?d.nodeId:d.anchor.blockId,u=function(t,e){if("table_cell"===t.getBlock(e)?.type)return e;const n=t.getNodePath(e);if(n)for(const i of n)if("table_cell"===t.getBlock(i)?.type)return i}(c,m);return u?function(i,r,s,l){const c=i.getNodePath(s);if(!c)return!1;const d=e(a("image"),[],void 0,l),g=i.getBlock(s);if(!g)return!1;const m=i.transaction("command"),u=t(g);for(let t=u.length-1;t>=0;t--){const e=g.children.findIndex(e=>n(e)&&e.id===u[t]?.id);-1!==e&&m.removeNode(c,e)}return m.insertNode(c,0,d),m.setSelection(o(d.id,[...c,d.id])),r.dispatch(m.build()),!0}(c,s,u,g):function(t,n,i,r){const s=t.doc.children.findIndex(t=>t.id===i);if(-1===s)return!1;const l=e(a("image"),[],void 0,r),c=e(a("paragraph")),d=t.transaction("command").insertNode([],s+1,l).insertNode([],s+2,c).setSelection(o(l.id,[])).build();return n.dispatch(d),!0}(c,s,m,g)}function w(t,e,n){const i=t.getState(),o=i.selection;if(!r(o))return!1;const a=i.getBlock(o.nodeId);if(!a||"image"!==a.type)return!1;const s=a.attrs?.width,l=a.attrs?.height;if(void 0===s||void 0===l)return!1;const c=l>0?s/l:1,d=Math.max(50,Math.min(n,s+e)),g=Math.round(d/c);return(d!==s||g!==l)&&function(t,e){const n=t.getState(),i=n.selection;if(!r(i))return!1;const o=n.getBlock(i.nodeId);if(!o||"image"!==o.type)return!1;const a=n.getNodePath(i.nodeId);if(!a)return!1;const s={...o.attrs??{},...e},l=n.transaction("command").setNodeAttr(a,s).build();return t.dispatch(l),!0}(t,{width:d,height:g})}var z={insertImage:"Insert Image",insertImageTooltip:"Insert Image",uploadFromComputer:"Upload from computer",uploadAria:"Upload image from computer",separator:"or",urlPlaceholder:"https://...",urlAria:"Image URL",insertButton:"Insert",insertAria:"Insert image",imageAria:(t,e,n)=>{const i=[t||"Image"];return void 0!==e&&void 0!==n&&i.push(`${e} by ${n} pixels`),i.join(", ")},resetToNaturalSize:"Image reset to natural size.",uploadFailed:"Upload failed.",uploading:"Uploading...",resizeHandleLabel:t=>`Resize ${t}`,imageSelected:"Image selected.",altTextPrefix:"Alt text: ",imageSizeAnnounce:(t,e)=>`Size: ${t} by ${e} pixels.`,resizeHint:(t,e)=>`${t} / ${e} to resize.`,imageResized:(t,e)=>`Image resized to ${t} by ${e} pixels.`,keyboardResizeHint:(t,e)=>`${t} / ${e} to resize`},y=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-CO60qpZJ.mjs"),"./locales/de.ts":()=>import("./de-BpmjrOMc.mjs"),"./locales/es.ts":()=>import("./es-BbX_lEEN.mjs"),"./locales/fr.ts":()=>import("./fr-CZAbL_o0.mjs"),"./locales/hi.ts":()=>import("./hi-Dup389dM.mjs"),"./locales/pt.ts":()=>import("./pt-C8MhLnWx.mjs"),"./locales/ru.ts":()=>import("./ru-v9zumXd2.mjs"),"./locales/zh.ts":()=>import("./zh-B46Dt1h7.mjs")});async function _(t){return b(y,t,z)}var S={start:"notectl-image--start",center:"notectl-image--center",end:"notectl-image--end"},I={nw:"nwse-resize",ne:"nesw-resize",sw:"nesw-resize",se:"nwse-resize"},k={nw:-1,ne:1,sw:-1,se:1},L={nw:"top-left",ne:"top-right",sw:"bottom-left",se:"bottom-right"},C={nw:"top-right",ne:"top-left",sw:"bottom-right",se:"bottom-left"},A={nw:"nesw-resize",ne:"nwse-resize",sw:"nwse-resize",se:"nesw-resize"};function N(t,e,n=z){const i=(e?C:L)[t];return n.resizeHandleLabel(i)}var j=null;function E(){j&&(j.remove(),j=null)}function $(t,e,n,i=z){return(r,o,a)=>{const s=document.createElement("figure");s.className="notectl-image",s.setAttribute("data-block-id",r.id),s.setAttribute("data-void","true"),s.setAttribute("data-selectable","true");const l=document.createElement("div");l.className="notectl-image__container";const c=document.createElement("img");c.className="notectl-image__img",c.draggable=!1;const g=document.createElement("div");g.className="notectl-image__overlay",l.appendChild(c),l.appendChild(g),s.appendChild(l);let h=r.id,f=null;function b(t){const n=t.attrs?.src??"",r=t.attrs?.alt??"",o=t.attrs?.width,a=t.attrs?.height,l=t.attrs?.align??"center";c.src!==n&&(c.src=n),c.alt=r,p(c,"width",void 0!==o?`${o}px`:""),p(c,"height",void 0!==a?`${a}px`:"");for(const e of Object.values(S))s.classList.remove(e);const d=S[l];d&&s.classList.add(d);const m=e.get(t.id)??"idle",u="uploading"===m;g.classList.toggle("notectl-image__overlay--uploading",u),g.classList.toggle("notectl-image__overlay--error","error"===m),g.textContent=u?i.uploading:"error"===m?i.uploadFailed:"",u?s.setAttribute("aria-busy","true"):s.removeAttribute("aria-busy"),function(t){const e=t.attrs?.alt??"",n=t.attrs?.width,r=t.attrs?.height;s.setAttribute("aria-label",i.imageAria(e,n,r))}(t)}b(r);let x=!1;function w(e,n,i,r){let l=0,g=0,p=1,h=k[n];const f=e=>{const n=e.clientX-l,i=(o=g+n*h,Math.max(50,Math.min(t.maxWidth,o)));var o;const a=Math.round(i/p);m(c,{width:`${i}px`,height:`${a}px`}),r.textContent=`${Math.round(i)} × ${a}`},b=t=>{document.removeEventListener("pointermove",f),document.removeEventListener("pointerup",b),s.classList.remove("notectl-image--resizing"),r.classList.remove("notectl-image__size-indicator--visible"),E();const e=Math.round(c.getBoundingClientRect().width);!function(t,e,n){const i=o(),r=i.getBlock(t);if(!r)return;const s=r.attrs?.width,l=r.attrs?.height;if(s===e&&l===n)return;const c=i.getNodePath(t);if(!c)return;const d={...r.attrs??{},width:e,height:n};a(i.transaction("command").setNodeAttr(c,d).build())}(i,e,Math.round(e/p)),t.target?.releasePointerCapture?.(t.pointerId)};e.addEventListener("pointerdown",t=>{t.preventDefault(),t.stopPropagation();const e="rtl"===d(s);h=function(t,e){const n=k[t];return e?-n:n}(n,e),l=t.clientX,g=c.getBoundingClientRect().width;const i=c.getBoundingClientRect().height;p=i>0?g/i:1,s.classList.add("notectl-image--resizing"),r.textContent=`${Math.round(g)} × ${Math.round(i)}`,r.classList.add("notectl-image__size-indicator--visible"),function(t,e){E(),j=document.createElement("style");const n=e?u(e):void 0;n&&j.setAttribute("nonce",n),j.textContent=`*{cursor:${t}!important;user-select:none!important}`,document.head.appendChild(j)}(e?A[n]:I[n],s),t.target.setPointerCapture(t.pointerId),document.addEventListener("pointermove",f),document.addEventListener("pointerup",b)})}function z(){E(),f&&(f.remove(),f=null)}return c.addEventListener("load",()=>{if(x)return;const e=o(),n=e.getBlock(h);if(!n||"image"!==n.type)return;const i=void 0!==n.attrs?.width,r=void 0!==n.attrs?.height;if(i&&r)return void(x=!0);const s=c.naturalWidth,l=c.naturalHeight;if(0===s||0===l)return;const d=Math.min(s,t.maxWidth),g=s>0?l/s:1,m=Math.round(d*g),u=e.getNodePath(h);if(!u)return;const p={...n.attrs??{},width:d,height:m};a(e.transaction("command").setNodeAttr(u,p).build()),x=!0}),{dom:s,contentDOM:null,update:t=>"image"===t.type&&(h=t.id,s.setAttribute("data-block-id",t.id),b(t),!0),selectNode(){s.classList.add("notectl-image--selected"),function(e){if(!t.resizable||f)return;f=document.createElement("div"),f.className="notectl-image__resize-overlay",f.setAttribute("data-notectl-no-print","");const r=document.createElement("div");r.className="notectl-image__size-indicator",f.appendChild(r);const o="rtl"===d(s);for(const t of["nw","ne","sw","se"]){const n=document.createElement("div");n.className=`notectl-image__resize-handle notectl-image__resize-handle--${t}`,n.setAttribute("role","separator"),n.setAttribute("aria-label",N(t,o,i)),w(n,t,e,r),f.appendChild(n)}if(n){const t=function(t,e){const n=t.shrinkWidth??null,i=t.growWidth??null;return n&&i?e.keyboardResizeHint(v(n),v(i)):""}(n,i);if(t){const e=document.createElement("div");e.className="notectl-image__keyboard-hint",e.setAttribute("aria-hidden","true"),e.textContent=t,f.appendChild(e)}}l.appendChild(f)}(h)},deselectNode(){s.classList.remove("notectl-image--selected"),z()},destroy(){z()}}}}var R=new h("image:upload"),M={growWidth:"Mod-Shift-ArrowRight",shrinkWidth:"Mod-Shift-ArrowLeft",growWidthLarge:"Mod-Shift-Alt-ArrowRight",shrinkWidthLarge:"Mod-Shift-Alt-ArrowLeft",resetSize:"Mod-Shift-0"},T={maxWidth:800,maxFileSize:10485760,acceptedTypes:["image/png","image/jpeg","image/gif","image/webp","image/svg+xml"],resizable:!0,resizeStep:10,resizeStepLarge:50},U=class{id="image";name="Image";priority=45;config;resolvedKeymap;uploadStates=/* @__PURE__ */new Map;blobUrls=/* @__PURE__ */new Set;context=null;locale;constructor(t){this.config={...T,...t},this.resolvedKeymap={...M,...t?.keymap}}async init(t){this.locale=await f(t,this.config.locale,z,_),t.registerStyleSheet('\n/* Image */\n.notectl-image {\n\tmargin: 8px 0;\n\tuser-select: none;\n\tline-height: 0;\n}\n\n.notectl-image--center {\n\ttext-align: center;\n}\n\n.notectl-image--start {\n\ttext-align: start;\n}\n\n.notectl-image--end {\n\ttext-align: end;\n}\n\n.notectl-image__container {\n\tdisplay: inline-block;\n\tposition: relative;\n\tline-height: 0;\n}\n\n.notectl-image__img {\n\tdisplay: block;\n\tmax-width: 100%;\n\tborder-radius: 4px;\n}\n\n.notectl-image--selected .notectl-image__container {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 2px;\n\tborder-radius: 6px;\n}\n\n/* Alignment toolbar (appears on image selection) */\n.notectl-image__align-toolbar {\n\tdisplay: flex;\n\tgap: 2px;\n\tposition: absolute;\n\ttop: -36px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tpadding: 2px;\n\tbox-shadow: 0 2px 8px var(--notectl-shadow);\n\tz-index: 10;\n}\n\n.notectl-image__align-btn {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\theight: 28px;\n\tborder: none;\n\tbackground: transparent;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n}\n\n.notectl-image__align-btn:hover {\n\tbackground: var(--notectl-hover-bg);\n}\n\n.notectl-image__align-btn--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-image__align-btn svg {\n\twidth: 16px;\n\theight: 16px;\n\tfill: currentColor;\n}\n\n/* Upload overlay */\n.notectl-image__overlay {\n\tposition: absolute;\n\tinset: 0;\n\tdisplay: none;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: rgba(255, 255, 255, 0.8);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg-muted);\n}\n\n.notectl-image__overlay--uploading {\n\tdisplay: flex;\n}\n\n.notectl-image__overlay--error {\n\tdisplay: flex;\n\tbackground: var(--notectl-danger-muted);\n\tcolor: var(--notectl-danger);\n}\n\n/* Resize overlay + handles */\n.notectl-image__resize-overlay {\n\tposition: absolute;\n\tinset: 0;\n\tpointer-events: none;\n}\n\n.notectl-image__resize-handle {\n\tposition: absolute;\n\twidth: 10px;\n\theight: 10px;\n\tbackground: var(--notectl-surface-raised);\n\tborder: 2px solid var(--notectl-primary);\n\tborder-radius: 50%;\n\tpointer-events: all;\n\tz-index: 2;\n\ttransition: transform 0.1s, background 0.1s;\n}\n\n.notectl-image__resize-handle:hover {\n\tbackground: var(--notectl-primary);\n\ttransform: scale(1.3);\n}\n\n.notectl-image--resizing .notectl-image__resize-handle {\n\tbackground: var(--notectl-primary);\n}\n\n.notectl-image__resize-handle--nw {\n\ttop: -5px;\n\tinset-inline-start: -5px;\n\tcursor: nwse-resize;\n}\n\n.notectl-image__resize-handle--ne {\n\ttop: -5px;\n\tinset-inline-end: -5px;\n\tcursor: nesw-resize;\n}\n\n.notectl-image__resize-handle--sw {\n\tbottom: -5px;\n\tinset-inline-start: -5px;\n\tcursor: nesw-resize;\n}\n\n.notectl-image__resize-handle--se {\n\tbottom: -5px;\n\tinset-inline-end: -5px;\n\tcursor: nwse-resize;\n}\n\n/* RTL cursor overrides — flip diagonal cursors when in RTL context */\n[dir="rtl"] .notectl-image__resize-handle--nw {\n\tcursor: nesw-resize;\n}\n\n[dir="rtl"] .notectl-image__resize-handle--ne {\n\tcursor: nwse-resize;\n}\n\n[dir="rtl"] .notectl-image__resize-handle--sw {\n\tcursor: nwse-resize;\n}\n\n[dir="rtl"] .notectl-image__resize-handle--se {\n\tcursor: nesw-resize;\n}\n\n/* Size indicator tooltip */\n.notectl-image__size-indicator {\n\tposition: absolute;\n\tbottom: -28px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tpadding: 2px 8px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\tborder-radius: 4px;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\topacity: 0;\n\ttransition: opacity 0.15s;\n\tz-index: 3;\n}\n\n.notectl-image__size-indicator--visible {\n\topacity: 1;\n}\n\n/* Keyboard resize hint (shown on selection, hidden during drag) */\n.notectl-image__keyboard-hint {\n\tdisplay: none;\n\tposition: absolute;\n\tbottom: -28px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tpadding: 2px 8px;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\twhite-space: nowrap;\n\tpointer-events: none;\n\tz-index: 3;\n}\n\n.notectl-image--selected .notectl-image__keyboard-hint {\n\tdisplay: block;\n}\n\n.notectl-image--resizing .notectl-image__keyboard-hint {\n\tdisplay: none;\n}\n\n/* Resizing feedback */\n.notectl-image--resizing .notectl-image__img {\n\topacity: 0.85;\n}\n'),this.context=t,this.registerNodeSpec(t),this.registerNodeView(t),function(t){t.registerCommand("insertImage",()=>x(t,{src:""})),t.registerCommand("removeImage",()=>function(t){const e=t.getState(),n=e.selection;if(!r(n))return!1;const i=e.getBlock(n.nodeId);if(!i||"image"!==i.type)return!1;const a=e.getNodePath(n.nodeId);if(!a||0===a.length)return!1;const s=c(e,o(n.nodeId,a));return!!s&&(t.dispatch(s),!0)}(t))}(t),this.registerResizeCommands(t),this.registerResizeKeymaps(t),this.registerFileHandler(t),this.registerToolbarItem(t)}destroy(){for(const t of this.blobUrls)URL.revokeObjectURL(t);this.blobUrls.clear(),this.uploadStates.clear(),this.context=null}onStateChange(t,e,n){if(!this.context)return;for(const o of this.uploadStates.keys())e.getBlock(o)||this.uploadStates.delete(o);const i=this.isImageSelected(t),r=this.isImageSelected(e);!i&&r&&this.announceImageSelection(e)}registerNodeSpec(t){const e=this.locale;t.registerNodeSpec({type:"image",group:"block",isVoid:!0,selectable:!0,attrs:{src:{default:""},alt:{default:""},align:{default:"center"}},toDOM(t){const n=s("figure",t.id);n.className="notectl-image",n.setAttribute("data-void","true"),n.setAttribute("data-selectable","true");const i=document.createElement("div");i.className="notectl-image__container";const r=t.attrs?.alt??"",o=t.attrs?.width,a=t.attrs?.height,l=document.createElement("img");l.className="notectl-image__img",l.src=t.attrs?.src??"",l.alt=r,l.draggable=!1,void 0!==o&&p(l,"width",`${o}px`),void 0!==a&&p(l,"height",`${a}px`);const c={start:"notectl-image--start",center:"notectl-image--center",end:"notectl-image--end"}[t.attrs?.align??"center"];return c&&n.classList.add(c),n.setAttribute("aria-label",e.imageAria(r,o,a)),i.appendChild(l),n.appendChild(i),n},toHTML(t){const e=l(t.attrs?.src??""),n=l(t.attrs?.alt??""),i=t.attrs?.width,r=t.attrs?.height;return`<figure><img src="${e}" alt="${n}"${(void 0!==i?` width="${i}"`:"")+(void 0!==r?` height="${r}"`:"")}></figure>`},parseHTML:[{tag:"figure",getAttrs(t){const e=t.querySelector("img");if(!e)return!1;const n={src:e.getAttribute("src")??"",alt:e.getAttribute("alt")??"",align:"center"},i=e.getAttribute("width"),r=e.getAttribute("height");i&&(n.width=Number.parseInt(i,10)),r&&(n.height=Number.parseInt(r,10));const o=t.style?.textAlign??"";return"start"===o||"end"===o||"center"===o?n.align=o:"left"===o?n.align="start":"right"===o?n.align="end":t.classList.contains("notectl-align-start")||t.classList.contains("notectl-align-left")||t.classList.contains("notectl-image--start")||t.classList.contains("notectl-image--left")?n.align="start":t.classList.contains("notectl-align-end")||t.classList.contains("notectl-align-right")||t.classList.contains("notectl-image--end")||t.classList.contains("notectl-image--right")?n.align="end":t.classList.contains("notectl-align-center")&&(n.align="center"),n}},{tag:"img",getAttrs(t){const e={src:t.getAttribute("src")??"",alt:t.getAttribute("alt")??"",align:"center"},n=t.getAttribute("width"),i=t.getAttribute("height");return n&&(e.width=Number.parseInt(n,10)),i&&(e.height=Number.parseInt(i,10)),e}}],sanitize:{tags:["figure","img"],attrs:["src","alt","width","height","class","style"]}})}registerNodeView(t){t.registerNodeView("image",$(this.config,this.uploadStates,this.resolvedKeymap,this.locale))}registerResizeCommands(t){const e=this.config.resizeStep??10,n=this.config.resizeStepLarge??50,i=this.config.maxWidth;t.registerCommand("resizeImageGrow",()=>{const n=w(t,e,i);return n&&this.announceCurrentSize(t),n}),t.registerCommand("resizeImageShrink",()=>{const n=w(t,-e,i);return n&&this.announceCurrentSize(t),n}),t.registerCommand("resizeImageGrowLarge",()=>{const e=w(t,n,i);return e&&this.announceCurrentSize(t),e}),t.registerCommand("resizeImageShrinkLarge",()=>{const e=w(t,-n,i);return e&&this.announceCurrentSize(t),e}),t.registerCommand("resetImageSize",()=>{const e=function(t){const e=t.getState(),n=e.selection;if(!r(n))return!1;const i=e.getBlock(n.nodeId);if(!i||"image"!==i.type)return!1;const o=e.getNodePath(n.nodeId);if(!o)return!1;const a={...i.attrs??{}},s=Object.fromEntries(Object.entries(a).filter(([t])=>"width"!==t&&"height"!==t)),l=e.transaction("command").setNodeAttr(o,s).build();return t.dispatch(l),!0}(t);return e&&t.announce(this.locale.resetToNaturalSize),e})}registerResizeKeymaps(t){const e={};for(const[n,i]of Object.entries({growWidth:"resizeImageGrow",shrinkWidth:"resizeImageShrink",growWidthLarge:"resizeImageGrowLarge",shrinkWidthLarge:"resizeImageShrinkLarge",resetSize:"resetImageSize"})){const r=this.resolvedKeymap[n]??null;r&&(e[r]=()=>t.executeCommand(i))}Object.keys(e).length>0&&t.registerKeymap(e)}registerFileHandler(t){t.registerFileHandler("image/*",async(e,n)=>!!this.isAcceptedType(e.type)&&(this.handleFileInsert(t,e),!0))}handleFileInsert(t,e){if(e.size>this.config.maxFileSize)return;const n=URL.createObjectURL(e);if(this.blobUrls.add(n),!x(t,{src:n}))return URL.revokeObjectURL(n),void this.blobUrls.delete(n);const i=t.getState().selection;if(!r(i))return;const o=i.nodeId;this.uploadStates.set(o,"uploading"),t.getService(R)?this.uploadFile(t,e,o,n):this.uploadStates.set(o,"complete")}async uploadFile(t,e,n,i){const r=t.getService(R);if(r)try{const o=await r.upload(e);this.uploadStates.set(n,"complete");const a=t.getState(),s=a.getBlock(n);if(!s)return;const l=a.getNodePath(n);if(!l)return;const c={...s.attrs??{},src:o.url,...void 0!==o.width?{width:o.width}:{},...void 0!==o.height?{height:o.height}:{}},d=a.transaction("command").setNodeAttr(l,c).build();t.dispatch(d),URL.revokeObjectURL(i),this.blobUrls.delete(i)}catch{this.uploadStates.set(n,"error"),t.announce(this.locale.uploadFailed)}}registerToolbarItem(t){t.registerToolbarItem({id:"image",group:"insert",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg>',label:this.locale.insertImage,tooltip:this.locale.insertImageTooltip,command:"insertImage",popupType:"custom",renderPopup:(t,e,n)=>{!function(t,e,n){p(t,"padding","8px"),p(t,"minWidth","240px"),function(t,e,n){const i=document.createElement("input");i.type="file",i.accept=n.acceptedTypes.join(","),g(i,"position:absolute;width:0;height:0;overflow:hidden;opacity:0;");const r=document.createElement("button");r.type="button",r.textContent=n.locale.uploadFromComputer,r.setAttribute("aria-label",n.locale.uploadAria),g(r,"display:block;width:100%;padding:8px 12px;cursor:pointer;text-align:center;box-sizing:border-box;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-surface-raised);color:var(--notectl-fg);"),r.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),i.click()}),i.addEventListener("change",()=>{const t=i.files?.[0];t&&(n.onFileInsert(e,t),n.onClose(),e.getContainer().focus())}),t.appendChild(i),t.appendChild(r)}(t,e,n),function(t,e){const n=document.createElement("div");g(n,"display:flex;align-items:center;margin:8px 0;color:var(--notectl-fg-muted);font-size:12px;");const i=document.createElement("span");g(i,"flex:1;height:1px;background:var(--notectl-border);");const r=document.createElement("span");r.textContent=e.separator,g(r,"padding:0 8px;");const o=document.createElement("span");g(o,"flex:1;height:1px;background:var(--notectl-border);"),n.appendChild(i),n.appendChild(r),n.appendChild(o),t.appendChild(n)}(t,n.locale),function(t,e,n){const i=document.createElement("input");i.type="url",i.placeholder=n.locale.urlPlaceholder,i.setAttribute("aria-label",n.locale.urlAria),g(i,"width:100%;padding:6px 8px;box-sizing:border-box;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-surface-overlay);color:var(--notectl-fg);");const r=document.createElement("button");r.type="button",r.textContent=n.locale.insertButton,r.setAttribute("aria-label",n.locale.insertAria),g(r,"width:100%;padding:8px 12px;margin-top:4px;cursor:pointer;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-surface-raised);color:var(--notectl-fg);");const o=()=>{const t=i.value.trim();t&&(x(e,{src:t}),n.onClose(),e.getContainer().focus())};r.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),o()}),i.addEventListener("keydown",t=>{"Enter"===t.key&&(t.preventDefault(),o())}),t.appendChild(i),t.appendChild(r),requestAnimationFrame(()=>i.focus())}(t,e,n)}(t,e,{acceptedTypes:this.config.acceptedTypes,locale:this.locale,onFileInsert:(t,e)=>this.handleFileInsert(t,e),onClose:n})}})}isAcceptedType(t){return this.config.acceptedTypes.some(e=>e===t||e.endsWith("/*")&&t.startsWith(e.slice(0,-1)))}isImageSelected(t){const e=t.selection;return!!r(e)&&"image"===t.getBlock(e.nodeId)?.type}announceImageSelection(t){if(!this.context)return;const e=t.selection;if(!r(e))return;const n=t.getBlock(e.nodeId);if(!n||"image"!==n.type)return;const i=n.attrs?.alt??"",o=n.attrs?.width,a=n.attrs?.height,s=[this.locale.imageSelected];i&&s.push(`${this.locale.altTextPrefix}${i}.`),void 0!==o&&void 0!==a&&s.push(this.locale.imageSizeAnnounce(o,a));const l=this.resolvedKeymap.shrinkWidth??null,c=this.resolvedKeymap.growWidth??null;l&&c&&s.push(this.locale.resizeHint(v(l),v(c))),this.context.announce(s.join(" "))}announceCurrentSize(t){const e=t.getState(),n=e.selection;if(!r(n))return;const i=e.getBlock(n.nodeId);if(!i||"image"!==i.type)return;const o=i.attrs?.width,a=i.attrs?.height;void 0!==o&&void 0!==a&&t.announce(this.locale.imageResized(o,a))}};export{_ as a,z as i,M as n,R as r,U as t};
2
- //# sourceMappingURL=ImagePlugin-CCEevNfJ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImagePlugin-CCEevNfJ.mjs","names":[],"sources":["../../src/editor/styles/image.ts","../../src/plugins/image/ImageCommands.ts","../../src/plugins/image/ImageLocale.ts","../../src/plugins/image/ImageNodeView.ts","../../src/plugins/image/ImagePopup.ts","../../src/plugins/image/ImageUpload.ts","../../src/plugins/image/ImagePlugin.ts"],"sourcesContent":["/** Image styles — display, alignment, resize handles, upload overlay. */\nexport const IMAGE_CSS = `\n/* Image */\n.notectl-image {\n\tmargin: 8px 0;\n\tuser-select: none;\n\tline-height: 0;\n}\n\n.notectl-image--center {\n\ttext-align: center;\n}\n\n.notectl-image--start {\n\ttext-align: start;\n}\n\n.notectl-image--end {\n\ttext-align: end;\n}\n\n.notectl-image__container {\n\tdisplay: inline-block;\n\tposition: relative;\n\tline-height: 0;\n}\n\n.notectl-image__img {\n\tdisplay: block;\n\tmax-width: 100%;\n\tborder-radius: 4px;\n}\n\n.notectl-image--selected .notectl-image__container {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 2px;\n\tborder-radius: 6px;\n}\n\n/* Alignment toolbar (appears on image selection) */\n.notectl-image__align-toolbar {\n\tdisplay: flex;\n\tgap: 2px;\n\tposition: absolute;\n\ttop: -36px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tpadding: 2px;\n\tbox-shadow: 0 2px 8px var(--notectl-shadow);\n\tz-index: 10;\n}\n\n.notectl-image__align-btn {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\theight: 28px;\n\tborder: none;\n\tbackground: transparent;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n}\n\n.notectl-image__align-btn:hover {\n\tbackground: var(--notectl-hover-bg);\n}\n\n.notectl-image__align-btn--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-image__align-btn svg {\n\twidth: 16px;\n\theight: 16px;\n\tfill: currentColor;\n}\n\n/* Upload overlay */\n.notectl-image__overlay {\n\tposition: absolute;\n\tinset: 0;\n\tdisplay: none;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: rgba(255, 255, 255, 0.8);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg-muted);\n}\n\n.notectl-image__overlay--uploading {\n\tdisplay: flex;\n}\n\n.notectl-image__overlay--error {\n\tdisplay: flex;\n\tbackground: var(--notectl-danger-muted);\n\tcolor: var(--notectl-danger);\n}\n\n/* Resize overlay + handles */\n.notectl-image__resize-overlay {\n\tposition: absolute;\n\tinset: 0;\n\tpointer-events: none;\n}\n\n.notectl-image__resize-handle {\n\tposition: absolute;\n\twidth: 10px;\n\theight: 10px;\n\tbackground: var(--notectl-surface-raised);\n\tborder: 2px solid var(--notectl-primary);\n\tborder-radius: 50%;\n\tpointer-events: all;\n\tz-index: 2;\n\ttransition: transform 0.1s, background 0.1s;\n}\n\n.notectl-image__resize-handle:hover {\n\tbackground: var(--notectl-primary);\n\ttransform: scale(1.3);\n}\n\n.notectl-image--resizing .notectl-image__resize-handle {\n\tbackground: var(--notectl-primary);\n}\n\n.notectl-image__resize-handle--nw {\n\ttop: -5px;\n\tinset-inline-start: -5px;\n\tcursor: nwse-resize;\n}\n\n.notectl-image__resize-handle--ne {\n\ttop: -5px;\n\tinset-inline-end: -5px;\n\tcursor: nesw-resize;\n}\n\n.notectl-image__resize-handle--sw {\n\tbottom: -5px;\n\tinset-inline-start: -5px;\n\tcursor: nesw-resize;\n}\n\n.notectl-image__resize-handle--se {\n\tbottom: -5px;\n\tinset-inline-end: -5px;\n\tcursor: nwse-resize;\n}\n\n/* RTL cursor overrides — flip diagonal cursors when in RTL context */\n[dir=\"rtl\"] .notectl-image__resize-handle--nw {\n\tcursor: nesw-resize;\n}\n\n[dir=\"rtl\"] .notectl-image__resize-handle--ne {\n\tcursor: nwse-resize;\n}\n\n[dir=\"rtl\"] .notectl-image__resize-handle--sw {\n\tcursor: nwse-resize;\n}\n\n[dir=\"rtl\"] .notectl-image__resize-handle--se {\n\tcursor: nesw-resize;\n}\n\n/* Size indicator tooltip */\n.notectl-image__size-indicator {\n\tposition: absolute;\n\tbottom: -28px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tpadding: 2px 8px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\tborder-radius: 4px;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\topacity: 0;\n\ttransition: opacity 0.15s;\n\tz-index: 3;\n}\n\n.notectl-image__size-indicator--visible {\n\topacity: 1;\n}\n\n/* Keyboard resize hint (shown on selection, hidden during drag) */\n.notectl-image__keyboard-hint {\n\tdisplay: none;\n\tposition: absolute;\n\tbottom: -28px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tpadding: 2px 8px;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\twhite-space: nowrap;\n\tpointer-events: none;\n\tz-index: 3;\n}\n\n.notectl-image--selected .notectl-image__keyboard-hint {\n\tdisplay: block;\n}\n\n.notectl-image--resizing .notectl-image__keyboard-hint {\n\tdisplay: none;\n}\n\n/* Resizing feedback */\n.notectl-image--resizing .notectl-image__img {\n\topacity: 0.85;\n}\n`;\n","/**\n * Image plugin commands: insert, remove, and attribute updates.\n * Supports both root-level and nested contexts (e.g. images inside table cells).\n */\n\nimport { deleteNodeSelection } from '../../commands/NodeSelectionCommands.js';\nimport type { BlockAttrs, BlockNode } from '../../model/Document.js';\nimport { createBlockNode, getBlockChildren, isBlockNode } from '../../model/Document.js';\nimport { createNodeSelection, isGapCursor, isNodeSelection } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { ImageAttrs } from './ImageUpload.js';\n\n/**\n * Inserts an image block. When the cursor is inside a table cell,\n * the image is inserted as a child of the cell. Otherwise it is\n * inserted after the current block at document root.\n */\nexport function insertImage(\n\tcontext: PluginContext,\n\tattrs: Partial<ImageAttrs> & { readonly src: string },\n): boolean {\n\tconst state = context.getState();\n\tconst sel = state.selection;\n\n\tconst imageAttrs: BlockAttrs = {\n\t\tsrc: attrs.src,\n\t\talt: attrs.alt ?? '',\n\t\talign: attrs.align ?? 'center',\n\t\t...(attrs.width !== undefined ? { width: attrs.width } : {}),\n\t\t...(attrs.height !== undefined ? { height: attrs.height } : {}),\n\t};\n\n\tif (isGapCursor(sel)) return false;\n\n\tconst anchorBlockId: BlockId = isNodeSelection(sel) ? sel.nodeId : sel.anchor.blockId;\n\n\t// Check if we're inside a table cell\n\tconst cellId: BlockId | undefined = findTableCellAncestor(state, anchorBlockId);\n\tif (cellId) {\n\t\treturn insertImageIntoCell(state, context, cellId, imageAttrs);\n\t}\n\n\treturn insertImageAtRoot(state, context, anchorBlockId, imageAttrs);\n}\n\n/** Finds a table_cell ancestor for the given block (or the block itself). */\nfunction findTableCellAncestor(state: EditorState, bid: BlockId): BlockId | undefined {\n\tconst block: BlockNode | undefined = state.getBlock(bid);\n\tif (block?.type === 'table_cell') return bid;\n\n\tconst path: BlockId[] | undefined = state.getNodePath(bid);\n\tif (!path) return undefined;\n\n\tfor (const id of path) {\n\t\tconst node: BlockNode | undefined = state.getBlock(id);\n\t\tif (node?.type === 'table_cell') return id;\n\t}\n\treturn undefined;\n}\n\n/** Inserts an image at document root after the anchor block. */\nfunction insertImageAtRoot(\n\tstate: EditorState,\n\tcontext: PluginContext,\n\tanchorBlockId: BlockId,\n\timageAttrs: BlockAttrs,\n): boolean {\n\tconst blockIndex: number = state.doc.children.findIndex((b) => b.id === anchorBlockId);\n\tif (blockIndex === -1) return false;\n\n\tconst imageBlock: BlockNode = createBlockNode(nodeType('image'), [], undefined, imageAttrs);\n\tconst newParagraph: BlockNode = createBlockNode(nodeType('paragraph'));\n\n\tconst tr = state\n\t\t.transaction('command')\n\t\t.insertNode([], blockIndex + 1, imageBlock)\n\t\t.insertNode([], blockIndex + 2, newParagraph)\n\t\t.setSelection(createNodeSelection(imageBlock.id, []))\n\t\t.build();\n\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Inserts an image as a child of a table cell. */\nfunction insertImageIntoCell(\n\tstate: EditorState,\n\tcontext: PluginContext,\n\tcellId: BlockId,\n\timageAttrs: BlockAttrs,\n): boolean {\n\tconst cellPath: BlockId[] | undefined = state.getNodePath(cellId);\n\tif (!cellPath) return false;\n\n\tconst imageBlock: BlockNode = createBlockNode(nodeType('image'), [], undefined, imageAttrs);\n\n\t// Remove existing block children first (if any)\n\tconst cell: BlockNode | undefined = state.getBlock(cellId);\n\tif (!cell) return false;\n\n\tconst builder = state.transaction('command');\n\tconst blockChildren: readonly BlockNode[] = getBlockChildren(cell);\n\tfor (let i = blockChildren.length - 1; i >= 0; i--) {\n\t\t// Find the raw index in children array\n\t\tconst rawIndex: number = cell.children.findIndex(\n\t\t\t(c) => isBlockNode(c) && c.id === blockChildren[i]?.id,\n\t\t);\n\t\tif (rawIndex !== -1) {\n\t\t\tbuilder.removeNode(cellPath, rawIndex);\n\t\t}\n\t}\n\n\t// Insert image at index 0 (before any text nodes)\n\tbuilder.insertNode(cellPath, 0, imageBlock);\n\tbuilder.setSelection(createNodeSelection(imageBlock.id, [...cellPath, imageBlock.id]));\n\n\tcontext.dispatch(builder.build());\n\treturn true;\n}\n\n/** Removes the currently selected image block (works for nested images too). */\nexport function removeImage(context: PluginContext): boolean {\n\tconst state = context.getState();\n\tconst sel = state.selection;\n\tif (!isNodeSelection(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.nodeId);\n\tif (!block || block.type !== 'image') return false;\n\n\tconst nodePath: BlockId[] | undefined = state.getNodePath(sel.nodeId);\n\tif (!nodePath || nodePath.length === 0) return false;\n\n\tconst tr = deleteNodeSelection(state, createNodeSelection(sel.nodeId, nodePath));\n\tif (!tr) return false;\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Updates attributes on the currently selected image block. */\nexport function setImageAttr(context: PluginContext, attrs: Partial<ImageAttrs>): boolean {\n\tconst state = context.getState();\n\tconst sel = state.selection;\n\tif (!isNodeSelection(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.nodeId);\n\tif (!block || block.type !== 'image') return false;\n\n\tconst path: BlockId[] | undefined = state.getNodePath(sel.nodeId);\n\tif (!path) return false;\n\n\tconst merged: BlockAttrs = { ...(block.attrs ?? {}), ...attrs };\n\tconst tr = state.transaction('command').setNodeAttr(path, merged).build();\n\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Minimum image width in pixels (shared with NodeView). */\nexport const MIN_IMAGE_WIDTH = 50;\n\n/**\n * Resizes the currently selected image by a pixel delta, preserving aspect ratio.\n * Returns false if no image is selected or the image has no width/height attributes.\n */\nexport function resizeImageByDelta(\n\tcontext: PluginContext,\n\tdelta: number,\n\tmaxWidth: number,\n): boolean {\n\tconst state = context.getState();\n\tconst sel = state.selection;\n\tif (!isNodeSelection(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.nodeId);\n\tif (!block || block.type !== 'image') return false;\n\n\tconst currentWidth: number | undefined = block.attrs?.width as number | undefined;\n\tconst currentHeight: number | undefined = block.attrs?.height as number | undefined;\n\tif (currentWidth === undefined || currentHeight === undefined) return false;\n\n\tconst aspectRatio: number = currentHeight > 0 ? currentWidth / currentHeight : 1;\n\tconst clampedWidth: number = Math.max(MIN_IMAGE_WIDTH, Math.min(maxWidth, currentWidth + delta));\n\tconst newHeight: number = Math.round(clampedWidth / aspectRatio);\n\n\tif (clampedWidth === currentWidth && newHeight === currentHeight) return false;\n\n\treturn setImageAttr(context, { width: clampedWidth, height: newHeight });\n}\n\n/** Resets the currently selected image to its natural size by removing width/height. */\nexport function resetImageSize(context: PluginContext): boolean {\n\tconst state = context.getState();\n\tconst sel = state.selection;\n\tif (!isNodeSelection(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.nodeId);\n\tif (!block || block.type !== 'image') return false;\n\n\tconst path: BlockId[] | undefined = state.getNodePath(sel.nodeId);\n\tif (!path) return false;\n\n\tconst attrs: BlockAttrs = { ...(block.attrs ?? {}) };\n\tconst cleaned: BlockAttrs = Object.fromEntries(\n\t\tObject.entries(attrs).filter(([k]) => k !== 'width' && k !== 'height'),\n\t);\n\n\tconst tr = state.transaction('command').setNodeAttr(path, cleaned).build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Registers all image commands on the plugin context. */\nexport function registerImageCommands(context: PluginContext): void {\n\tcontext.registerCommand('insertImage', () => {\n\t\treturn insertImage(context, { src: '' });\n\t});\n\n\tcontext.registerCommand('removeImage', () => {\n\t\treturn removeImage(context);\n\t});\n}\n","/** Locale interface and default English locale for the ImagePlugin. */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface ImageLocale {\n\treadonly insertImage: string;\n\treadonly insertImageTooltip: string;\n\treadonly uploadFromComputer: string;\n\treadonly uploadAria: string;\n\treadonly separator: string;\n\treadonly urlPlaceholder: string;\n\treadonly urlAria: string;\n\treadonly insertButton: string;\n\treadonly insertAria: string;\n\treadonly imageAria: (alt: string, width?: number, height?: number) => string;\n\treadonly resetToNaturalSize: string;\n\treadonly uploadFailed: string;\n\treadonly uploading: string;\n\treadonly resizeHandleLabel: (position: string) => string;\n\treadonly imageSelected: string;\n\treadonly altTextPrefix: string;\n\treadonly imageSizeAnnounce: (w: number, h: number) => string;\n\treadonly resizeHint: (shrink: string, grow: string) => string;\n\treadonly imageResized: (w: number, h: number) => string;\n\treadonly keyboardResizeHint: (shrink: string, grow: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const IMAGE_LOCALE_EN: ImageLocale = {\n\tinsertImage: 'Insert Image',\n\tinsertImageTooltip: 'Insert Image',\n\tuploadFromComputer: 'Upload from computer',\n\tuploadAria: 'Upload image from computer',\n\tseparator: 'or',\n\turlPlaceholder: 'https://...',\n\turlAria: 'Image URL',\n\tinsertButton: 'Insert',\n\tinsertAria: 'Insert image',\n\timageAria: (alt: string, width?: number, height?: number) => {\n\t\tconst parts: string[] = [alt || 'Image'];\n\t\tif (width !== undefined && height !== undefined) {\n\t\t\tparts.push(`${width} by ${height} pixels`);\n\t\t}\n\t\treturn parts.join(', ');\n\t},\n\tresetToNaturalSize: 'Image reset to natural size.',\n\tuploadFailed: 'Upload failed.',\n\tuploading: 'Uploading...',\n\tresizeHandleLabel: (position: string) => `Resize ${position}`,\n\timageSelected: 'Image selected.',\n\taltTextPrefix: 'Alt text: ',\n\timageSizeAnnounce: (w: number, h: number) => `Size: ${w} by ${h} pixels.`,\n\tresizeHint: (shrink: string, grow: string) => `${shrink} / ${grow} to resize.`,\n\timageResized: (w: number, h: number) => `Image resized to ${w} by ${h} pixels.`,\n\tkeyboardResizeHint: (shrink: string, grow: string) => `${shrink} / ${grow} to resize`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<ImageLocale> = import.meta.glob<{\n\tdefault: ImageLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadImageLocale(lang: string): Promise<ImageLocale> {\n\treturn loadLocaleModule(localeModules, lang, IMAGE_LOCALE_EN);\n}\n","/**\n * NodeView factory for image blocks.\n * Renders <figure> with <img>, handles selection state, upload overlay,\n * resize with 4 corner handles + live size indicator, and a keyboard-hint\n * showing resize shortcuts when the image is selected.\n */\n\nimport type { BlockAttrs, BlockNode } from '../../model/Document.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport { getTextDirection } from '../../platform/Platform.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport {\n\tgetStyleNonceForNode,\n\tsetStyleProperties,\n\tsetStyleProperty,\n} from '../../style/StyleRuntime.js';\nimport type { NodeView, NodeViewFactory } from '../../view/NodeView.js';\nimport { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport { IMAGE_LOCALE_EN, type ImageLocale } from './ImageLocale.js';\nimport type { ImageKeymap, ImagePluginConfig, UploadState } from './ImageUpload.js';\n\nconst ALIGNMENT_CLASSES: Record<string, string> = {\n\tstart: 'notectl-image--start',\n\tcenter: 'notectl-image--center',\n\tend: 'notectl-image--end',\n};\n\nconst MIN_IMAGE_WIDTH = 50;\n\ntype HandlePosition = 'nw' | 'ne' | 'sw' | 'se';\n\nconst HANDLE_CURSORS: Readonly<Record<HandlePosition, string>> = {\n\tnw: 'nwse-resize',\n\tne: 'nesw-resize',\n\tsw: 'nesw-resize',\n\tse: 'nwse-resize',\n};\n\n/** +1 means dragging right increases width; -1 means dragging left does. */\nconst HANDLE_X_SIGN: Readonly<Record<HandlePosition, 1 | -1>> = {\n\tnw: -1,\n\tne: 1,\n\tsw: -1,\n\tse: 1,\n};\n\nconst HANDLE_POSITIONS_LTR: Readonly<Record<HandlePosition, string>> = {\n\tnw: 'top-left',\n\tne: 'top-right',\n\tsw: 'bottom-left',\n\tse: 'bottom-right',\n};\n\nconst HANDLE_POSITIONS_RTL: Readonly<Record<HandlePosition, string>> = {\n\tnw: 'top-right',\n\tne: 'top-left',\n\tsw: 'bottom-right',\n\tse: 'bottom-left',\n};\n\nconst RTL_CURSOR_MAP: Readonly<Record<HandlePosition, string>> = {\n\tnw: 'nesw-resize',\n\tne: 'nwse-resize',\n\tsw: 'nwse-resize',\n\tse: 'nesw-resize',\n};\n\n/** Returns the direction-aware ARIA label for a resize handle. */\nexport function getHandleLabel(\n\tposition: HandlePosition,\n\tisRtl: boolean,\n\tlocale: ImageLocale = IMAGE_LOCALE_EN,\n): string {\n\tconst positionName: string = (isRtl ? HANDLE_POSITIONS_RTL : HANDLE_POSITIONS_LTR)[position];\n\treturn locale.resizeHandleLabel(positionName);\n}\n\n/** Returns the X-sign for resize drag, flipped in RTL. */\nexport function getResizeXSign(position: HandlePosition, isRtl: boolean): 1 | -1 {\n\tconst sign: 1 | -1 = HANDLE_X_SIGN[position];\n\treturn isRtl ? (-sign as 1 | -1) : sign;\n}\n\n// --- Global cursor override during resize ---\n\nlet activeCursorStyle: HTMLStyleElement | null = null;\n\nfunction setGlobalResizeCursor(cursor: string, referenceNode?: Node): void {\n\tclearGlobalResizeCursor();\n\tactiveCursorStyle = document.createElement('style');\n\tconst nonce = referenceNode ? getStyleNonceForNode(referenceNode) : undefined;\n\tif (nonce) {\n\t\tactiveCursorStyle.setAttribute('nonce', nonce);\n\t}\n\tactiveCursorStyle.textContent = `*{cursor:${cursor}!important;user-select:none!important}`;\n\tdocument.head.appendChild(activeCursorStyle);\n}\n\nfunction clearGlobalResizeCursor(): void {\n\tif (activeCursorStyle) {\n\t\tactiveCursorStyle.remove();\n\t\tactiveCursorStyle = null;\n\t}\n}\n\n/** Builds the keyboard-hint text from the resolved keymap. */\nfunction buildKeyboardHintText(\n\tresolvedKeymap: Readonly<Record<keyof ImageKeymap, string | null>>,\n\tlocale: ImageLocale,\n): string {\n\tconst shrink: string | null = resolvedKeymap.shrinkWidth ?? null;\n\tconst grow: string | null = resolvedKeymap.growWidth ?? null;\n\tif (!shrink || !grow) return '';\n\treturn locale.keyboardResizeHint(formatShortcut(shrink), formatShortcut(grow));\n}\n\n/** Creates a NodeViewFactory for image blocks. */\nexport function createImageNodeViewFactory(\n\tconfig: ImagePluginConfig,\n\tuploadStates: Map<BlockId, UploadState>,\n\tresolvedKeymap?: Readonly<Record<keyof ImageKeymap, string | null>>,\n\tlocale: ImageLocale = IMAGE_LOCALE_EN,\n): NodeViewFactory {\n\treturn (\n\t\tnode: BlockNode,\n\t\tgetState: () => EditorState,\n\t\tdispatch: (tr: Transaction) => void,\n\t): NodeView => {\n\t\t// --- DOM Construction ---\n\t\tconst figure: HTMLElement = document.createElement('figure');\n\t\tfigure.className = 'notectl-image';\n\t\tfigure.setAttribute('data-block-id', node.id);\n\t\tfigure.setAttribute('data-void', 'true');\n\t\tfigure.setAttribute('data-selectable', 'true');\n\n\t\tconst container: HTMLDivElement = document.createElement('div');\n\t\tcontainer.className = 'notectl-image__container';\n\n\t\tconst img: HTMLImageElement = document.createElement('img');\n\t\timg.className = 'notectl-image__img';\n\t\timg.draggable = false;\n\n\t\tconst overlay: HTMLDivElement = document.createElement('div');\n\t\toverlay.className = 'notectl-image__overlay';\n\n\t\tcontainer.appendChild(img);\n\t\tcontainer.appendChild(overlay);\n\t\tfigure.appendChild(container);\n\n\t\tlet currentNodeId: BlockId = node.id;\n\t\tlet resizeOverlay: HTMLDivElement | null = null;\n\n\t\t// --- ARIA Label ---\n\n\t\tfunction updateAriaLabel(n: BlockNode): void {\n\t\t\tconst alt: string = (n.attrs?.alt as string | undefined) ?? '';\n\t\t\tconst width: number | undefined = n.attrs?.width as number | undefined;\n\t\t\tconst height: number | undefined = n.attrs?.height as number | undefined;\n\t\t\tfigure.setAttribute('aria-label', locale.imageAria(alt, width, height));\n\t\t}\n\n\t\t// --- Attribute Application ---\n\n\t\tfunction applyAttrs(n: BlockNode): void {\n\t\t\tconst src: string = (n.attrs?.src as string | undefined) ?? '';\n\t\t\tconst alt: string = (n.attrs?.alt as string | undefined) ?? '';\n\t\t\tconst width: number | undefined = n.attrs?.width as number | undefined;\n\t\t\tconst height: number | undefined = n.attrs?.height as number | undefined;\n\t\t\tconst align: string = (n.attrs?.align as string | undefined) ?? 'center';\n\n\t\t\t// Only update src when it changes to avoid re-triggering load events\n\t\t\tif (img.src !== src) img.src = src;\n\t\t\timg.alt = alt;\n\n\t\t\tif (width !== undefined) {\n\t\t\t\tsetStyleProperty(img, 'width', `${width}px`);\n\t\t\t} else {\n\t\t\t\tsetStyleProperty(img, 'width', '');\n\t\t\t}\n\t\t\tif (height !== undefined) {\n\t\t\t\tsetStyleProperty(img, 'height', `${height}px`);\n\t\t\t} else {\n\t\t\t\tsetStyleProperty(img, 'height', '');\n\t\t\t}\n\n\t\t\tfor (const cls of Object.values(ALIGNMENT_CLASSES)) {\n\t\t\t\tfigure.classList.remove(cls);\n\t\t\t}\n\t\t\tconst alignClass: string | undefined = ALIGNMENT_CLASSES[align];\n\t\t\tif (alignClass) {\n\t\t\t\tfigure.classList.add(alignClass);\n\t\t\t}\n\n\t\t\tconst uploadState: UploadState = uploadStates.get(n.id) ?? 'idle';\n\t\t\tconst isUploading: boolean = uploadState === 'uploading';\n\t\t\toverlay.classList.toggle('notectl-image__overlay--uploading', isUploading);\n\t\t\toverlay.classList.toggle('notectl-image__overlay--error', uploadState === 'error');\n\n\t\t\tif (isUploading) {\n\t\t\t\toverlay.textContent = locale.uploading;\n\t\t\t} else if (uploadState === 'error') {\n\t\t\t\toverlay.textContent = locale.uploadFailed;\n\t\t\t} else {\n\t\t\t\toverlay.textContent = '';\n\t\t\t}\n\n\t\t\tif (isUploading) {\n\t\t\t\tfigure.setAttribute('aria-busy', 'true');\n\t\t\t} else {\n\t\t\t\tfigure.removeAttribute('aria-busy');\n\t\t\t}\n\n\t\t\tupdateAriaLabel(n);\n\t\t}\n\n\t\tapplyAttrs(node);\n\n\t\t// --- Commit natural dimensions on first load ---\n\n\t\tlet dimensionsCommitted = false;\n\n\t\timg.addEventListener('load', () => {\n\t\t\tif (dimensionsCommitted) return;\n\n\t\t\tconst state: EditorState = getState();\n\t\t\tconst block: BlockNode | undefined = state.getBlock(currentNodeId);\n\t\t\tif (!block || block.type !== 'image') return;\n\n\t\t\tconst hasWidth: boolean = block.attrs?.width !== undefined;\n\t\t\tconst hasHeight: boolean = block.attrs?.height !== undefined;\n\t\t\tif (hasWidth && hasHeight) {\n\t\t\t\tdimensionsCommitted = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst naturalW: number = img.naturalWidth;\n\t\t\tconst naturalH: number = img.naturalHeight;\n\t\t\tif (naturalW === 0 || naturalH === 0) return;\n\n\t\t\tconst clampedW: number = Math.min(naturalW, config.maxWidth);\n\t\t\tconst ratio: number = naturalW > 0 ? naturalH / naturalW : 1;\n\t\t\tconst clampedH: number = Math.round(clampedW * ratio);\n\n\t\t\tconst path: BlockId[] | undefined = state.getNodePath(currentNodeId);\n\t\t\tif (!path) return;\n\n\t\t\tconst merged: BlockAttrs = {\n\t\t\t\t...(block.attrs ?? {}),\n\t\t\t\twidth: clampedW,\n\t\t\t\theight: clampedH,\n\t\t\t};\n\n\t\t\tconst tr: Transaction = state.transaction('command').setNodeAttr(path, merged).build();\n\t\t\tdispatch(tr);\n\t\t\tdimensionsCommitted = true;\n\t\t});\n\n\t\t// --- Resize Logic ---\n\n\t\tfunction clampWidth(width: number): number {\n\t\t\treturn Math.max(MIN_IMAGE_WIDTH, Math.min(config.maxWidth, width));\n\t\t}\n\n\t\tfunction commitResize(nodeId: BlockId, width: number, height: number): void {\n\t\t\tconst state: EditorState = getState();\n\t\t\tconst block: BlockNode | undefined = state.getBlock(nodeId);\n\t\t\tif (!block) return;\n\n\t\t\tconst prevWidth: number | undefined = block.attrs?.width as number | undefined;\n\t\t\tconst prevHeight: number | undefined = block.attrs?.height as number | undefined;\n\t\t\tif (prevWidth === width && prevHeight === height) return;\n\n\t\t\tconst path: BlockId[] | undefined = state.getNodePath(nodeId);\n\t\t\tif (!path) return;\n\n\t\t\tconst merged: BlockAttrs = {\n\t\t\t\t...(block.attrs ?? {}),\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t};\n\n\t\t\tconst tr: Transaction = state.transaction('command').setNodeAttr(path, merged).build();\n\t\t\tdispatch(tr);\n\t\t}\n\n\t\tfunction attachHandleListeners(\n\t\t\thandle: HTMLDivElement,\n\t\t\tposition: HandlePosition,\n\t\t\tnodeId: BlockId,\n\t\t\tsizeIndicator: HTMLDivElement,\n\t\t): void {\n\t\t\tlet startX = 0;\n\t\t\tlet startWidth = 0;\n\t\t\tlet aspectRatio = 1;\n\t\t\tlet xSign: 1 | -1 = HANDLE_X_SIGN[position];\n\n\t\t\tconst onPointerMove = (e: PointerEvent): void => {\n\t\t\t\tconst deltaX: number = e.clientX - startX;\n\t\t\t\tconst newWidth: number = clampWidth(startWidth + deltaX * xSign);\n\t\t\t\tconst newHeight: number = Math.round(newWidth / aspectRatio);\n\n\t\t\t\tsetStyleProperties(img, {\n\t\t\t\t\twidth: `${newWidth}px`,\n\t\t\t\t\theight: `${newHeight}px`,\n\t\t\t\t});\n\n\t\t\t\tsizeIndicator.textContent = `${Math.round(newWidth)} \\u00D7 ${newHeight}`;\n\t\t\t};\n\n\t\t\tconst onPointerUp = (e: PointerEvent): void => {\n\t\t\t\tdocument.removeEventListener('pointermove', onPointerMove);\n\t\t\t\tdocument.removeEventListener('pointerup', onPointerUp);\n\n\t\t\t\tfigure.classList.remove('notectl-image--resizing');\n\t\t\t\tsizeIndicator.classList.remove('notectl-image__size-indicator--visible');\n\t\t\t\tclearGlobalResizeCursor();\n\n\t\t\t\tconst finalWidth: number = Math.round(img.getBoundingClientRect().width);\n\t\t\t\tconst finalHeight: number = Math.round(finalWidth / aspectRatio);\n\n\t\t\t\tcommitResize(nodeId, finalWidth, finalHeight);\n\n\t\t\t\t(e.target as HTMLElement | null)?.releasePointerCapture?.(e.pointerId);\n\t\t\t};\n\n\t\t\thandle.addEventListener('pointerdown', (e: PointerEvent) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\tconst isRtl: boolean = getTextDirection(figure) === 'rtl';\n\t\t\t\txSign = getResizeXSign(position, isRtl);\n\n\t\t\t\tstartX = e.clientX;\n\t\t\t\tstartWidth = img.getBoundingClientRect().width;\n\t\t\t\tconst imgHeight: number = img.getBoundingClientRect().height;\n\t\t\t\taspectRatio = imgHeight > 0 ? startWidth / imgHeight : 1;\n\n\t\t\t\tfigure.classList.add('notectl-image--resizing');\n\t\t\t\tsizeIndicator.textContent = `${Math.round(startWidth)} \\u00D7 ${Math.round(imgHeight)}`;\n\t\t\t\tsizeIndicator.classList.add('notectl-image__size-indicator--visible');\n\t\t\t\tconst cursor: string = isRtl ? RTL_CURSOR_MAP[position] : HANDLE_CURSORS[position];\n\t\t\t\tsetGlobalResizeCursor(cursor, figure);\n\n\t\t\t\t(e.target as HTMLElement).setPointerCapture(e.pointerId);\n\t\t\t\tdocument.addEventListener('pointermove', onPointerMove);\n\t\t\t\tdocument.addEventListener('pointerup', onPointerUp);\n\t\t\t});\n\t\t}\n\n\t\tfunction createResizeOverlay(nodeId: BlockId): void {\n\t\t\tif (!config.resizable || resizeOverlay) return;\n\n\t\t\tresizeOverlay = document.createElement('div');\n\t\t\tresizeOverlay.className = 'notectl-image__resize-overlay';\n\t\t\tresizeOverlay.setAttribute('data-notectl-no-print', '');\n\n\t\t\tconst sizeIndicator: HTMLDivElement = document.createElement('div');\n\t\t\tsizeIndicator.className = 'notectl-image__size-indicator';\n\t\t\tresizeOverlay.appendChild(sizeIndicator);\n\n\t\t\tconst isRtl: boolean = getTextDirection(figure) === 'rtl';\n\t\t\tconst positions: readonly HandlePosition[] = ['nw', 'ne', 'sw', 'se'];\n\t\t\tfor (const pos of positions) {\n\t\t\t\tconst handle: HTMLDivElement = document.createElement('div');\n\t\t\t\thandle.className = `notectl-image__resize-handle notectl-image__resize-handle--${pos}`;\n\t\t\t\thandle.setAttribute('role', 'separator');\n\t\t\t\thandle.setAttribute('aria-label', getHandleLabel(pos, isRtl, locale));\n\t\t\t\tattachHandleListeners(handle, pos, nodeId, sizeIndicator);\n\t\t\t\tresizeOverlay.appendChild(handle);\n\t\t\t}\n\n\t\t\t// Keyboard hint (hidden from screenreaders, visual only)\n\t\t\tif (resolvedKeymap) {\n\t\t\t\tconst hintText: string = buildKeyboardHintText(resolvedKeymap, locale);\n\t\t\t\tif (hintText) {\n\t\t\t\t\tconst hint: HTMLDivElement = document.createElement('div');\n\t\t\t\t\thint.className = 'notectl-image__keyboard-hint';\n\t\t\t\t\thint.setAttribute('aria-hidden', 'true');\n\t\t\t\t\thint.textContent = hintText;\n\t\t\t\t\tresizeOverlay.appendChild(hint);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcontainer.appendChild(resizeOverlay);\n\t\t}\n\n\t\tfunction removeResizeOverlay(): void {\n\t\t\tclearGlobalResizeCursor();\n\t\t\tif (resizeOverlay) {\n\t\t\t\tresizeOverlay.remove();\n\t\t\t\tresizeOverlay = null;\n\t\t\t}\n\t\t}\n\n\t\t// --- NodeView Interface ---\n\n\t\treturn {\n\t\t\tdom: figure,\n\t\t\tcontentDOM: null,\n\n\t\t\tupdate(updatedNode: BlockNode): boolean {\n\t\t\t\tif (updatedNode.type !== 'image') return false;\n\t\t\t\tcurrentNodeId = updatedNode.id;\n\t\t\t\tfigure.setAttribute('data-block-id', updatedNode.id);\n\t\t\t\tapplyAttrs(updatedNode);\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\tselectNode(): void {\n\t\t\t\tfigure.classList.add('notectl-image--selected');\n\t\t\t\tcreateResizeOverlay(currentNodeId);\n\t\t\t},\n\n\t\t\tdeselectNode(): void {\n\t\t\t\tfigure.classList.remove('notectl-image--selected');\n\t\t\t\tremoveResizeOverlay();\n\t\t\t},\n\n\t\t\tdestroy(): void {\n\t\t\t\tremoveResizeOverlay();\n\t\t\t\t// Do NOT revoke blob URLs here — the URL may still be referenced\n\t\t\t\t// by the clipboard (cut/paste) or undo history. Blob URLs are\n\t\t\t\t// automatically released when the document is unloaded.\n\t\t\t},\n\t\t};\n\t};\n}\n","/**\n * Renders the image insert popup with file upload and URL input,\n * following the same pattern as FontSizePopup.\n */\n\nimport { setStyleProperty, setStyleText } from '../../style/StyleRuntime.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { insertImage } from './ImageCommands.js';\nimport type { ImageLocale } from './ImageLocale.js';\n\n// --- Config ---\n\nexport interface ImagePopupConfig {\n\treadonly acceptedTypes: readonly string[];\n\treadonly locale: ImageLocale;\n\treadonly onFileInsert: (context: PluginContext, file: File) => void;\n\treadonly onClose: () => void;\n}\n\n// --- Public Entry Point ---\n\n/** Builds the image insert popup DOM inside the given container. */\nexport function renderImagePopup(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\tconfig: ImagePopupConfig,\n): void {\n\tsetStyleProperty(container, 'padding', '8px');\n\tsetStyleProperty(container, 'minWidth', '240px');\n\n\tappendFileUploadSection(container, context, config);\n\tappendSeparator(container, config.locale);\n\tappendUrlSection(container, context, config);\n}\n\n// --- File Upload Section ---\n\nfunction appendFileUploadSection(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\tconfig: ImagePopupConfig,\n): void {\n\tconst fileInput: HTMLInputElement = document.createElement('input');\n\tfileInput.type = 'file';\n\tfileInput.accept = config.acceptedTypes.join(',');\n\tsetStyleText(fileInput, 'position:absolute;width:0;height:0;overflow:hidden;opacity:0;');\n\n\tconst uploadBtn: HTMLButtonElement = document.createElement('button');\n\tuploadBtn.type = 'button';\n\tuploadBtn.textContent = config.locale.uploadFromComputer;\n\tuploadBtn.setAttribute('aria-label', config.locale.uploadAria);\n\tsetStyleText(\n\t\tuploadBtn,\n\t\t'display:block;width:100%;padding:8px 12px;cursor:pointer;' +\n\t\t\t'text-align:center;box-sizing:border-box;' +\n\t\t\t'border:1px solid var(--notectl-border);border-radius:4px;' +\n\t\t\t'background:var(--notectl-surface-raised);color:var(--notectl-fg);',\n\t);\n\n\tuploadBtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tfileInput.click();\n\t});\n\n\tfileInput.addEventListener('change', () => {\n\t\tconst file: File | undefined = fileInput.files?.[0];\n\t\tif (file) {\n\t\t\tconfig.onFileInsert(context, file);\n\t\t\tconfig.onClose();\n\t\t\tcontext.getContainer().focus();\n\t\t}\n\t});\n\n\tcontainer.appendChild(fileInput);\n\tcontainer.appendChild(uploadBtn);\n}\n\n// --- Separator ---\n\nfunction appendSeparator(container: HTMLElement, locale: ImageLocale): void {\n\tconst separator: HTMLDivElement = document.createElement('div');\n\tsetStyleText(\n\t\tseparator,\n\t\t'display:flex;align-items:center;margin:8px 0;' +\n\t\t\t'color:var(--notectl-fg-muted);font-size:12px;',\n\t);\n\n\tconst line1: HTMLSpanElement = document.createElement('span');\n\tsetStyleText(line1, 'flex:1;height:1px;background:var(--notectl-border);');\n\n\tconst orText: HTMLSpanElement = document.createElement('span');\n\torText.textContent = locale.separator;\n\tsetStyleText(orText, 'padding:0 8px;');\n\n\tconst line2: HTMLSpanElement = document.createElement('span');\n\tsetStyleText(line2, 'flex:1;height:1px;background:var(--notectl-border);');\n\n\tseparator.appendChild(line1);\n\tseparator.appendChild(orText);\n\tseparator.appendChild(line2);\n\tcontainer.appendChild(separator);\n}\n\n// --- URL Input Section ---\n\nfunction appendUrlSection(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\tconfig: ImagePopupConfig,\n): void {\n\tconst urlInput: HTMLInputElement = document.createElement('input');\n\turlInput.type = 'url';\n\turlInput.placeholder = config.locale.urlPlaceholder;\n\turlInput.setAttribute('aria-label', config.locale.urlAria);\n\tsetStyleText(\n\t\turlInput,\n\t\t'width:100%;padding:6px 8px;box-sizing:border-box;' +\n\t\t\t'border:1px solid var(--notectl-border);border-radius:4px;' +\n\t\t\t'background:var(--notectl-surface-overlay);color:var(--notectl-fg);',\n\t);\n\n\tconst insertBtn: HTMLButtonElement = document.createElement('button');\n\tinsertBtn.type = 'button';\n\tinsertBtn.textContent = config.locale.insertButton;\n\tinsertBtn.setAttribute('aria-label', config.locale.insertAria);\n\tsetStyleText(\n\t\tinsertBtn,\n\t\t'width:100%;padding:8px 12px;margin-top:4px;cursor:pointer;' +\n\t\t\t'border:1px solid var(--notectl-border);border-radius:4px;' +\n\t\t\t'background:var(--notectl-surface-raised);color:var(--notectl-fg);',\n\t);\n\n\tconst applyUrl = (): void => {\n\t\tconst src: string = urlInput.value.trim();\n\t\tif (src) {\n\t\t\tinsertImage(context, { src });\n\t\t\tconfig.onClose();\n\t\t\tcontext.getContainer().focus();\n\t\t}\n\t};\n\n\tinsertBtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tapplyUrl();\n\t});\n\n\turlInput.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\tif (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\t\t\tapplyUrl();\n\t\t}\n\t});\n\n\tcontainer.appendChild(urlInput);\n\tcontainer.appendChild(insertBtn);\n\n\trequestAnimationFrame(() => urlInput.focus());\n}\n","/**\n * Image plugin types, configuration, and service key.\n */\n\nimport { ServiceKey } from '../Plugin.js';\nimport type { ImageLocale } from './ImageLocale.js';\n\n// --- Image Attributes ---\n\nexport interface ImageAttrs {\n\treadonly src: string;\n\treadonly alt: string;\n\treadonly width?: number;\n\treadonly height?: number;\n\treadonly align: 'start' | 'center' | 'end';\n}\n\n// --- Upload Types ---\n\nexport interface ImageUploadResult {\n\treadonly url: string;\n\treadonly width?: number;\n\treadonly height?: number;\n}\n\nexport interface ImageUploadService {\n\tupload(file: File): Promise<ImageUploadResult>;\n}\n\nexport const IMAGE_UPLOAD_SERVICE = new ServiceKey<ImageUploadService>('image:upload');\n\nexport type UploadState = 'idle' | 'uploading' | 'complete' | 'error';\n\n// --- Keyboard Bindings ---\n\n/**\n * Configurable keyboard bindings for image resize actions.\n * Omit a slot to use the default; set to `null` to disable the binding.\n *\n * Key descriptor format: `'Mod-Shift-ArrowRight'`, etc.\n * `Mod` resolves to Cmd on macOS, Ctrl on Windows/Linux.\n */\nexport interface ImageKeymap {\n\treadonly growWidth?: string | null;\n\treadonly shrinkWidth?: string | null;\n\treadonly growWidthLarge?: string | null;\n\treadonly shrinkWidthLarge?: string | null;\n\treadonly resetSize?: string | null;\n}\n\nexport const DEFAULT_IMAGE_KEYMAP: Readonly<Record<keyof ImageKeymap, string>> = {\n\tgrowWidth: 'Mod-Shift-ArrowRight',\n\tshrinkWidth: 'Mod-Shift-ArrowLeft',\n\tgrowWidthLarge: 'Mod-Shift-Alt-ArrowRight',\n\tshrinkWidthLarge: 'Mod-Shift-Alt-ArrowLeft',\n\tresetSize: 'Mod-Shift-0',\n};\n\n// --- Configuration ---\n\nexport interface ImagePluginConfig {\n\treadonly maxWidth: number;\n\treadonly maxFileSize: number;\n\treadonly acceptedTypes: readonly string[];\n\treadonly resizable: boolean;\n\t/** Pixels to grow/shrink per small resize step. @default 10 */\n\treadonly resizeStep?: number;\n\t/** Pixels to grow/shrink per large resize step. @default 50 */\n\treadonly resizeStepLarge?: number;\n\t/** Customize keyboard bindings for image resize actions. */\n\treadonly keymap?: ImageKeymap;\n\t/** Locale override for user-facing strings. */\n\treadonly locale?: ImageLocale;\n}\n\nexport const DEFAULT_IMAGE_CONFIG: ImagePluginConfig = {\n\tmaxWidth: 800,\n\tmaxFileSize: 10 * 1024 * 1024,\n\tacceptedTypes: ['image/png', 'image/jpeg', 'image/gif', 'image/webp', 'image/svg+xml'],\n\tresizable: true,\n\tresizeStep: 10,\n\tresizeStepLarge: 50,\n};\n","/**\n * ImagePlugin: registers an image void block type with NodeSpec,\n * NodeView, commands, file handler, toolbar button, and accessible\n * keyboard resize with screenreader announcements.\n */\n\nimport { IMAGE_CSS } from '../../editor/styles/image.js';\nimport type { BlockAttrs, BlockNode } from '../../model/Document.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport { isNodeSelection } 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 { 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 { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport {\n\tinsertImage,\n\tregisterImageCommands,\n\tresetImageSize,\n\tresizeImageByDelta,\n} from './ImageCommands.js';\nimport { IMAGE_LOCALE_EN, type ImageLocale, loadImageLocale } from './ImageLocale.js';\nimport { createImageNodeViewFactory } from './ImageNodeView.js';\nimport { renderImagePopup } from './ImagePopup.js';\nimport {\n\tDEFAULT_IMAGE_CONFIG,\n\tDEFAULT_IMAGE_KEYMAP,\n\tIMAGE_UPLOAD_SERVICE,\n\ttype ImageKeymap,\n\ttype ImagePluginConfig,\n\ttype UploadState,\n} from './ImageUpload.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\timage: {\n\t\t\tsrc: string;\n\t\t\talt: string;\n\t\t\twidth?: number;\n\t\t\theight?: number;\n\t\t\talign: 'start' | 'center' | 'end';\n\t\t};\n\t}\n}\n\n// --- Plugin ---\n\nexport class ImagePlugin implements Plugin {\n\treadonly id = 'image';\n\treadonly name = 'Image';\n\treadonly priority = 45;\n\n\tprivate readonly config: ImagePluginConfig;\n\tprivate readonly resolvedKeymap: Readonly<Record<keyof ImageKeymap, string | null>>;\n\tprivate readonly uploadStates = new Map<BlockId, UploadState>();\n\tprivate readonly blobUrls = new Set<string>();\n\tprivate context: PluginContext | null = null;\n\tprivate locale!: ImageLocale;\n\n\tconstructor(config?: Partial<ImagePluginConfig>) {\n\t\tthis.config = { ...DEFAULT_IMAGE_CONFIG, ...config };\n\t\tthis.resolvedKeymap = { ...DEFAULT_IMAGE_KEYMAP, ...config?.keymap };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tIMAGE_LOCALE_EN,\n\t\t\tloadImageLocale,\n\t\t);\n\t\tcontext.registerStyleSheet(IMAGE_CSS);\n\t\tthis.context = context;\n\t\tthis.registerNodeSpec(context);\n\t\tthis.registerNodeView(context);\n\t\tregisterImageCommands(context);\n\t\tthis.registerResizeCommands(context);\n\t\tthis.registerResizeKeymaps(context);\n\t\tthis.registerFileHandler(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tdestroy(): void {\n\t\tfor (const url of this.blobUrls) {\n\t\t\tURL.revokeObjectURL(url);\n\t\t}\n\t\tthis.blobUrls.clear();\n\t\tthis.uploadStates.clear();\n\t\tthis.context = null;\n\t}\n\n\tonStateChange(oldState: EditorState, newState: EditorState, _tr: Transaction): void {\n\t\tif (!this.context) return;\n\n\t\t// Clean up upload states for removed blocks (searches full tree)\n\t\tfor (const id of this.uploadStates.keys()) {\n\t\t\tif (!newState.getBlock(id)) {\n\t\t\t\tthis.uploadStates.delete(id);\n\t\t\t}\n\t\t}\n\n\t\t// Announce image selection for screenreaders\n\t\tconst oldIsImage: boolean = this.isImageSelected(oldState);\n\t\tconst nowIsImage: boolean = this.isImageSelected(newState);\n\n\t\tif (!oldIsImage && nowIsImage) {\n\t\t\tthis.announceImageSelection(newState);\n\t\t}\n\t}\n\n\tprivate registerNodeSpec(context: PluginContext): void {\n\t\tconst locale = this.locale;\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'image',\n\t\t\tgroup: 'block',\n\t\t\tisVoid: true,\n\t\t\tselectable: true,\n\t\t\tattrs: {\n\t\t\t\tsrc: { default: '' },\n\t\t\t\talt: { default: '' },\n\t\t\t\talign: { default: 'center' },\n\t\t\t},\n\t\t\ttoDOM(node) {\n\t\t\t\tconst figure = createBlockElement('figure', node.id);\n\t\t\t\tfigure.className = 'notectl-image';\n\t\t\t\tfigure.setAttribute('data-void', 'true');\n\t\t\t\tfigure.setAttribute('data-selectable', 'true');\n\n\t\t\t\tconst imgContainer: HTMLDivElement = document.createElement('div');\n\t\t\t\timgContainer.className = 'notectl-image__container';\n\n\t\t\t\tconst alt: string = (node.attrs?.alt as string | undefined) ?? '';\n\t\t\t\tconst width: number | undefined = node.attrs?.width as number | undefined;\n\t\t\t\tconst height: number | undefined = node.attrs?.height as number | undefined;\n\n\t\t\t\tconst img: HTMLImageElement = document.createElement('img');\n\t\t\t\timg.className = 'notectl-image__img';\n\t\t\t\timg.src = (node.attrs?.src as string | undefined) ?? '';\n\t\t\t\timg.alt = alt;\n\t\t\t\timg.draggable = false;\n\n\t\t\t\tif (width !== undefined) setStyleProperty(img, 'width', `${width}px`);\n\t\t\t\tif (height !== undefined) setStyleProperty(img, 'height', `${height}px`);\n\n\t\t\t\tconst align: string = (node.attrs?.align as string | undefined) ?? 'center';\n\t\t\t\tconst alignClass: string | undefined = {\n\t\t\t\t\tstart: 'notectl-image--start',\n\t\t\t\t\tcenter: 'notectl-image--center',\n\t\t\t\t\tend: 'notectl-image--end',\n\t\t\t\t}[align];\n\t\t\t\tif (alignClass) figure.classList.add(alignClass);\n\n\t\t\t\tfigure.setAttribute('aria-label', locale.imageAria(alt, width, height));\n\n\t\t\t\timgContainer.appendChild(img);\n\t\t\t\tfigure.appendChild(imgContainer);\n\t\t\t\treturn figure;\n\t\t\t},\n\t\t\ttoHTML(node) {\n\t\t\t\tconst src: string = escapeHTML((node.attrs?.src as string | undefined) ?? '');\n\t\t\t\tconst alt: string = escapeHTML((node.attrs?.alt as string | undefined) ?? '');\n\t\t\t\tconst width: number | undefined = node.attrs?.width as number | undefined;\n\t\t\t\tconst height: number | undefined = node.attrs?.height as number | undefined;\n\n\t\t\t\tconst sizeAttrs: string =\n\t\t\t\t\t(width !== undefined ? ` width=\"${width}\"` : '') +\n\t\t\t\t\t(height !== undefined ? ` height=\"${height}\"` : '');\n\n\t\t\t\t// Alignment is handled by the serializer's alignment injection,\n\t\t\t\t// which works in both inline-style and CSS-class modes.\n\t\t\t\treturn `<figure><img src=\"${src}\" alt=\"${alt}\"${sizeAttrs}></figure>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'figure',\n\t\t\t\t\tgetAttrs(el) {\n\t\t\t\t\t\tconst img: HTMLImageElement | null = el.querySelector('img');\n\t\t\t\t\t\tif (!img) return false;\n\t\t\t\t\t\tconst attrs: Record<string, string | number | boolean> = {\n\t\t\t\t\t\t\tsrc: img.getAttribute('src') ?? '',\n\t\t\t\t\t\t\talt: img.getAttribute('alt') ?? '',\n\t\t\t\t\t\t\talign: 'center',\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst width: string | null = img.getAttribute('width');\n\t\t\t\t\t\tconst height: string | null = img.getAttribute('height');\n\t\t\t\t\t\tif (width) attrs.width = Number.parseInt(width, 10);\n\t\t\t\t\t\tif (height) attrs.height = Number.parseInt(height, 10);\n\n\t\t\t\t\t\t// Check inline style first, then class names (new + legacy)\n\t\t\t\t\t\tconst textAlign: string = el.style?.textAlign ?? '';\n\t\t\t\t\t\tif (textAlign === 'start' || textAlign === 'end' || textAlign === 'center') {\n\t\t\t\t\t\t\tattrs.align = textAlign;\n\t\t\t\t\t\t} else if (textAlign === 'left') {\n\t\t\t\t\t\t\tattrs.align = 'start';\n\t\t\t\t\t\t} else if (textAlign === 'right') {\n\t\t\t\t\t\t\tattrs.align = 'end';\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tel.classList.contains('notectl-align-start') ||\n\t\t\t\t\t\t\tel.classList.contains('notectl-align-left') ||\n\t\t\t\t\t\t\tel.classList.contains('notectl-image--start') ||\n\t\t\t\t\t\t\tel.classList.contains('notectl-image--left')\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tattrs.align = 'start';\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tel.classList.contains('notectl-align-end') ||\n\t\t\t\t\t\t\tel.classList.contains('notectl-align-right') ||\n\t\t\t\t\t\t\tel.classList.contains('notectl-image--end') ||\n\t\t\t\t\t\t\tel.classList.contains('notectl-image--right')\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tattrs.align = 'end';\n\t\t\t\t\t\t} else if (el.classList.contains('notectl-align-center')) {\n\t\t\t\t\t\t\tattrs.align = 'center';\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn attrs;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttag: 'img',\n\t\t\t\t\tgetAttrs(el) {\n\t\t\t\t\t\tconst attrs: Record<string, string | number | boolean> = {\n\t\t\t\t\t\t\tsrc: el.getAttribute('src') ?? '',\n\t\t\t\t\t\t\talt: el.getAttribute('alt') ?? '',\n\t\t\t\t\t\t\talign: 'center',\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst width: string | null = el.getAttribute('width');\n\t\t\t\t\t\tconst height: string | null = el.getAttribute('height');\n\t\t\t\t\t\tif (width) attrs.width = Number.parseInt(width, 10);\n\t\t\t\t\t\tif (height) attrs.height = Number.parseInt(height, 10);\n\t\t\t\t\t\treturn attrs;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: {\n\t\t\t\ttags: ['figure', 'img'],\n\t\t\t\tattrs: ['src', 'alt', 'width', 'height', 'class', 'style'],\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate registerNodeView(context: PluginContext): void {\n\t\tcontext.registerNodeView(\n\t\t\t'image',\n\t\t\tcreateImageNodeViewFactory(this.config, this.uploadStates, this.resolvedKeymap, this.locale),\n\t\t);\n\t}\n\n\tprivate registerResizeCommands(context: PluginContext): void {\n\t\tconst step: number = this.config.resizeStep ?? 10;\n\t\tconst stepLarge: number = this.config.resizeStepLarge ?? 50;\n\t\tconst maxWidth: number = this.config.maxWidth;\n\n\t\tcontext.registerCommand('resizeImageGrow', () => {\n\t\t\tconst result: boolean = resizeImageByDelta(context, step, maxWidth);\n\t\t\tif (result) this.announceCurrentSize(context);\n\t\t\treturn result;\n\t\t});\n\n\t\tcontext.registerCommand('resizeImageShrink', () => {\n\t\t\tconst result: boolean = resizeImageByDelta(context, -step, maxWidth);\n\t\t\tif (result) this.announceCurrentSize(context);\n\t\t\treturn result;\n\t\t});\n\n\t\tcontext.registerCommand('resizeImageGrowLarge', () => {\n\t\t\tconst result: boolean = resizeImageByDelta(context, stepLarge, maxWidth);\n\t\t\tif (result) this.announceCurrentSize(context);\n\t\t\treturn result;\n\t\t});\n\n\t\tcontext.registerCommand('resizeImageShrinkLarge', () => {\n\t\t\tconst result: boolean = resizeImageByDelta(context, -stepLarge, maxWidth);\n\t\t\tif (result) this.announceCurrentSize(context);\n\t\t\treturn result;\n\t\t});\n\n\t\tcontext.registerCommand('resetImageSize', () => {\n\t\t\tconst result: boolean = resetImageSize(context);\n\t\t\tif (result) context.announce(this.locale.resetToNaturalSize);\n\t\t\treturn result;\n\t\t});\n\t}\n\n\tprivate registerResizeKeymaps(context: PluginContext): void {\n\t\tconst bindings: Record<string, () => boolean> = {};\n\t\tconst commands: Record<keyof ImageKeymap, string> = {\n\t\t\tgrowWidth: 'resizeImageGrow',\n\t\t\tshrinkWidth: 'resizeImageShrink',\n\t\t\tgrowWidthLarge: 'resizeImageGrowLarge',\n\t\t\tshrinkWidthLarge: 'resizeImageShrinkLarge',\n\t\t\tresetSize: 'resetImageSize',\n\t\t};\n\n\t\tfor (const [slot, commandName] of Object.entries(commands)) {\n\t\t\tconst binding: string | null = this.resolvedKeymap[slot as keyof ImageKeymap] ?? null;\n\t\t\tif (binding) {\n\t\t\t\tbindings[binding] = () => context.executeCommand(commandName);\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(bindings).length > 0) {\n\t\t\tcontext.registerKeymap(bindings);\n\t\t}\n\t}\n\n\tprivate registerFileHandler(context: PluginContext): void {\n\t\tcontext.registerFileHandler('image/*', async (file, _position) => {\n\t\t\tif (!this.isAcceptedType(file.type)) return false;\n\t\t\tthis.handleFileInsert(context, file);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tprivate handleFileInsert(context: PluginContext, file: File): void {\n\t\tif (file.size > this.config.maxFileSize) return;\n\n\t\tconst blobUrl: string = URL.createObjectURL(file);\n\t\tthis.blobUrls.add(blobUrl);\n\n\t\tconst inserted: boolean = insertImage(context, { src: blobUrl });\n\t\tif (!inserted) {\n\t\t\tURL.revokeObjectURL(blobUrl);\n\t\t\tthis.blobUrls.delete(blobUrl);\n\t\t\treturn;\n\t\t}\n\n\t\t// Find the newly inserted image block\n\t\tconst state: EditorState = context.getState();\n\t\tconst sel = state.selection;\n\t\tif (!isNodeSelection(sel)) return;\n\t\tconst imageBlockId: BlockId = sel.nodeId;\n\n\t\tthis.uploadStates.set(imageBlockId, 'uploading');\n\n\t\t// Upload if service is registered\n\t\tconst uploadService = context.getService(IMAGE_UPLOAD_SERVICE);\n\t\tif (uploadService) {\n\t\t\tthis.uploadFile(context, file, imageBlockId, blobUrl);\n\t\t} else {\n\t\t\tthis.uploadStates.set(imageBlockId, 'complete');\n\t\t}\n\t}\n\n\tprivate async uploadFile(\n\t\tcontext: PluginContext,\n\t\tfile: File,\n\t\timageBlockId: BlockId,\n\t\tblobUrl: string,\n\t): Promise<void> {\n\t\tconst uploadService = context.getService(IMAGE_UPLOAD_SERVICE);\n\t\tif (!uploadService) return;\n\n\t\ttry {\n\t\t\tconst result = await uploadService.upload(file);\n\t\t\tthis.uploadStates.set(imageBlockId, 'complete');\n\n\t\t\t// Replace blob URL with uploaded URL\n\t\t\tconst state: EditorState = context.getState();\n\t\t\tconst block: BlockNode | undefined = state.getBlock(imageBlockId);\n\t\t\tif (!block) return;\n\n\t\t\tconst path: BlockId[] | undefined = state.getNodePath(imageBlockId);\n\t\t\tif (!path) return;\n\n\t\t\tconst merged: BlockAttrs = {\n\t\t\t\t...(block.attrs ?? {}),\n\t\t\t\tsrc: result.url,\n\t\t\t\t...(result.width !== undefined ? { width: result.width } : {}),\n\t\t\t\t...(result.height !== undefined ? { height: result.height } : {}),\n\t\t\t};\n\n\t\t\tconst tr: Transaction = state.transaction('command').setNodeAttr(path, merged).build();\n\t\t\tcontext.dispatch(tr);\n\n\t\t\t// Clean up blob URL\n\t\t\tURL.revokeObjectURL(blobUrl);\n\t\t\tthis.blobUrls.delete(blobUrl);\n\t\t} catch {\n\t\t\tthis.uploadStates.set(imageBlockId, 'error');\n\t\t\tcontext.announce(this.locale.uploadFailed);\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=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'image',\n\t\t\tgroup: 'insert',\n\t\t\ticon,\n\t\t\tlabel: this.locale.insertImage,\n\t\t\ttooltip: this.locale.insertImageTooltip,\n\t\t\tcommand: 'insertImage',\n\t\t\tpopupType: 'custom',\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderImagePopup(container, ctx, {\n\t\t\t\t\tacceptedTypes: this.config.acceptedTypes,\n\t\t\t\t\tlocale: this.locale,\n\t\t\t\t\tonFileInsert: (c, file) => this.handleFileInsert(c, file),\n\t\t\t\t\tonClose,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate isAcceptedType(mimeType: string): boolean {\n\t\treturn this.config.acceptedTypes.some(\n\t\t\t(accepted) =>\n\t\t\t\taccepted === mimeType ||\n\t\t\t\t(accepted.endsWith('/*') && mimeType.startsWith(accepted.slice(0, -1))),\n\t\t);\n\t}\n\n\tprivate isImageSelected(state: EditorState): boolean {\n\t\tconst sel = state.selection;\n\t\tif (!isNodeSelection(sel)) return false;\n\t\tconst block: BlockNode | undefined = state.getBlock(sel.nodeId);\n\t\treturn block?.type === 'image';\n\t}\n\n\tprivate announceImageSelection(state: EditorState): void {\n\t\tif (!this.context) return;\n\t\tconst sel = state.selection;\n\t\tif (!isNodeSelection(sel)) return;\n\n\t\tconst block: BlockNode | undefined = state.getBlock(sel.nodeId);\n\t\tif (!block || block.type !== 'image') return;\n\n\t\tconst alt: string = (block.attrs?.alt as string | undefined) ?? '';\n\t\tconst width: number | undefined = block.attrs?.width as number | undefined;\n\t\tconst height: number | undefined = block.attrs?.height as number | undefined;\n\n\t\tconst parts: string[] = [this.locale.imageSelected];\n\t\tif (alt) parts.push(`${this.locale.altTextPrefix}${alt}.`);\n\t\tif (width !== undefined && height !== undefined) {\n\t\t\tparts.push(this.locale.imageSizeAnnounce(width, height));\n\t\t}\n\n\t\tconst shrinkKey: string | null = this.resolvedKeymap.shrinkWidth ?? null;\n\t\tconst growKey: string | null = this.resolvedKeymap.growWidth ?? null;\n\t\tif (shrinkKey && growKey) {\n\t\t\tparts.push(this.locale.resizeHint(formatShortcut(shrinkKey), formatShortcut(growKey)));\n\t\t}\n\n\t\tthis.context.announce(parts.join(' '));\n\t}\n\n\tprivate announceCurrentSize(context: PluginContext): void {\n\t\tconst state = context.getState();\n\t\tconst sel = state.selection;\n\t\tif (!isNodeSelection(sel)) return;\n\n\t\tconst block: BlockNode | undefined = state.getBlock(sel.nodeId);\n\t\tif (!block || block.type !== 'image') return;\n\n\t\tconst width: number | undefined = block.attrs?.width as number | undefined;\n\t\tconst height: number | undefined = block.attrs?.height as number | undefined;\n\t\tif (width !== undefined && height !== undefined) {\n\t\t\tcontext.announce(this.locale.imageResized(width, height));\n\t\t}\n\t}\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{u as t}from"./Document-_qdGR4vh.mjs";import{o as e,t as o,u as r}from"./Selection-aeiSsvhe.mjs";import{_ as s,m as i}from"./Commands-BuYF23lf.mjs";import{i as n}from"./TypeBrands-BZDKMjR-.mjs";import{i as a,o as c}from"./PluginHelpers-D-MvWR98.mjs";import{t as l}from"./ShortcutFormatting-DE6B8iGs.mjs";var m={label:"Inline Code",tooltip:t=>`Inline Code (${t})`},d=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-Bvja-bjE.mjs"),"./locales/de.ts":()=>import("./de-DKj55F9g.mjs"),"./locales/es.ts":()=>import("./es-BMKsnh3y.mjs"),"./locales/fr.ts":()=>import("./fr-CNNBBeLM.mjs"),"./locales/hi.ts":()=>import("./hi-DzRFsYYN.mjs"),"./locales/pt.ts":()=>import("./pt-DVfMAcXb.mjs"),"./locales/ru.ts":()=>import("./ru-C-4AaPUK.mjs"),"./locales/zh.ts":()=>import("./zh-d19V68ib.mjs")});async function p(t){return c(d,t,m)}var g={toolbar:!0,keymap:"Mod-E",inputRule:!0},u=new Set(["bold","italic","underline","strikethrough","highlight","font","fontSize","superscript","subscript"]),f=class{id="inline-code";name="Inline Code";priority=22;config;locale;constructor(t){this.config={...g,...t}}async init(t){this.locale=await a(t,this.config.locale,m,p),t.registerStyleSheet("\n.notectl-content code {\n\tfont-family: ui-monospace, 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;\n\tfont-size: 0.9em;\n\tpadding: 0.15em 0.35em;\n\tborder-radius: 4px;\n\tbackground-color: var(--notectl-code-bg);\n\tcolor: var(--notectl-code-color);\n\tword-break: break-word;\n}\n@media (forced-colors: active) {\n\t.notectl-content code {\n\t\tborder: 1px solid LinkText;\n\t}\n}\n"),this.registerMarkSpec(t),this.registerCommand(t),null!==this.config.keymap&&this.registerKeymap(t),!1!==this.config.inputRule&&this.registerInputRule(t),!1!==this.config.toolbar&&this.registerToolbarItem(t),this.registerExclusivityMiddleware(t)}registerMarkSpec(t){t.registerMarkSpec({type:"code",rank:3,toDOM:()=>document.createElement("code"),toHTMLString:(t,e)=>`<code>${e}</code>`,parseHTML:[{tag:"code",getAttrs:t=>"PRE"!==t.parentElement?.tagName&&{}},{tag:"span",getAttrs:t=>{const e=t.style.fontFamily.replace(/['"]/g,"").trim();return!!/^monospace$/i.test(e)&&{}}}],sanitize:{tags:["code"]}})}registerCommand(t){t.registerCommand("toggleInlineCode",()=>{const e=s(t.getState(),n("code"));return!!e&&(t.dispatch(e),!0)})}registerKeymap(t){const e=this.config.keymap??"Mod-E";t.registerKeymap({[e]:()=>t.executeCommand("toggleInlineCode")})}registerInputRule(t){t.registerInputRule({pattern:/(?:^|[^`])(`([^`]+)`)$/,handler(t,s,i,a){const c=t.selection;if(!r(c))return null;if(!e(c))return null;const l=t.getBlock(c.anchor.blockId);if(!l||"code_block"===l.type)return null;const m=s[2],d=s[1];if(!m||!d)return null;const p=a-d.length;return t.transaction("input").deleteTextAt(c.anchor.blockId,p,a).insertText(c.anchor.blockId,p,m,[{type:n("code")}]).setSelection(o(c.anchor.blockId,p+m.length)).build()}})}registerToolbarItem(t){t.registerToolbarItem({id:"inline_code",group:"format",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0L19.2 12l-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"/></svg>',label:this.locale.label,tooltip:this.locale.tooltip(l(this.config.keymap??"Mod-E")),command:"toggleInlineCode",isActive:t=>i(t,n("code"))})}registerExclusivityMiddleware(e){e.registerMiddleware((e,o,r)=>{let s=!1;const i=[];for(const c of e.steps){if("addMark"!==c.type){i.push(c);continue}const e=c.mark.type;if("code"===e){const e=o.getBlock(c.blockId);if(e){const o=t(e,c.from,c.to),r=/* @__PURE__ */new Set;for(const t of o)if("text"===t.kind)for(const e of t.marks)u.has(e.type)&&r.add(e.type);for(const t of r)s=!0,i.push({type:"removeMark",blockId:c.blockId,from:c.from,to:c.to,mark:{type:n(t)},...c.path?{path:c.path}:{}})}i.push(c);continue}if(u.has(e)){const e=o.getBlock(c.blockId);if(e&&t(e,c.from,c.to).some(t=>"text"===t.kind&&t.marks.some(t=>"code"===t.type))){s=!0;continue}}i.push(c)}let a=e.storedMarksAfter;if(a){const t=a.some(t=>"code"===t.type),e=a.some(t=>u.has(t.type));t&&e&&(a=a.filter(t=>!u.has(t.type)),s=!0)}r(s?{...e,steps:i,storedMarksAfter:a}:e)},{name:"inline-code:mark-exclusivity",priority:50})}};export{m as n,p as r,f as t};
2
- //# sourceMappingURL=InlineCodePlugin-B7IOgUSI.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InlineCodePlugin-B7IOgUSI.mjs","names":[],"sources":["../../src/plugins/inline-code/InlineCodeLocale.ts","../../src/plugins/inline-code/InlineCodePlugin.ts"],"sourcesContent":["/**\n * Locale interface and default English locale for the InlineCodePlugin.\n */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface InlineCodeLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const INLINE_CODE_LOCALE_EN: InlineCodeLocale = {\n\tlabel: 'Inline Code',\n\ttooltip: (shortcut: string) => `Inline Code (${shortcut})`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<InlineCodeLocale> = import.meta.glob<{\n\tdefault: InlineCodeLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadInlineCodeLocale(lang: string): Promise<InlineCodeLocale> {\n\treturn loadLocaleModule(localeModules, lang, INLINE_CODE_LOCALE_EN);\n}\n","/**\n * InlineCodePlugin: registers an inline code mark with MarkSpec,\n * toggle command, keyboard shortcut (Mod-E), backtick InputRule,\n * toolbar button, and mark exclusivity middleware.\n */\n\nimport { isMarkActive, toggleMark } from '../../commands/Commands.js';\nimport type { BlockNode, Mark } from '../../model/Document.js';\nimport { getBlockContentSegmentsInRange } from '../../model/Document.js';\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { markType } from '../../model/TypeBrands.js';\nimport type { Step } from '../../state/Steps.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport {\n\tINLINE_CODE_LOCALE_EN,\n\ttype InlineCodeLocale,\n\tloadInlineCodeLocale,\n} from './InlineCodeLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tcode: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\nexport interface InlineCodeConfig {\n\t/** Show toolbar button. Default: true */\n\treadonly toolbar?: boolean;\n\t/** Override keyboard shortcut. Set to null to disable. Default: 'Mod-E' */\n\treadonly keymap?: string | null;\n\t/** Enable backtick InputRule. Default: true */\n\treadonly inputRule?: boolean;\n\t/** Override locale strings */\n\treadonly locale?: InlineCodeLocale;\n}\n\nconst DEFAULT_CONFIG: InlineCodeConfig = {\n\ttoolbar: true,\n\tkeymap: 'Mod-E',\n\tinputRule: true,\n};\n\n// --- CSS ---\n\nconst INLINE_CODE_CSS = `\n.notectl-content code {\n\tfont-family: ui-monospace, 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;\n\tfont-size: 0.9em;\n\tpadding: 0.15em 0.35em;\n\tborder-radius: 4px;\n\tbackground-color: var(--notectl-code-bg);\n\tcolor: var(--notectl-code-color);\n\tword-break: break-word;\n}\n@media (forced-colors: active) {\n\t.notectl-content code {\n\t\tborder: 1px solid LinkText;\n\t}\n}\n`;\n\n// --- Mark Exclusivity ---\n\nconst EXCLUDED_WITH_CODE: ReadonlySet<string> = new Set([\n\t'bold',\n\t'italic',\n\t'underline',\n\t'strikethrough',\n\t'highlight',\n\t'font',\n\t'fontSize',\n\t'superscript',\n\t'subscript',\n]);\n\n// --- Plugin ---\n\nexport class InlineCodePlugin implements Plugin {\n\treadonly id = 'inline-code';\n\treadonly name = 'Inline Code';\n\treadonly priority = 22;\n\n\tprivate readonly config: InlineCodeConfig;\n\tprivate locale!: InlineCodeLocale;\n\n\tconstructor(config?: Partial<InlineCodeConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tINLINE_CODE_LOCALE_EN,\n\t\t\tloadInlineCodeLocale,\n\t\t);\n\t\tcontext.registerStyleSheet(INLINE_CODE_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommand(context);\n\n\t\tif (this.config.keymap !== null) {\n\t\t\tthis.registerKeymap(context);\n\t\t}\n\t\tif (this.config.inputRule !== false) {\n\t\t\tthis.registerInputRule(context);\n\t\t}\n\t\tif (this.config.toolbar !== false) {\n\t\t\tthis.registerToolbarItem(context);\n\t\t}\n\t\tthis.registerExclusivityMiddleware(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'code',\n\t\t\trank: 3,\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement('code');\n\t\t\t},\n\t\t\ttoHTMLString: (_mark, content) => `<code>${content}</code>`,\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'code',\n\t\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\t\tif (el.parentElement?.tagName === 'PRE') return false;\n\t\t\t\t\t\treturn {};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\t\tconst fontFamily: string = el.style.fontFamily.replace(/['\"]/g, '').trim();\n\t\t\t\t\t\tif (/^monospace$/i.test(fontFamily)) return {};\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['code'] },\n\t\t});\n\t}\n\n\tprivate registerCommand(context: PluginContext): void {\n\t\tcontext.registerCommand('toggleInlineCode', () => {\n\t\t\tconst tr = toggleMark(context.getState(), markType('code'));\n\t\t\tif (tr) {\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tconst key: string = this.config.keymap ?? 'Mod-E';\n\t\tcontext.registerKeymap({\n\t\t\t[key]: () => context.executeCommand('toggleInlineCode'),\n\t\t});\n\t}\n\n\tprivate registerInputRule(context: PluginContext): void {\n\t\tconst pattern: RegExp = /(?:^|[^`])(`([^`]+)`)$/;\n\n\t\tcontext.registerInputRule({\n\t\t\tpattern,\n\t\t\thandler(state, match, _start, end) {\n\t\t\t\tconst sel = state.selection;\n\t\t\t\tif (!isTextSelection(sel)) return null;\n\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\t\t\t\tif (!block || block.type === 'code_block') return null;\n\n\t\t\t\tconst innerText: string | undefined = match[2];\n\t\t\t\tconst backtickExpr: string | undefined = match[1];\n\t\t\t\tif (!innerText || !backtickExpr) return null;\n\n\t\t\t\tconst backtickExprStart: number = end - backtickExpr.length;\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, backtickExprStart, end)\n\t\t\t\t\t.insertText(sel.anchor.blockId, backtickExprStart, innerText, [\n\t\t\t\t\t\t{ type: markType('code') },\n\t\t\t\t\t])\n\t\t\t\t\t.setSelection(\n\t\t\t\t\t\tcreateCollapsedSelection(sel.anchor.blockId, backtickExprStart + innerText.length),\n\t\t\t\t\t)\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst icon =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0L19.2 12l-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'inline_code',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip(formatShortcut(this.config.keymap ?? 'Mod-E')),\n\t\t\tcommand: 'toggleInlineCode',\n\t\t\tisActive: (state) => isMarkActive(state, markType('code')),\n\t\t});\n\t}\n\n\t/**\n\t * Prevents formatting marks from coexisting with the code mark.\n\t * Bold, italic, underline, etc. are stripped when code is applied,\n\t * and code is blocked on text that already has formatting marks.\n\t * The link mark is allowed to coexist.\n\t */\n\tprivate registerExclusivityMiddleware(context: PluginContext): void {\n\t\tcontext.registerMiddleware(\n\t\t\t(tr, state, next) => {\n\t\t\t\tlet patched = false;\n\t\t\t\tconst patchedSteps: Step[] = [];\n\n\t\t\t\tfor (const step of tr.steps) {\n\t\t\t\t\tif (step.type !== 'addMark') {\n\t\t\t\t\t\tpatchedSteps.push(step);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst stepMarkType: string = step.mark.type;\n\n\t\t\t\t\tif (stepMarkType === 'code') {\n\t\t\t\t\t\t// Adding code mark: inject removeMark steps for excluded marks\n\t\t\t\t\t\tconst block: BlockNode | undefined = state.getBlock(step.blockId);\n\t\t\t\t\t\tif (block) {\n\t\t\t\t\t\t\tconst segments = getBlockContentSegmentsInRange(block, step.from, step.to);\n\t\t\t\t\t\t\tconst marksToRemove: Set<string> = new Set();\n\t\t\t\t\t\t\tfor (const seg of segments) {\n\t\t\t\t\t\t\t\tif (seg.kind !== 'text') continue;\n\t\t\t\t\t\t\t\tfor (const m of seg.marks) {\n\t\t\t\t\t\t\t\t\tif (EXCLUDED_WITH_CODE.has(m.type)) {\n\t\t\t\t\t\t\t\t\t\tmarksToRemove.add(m.type);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (const mt of marksToRemove) {\n\t\t\t\t\t\t\t\tpatched = true;\n\t\t\t\t\t\t\t\tpatchedSteps.push({\n\t\t\t\t\t\t\t\t\ttype: 'removeMark',\n\t\t\t\t\t\t\t\t\tblockId: step.blockId,\n\t\t\t\t\t\t\t\t\tfrom: step.from,\n\t\t\t\t\t\t\t\t\tto: step.to,\n\t\t\t\t\t\t\t\t\tmark: { type: markType(mt) },\n\t\t\t\t\t\t\t\t\t...(step.path ? { path: step.path } : {}),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpatchedSteps.push(step);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (EXCLUDED_WITH_CODE.has(stepMarkType)) {\n\t\t\t\t\t\t// Adding a formatting mark: block if target range has code mark\n\t\t\t\t\t\tconst block: BlockNode | undefined = state.getBlock(step.blockId);\n\t\t\t\t\t\tif (block) {\n\t\t\t\t\t\t\tconst segments = getBlockContentSegmentsInRange(block, step.from, step.to);\n\t\t\t\t\t\t\tconst hasCode: boolean = segments.some(\n\t\t\t\t\t\t\t\t(seg) => seg.kind === 'text' && seg.marks.some((m) => m.type === 'code'),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (hasCode) {\n\t\t\t\t\t\t\t\tpatched = true;\n\t\t\t\t\t\t\t\tcontinue; // skip this step\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tpatchedSteps.push(step);\n\t\t\t\t}\n\n\t\t\t\t// Handle stored marks\n\t\t\t\tlet storedMarksAfter: readonly Mark[] | null = tr.storedMarksAfter;\n\t\t\t\tif (storedMarksAfter) {\n\t\t\t\t\tconst hasCode: boolean = storedMarksAfter.some((m) => m.type === 'code');\n\t\t\t\t\tconst hasExcluded: boolean = storedMarksAfter.some((m) => EXCLUDED_WITH_CODE.has(m.type));\n\n\t\t\t\t\tif (hasCode && hasExcluded) {\n\t\t\t\t\t\t// Keep code, strip formatting marks\n\t\t\t\t\t\tstoredMarksAfter = storedMarksAfter.filter((m) => !EXCLUDED_WITH_CODE.has(m.type));\n\t\t\t\t\t\tpatched = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnext(patched ? { ...tr, steps: patchedSteps, storedMarksAfter } : tr);\n\t\t\t},\n\t\t\t{ name: 'inline-code:mark-exclusivity', priority: 50 },\n\t\t);\n\t}\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
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-CsdlWnNl.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"KeyboardNav-CsdlWnNl.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,OAM5D,SAAgB,EACf,EACA,EACA,GAEA,MAAM,EAAM,EAAM,OAClB,OAAY,IAAR,GAAkB,GACd,EAAU,EAAY,GAAO,EAiBtC,SAAgB,EACf,EACA,EACA,EACA,EACA,EACA,GAAQ,GAMR,OAJuE,EArBxE,SACC,GAEA,MAAY,cAAR,EAA4B,aACpB,eAAR,EAA6B,YAC1B,EAiBJ,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"}
@@ -1,2 +0,0 @@
1
- import{v as t}from"./Document-_qdGR4vh.mjs";import{o as e,u as r}from"./Selection-aeiSsvhe.mjs";import{i as n}from"./TypeBrands-BZDKMjR-.mjs";import{a as i,r as o}from"./HTMLUtils-brwcaufP.mjs";import{i as s,r as a,t as l}from"./AttributedMarkCommands-35jTbVRg.mjs";import{i as c,o as p}from"./PluginHelpers-D-MvWR98.mjs";import{t as m}from"./ShortcutFormatting-DE6B8iGs.mjs";var d={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."},u=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-6I20_Djq.mjs"),"./locales/de.ts":()=>import("./de-Cz26vtXW.mjs"),"./locales/es.ts":()=>import("./es-BlHe_tc0.mjs"),"./locales/fr.ts":()=>import("./fr-DnQHoPVo.mjs"),"./locales/hi.ts":()=>import("./hi-sxC2nk3h.mjs"),"./locales/pt.ts":()=>import("./pt-DLbf6uoo.mjs"),"./locales/ru.ts":()=>import("./ru-BMxJsSe3.mjs"),"./locales/zh.ts":()=>import("./zh-C0I3L6NA.mjs")});async function h(t){return p(u,t,d)}var k={openInNewTab:!0},g=class{id="link";name="Link";priority=25;config;locale;constructor(t){this.config={...k,...t}}async init(t){this.locale=await c(t,this.config.locale,d,h),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,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(m("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;if(!r(s))return!1;if(e(s))return!1;const a=l(i,{type:n("link"),attrs:{href:o}});return!!a&&(t.dispatch(a),!0)}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}const l=s(o,n("link"));return!!l&&(i.dispatch(l),!0)}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{d as n,h as r,g as t};
2
- //# sourceMappingURL=LinkPlugin-Bhwg24lH.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LinkPlugin-Bhwg24lH.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 { 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\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\tconst tr = applyAttributedMark(state, mark);\n\t\tif (!tr) return false;\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\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\tconst tr = removeAttributedMark(state, markType('link'));\n\t\tif (!tr) return false;\n\t\tcontext.dispatch(tr);\n\t\treturn true;\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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"}
@@ -1,2 +0,0 @@
1
- import{c as t,m as e}from"./Document-_qdGR4vh.mjs";import{d as n,o as i,t as s,u as c}from"./Selection-aeiSsvhe.mjs";import{a as o,t as r}from"./TypeBrands-BZDKMjR-.mjs";import{r as l}from"./AttrRegistry-nDKtHK87.mjs";import{n as a}from"./DomUtils-RKbAVBQz.mjs";import{t as d}from"./RangeIterator-DytL1lUT.mjs";import{s as u}from"./StyleRuntime-D3d1XFFe.mjs";import{i as p,o as m}from"./PluginHelpers-D-MvWR98.mjs";function h(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(),s=i.selection;return!!c(s)&&(s.anchor.blockId!==s.head.blockId?function(t,e,i){const s=e.selection;if(!c(s))return!1;const r=n(s,e.getBlockOrder()),a=b(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,s=l(n,"list_item")&&"checklist"===n.attrs.listType&&n.attrs.checked;u.setBlockType(t,o("list_item"),h(i,e,s))}}),u.setSelection(s),t.dispatch(u.build()),!0}(t,i,e):function(t,e,n){const i=e.selection;if(!c(i))return!1;const s=e.getBlock(i.anchor.blockId);if(!s)return!1;if("list_item"===s.type&&s.attrs?.listType===n){const n=e.transaction("command").setBlockType(i.anchor.blockId,o("paragraph")).setSelection(i).build();return t.dispatch(n),!0}const r=h(n,l(s,"list_item")?s.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 f(t,e,i){const s=t.getState();if(!c(s.selection))return!1;if(s.selection.anchor.blockId!==s.selection.head.blockId)return function(t,e,i,s){const r=e.selection;if(!c(r))return!1;const a=n(r,e.getBlockOrder()),u=e.transaction("command");let p=!1;return d(e,a,t=>{const n=e.getBlock(t);if(!n||!l(n,"list_item"))return;const c=n.attrs.indent+i;c<0||c>s||(u.setBlockType(t,o("list_item"),h(n.attrs.listType,c,n.attrs.checked)),p=!0)}),!!p&&(u.setSelection(r),t.dispatch(u.build()),!0)}(t,s,e,i);const r=s.selection,a=s.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 p=h(a.attrs.listType,u,a.attrs.checked),m=s.transaction("command").setBlockType(r.anchor.blockId,o("list_item"),p).setSelection(r).build();return t.dispatch(m),!0}function g(t,e,n){if(t.isReadOnly()&&!e)return!1;const i=t.getState(),s=n??(c(i.selection)?i.selection.anchor.blockId:null);if(!s)return!1;const r=i.getBlock(s);if(!r||!l(r,"list_item")||"checklist"!==r.attrs.listType)return!1;const a=h(r.attrs.listType,r.attrs.indent,!r.attrs.checked),d=i.transaction("command").setBlockType(s,o("list_item"),a).setSelection(i.selection).build();return t.dispatch(d),!0}function b(t,e,n){let i=!0;return d(t,e,e=>{const s=t.getBlock(e);s&&"list_item"===s.type&&s.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(!c(n.selection))return!1;const s=n.selection;if(!i(s))return!1;const o=n.getBlock(s.anchor.blockId);return!(!o||"list_item"!==o.type)&&e({state:n,block:o,blockId:s.anchor.blockId,offset:s.anchor.offset})}var x={bulletList:"Bullet List",numberedList:"Numbered List",checklist:"Checklist"},T=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-DJN9fQ7Z.mjs"),"./locales/de.ts":()=>import("./de-pLGt5S7j.mjs"),"./locales/es.ts":()=>import("./es-D787y0ui.mjs"),"./locales/fr.ts":()=>import("./fr-BRGGu0E2.mjs"),"./locales/hi.ts":()=>import("./hi-BnsbcSIX.mjs"),"./locales/pt.ts":()=>import("./pt-C2pkn7vo.mjs"),"./locales/ru.ts":()=>import("./ru-B-gRJ6nQ.mjs"),"./locales/zh.ts":()=>import("./zh-DQtLxQ3s.mjs")});async function I(t){return m(T,t,x)}function B(t,e){return{bullet:e.bulletList,ordered:e.numberedList,checklist:e.checklist}[t]}function S(t,e){if(!c(t.selection))return!1;if(t.selection.anchor.blockId!==t.selection.head.blockId)return b(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 L={types:["bullet","ordered","checklist"],maxIndent:4},w=class{id="list";name="List";priority=35;config;locale;context=null;checkboxClickHandler=null;constructor(t){this.config={...L,...t}}async init(n){this.context=n,this.locale=await p(n,this.config.locale,x,I);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 */\n.notectl-list-item--checklist::before {\n\tcontent: '\\2610';\n\tfont-size: 16px;\n\tcolor: var(--notectl-fg-muted);\n\tcursor: pointer;\n\tpointer-events: auto;\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"]::before {\n\tcontent: '\\2611';\n\tcolor: var(--notectl-success);\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){for(const i of n)t.registerCommand(`toggleList:${i.type}`,()=>k(t,i.type));t.registerCommand("indentListItem",()=>f(t,1,e.maxIndent)),t.registerCommand("outdentListItem",()=>f(t,-1,e.maxIndent)),e.types.includes("checklist")&&t.registerCommand("toggleChecklistItem",()=>g(t,e.interactiveCheckboxes),{readonlyAllowed:!0}),t.registerKeymap({Tab:()=>f(t,1,e.maxIndent),"Shift-Tab":()=>f(t,-1,e.maxIndent)})}(n,this.config,r),function(n){n.registerKeymap({Enter:()=>function(n){return v(n,i=>{if(""===e(i.block)){const t=i.state.transaction("input").setBlockType(i.blockId,o("paragraph")).setSelection(i.state.selection).build();return n.dispatch(t),!0}const c=t(),r=h(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,c).setBlockType(c,o("list_item"),r).setSelection(s(c,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(!c(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]??"",p=u.length,m=h(n.type,0,u.includes("[x]"));return t.transaction("input").deleteTextAt(a.anchor.blockId,r,r+p).setBlockType(a.anchor.blockId,o("list_item"),m).setSelection(s(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:B(i.type,n),command:`toggleList:${i.type}`,isActive:t=>S(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){t.registerNodeSpec({type:"list_item",group:"block",content:{allow:["text"]},attrs:{listType:{default:"bullet"},indent:{default:0},checked:{default:!1}},toDOM(t){const e=t.attrs?.listType??"bullet",n=t.attrs?.indent??0,i=t.attrs?.checked??!1,s=a("li",t.id);return s.setAttribute("role","listitem"),s.setAttribute("data-list-type",e),s.setAttribute("data-indent",String(n)),s.className=`notectl-list-item notectl-list-item--${e}`,n>0&&u(s,"marginLeft",24*n+"px"),"checklist"===e&&(s.setAttribute("data-checked",String(i)),s.setAttribute("aria-checked",String(i))),s.setAttribute("aria-level",String(n+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(".notectl-list-item--checklist");if(!i)return;const s=i.getBoundingClientRect();if(("rtl"===getComputedStyle(i).direction?s.right-e.clientX:e.clientX-s.left)>=24)return;e.preventDefault();const c=i.getAttribute("data-block-id");c&&g(t,this.config.interactiveCheckboxes,r(c))},t.getContainer().addEventListener("mousedown",this.checkboxClickHandler))}getEnabledTypes(){return y.filter(t=>this.config.types.includes(t.type))}};export{x as n,I as r,w as t};
2
- //# sourceMappingURL=ListPlugin-BkG6UO4x.mjs.map