@notectl/core 2.0.1 → 2.0.3

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 (1053) hide show
  1. package/README.md +258 -121
  2. package/dist/chunks/AlignmentPlugin-CIkPaP2h.mjs +2 -0
  3. package/dist/chunks/AlignmentPlugin-CIkPaP2h.mjs.map +1 -0
  4. package/dist/chunks/AttrRegistry-B1iBFcKO.mjs +2 -0
  5. package/dist/chunks/AttrRegistry-B1iBFcKO.mjs.map +1 -0
  6. package/dist/chunks/AttributedMarkCommands-Cmet1IuC.mjs +2 -0
  7. package/dist/chunks/AttributedMarkCommands-Cmet1IuC.mjs.map +1 -0
  8. package/dist/chunks/BlockInsertion-DTIE2BiH.mjs +2 -0
  9. package/dist/chunks/BlockInsertion-DTIE2BiH.mjs.map +1 -0
  10. package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs +2 -0
  11. package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs.map +1 -0
  12. package/dist/chunks/BlockquotePlugin-DmbnFmNj.mjs +2 -0
  13. package/dist/chunks/BlockquotePlugin-DmbnFmNj.mjs.map +1 -0
  14. package/dist/chunks/CaretNavigationPlugin-4EaHvYXR.mjs +2 -0
  15. package/dist/chunks/CaretNavigationPlugin-4EaHvYXR.mjs.map +1 -0
  16. package/dist/chunks/CodeBlockPlugin-BP3XaOGj.mjs +2 -0
  17. package/dist/chunks/CodeBlockPlugin-BP3XaOGj.mjs.map +1 -0
  18. package/dist/chunks/ColorGrid-taTKtdsm.mjs +2 -0
  19. package/dist/chunks/ColorGrid-taTKtdsm.mjs.map +1 -0
  20. package/dist/chunks/ColorPickerPopup-JJQ-gMBN.mjs +2 -0
  21. package/dist/chunks/ColorPickerPopup-JJQ-gMBN.mjs.map +1 -0
  22. package/dist/chunks/ColorValidation-3viVw_tK.mjs +2 -0
  23. package/dist/chunks/ColorValidation-3viVw_tK.mjs.map +1 -0
  24. package/dist/chunks/CommandHelpers-D0LIFM4O.mjs +2 -0
  25. package/dist/chunks/CommandHelpers-D0LIFM4O.mjs.map +1 -0
  26. package/dist/chunks/Commands-DJSVqp7b.mjs +2 -0
  27. package/dist/chunks/Commands-DJSVqp7b.mjs.map +1 -0
  28. package/dist/chunks/Decoration-6dhb8k3b.mjs +2 -0
  29. package/dist/chunks/Decoration-6dhb8k3b.mjs.map +1 -0
  30. package/dist/chunks/Document-CkQLx84k.mjs +2 -0
  31. package/dist/chunks/Document-CkQLx84k.mjs.map +1 -0
  32. package/dist/chunks/DocumentParser-QJUmtPp9.mjs +2 -0
  33. package/dist/chunks/DocumentParser-QJUmtPp9.mjs.map +1 -0
  34. package/dist/chunks/DocumentSerializer-bwcxM9WV.mjs +2 -0
  35. package/dist/chunks/DocumentSerializer-bwcxM9WV.mjs.map +1 -0
  36. package/dist/chunks/DomUtils-BkyCg-OO.mjs +2 -0
  37. package/dist/chunks/DomUtils-BkyCg-OO.mjs.map +1 -0
  38. package/dist/chunks/FontPlugin-Cz4qEYGh.mjs +2 -0
  39. package/dist/chunks/FontPlugin-Cz4qEYGh.mjs.map +1 -0
  40. package/dist/chunks/FontSizePlugin-D1WtDqrH.mjs +2 -0
  41. package/dist/chunks/FontSizePlugin-D1WtDqrH.mjs.map +1 -0
  42. package/dist/chunks/GapCursorNavigation-CKKq42kA.mjs +2 -0
  43. package/dist/chunks/GapCursorNavigation-CKKq42kA.mjs.map +1 -0
  44. package/dist/chunks/GapCursorPlugin-0CyOaciK.mjs +2 -0
  45. package/dist/chunks/GapCursorPlugin-0CyOaciK.mjs.map +1 -0
  46. package/dist/chunks/HTMLUtils-BLwp5G4f.mjs +2 -0
  47. package/dist/chunks/HTMLUtils-BLwp5G4f.mjs.map +1 -0
  48. package/dist/chunks/HardBreakPlugin-BOz-L53p.mjs +2 -0
  49. package/dist/chunks/HardBreakPlugin-BOz-L53p.mjs.map +1 -0
  50. package/dist/chunks/HeadingPlugin-C1F-5Ail.mjs +2 -0
  51. package/dist/chunks/HeadingPlugin-C1F-5Ail.mjs.map +1 -0
  52. package/dist/chunks/HighlightPlugin-LYARYuDC.mjs +2 -0
  53. package/dist/chunks/HighlightPlugin-LYARYuDC.mjs.map +1 -0
  54. package/dist/chunks/HorizontalRulePlugin-fmdbzWDQ.mjs +2 -0
  55. package/dist/chunks/HorizontalRulePlugin-fmdbzWDQ.mjs.map +1 -0
  56. package/dist/chunks/ImagePlugin-CrfnT1sD.mjs +2 -0
  57. package/dist/chunks/ImagePlugin-CrfnT1sD.mjs.map +1 -0
  58. package/dist/chunks/KeyboardNav-BZIHDPDV.mjs +2 -0
  59. package/dist/chunks/KeyboardNav-BZIHDPDV.mjs.map +1 -0
  60. package/dist/chunks/LinkPlugin-DzFJLnfQ.mjs +2 -0
  61. package/dist/chunks/LinkPlugin-DzFJLnfQ.mjs.map +1 -0
  62. package/dist/chunks/ListPlugin-C_Rcz3bV.mjs +2 -0
  63. package/dist/chunks/ListPlugin-C_Rcz3bV.mjs.map +1 -0
  64. package/dist/chunks/NavigationQueries-CgYPG6oY.mjs +2 -0
  65. package/dist/chunks/NavigationQueries-CgYPG6oY.mjs.map +1 -0
  66. package/dist/chunks/NodeResolver-CCA8UVRr.mjs +2 -0
  67. package/dist/chunks/NodeResolver-CCA8UVRr.mjs.map +1 -0
  68. package/dist/chunks/NodeSelectionCommands-CE_73CxF.mjs +2 -0
  69. package/dist/chunks/NodeSelectionCommands-CE_73CxF.mjs.map +1 -0
  70. package/dist/chunks/Platform-D9TRT4Mn.mjs +2 -0
  71. package/dist/chunks/Platform-D9TRT4Mn.mjs.map +1 -0
  72. package/dist/chunks/PluginHelpers-DLKHJWJn.mjs +2 -0
  73. package/dist/chunks/PluginHelpers-DLKHJWJn.mjs.map +1 -0
  74. package/dist/chunks/PopupManager-RWOaksC0.mjs +2 -0
  75. package/dist/chunks/PopupManager-RWOaksC0.mjs.map +1 -0
  76. package/dist/chunks/PopupPositioning-a1ADYSmx.mjs +2 -0
  77. package/dist/chunks/PopupPositioning-a1ADYSmx.mjs.map +1 -0
  78. package/dist/chunks/PrintPlugin-CwbEz3eP.mjs +2 -0
  79. package/dist/chunks/PrintPlugin-CwbEz3eP.mjs.map +1 -0
  80. package/dist/chunks/PrintTypes-B2DXeAEG.mjs +2 -0
  81. package/dist/chunks/PrintTypes-B2DXeAEG.mjs.map +1 -0
  82. package/dist/chunks/Selection-B14e7gd0.mjs +2 -0
  83. package/dist/chunks/Selection-B14e7gd0.mjs.map +1 -0
  84. package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs +2 -0
  85. package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs.map +1 -0
  86. package/dist/chunks/SmartPastePlugin-CXqJ0CPO.mjs +2 -0
  87. package/dist/chunks/SmartPastePlugin-CXqJ0CPO.mjs.map +1 -0
  88. package/dist/chunks/StrikethroughPlugin-CRl69jm3.mjs +2 -0
  89. package/dist/chunks/StrikethroughPlugin-CRl69jm3.mjs.map +1 -0
  90. package/dist/chunks/StyleRuntime-0yPPJK9H.mjs +2 -0
  91. package/dist/chunks/StyleRuntime-0yPPJK9H.mjs.map +1 -0
  92. package/dist/chunks/SuperSubPlugin-CAnaTJVm.mjs +2 -0
  93. package/dist/chunks/SuperSubPlugin-CAnaTJVm.mjs.map +1 -0
  94. package/dist/chunks/TablePlugin-D_7bgrqm.mjs +2 -0
  95. package/dist/chunks/TablePlugin-D_7bgrqm.mjs.map +1 -0
  96. package/dist/chunks/TextColorPlugin-Dfhvl1qG.mjs +2 -0
  97. package/dist/chunks/TextColorPlugin-Dfhvl1qG.mjs.map +1 -0
  98. package/dist/chunks/TextDirectionCorePlugin-CyKw-C8X.mjs +2 -0
  99. package/dist/chunks/TextDirectionCorePlugin-CyKw-C8X.mjs.map +1 -0
  100. package/dist/chunks/TextDirectionLocale-rlU1yNly.mjs +2 -0
  101. package/dist/chunks/TextDirectionLocale-rlU1yNly.mjs.map +1 -0
  102. package/dist/chunks/TextFormattingPlugin-xtQczzCs.mjs +2 -0
  103. package/dist/chunks/TextFormattingPlugin-xtQczzCs.mjs.map +1 -0
  104. package/dist/chunks/ToolbarPlugin-BFEniyH-.mjs +2 -0
  105. package/dist/chunks/ToolbarPlugin-BFEniyH-.mjs.map +1 -0
  106. package/dist/chunks/TypeBrands-BQR8dEYU.mjs +2 -0
  107. package/dist/chunks/TypeBrands-BQR8dEYU.mjs.map +1 -0
  108. package/dist/chunks/WordBoundary-iZXLMFyk.mjs +2 -0
  109. package/dist/chunks/WordBoundary-iZXLMFyk.mjs.map +1 -0
  110. package/dist/chunks/XmlPatterns-Ub8I1jdE.mjs +2 -0
  111. package/dist/chunks/XmlPatterns-Ub8I1jdE.mjs.map +1 -0
  112. package/dist/chunks/ar-3-z4mZhh.mjs +2 -0
  113. package/dist/chunks/ar-3-z4mZhh.mjs.map +1 -0
  114. package/dist/chunks/ar-B-l6wR4D.mjs +2 -0
  115. package/dist/chunks/ar-B-l6wR4D.mjs.map +1 -0
  116. package/dist/chunks/ar-B3NByR5H.mjs +2 -0
  117. package/dist/chunks/ar-B3NByR5H.mjs.map +1 -0
  118. package/dist/chunks/ar-BRvm4F78.mjs +2 -0
  119. package/dist/chunks/ar-BRvm4F78.mjs.map +1 -0
  120. package/dist/chunks/ar-BUMXujtS.mjs +2 -0
  121. package/dist/chunks/ar-BUMXujtS.mjs.map +1 -0
  122. package/dist/chunks/ar-BhVHv8Lx.mjs +2 -0
  123. package/dist/chunks/ar-BhVHv8Lx.mjs.map +1 -0
  124. package/dist/chunks/ar-BhwRD9Cg.mjs +2 -0
  125. package/dist/chunks/ar-BhwRD9Cg.mjs.map +1 -0
  126. package/dist/chunks/ar-Bm8ORJ3H.mjs +2 -0
  127. package/dist/chunks/ar-Bm8ORJ3H.mjs.map +1 -0
  128. package/dist/chunks/ar-BpxuRQB2.mjs +2 -0
  129. package/dist/chunks/ar-BpxuRQB2.mjs.map +1 -0
  130. package/dist/chunks/ar-CA0-ysCj.mjs +2 -0
  131. package/dist/chunks/ar-CA0-ysCj.mjs.map +1 -0
  132. package/dist/chunks/ar-CAkFpIju.mjs +2 -0
  133. package/dist/chunks/ar-CAkFpIju.mjs.map +1 -0
  134. package/dist/chunks/ar-CU6qxyFp.mjs +2 -0
  135. package/dist/chunks/ar-CU6qxyFp.mjs.map +1 -0
  136. package/dist/chunks/ar-CXcTrZVc.mjs +2 -0
  137. package/dist/chunks/ar-CXcTrZVc.mjs.map +1 -0
  138. package/dist/chunks/ar-CeO_osWz.mjs +2 -0
  139. package/dist/chunks/ar-CeO_osWz.mjs.map +1 -0
  140. package/dist/chunks/ar-CxRSPJDE.mjs +2 -0
  141. package/dist/chunks/ar-CxRSPJDE.mjs.map +1 -0
  142. package/dist/chunks/ar-DHes6Igy.mjs +2 -0
  143. package/dist/chunks/ar-DHes6Igy.mjs.map +1 -0
  144. package/dist/chunks/ar-DN1aHdqb.mjs +2 -0
  145. package/dist/chunks/ar-DN1aHdqb.mjs.map +1 -0
  146. package/dist/chunks/ar-DNzmHN3q.mjs +2 -0
  147. package/dist/chunks/ar-DNzmHN3q.mjs.map +1 -0
  148. package/dist/chunks/ar-DVdWier2.mjs +2 -0
  149. package/dist/chunks/ar-DVdWier2.mjs.map +1 -0
  150. package/dist/chunks/ar-G_ADWoCx.mjs +2 -0
  151. package/dist/chunks/ar-G_ADWoCx.mjs.map +1 -0
  152. package/dist/chunks/ar-KAaQxKMo.mjs +2 -0
  153. package/dist/chunks/ar-KAaQxKMo.mjs.map +1 -0
  154. package/dist/chunks/ar-MHdV5PAO.mjs +2 -0
  155. package/dist/chunks/ar-MHdV5PAO.mjs.map +1 -0
  156. package/dist/chunks/ar-S2VfgLMv.mjs +2 -0
  157. package/dist/chunks/ar-S2VfgLMv.mjs.map +1 -0
  158. package/dist/chunks/color-picker-DumtHdqh.mjs +2 -0
  159. package/dist/chunks/color-picker-DumtHdqh.mjs.map +1 -0
  160. package/dist/chunks/de-0x8V-vch.mjs +2 -0
  161. package/dist/chunks/de-0x8V-vch.mjs.map +1 -0
  162. package/dist/chunks/de-B5xIP9en.mjs +2 -0
  163. package/dist/chunks/de-B5xIP9en.mjs.map +1 -0
  164. package/dist/chunks/de-BBohFIqw.mjs +2 -0
  165. package/dist/chunks/de-BBohFIqw.mjs.map +1 -0
  166. package/dist/chunks/de-BWPmC-2S.mjs +2 -0
  167. package/dist/chunks/de-BWPmC-2S.mjs.map +1 -0
  168. package/dist/chunks/de-Bo1kM9rb.mjs +2 -0
  169. package/dist/chunks/de-Bo1kM9rb.mjs.map +1 -0
  170. package/dist/chunks/de-BqzR2XMP.mjs +2 -0
  171. package/dist/chunks/de-BqzR2XMP.mjs.map +1 -0
  172. package/dist/chunks/de-CIZibvOC.mjs +2 -0
  173. package/dist/chunks/de-CIZibvOC.mjs.map +1 -0
  174. package/dist/chunks/de-CLToQn0o.mjs +2 -0
  175. package/dist/chunks/de-CLToQn0o.mjs.map +1 -0
  176. package/dist/chunks/de-CNoAAJul.mjs +2 -0
  177. package/dist/chunks/de-CNoAAJul.mjs.map +1 -0
  178. package/dist/chunks/de-CPb7rgkk.mjs +2 -0
  179. package/dist/chunks/de-CPb7rgkk.mjs.map +1 -0
  180. package/dist/chunks/de-CdmBKVDW.mjs +2 -0
  181. package/dist/chunks/de-CdmBKVDW.mjs.map +1 -0
  182. package/dist/chunks/de-DDgeyWgp.mjs +2 -0
  183. package/dist/chunks/de-DDgeyWgp.mjs.map +1 -0
  184. package/dist/chunks/de-DGXQ4OiR.mjs +2 -0
  185. package/dist/chunks/de-DGXQ4OiR.mjs.map +1 -0
  186. package/dist/chunks/de-DJbvKl4E.mjs +2 -0
  187. package/dist/chunks/de-DJbvKl4E.mjs.map +1 -0
  188. package/dist/chunks/de-DKNvYM_G.mjs +2 -0
  189. package/dist/chunks/de-DKNvYM_G.mjs.map +1 -0
  190. package/dist/chunks/de-DOHm_P4A.mjs +2 -0
  191. package/dist/chunks/de-DOHm_P4A.mjs.map +1 -0
  192. package/dist/chunks/de-DTMX75rn.mjs +2 -0
  193. package/dist/chunks/de-DTMX75rn.mjs.map +1 -0
  194. package/dist/chunks/de-DfkQds5F.mjs +2 -0
  195. package/dist/chunks/de-DfkQds5F.mjs.map +1 -0
  196. package/dist/chunks/de-TEQW-F4t.mjs +2 -0
  197. package/dist/chunks/de-TEQW-F4t.mjs.map +1 -0
  198. package/dist/chunks/de-WzdZ_NJ6.mjs +2 -0
  199. package/dist/chunks/de-WzdZ_NJ6.mjs.map +1 -0
  200. package/dist/chunks/de-_vqVfXeo.mjs +2 -0
  201. package/dist/chunks/de-_vqVfXeo.mjs.map +1 -0
  202. package/dist/chunks/de-gR6jt-sS.mjs +2 -0
  203. package/dist/chunks/de-gR6jt-sS.mjs.map +1 -0
  204. package/dist/chunks/de-qOBFRCGL.mjs +2 -0
  205. package/dist/chunks/de-qOBFRCGL.mjs.map +1 -0
  206. package/dist/chunks/es-1udUsTJd.mjs +2 -0
  207. package/dist/chunks/es-1udUsTJd.mjs.map +1 -0
  208. package/dist/chunks/es-3H7h0_G5.mjs +2 -0
  209. package/dist/chunks/es-3H7h0_G5.mjs.map +1 -0
  210. package/dist/chunks/es-4-5iRK0M.mjs +2 -0
  211. package/dist/chunks/es-4-5iRK0M.mjs.map +1 -0
  212. package/dist/chunks/es-89LD3TlT.mjs +2 -0
  213. package/dist/chunks/es-89LD3TlT.mjs.map +1 -0
  214. package/dist/chunks/es-B2KFVoHa.mjs +2 -0
  215. package/dist/chunks/es-B2KFVoHa.mjs.map +1 -0
  216. package/dist/chunks/es-BUP1scLX.mjs +2 -0
  217. package/dist/chunks/es-BUP1scLX.mjs.map +1 -0
  218. package/dist/chunks/es-Bhhj-yh0.mjs +2 -0
  219. package/dist/chunks/es-Bhhj-yh0.mjs.map +1 -0
  220. package/dist/chunks/es-Bo0NTtQH.mjs +2 -0
  221. package/dist/chunks/es-Bo0NTtQH.mjs.map +1 -0
  222. package/dist/chunks/es-Bovw7l2W.mjs +2 -0
  223. package/dist/chunks/es-Bovw7l2W.mjs.map +1 -0
  224. package/dist/chunks/es-C7xAs1yn.mjs +2 -0
  225. package/dist/chunks/es-C7xAs1yn.mjs.map +1 -0
  226. package/dist/chunks/es-CIdF7MzV.mjs +2 -0
  227. package/dist/chunks/es-CIdF7MzV.mjs.map +1 -0
  228. package/dist/chunks/es-CPit7Z6w.mjs +2 -0
  229. package/dist/chunks/es-CPit7Z6w.mjs.map +1 -0
  230. package/dist/chunks/es-CQzgvQI6.mjs +2 -0
  231. package/dist/chunks/es-CQzgvQI6.mjs.map +1 -0
  232. package/dist/chunks/es-CSteuqi5.mjs +2 -0
  233. package/dist/chunks/es-CSteuqi5.mjs.map +1 -0
  234. package/dist/chunks/es-ClJxqhu_.mjs +2 -0
  235. package/dist/chunks/es-ClJxqhu_.mjs.map +1 -0
  236. package/dist/chunks/es-CrmqYoVh.mjs +2 -0
  237. package/dist/chunks/es-CrmqYoVh.mjs.map +1 -0
  238. package/dist/chunks/es-CwRwLkfr.mjs +2 -0
  239. package/dist/chunks/es-CwRwLkfr.mjs.map +1 -0
  240. package/dist/chunks/es-D7DRGnkZ.mjs +2 -0
  241. package/dist/chunks/es-D7DRGnkZ.mjs.map +1 -0
  242. package/dist/chunks/es-DET1uMu-.mjs +2 -0
  243. package/dist/chunks/es-DET1uMu-.mjs.map +1 -0
  244. package/dist/chunks/es-Dj83hJxy.mjs +2 -0
  245. package/dist/chunks/es-Dj83hJxy.mjs.map +1 -0
  246. package/dist/chunks/es-DwYWucI6.mjs +2 -0
  247. package/dist/chunks/es-DwYWucI6.mjs.map +1 -0
  248. package/dist/chunks/es-DwrcpThR.mjs +2 -0
  249. package/dist/chunks/es-DwrcpThR.mjs.map +1 -0
  250. package/dist/chunks/es-z7xjgDdk.mjs +2 -0
  251. package/dist/chunks/es-z7xjgDdk.mjs.map +1 -0
  252. package/dist/chunks/fonts-CG5ZnGux.mjs +2 -0
  253. package/dist/chunks/fonts-CG5ZnGux.mjs.map +1 -0
  254. package/dist/chunks/fr-B73tOEzO.mjs +2 -0
  255. package/dist/chunks/fr-B73tOEzO.mjs.map +1 -0
  256. package/dist/chunks/fr-BEbsFEkX.mjs +2 -0
  257. package/dist/chunks/fr-BEbsFEkX.mjs.map +1 -0
  258. package/dist/chunks/fr-BFCaEBSV.mjs +2 -0
  259. package/dist/chunks/fr-BFCaEBSV.mjs.map +1 -0
  260. package/dist/chunks/fr-BJ69XrDO.mjs +2 -0
  261. package/dist/chunks/fr-BJ69XrDO.mjs.map +1 -0
  262. package/dist/chunks/fr-BdQ_-Iwg.mjs +2 -0
  263. package/dist/chunks/fr-BdQ_-Iwg.mjs.map +1 -0
  264. package/dist/chunks/fr-BhnuBA0i.mjs +2 -0
  265. package/dist/chunks/fr-BhnuBA0i.mjs.map +1 -0
  266. package/dist/chunks/fr-BiLmpXZ9.mjs +2 -0
  267. package/dist/chunks/fr-BiLmpXZ9.mjs.map +1 -0
  268. package/dist/chunks/fr-C1Pak7kS.mjs +2 -0
  269. package/dist/chunks/fr-C1Pak7kS.mjs.map +1 -0
  270. package/dist/chunks/fr-CFDoFELm.mjs +2 -0
  271. package/dist/chunks/fr-CFDoFELm.mjs.map +1 -0
  272. package/dist/chunks/fr-CmsH8BnY.mjs +2 -0
  273. package/dist/chunks/fr-CmsH8BnY.mjs.map +1 -0
  274. package/dist/chunks/fr-Cz2qWiuV.mjs +2 -0
  275. package/dist/chunks/fr-Cz2qWiuV.mjs.map +1 -0
  276. package/dist/chunks/fr-CzTPuD1P.mjs +2 -0
  277. package/dist/chunks/fr-CzTPuD1P.mjs.map +1 -0
  278. package/dist/chunks/fr-D1LQMsjB.mjs +2 -0
  279. package/dist/chunks/fr-D1LQMsjB.mjs.map +1 -0
  280. package/dist/chunks/fr-D84mXQrZ.mjs +2 -0
  281. package/dist/chunks/fr-D84mXQrZ.mjs.map +1 -0
  282. package/dist/chunks/fr-DX7z_ld0.mjs +2 -0
  283. package/dist/chunks/fr-DX7z_ld0.mjs.map +1 -0
  284. package/dist/chunks/fr-DXkQUerf.mjs +2 -0
  285. package/dist/chunks/fr-DXkQUerf.mjs.map +1 -0
  286. package/dist/chunks/fr-Di5gv5P8.mjs +2 -0
  287. package/dist/chunks/fr-Di5gv5P8.mjs.map +1 -0
  288. package/dist/chunks/fr-Dq5MrVWd.mjs +2 -0
  289. package/dist/chunks/fr-Dq5MrVWd.mjs.map +1 -0
  290. package/dist/chunks/fr-DtfEjLSL.mjs +2 -0
  291. package/dist/chunks/fr-DtfEjLSL.mjs.map +1 -0
  292. package/dist/chunks/fr-DvW-dpp3.mjs +2 -0
  293. package/dist/chunks/fr-DvW-dpp3.mjs.map +1 -0
  294. package/dist/chunks/fr-UJFNrn-V.mjs +2 -0
  295. package/dist/chunks/fr-UJFNrn-V.mjs.map +1 -0
  296. package/dist/chunks/fr-hK8X-sM6.mjs +2 -0
  297. package/dist/chunks/fr-hK8X-sM6.mjs.map +1 -0
  298. package/dist/chunks/fr-uuOSXj4L.mjs +2 -0
  299. package/dist/chunks/fr-uuOSXj4L.mjs.map +1 -0
  300. package/dist/chunks/full-216JgIG1.mjs +2 -0
  301. package/dist/chunks/full-216JgIG1.mjs.map +1 -0
  302. package/dist/chunks/hi-B2kXjElO.mjs +2 -0
  303. package/dist/chunks/hi-B2kXjElO.mjs.map +1 -0
  304. package/dist/chunks/hi-B2mEQ5gX.mjs +2 -0
  305. package/dist/chunks/hi-B2mEQ5gX.mjs.map +1 -0
  306. package/dist/chunks/hi-B61lTO2W.mjs +2 -0
  307. package/dist/chunks/hi-B61lTO2W.mjs.map +1 -0
  308. package/dist/chunks/hi-BD5HrbxU.mjs +2 -0
  309. package/dist/chunks/hi-BD5HrbxU.mjs.map +1 -0
  310. package/dist/chunks/hi-BHTvSWXw.mjs +2 -0
  311. package/dist/chunks/hi-BHTvSWXw.mjs.map +1 -0
  312. package/dist/chunks/hi-BYyaOBqY.mjs +2 -0
  313. package/dist/chunks/hi-BYyaOBqY.mjs.map +1 -0
  314. package/dist/chunks/hi-Bhlbz5gX.mjs +2 -0
  315. package/dist/chunks/hi-Bhlbz5gX.mjs.map +1 -0
  316. package/dist/chunks/hi-BniuSk3L.mjs +2 -0
  317. package/dist/chunks/hi-BniuSk3L.mjs.map +1 -0
  318. package/dist/chunks/hi-CBODdhOq.mjs +2 -0
  319. package/dist/chunks/hi-CBODdhOq.mjs.map +1 -0
  320. package/dist/chunks/hi-CKWQCooT.mjs +2 -0
  321. package/dist/chunks/hi-CKWQCooT.mjs.map +1 -0
  322. package/dist/chunks/hi-CkoruGVs.mjs +2 -0
  323. package/dist/chunks/hi-CkoruGVs.mjs.map +1 -0
  324. package/dist/chunks/hi-D6Ge3Lp5.mjs +2 -0
  325. package/dist/chunks/hi-D6Ge3Lp5.mjs.map +1 -0
  326. package/dist/chunks/hi-DEreeBFj.mjs +2 -0
  327. package/dist/chunks/hi-DEreeBFj.mjs.map +1 -0
  328. package/dist/chunks/hi-Dj4JW-9k.mjs +2 -0
  329. package/dist/chunks/hi-Dj4JW-9k.mjs.map +1 -0
  330. package/dist/chunks/hi-DkP4pHSX.mjs +2 -0
  331. package/dist/chunks/hi-DkP4pHSX.mjs.map +1 -0
  332. package/dist/chunks/hi-DknCX8Nx.mjs +2 -0
  333. package/dist/chunks/hi-DknCX8Nx.mjs.map +1 -0
  334. package/dist/chunks/hi-Dm1KJQQ5.mjs +2 -0
  335. package/dist/chunks/hi-Dm1KJQQ5.mjs.map +1 -0
  336. package/dist/chunks/hi-Dx-LTWg-.mjs +2 -0
  337. package/dist/chunks/hi-Dx-LTWg-.mjs.map +1 -0
  338. package/dist/chunks/hi-RDoZtwMm.mjs +2 -0
  339. package/dist/chunks/hi-RDoZtwMm.mjs.map +1 -0
  340. package/dist/chunks/hi-Tq9eDRk7.mjs +2 -0
  341. package/dist/chunks/hi-Tq9eDRk7.mjs.map +1 -0
  342. package/dist/chunks/hi-_vJ_Eo4p.mjs +2 -0
  343. package/dist/chunks/hi-_vJ_Eo4p.mjs.map +1 -0
  344. package/dist/chunks/hi-l8E-czFm.mjs +2 -0
  345. package/dist/chunks/hi-l8E-czFm.mjs.map +1 -0
  346. package/dist/chunks/hi-ydmPh3HB.mjs +2 -0
  347. package/dist/chunks/hi-ydmPh3HB.mjs.map +1 -0
  348. package/dist/chunks/minimal-D-QxXO1C.mjs +2 -0
  349. package/dist/chunks/minimal-D-QxXO1C.mjs.map +1 -0
  350. package/dist/chunks/pt-B4NUSLW8.mjs +2 -0
  351. package/dist/chunks/pt-B4NUSLW8.mjs.map +1 -0
  352. package/dist/chunks/pt-B8VKEboV.mjs +2 -0
  353. package/dist/chunks/pt-B8VKEboV.mjs.map +1 -0
  354. package/dist/chunks/pt-BMDKykEi.mjs +2 -0
  355. package/dist/chunks/pt-BMDKykEi.mjs.map +1 -0
  356. package/dist/chunks/pt-BmWE3xXF.mjs +2 -0
  357. package/dist/chunks/pt-BmWE3xXF.mjs.map +1 -0
  358. package/dist/chunks/pt-CJWKE1SW.mjs +2 -0
  359. package/dist/chunks/pt-CJWKE1SW.mjs.map +1 -0
  360. package/dist/chunks/pt-CKETXoPa.mjs +2 -0
  361. package/dist/chunks/pt-CKETXoPa.mjs.map +1 -0
  362. package/dist/chunks/pt-CKRs16QH.mjs +2 -0
  363. package/dist/chunks/pt-CKRs16QH.mjs.map +1 -0
  364. package/dist/chunks/pt-Cb-1GHq4.mjs +2 -0
  365. package/dist/chunks/pt-Cb-1GHq4.mjs.map +1 -0
  366. package/dist/chunks/pt-CgpU74p4.mjs +2 -0
  367. package/dist/chunks/pt-CgpU74p4.mjs.map +1 -0
  368. package/dist/chunks/pt-CtOdAphq.mjs +2 -0
  369. package/dist/chunks/pt-CtOdAphq.mjs.map +1 -0
  370. package/dist/chunks/pt-CzaPFMSx.mjs +2 -0
  371. package/dist/chunks/pt-CzaPFMSx.mjs.map +1 -0
  372. package/dist/chunks/pt-DGuLcW0m.mjs +2 -0
  373. package/dist/chunks/pt-DGuLcW0m.mjs.map +1 -0
  374. package/dist/chunks/pt-DHzSXzlf.mjs +2 -0
  375. package/dist/chunks/pt-DHzSXzlf.mjs.map +1 -0
  376. package/dist/chunks/pt-DWDdBfLk.mjs +2 -0
  377. package/dist/chunks/pt-DWDdBfLk.mjs.map +1 -0
  378. package/dist/chunks/pt-DZ6Liq_x.mjs +2 -0
  379. package/dist/chunks/pt-DZ6Liq_x.mjs.map +1 -0
  380. package/dist/chunks/pt-D_MD7MJu.mjs +2 -0
  381. package/dist/chunks/pt-D_MD7MJu.mjs.map +1 -0
  382. package/dist/chunks/pt-DgaY_yNG.mjs +2 -0
  383. package/dist/chunks/pt-DgaY_yNG.mjs.map +1 -0
  384. package/dist/chunks/pt-DgzgCxdH.mjs +2 -0
  385. package/dist/chunks/pt-DgzgCxdH.mjs.map +1 -0
  386. package/dist/chunks/pt-Dh7nUcAM.mjs +2 -0
  387. package/dist/chunks/pt-Dh7nUcAM.mjs.map +1 -0
  388. package/dist/chunks/pt-P914L5AX.mjs +2 -0
  389. package/dist/chunks/pt-P914L5AX.mjs.map +1 -0
  390. package/dist/chunks/pt-XT1vsWZj.mjs +2 -0
  391. package/dist/chunks/pt-XT1vsWZj.mjs.map +1 -0
  392. package/dist/chunks/pt-jJ0XXSVz.mjs +2 -0
  393. package/dist/chunks/pt-jJ0XXSVz.mjs.map +1 -0
  394. package/dist/chunks/pt-tuOLwYkM.mjs +2 -0
  395. package/dist/chunks/pt-tuOLwYkM.mjs.map +1 -0
  396. package/dist/chunks/rolldown-runtime-B8Ku5yk6.mjs +1 -0
  397. package/dist/chunks/ru-7m8CMM17.mjs +2 -0
  398. package/dist/chunks/ru-7m8CMM17.mjs.map +1 -0
  399. package/dist/chunks/ru-9Qh1fR-K.mjs +2 -0
  400. package/dist/chunks/ru-9Qh1fR-K.mjs.map +1 -0
  401. package/dist/chunks/ru-B5gK8OLp.mjs +2 -0
  402. package/dist/chunks/ru-B5gK8OLp.mjs.map +1 -0
  403. package/dist/chunks/ru-BRNN6ldH.mjs +2 -0
  404. package/dist/chunks/ru-BRNN6ldH.mjs.map +1 -0
  405. package/dist/chunks/ru-BiyE9o-D.mjs +2 -0
  406. package/dist/chunks/ru-BiyE9o-D.mjs.map +1 -0
  407. package/dist/chunks/ru-BpGTIPbv.mjs +2 -0
  408. package/dist/chunks/ru-BpGTIPbv.mjs.map +1 -0
  409. package/dist/chunks/ru-CAzMaI4y.mjs +2 -0
  410. package/dist/chunks/ru-CAzMaI4y.mjs.map +1 -0
  411. package/dist/chunks/ru-COo6HpcD.mjs +2 -0
  412. package/dist/chunks/ru-COo6HpcD.mjs.map +1 -0
  413. package/dist/chunks/ru-CgEOZsUs.mjs +2 -0
  414. package/dist/chunks/ru-CgEOZsUs.mjs.map +1 -0
  415. package/dist/chunks/ru-CptzezhV.mjs +2 -0
  416. package/dist/chunks/ru-CptzezhV.mjs.map +1 -0
  417. package/dist/chunks/ru-Ct0qNMLS.mjs +2 -0
  418. package/dist/chunks/ru-Ct0qNMLS.mjs.map +1 -0
  419. package/dist/chunks/ru-Ct2IrzbA.mjs +2 -0
  420. package/dist/chunks/ru-Ct2IrzbA.mjs.map +1 -0
  421. package/dist/chunks/ru-CyHnlWLN.mjs +2 -0
  422. package/dist/chunks/ru-CyHnlWLN.mjs.map +1 -0
  423. package/dist/chunks/ru-DF0vhzeC.mjs +2 -0
  424. package/dist/chunks/ru-DF0vhzeC.mjs.map +1 -0
  425. package/dist/chunks/ru-DH6rsOWL.mjs +2 -0
  426. package/dist/chunks/ru-DH6rsOWL.mjs.map +1 -0
  427. package/dist/chunks/ru-DHH8k6G8.mjs +2 -0
  428. package/dist/chunks/ru-DHH8k6G8.mjs.map +1 -0
  429. package/dist/chunks/ru-GVReqjM4.mjs +2 -0
  430. package/dist/chunks/ru-GVReqjM4.mjs.map +1 -0
  431. package/dist/chunks/ru-IzloX5CY.mjs +2 -0
  432. package/dist/chunks/ru-IzloX5CY.mjs.map +1 -0
  433. package/dist/chunks/ru-ZrzXB0f6.mjs +2 -0
  434. package/dist/chunks/ru-ZrzXB0f6.mjs.map +1 -0
  435. package/dist/chunks/ru-asRKygvE.mjs +2 -0
  436. package/dist/chunks/ru-asRKygvE.mjs.map +1 -0
  437. package/dist/chunks/ru-m19l8nRA.mjs +2 -0
  438. package/dist/chunks/ru-m19l8nRA.mjs.map +1 -0
  439. package/dist/chunks/ru-vfQ5Xaz4.mjs +2 -0
  440. package/dist/chunks/ru-vfQ5Xaz4.mjs.map +1 -0
  441. package/dist/chunks/ru-wVOlNily.mjs +2 -0
  442. package/dist/chunks/ru-wVOlNily.mjs.map +1 -0
  443. package/dist/chunks/shared-DxmfXZH7.mjs +2 -0
  444. package/dist/chunks/shared-DxmfXZH7.mjs.map +1 -0
  445. package/dist/chunks/src-DFXIsulM.mjs +2 -0
  446. package/dist/chunks/src-DFXIsulM.mjs.map +1 -0
  447. package/dist/chunks/text-direction-advanced-B5JuIs0P.mjs +2 -0
  448. package/dist/chunks/text-direction-advanced-B5JuIs0P.mjs.map +1 -0
  449. package/dist/chunks/zh-0uhsRxfq.mjs +2 -0
  450. package/dist/chunks/zh-0uhsRxfq.mjs.map +1 -0
  451. package/dist/chunks/zh-1BrLr5Wk.mjs +2 -0
  452. package/dist/chunks/zh-1BrLr5Wk.mjs.map +1 -0
  453. package/dist/chunks/zh-BNHeXa_M.mjs +2 -0
  454. package/dist/chunks/zh-BNHeXa_M.mjs.map +1 -0
  455. package/dist/chunks/zh-BOpBzSX3.mjs +2 -0
  456. package/dist/chunks/zh-BOpBzSX3.mjs.map +1 -0
  457. package/dist/chunks/zh-BV2uDDGf.mjs +2 -0
  458. package/dist/chunks/zh-BV2uDDGf.mjs.map +1 -0
  459. package/dist/chunks/zh-BkoPteNb.mjs +2 -0
  460. package/dist/chunks/zh-BkoPteNb.mjs.map +1 -0
  461. package/dist/chunks/zh-C2z0g7OC.mjs +2 -0
  462. package/dist/chunks/zh-C2z0g7OC.mjs.map +1 -0
  463. package/dist/chunks/zh-CeJw45yo.mjs +2 -0
  464. package/dist/chunks/zh-CeJw45yo.mjs.map +1 -0
  465. package/dist/chunks/zh-CwVkxL4q.mjs +2 -0
  466. package/dist/chunks/zh-CwVkxL4q.mjs.map +1 -0
  467. package/dist/chunks/zh-Cy7mujpx.mjs +2 -0
  468. package/dist/chunks/zh-Cy7mujpx.mjs.map +1 -0
  469. package/dist/chunks/zh-D-P00ENX.mjs +2 -0
  470. package/dist/chunks/zh-D-P00ENX.mjs.map +1 -0
  471. package/dist/chunks/zh-D5d-NAuv.mjs +2 -0
  472. package/dist/chunks/zh-D5d-NAuv.mjs.map +1 -0
  473. package/dist/chunks/zh-D6gTQA2W.mjs +2 -0
  474. package/dist/chunks/zh-D6gTQA2W.mjs.map +1 -0
  475. package/dist/chunks/zh-DLwq4e4-.mjs +2 -0
  476. package/dist/chunks/zh-DLwq4e4-.mjs.map +1 -0
  477. package/dist/chunks/zh-D_Yb8Eg6.mjs +2 -0
  478. package/dist/chunks/zh-D_Yb8Eg6.mjs.map +1 -0
  479. package/dist/chunks/zh-DaNHqNDY.mjs +2 -0
  480. package/dist/chunks/zh-DaNHqNDY.mjs.map +1 -0
  481. package/dist/chunks/zh-De7-Y4O5.mjs +2 -0
  482. package/dist/chunks/zh-De7-Y4O5.mjs.map +1 -0
  483. package/dist/chunks/zh-Dj7kHEcp.mjs +2 -0
  484. package/dist/chunks/zh-Dj7kHEcp.mjs.map +1 -0
  485. package/dist/chunks/zh-Dl0oVWiK.mjs +2 -0
  486. package/dist/chunks/zh-Dl0oVWiK.mjs.map +1 -0
  487. package/dist/chunks/zh-Do0plBjM.mjs +2 -0
  488. package/dist/chunks/zh-Do0plBjM.mjs.map +1 -0
  489. package/dist/chunks/zh-Q0aDk5UA.mjs +2 -0
  490. package/dist/chunks/zh-Q0aDk5UA.mjs.map +1 -0
  491. package/dist/chunks/zh-eSgs8mzc.mjs +2 -0
  492. package/dist/chunks/zh-eSgs8mzc.mjs.map +1 -0
  493. package/dist/chunks/zh-giWyGMSZ.mjs +2 -0
  494. package/dist/chunks/zh-giWyGMSZ.mjs.map +1 -0
  495. package/dist/commands/BlockInsertion.d.ts.map +1 -1
  496. package/dist/commands/CommandHelpers.d.ts +13 -2
  497. package/dist/commands/CommandHelpers.d.ts.map +1 -1
  498. package/dist/commands/NodeSelectionCommands.d.ts +3 -8
  499. package/dist/commands/NodeSelectionCommands.d.ts.map +1 -1
  500. package/dist/editor/ContentSerializer.d.ts.map +1 -1
  501. package/dist/editor/EditorConfig.d.ts +50 -0
  502. package/dist/editor/EditorConfig.d.ts.map +1 -0
  503. package/dist/editor/EditorConfigController.d.ts +1 -1
  504. package/dist/editor/EditorConfigController.d.ts.map +1 -1
  505. package/dist/editor/EditorDOM.d.ts.map +1 -1
  506. package/dist/editor/EditorInitializer.d.ts +37 -0
  507. package/dist/editor/EditorInitializer.d.ts.map +1 -0
  508. package/dist/editor/EditorLifecycleCoordinator.d.ts +6 -1
  509. package/dist/editor/EditorLifecycleCoordinator.d.ts.map +1 -1
  510. package/dist/editor/NotectlEditor.d.ts +13 -51
  511. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  512. package/dist/editor/PluginBootstrapper.d.ts +1 -1
  513. package/dist/editor/PluginBootstrapper.d.ts.map +1 -1
  514. package/dist/fonts.mjs +1 -2
  515. package/dist/full.mjs +1 -2
  516. package/dist/html.mjs +1 -2
  517. package/dist/input/ClipboardHandler.d.ts +5 -0
  518. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  519. package/dist/input/HTMLParser.d.ts +9 -5
  520. package/dist/input/HTMLParser.d.ts.map +1 -1
  521. package/dist/input/InputHandler.d.ts +1 -0
  522. package/dist/input/InputHandler.d.ts.map +1 -1
  523. package/dist/input/PasteHTMLHandler.d.ts +25 -0
  524. package/dist/input/PasteHTMLHandler.d.ts.map +1 -0
  525. package/dist/input/PasteHandler.d.ts +2 -27
  526. package/dist/input/PasteHandler.d.ts.map +1 -1
  527. package/dist/input/PasteRichBlockHandler.d.ts +23 -0
  528. package/dist/input/PasteRichBlockHandler.d.ts.map +1 -0
  529. package/dist/input/SelectionDocument.d.ts +10 -0
  530. package/dist/input/SelectionDocument.d.ts.map +1 -0
  531. package/dist/model/RichBlockData.d.ts +12 -2
  532. package/dist/model/RichBlockData.d.ts.map +1 -1
  533. package/dist/notectl-core.mjs +1 -2
  534. package/dist/notectl-core.umd.js +2 -2
  535. package/dist/notectl-core.umd.js.map +1 -1
  536. package/dist/plugins/PluginContextFactory.d.ts +73 -0
  537. package/dist/plugins/PluginContextFactory.d.ts.map +1 -0
  538. package/dist/plugins/PluginManager.d.ts +5 -0
  539. package/dist/plugins/PluginManager.d.ts.map +1 -1
  540. package/dist/plugins/alignment.mjs +1 -2
  541. package/dist/plugins/blockquote.mjs +1 -2
  542. package/dist/plugins/caret-navigation.mjs +1 -2
  543. package/dist/plugins/code-block.mjs +1 -2
  544. package/dist/plugins/font-size.mjs +1 -2
  545. package/dist/plugins/font.mjs +1 -2
  546. package/dist/plugins/gap-cursor.mjs +1 -2
  547. package/dist/plugins/hard-break.mjs +1 -2
  548. package/dist/plugins/heading.mjs +1 -2
  549. package/dist/plugins/highlight.mjs +1 -2
  550. package/dist/plugins/horizontal-rule.mjs +1 -2
  551. package/dist/plugins/image/ImageCommands.d.ts.map +1 -1
  552. package/dist/plugins/image.mjs +1 -2
  553. package/dist/plugins/link.mjs +1 -2
  554. package/dist/plugins/list.mjs +1 -2
  555. package/dist/plugins/print/PrintContentPreparer.d.ts.map +1 -1
  556. package/dist/plugins/print.mjs +1 -2
  557. package/dist/plugins/shared/PopupManager.d.ts.map +1 -1
  558. package/dist/plugins/shared.mjs +1 -2
  559. package/dist/plugins/smart-paste.mjs +1 -2
  560. package/dist/plugins/strikethrough.mjs +1 -2
  561. package/dist/plugins/super-sub.mjs +1 -2
  562. package/dist/plugins/table/TableCommands.d.ts +1 -0
  563. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  564. package/dist/plugins/table/TableContextMenu.d.ts.map +1 -1
  565. package/dist/plugins/table/TableSelection.d.ts.map +1 -1
  566. package/dist/plugins/table.mjs +1 -2
  567. package/dist/plugins/text-color.mjs +1 -2
  568. package/dist/plugins/text-direction-advanced.mjs +1 -2
  569. package/dist/plugins/text-direction.mjs +1 -2
  570. package/dist/plugins/text-formatting.mjs +1 -2
  571. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts +2 -0
  572. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -1
  573. package/dist/plugins/toolbar.mjs +1 -2
  574. package/dist/presets/full.mjs +1 -2
  575. package/dist/presets/minimal.mjs +1 -2
  576. package/dist/presets.mjs +1 -2
  577. package/dist/state/StepInversion.d.ts.map +1 -1
  578. package/dist/view/EditorView.d.ts +8 -58
  579. package/dist/view/EditorView.d.ts.map +1 -1
  580. package/dist/view/EditorViewEvents.d.ts +54 -0
  581. package/dist/view/EditorViewEvents.d.ts.map +1 -0
  582. package/dist/view/EditorViewNavigation.d.ts +47 -0
  583. package/dist/view/EditorViewNavigation.d.ts.map +1 -0
  584. package/dist/view/SelectionSync.d.ts.map +1 -1
  585. package/package.json +5 -5
  586. package/dist/chunks/AttrRegistry-Ckj9eCHj.mjs +0 -2
  587. package/dist/chunks/AttrRegistry-Ckj9eCHj.mjs.map +0 -1
  588. package/dist/chunks/AttributedMarkCommands-x7h4Xy7V.mjs +0 -2
  589. package/dist/chunks/AttributedMarkCommands-x7h4Xy7V.mjs.map +0 -1
  590. package/dist/chunks/BlockInsertion-zPxm6oa_.mjs +0 -2
  591. package/dist/chunks/BlockInsertion-zPxm6oa_.mjs.map +0 -1
  592. package/dist/chunks/BlockTypePickerRegistry-DcSE6IXB.mjs +0 -2
  593. package/dist/chunks/BlockTypePickerRegistry-DcSE6IXB.mjs.map +0 -1
  594. package/dist/chunks/ColorGrid-CpkbKfXg.mjs +0 -2
  595. package/dist/chunks/ColorGrid-CpkbKfXg.mjs.map +0 -1
  596. package/dist/chunks/ColorPickerPopup-CDUvkgcK.mjs +0 -2
  597. package/dist/chunks/ColorPickerPopup-CDUvkgcK.mjs.map +0 -1
  598. package/dist/chunks/ColorValidation-DCSKq9B2.mjs +0 -2
  599. package/dist/chunks/ColorValidation-DCSKq9B2.mjs.map +0 -1
  600. package/dist/chunks/Commands-DwXBBVGR.mjs +0 -2
  601. package/dist/chunks/Commands-DwXBBVGR.mjs.map +0 -1
  602. package/dist/chunks/Decoration-D49mFXrH.mjs +0 -2
  603. package/dist/chunks/Decoration-D49mFXrH.mjs.map +0 -1
  604. package/dist/chunks/Document-HC8s50qJ.mjs +0 -2
  605. package/dist/chunks/Document-HC8s50qJ.mjs.map +0 -1
  606. package/dist/chunks/DocumentParser-w70-Axud.mjs +0 -2
  607. package/dist/chunks/DocumentParser-w70-Axud.mjs.map +0 -1
  608. package/dist/chunks/DomUtils-CznMAZZg.mjs +0 -2
  609. package/dist/chunks/DomUtils-CznMAZZg.mjs.map +0 -1
  610. package/dist/chunks/HTMLUtils-Cxy99Ak2.mjs +0 -2
  611. package/dist/chunks/HTMLUtils-Cxy99Ak2.mjs.map +0 -1
  612. package/dist/chunks/HeadingPlugin-B-LF-AMM.mjs +0 -2
  613. package/dist/chunks/HeadingPlugin-B-LF-AMM.mjs.map +0 -1
  614. package/dist/chunks/KeyboardNav-DsYhKKuV.mjs +0 -2
  615. package/dist/chunks/KeyboardNav-DsYhKKuV.mjs.map +0 -1
  616. package/dist/chunks/MarkCommands-CTuVDqnn.mjs +0 -2
  617. package/dist/chunks/MarkCommands-CTuVDqnn.mjs.map +0 -1
  618. package/dist/chunks/NavigationQueries-DCOv4Ca5.mjs +0 -2
  619. package/dist/chunks/NavigationQueries-DCOv4Ca5.mjs.map +0 -1
  620. package/dist/chunks/NotectlEditor-DBBJkPCW.mjs +0 -3
  621. package/dist/chunks/NotectlEditor-DBBJkPCW.mjs.map +0 -1
  622. package/dist/chunks/Platform-CU6itXZo.mjs +0 -2
  623. package/dist/chunks/Platform-CU6itXZo.mjs.map +0 -1
  624. package/dist/chunks/PluginHelpers-CdPR0MuT.mjs +0 -2
  625. package/dist/chunks/PluginHelpers-CdPR0MuT.mjs.map +0 -1
  626. package/dist/chunks/PopupManager-Du3dYnsJ.mjs +0 -2
  627. package/dist/chunks/PopupManager-Du3dYnsJ.mjs.map +0 -1
  628. package/dist/chunks/PopupPositioning-DtvqMSop.mjs +0 -2
  629. package/dist/chunks/PopupPositioning-DtvqMSop.mjs.map +0 -1
  630. package/dist/chunks/PrintTypes-DukwDSWS.mjs +0 -2
  631. package/dist/chunks/PrintTypes-DukwDSWS.mjs.map +0 -1
  632. package/dist/chunks/RangeIterator-CprUbOWv.mjs +0 -2
  633. package/dist/chunks/RangeIterator-CprUbOWv.mjs.map +0 -1
  634. package/dist/chunks/Selection-DhbizDM4.mjs +0 -2
  635. package/dist/chunks/Selection-DhbizDM4.mjs.map +0 -1
  636. package/dist/chunks/SelectionTransactions-DB3YDIEa.mjs +0 -2
  637. package/dist/chunks/SelectionTransactions-DB3YDIEa.mjs.map +0 -1
  638. package/dist/chunks/ShortcutFormatting-BLKS0Gys.mjs +0 -2
  639. package/dist/chunks/ShortcutFormatting-BLKS0Gys.mjs.map +0 -1
  640. package/dist/chunks/StyleRuntime-BmsLoEa8.mjs +0 -2
  641. package/dist/chunks/StyleRuntime-BmsLoEa8.mjs.map +0 -1
  642. package/dist/chunks/TextDirectionLocale-BraFI9JF.mjs +0 -2
  643. package/dist/chunks/TextDirectionLocale-BraFI9JF.mjs.map +0 -1
  644. package/dist/chunks/TypeBrands-Bp_Z_o5Y.mjs +0 -2
  645. package/dist/chunks/TypeBrands-Bp_Z_o5Y.mjs.map +0 -1
  646. package/dist/chunks/XmlPatterns-DxQXGjP8.mjs +0 -2
  647. package/dist/chunks/XmlPatterns-DxQXGjP8.mjs.map +0 -1
  648. package/dist/chunks/ar-B93SPJT7.mjs +0 -2
  649. package/dist/chunks/ar-B93SPJT7.mjs.map +0 -1
  650. package/dist/chunks/ar-BAmGa08u.mjs +0 -2
  651. package/dist/chunks/ar-BAmGa08u.mjs.map +0 -1
  652. package/dist/chunks/ar-BYNFEVLc.mjs +0 -2
  653. package/dist/chunks/ar-BYNFEVLc.mjs.map +0 -1
  654. package/dist/chunks/ar-Bnc7y8BP.mjs +0 -2
  655. package/dist/chunks/ar-Bnc7y8BP.mjs.map +0 -1
  656. package/dist/chunks/ar-Bp3rDZky.mjs +0 -2
  657. package/dist/chunks/ar-Bp3rDZky.mjs.map +0 -1
  658. package/dist/chunks/ar-BtOQ7lro.mjs +0 -2
  659. package/dist/chunks/ar-BtOQ7lro.mjs.map +0 -1
  660. package/dist/chunks/ar-C5JEHhw9.mjs +0 -2
  661. package/dist/chunks/ar-C5JEHhw9.mjs.map +0 -1
  662. package/dist/chunks/ar-CL3QL0tw.mjs +0 -2
  663. package/dist/chunks/ar-CL3QL0tw.mjs.map +0 -1
  664. package/dist/chunks/ar-CYtG-XlN.mjs +0 -2
  665. package/dist/chunks/ar-CYtG-XlN.mjs.map +0 -1
  666. package/dist/chunks/ar-CzVj8p__.mjs +0 -2
  667. package/dist/chunks/ar-CzVj8p__.mjs.map +0 -1
  668. package/dist/chunks/ar-D7PS3e2g.mjs +0 -2
  669. package/dist/chunks/ar-D7PS3e2g.mjs.map +0 -1
  670. package/dist/chunks/ar-D8adM2Uy.mjs +0 -2
  671. package/dist/chunks/ar-D8adM2Uy.mjs.map +0 -1
  672. package/dist/chunks/ar-D9jyShaB.mjs +0 -2
  673. package/dist/chunks/ar-D9jyShaB.mjs.map +0 -1
  674. package/dist/chunks/ar-DR6OA3ZO.mjs +0 -2
  675. package/dist/chunks/ar-DR6OA3ZO.mjs.map +0 -1
  676. package/dist/chunks/ar-Deibepjm.mjs +0 -2
  677. package/dist/chunks/ar-Deibepjm.mjs.map +0 -1
  678. package/dist/chunks/ar-Dlb5riUN.mjs +0 -2
  679. package/dist/chunks/ar-Dlb5riUN.mjs.map +0 -1
  680. package/dist/chunks/ar-DmmxE2W7.mjs +0 -2
  681. package/dist/chunks/ar-DmmxE2W7.mjs.map +0 -1
  682. package/dist/chunks/ar-Ds6Z2Gzf.mjs +0 -2
  683. package/dist/chunks/ar-Ds6Z2Gzf.mjs.map +0 -1
  684. package/dist/chunks/ar-DtIHQ8nU.mjs +0 -2
  685. package/dist/chunks/ar-DtIHQ8nU.mjs.map +0 -1
  686. package/dist/chunks/ar-J8B-on-0.mjs +0 -2
  687. package/dist/chunks/ar-J8B-on-0.mjs.map +0 -1
  688. package/dist/chunks/ar-b6VdnxAs.mjs +0 -2
  689. package/dist/chunks/ar-b6VdnxAs.mjs.map +0 -1
  690. package/dist/chunks/ar-iU02mRe5.mjs +0 -2
  691. package/dist/chunks/ar-iU02mRe5.mjs.map +0 -1
  692. package/dist/chunks/ar-mSCYQYnL.mjs +0 -2
  693. package/dist/chunks/ar-mSCYQYnL.mjs.map +0 -1
  694. package/dist/chunks/color-picker-Byjl_xr9.mjs +0 -2
  695. package/dist/chunks/color-picker-Byjl_xr9.mjs.map +0 -1
  696. package/dist/chunks/de-8aCC5jBM.mjs +0 -2
  697. package/dist/chunks/de-8aCC5jBM.mjs.map +0 -1
  698. package/dist/chunks/de-B4y4ndUw.mjs +0 -2
  699. package/dist/chunks/de-B4y4ndUw.mjs.map +0 -1
  700. package/dist/chunks/de-B5fcZ0FQ.mjs +0 -2
  701. package/dist/chunks/de-B5fcZ0FQ.mjs.map +0 -1
  702. package/dist/chunks/de-BT9VmwoJ.mjs +0 -2
  703. package/dist/chunks/de-BT9VmwoJ.mjs.map +0 -1
  704. package/dist/chunks/de-BZWSyJTG.mjs +0 -2
  705. package/dist/chunks/de-BZWSyJTG.mjs.map +0 -1
  706. package/dist/chunks/de-CFD_Wgik.mjs +0 -2
  707. package/dist/chunks/de-CFD_Wgik.mjs.map +0 -1
  708. package/dist/chunks/de-CLYtb6kD.mjs +0 -2
  709. package/dist/chunks/de-CLYtb6kD.mjs.map +0 -1
  710. package/dist/chunks/de-CP5v-98M.mjs +0 -2
  711. package/dist/chunks/de-CP5v-98M.mjs.map +0 -1
  712. package/dist/chunks/de-CYJ6uWno.mjs +0 -2
  713. package/dist/chunks/de-CYJ6uWno.mjs.map +0 -1
  714. package/dist/chunks/de-ChcKkF7A.mjs +0 -2
  715. package/dist/chunks/de-ChcKkF7A.mjs.map +0 -1
  716. package/dist/chunks/de-CicoU066.mjs +0 -2
  717. package/dist/chunks/de-CicoU066.mjs.map +0 -1
  718. package/dist/chunks/de-CjLAdBt2.mjs +0 -2
  719. package/dist/chunks/de-CjLAdBt2.mjs.map +0 -1
  720. package/dist/chunks/de-CtFvAXwF.mjs +0 -2
  721. package/dist/chunks/de-CtFvAXwF.mjs.map +0 -1
  722. package/dist/chunks/de-D1OAXtxJ.mjs +0 -2
  723. package/dist/chunks/de-D1OAXtxJ.mjs.map +0 -1
  724. package/dist/chunks/de-DBbzCQrm.mjs +0 -2
  725. package/dist/chunks/de-DBbzCQrm.mjs.map +0 -1
  726. package/dist/chunks/de-DOLwx_M7.mjs +0 -2
  727. package/dist/chunks/de-DOLwx_M7.mjs.map +0 -1
  728. package/dist/chunks/de-De2miMxo.mjs +0 -2
  729. package/dist/chunks/de-De2miMxo.mjs.map +0 -1
  730. package/dist/chunks/de-OTfhhinm.mjs +0 -2
  731. package/dist/chunks/de-OTfhhinm.mjs.map +0 -1
  732. package/dist/chunks/de-PZ9-LlBp.mjs +0 -2
  733. package/dist/chunks/de-PZ9-LlBp.mjs.map +0 -1
  734. package/dist/chunks/de-UREymH-5.mjs +0 -2
  735. package/dist/chunks/de-UREymH-5.mjs.map +0 -1
  736. package/dist/chunks/de-chYdoK9q.mjs +0 -2
  737. package/dist/chunks/de-chYdoK9q.mjs.map +0 -1
  738. package/dist/chunks/de-fXvs5vQT.mjs +0 -2
  739. package/dist/chunks/de-fXvs5vQT.mjs.map +0 -1
  740. package/dist/chunks/de-xJh5C_pk.mjs +0 -2
  741. package/dist/chunks/de-xJh5C_pk.mjs.map +0 -1
  742. package/dist/chunks/es-B9UhsaEI.mjs +0 -2
  743. package/dist/chunks/es-B9UhsaEI.mjs.map +0 -1
  744. package/dist/chunks/es-BHGwPgrP.mjs +0 -2
  745. package/dist/chunks/es-BHGwPgrP.mjs.map +0 -1
  746. package/dist/chunks/es-BTqy_aQ4.mjs +0 -2
  747. package/dist/chunks/es-BTqy_aQ4.mjs.map +0 -1
  748. package/dist/chunks/es-BbGOZGS_.mjs +0 -2
  749. package/dist/chunks/es-BbGOZGS_.mjs.map +0 -1
  750. package/dist/chunks/es-BjPsub0k.mjs +0 -2
  751. package/dist/chunks/es-BjPsub0k.mjs.map +0 -1
  752. package/dist/chunks/es-Bk0bRDFE.mjs +0 -2
  753. package/dist/chunks/es-Bk0bRDFE.mjs.map +0 -1
  754. package/dist/chunks/es-BkS6DsrM.mjs +0 -2
  755. package/dist/chunks/es-BkS6DsrM.mjs.map +0 -1
  756. package/dist/chunks/es-BzEpr4Bk.mjs +0 -2
  757. package/dist/chunks/es-BzEpr4Bk.mjs.map +0 -1
  758. package/dist/chunks/es-C2lnWyA0.mjs +0 -2
  759. package/dist/chunks/es-C2lnWyA0.mjs.map +0 -1
  760. package/dist/chunks/es-C7e35Muh.mjs +0 -2
  761. package/dist/chunks/es-C7e35Muh.mjs.map +0 -1
  762. package/dist/chunks/es-CBk43isB.mjs +0 -2
  763. package/dist/chunks/es-CBk43isB.mjs.map +0 -1
  764. package/dist/chunks/es-CE8t9fuM.mjs +0 -2
  765. package/dist/chunks/es-CE8t9fuM.mjs.map +0 -1
  766. package/dist/chunks/es-CFjzqIbS.mjs +0 -2
  767. package/dist/chunks/es-CFjzqIbS.mjs.map +0 -1
  768. package/dist/chunks/es-Ce-AEYxc.mjs +0 -2
  769. package/dist/chunks/es-Ce-AEYxc.mjs.map +0 -1
  770. package/dist/chunks/es-Co4AJr8Y.mjs +0 -2
  771. package/dist/chunks/es-Co4AJr8Y.mjs.map +0 -1
  772. package/dist/chunks/es-Cu5_OA4X.mjs +0 -2
  773. package/dist/chunks/es-Cu5_OA4X.mjs.map +0 -1
  774. package/dist/chunks/es-Cud6JXHf.mjs +0 -2
  775. package/dist/chunks/es-Cud6JXHf.mjs.map +0 -1
  776. package/dist/chunks/es-D-II7LZC.mjs +0 -2
  777. package/dist/chunks/es-D-II7LZC.mjs.map +0 -1
  778. package/dist/chunks/es-DBBSeOaD.mjs +0 -2
  779. package/dist/chunks/es-DBBSeOaD.mjs.map +0 -1
  780. package/dist/chunks/es-DCwjeUUu.mjs +0 -2
  781. package/dist/chunks/es-DCwjeUUu.mjs.map +0 -1
  782. package/dist/chunks/es-DvgH3-WZ.mjs +0 -2
  783. package/dist/chunks/es-DvgH3-WZ.mjs.map +0 -1
  784. package/dist/chunks/es-MgguVgIs.mjs +0 -2
  785. package/dist/chunks/es-MgguVgIs.mjs.map +0 -1
  786. package/dist/chunks/es-yXjjcxgb.mjs +0 -2
  787. package/dist/chunks/es-yXjjcxgb.mjs.map +0 -1
  788. package/dist/chunks/fr-B-_yKIAY.mjs +0 -2
  789. package/dist/chunks/fr-B-_yKIAY.mjs.map +0 -1
  790. package/dist/chunks/fr-BGyF2ym0.mjs +0 -2
  791. package/dist/chunks/fr-BGyF2ym0.mjs.map +0 -1
  792. package/dist/chunks/fr-BoRJ3B2-.mjs +0 -2
  793. package/dist/chunks/fr-BoRJ3B2-.mjs.map +0 -1
  794. package/dist/chunks/fr-BrKk4SPg.mjs +0 -2
  795. package/dist/chunks/fr-BrKk4SPg.mjs.map +0 -1
  796. package/dist/chunks/fr-C-y09LKg.mjs +0 -2
  797. package/dist/chunks/fr-C-y09LKg.mjs.map +0 -1
  798. package/dist/chunks/fr-C1W7jyd6.mjs +0 -2
  799. package/dist/chunks/fr-C1W7jyd6.mjs.map +0 -1
  800. package/dist/chunks/fr-C8CtmWBj.mjs +0 -2
  801. package/dist/chunks/fr-C8CtmWBj.mjs.map +0 -1
  802. package/dist/chunks/fr-C9oiPW0k.mjs +0 -2
  803. package/dist/chunks/fr-C9oiPW0k.mjs.map +0 -1
  804. package/dist/chunks/fr-CEkk4UyZ.mjs +0 -2
  805. package/dist/chunks/fr-CEkk4UyZ.mjs.map +0 -1
  806. package/dist/chunks/fr-Ccaetiwi.mjs +0 -2
  807. package/dist/chunks/fr-Ccaetiwi.mjs.map +0 -1
  808. package/dist/chunks/fr-Ccku5KzA.mjs +0 -2
  809. package/dist/chunks/fr-Ccku5KzA.mjs.map +0 -1
  810. package/dist/chunks/fr-CfUg1FxU.mjs +0 -2
  811. package/dist/chunks/fr-CfUg1FxU.mjs.map +0 -1
  812. package/dist/chunks/fr-DDkBcjmO.mjs +0 -2
  813. package/dist/chunks/fr-DDkBcjmO.mjs.map +0 -1
  814. package/dist/chunks/fr-DNwLChcm.mjs +0 -2
  815. package/dist/chunks/fr-DNwLChcm.mjs.map +0 -1
  816. package/dist/chunks/fr-DvneSjCf.mjs +0 -2
  817. package/dist/chunks/fr-DvneSjCf.mjs.map +0 -1
  818. package/dist/chunks/fr-Dx4Qqimj.mjs +0 -2
  819. package/dist/chunks/fr-Dx4Qqimj.mjs.map +0 -1
  820. package/dist/chunks/fr-RHXmueoO.mjs +0 -2
  821. package/dist/chunks/fr-RHXmueoO.mjs.map +0 -1
  822. package/dist/chunks/fr-VdiCNF4J.mjs +0 -2
  823. package/dist/chunks/fr-VdiCNF4J.mjs.map +0 -1
  824. package/dist/chunks/fr-Wiobfk5s.mjs +0 -2
  825. package/dist/chunks/fr-Wiobfk5s.mjs.map +0 -1
  826. package/dist/chunks/fr-YMiDtWuG.mjs +0 -2
  827. package/dist/chunks/fr-YMiDtWuG.mjs.map +0 -1
  828. package/dist/chunks/fr-_Oxf0k66.mjs +0 -2
  829. package/dist/chunks/fr-_Oxf0k66.mjs.map +0 -1
  830. package/dist/chunks/fr-gurfH-7T.mjs +0 -2
  831. package/dist/chunks/fr-gurfH-7T.mjs.map +0 -1
  832. package/dist/chunks/fr-zP7EjxDL.mjs +0 -2
  833. package/dist/chunks/fr-zP7EjxDL.mjs.map +0 -1
  834. package/dist/chunks/hi-B2W8pFqK.mjs +0 -2
  835. package/dist/chunks/hi-B2W8pFqK.mjs.map +0 -1
  836. package/dist/chunks/hi-B2m69ZCq.mjs +0 -2
  837. package/dist/chunks/hi-B2m69ZCq.mjs.map +0 -1
  838. package/dist/chunks/hi-BMIt3y_-.mjs +0 -2
  839. package/dist/chunks/hi-BMIt3y_-.mjs.map +0 -1
  840. package/dist/chunks/hi-BdtVhAzs.mjs +0 -2
  841. package/dist/chunks/hi-BdtVhAzs.mjs.map +0 -1
  842. package/dist/chunks/hi-BmkfaZpg.mjs +0 -2
  843. package/dist/chunks/hi-BmkfaZpg.mjs.map +0 -1
  844. package/dist/chunks/hi-C-l_R2SO.mjs +0 -2
  845. package/dist/chunks/hi-C-l_R2SO.mjs.map +0 -1
  846. package/dist/chunks/hi-C1LhM-oY.mjs +0 -2
  847. package/dist/chunks/hi-C1LhM-oY.mjs.map +0 -1
  848. package/dist/chunks/hi-CGEbGI1l.mjs +0 -2
  849. package/dist/chunks/hi-CGEbGI1l.mjs.map +0 -1
  850. package/dist/chunks/hi-CPuhj7IA.mjs +0 -2
  851. package/dist/chunks/hi-CPuhj7IA.mjs.map +0 -1
  852. package/dist/chunks/hi-CT5WERqi.mjs +0 -2
  853. package/dist/chunks/hi-CT5WERqi.mjs.map +0 -1
  854. package/dist/chunks/hi-CbLPPQ0b.mjs +0 -2
  855. package/dist/chunks/hi-CbLPPQ0b.mjs.map +0 -1
  856. package/dist/chunks/hi-ClvEtEKe.mjs +0 -2
  857. package/dist/chunks/hi-ClvEtEKe.mjs.map +0 -1
  858. package/dist/chunks/hi-CpBWHmYH.mjs +0 -2
  859. package/dist/chunks/hi-CpBWHmYH.mjs.map +0 -1
  860. package/dist/chunks/hi-DAfl8nU_.mjs +0 -2
  861. package/dist/chunks/hi-DAfl8nU_.mjs.map +0 -1
  862. package/dist/chunks/hi-DVof3w0y.mjs +0 -2
  863. package/dist/chunks/hi-DVof3w0y.mjs.map +0 -1
  864. package/dist/chunks/hi-DtlvSQkD.mjs +0 -2
  865. package/dist/chunks/hi-DtlvSQkD.mjs.map +0 -1
  866. package/dist/chunks/hi-FH3CAJuR.mjs +0 -2
  867. package/dist/chunks/hi-FH3CAJuR.mjs.map +0 -1
  868. package/dist/chunks/hi-Ga9h9a_1.mjs +0 -2
  869. package/dist/chunks/hi-Ga9h9a_1.mjs.map +0 -1
  870. package/dist/chunks/hi-Zc17M1T-.mjs +0 -2
  871. package/dist/chunks/hi-Zc17M1T-.mjs.map +0 -1
  872. package/dist/chunks/hi-g7i0bmig.mjs +0 -2
  873. package/dist/chunks/hi-g7i0bmig.mjs.map +0 -1
  874. package/dist/chunks/hi-js2P6byR.mjs +0 -2
  875. package/dist/chunks/hi-js2P6byR.mjs.map +0 -1
  876. package/dist/chunks/hi-ntUsOspQ.mjs +0 -2
  877. package/dist/chunks/hi-ntUsOspQ.mjs.map +0 -1
  878. package/dist/chunks/hi-yxAcR3w6.mjs +0 -2
  879. package/dist/chunks/hi-yxAcR3w6.mjs.map +0 -1
  880. package/dist/chunks/index-CVwf0cdH.mjs +0 -2
  881. package/dist/chunks/index-CVwf0cdH.mjs.map +0 -1
  882. package/dist/chunks/index-D3BZFsAD.mjs +0 -2
  883. package/dist/chunks/index-D3BZFsAD.mjs.map +0 -1
  884. package/dist/chunks/pt--IiroJQw.mjs +0 -2
  885. package/dist/chunks/pt--IiroJQw.mjs.map +0 -1
  886. package/dist/chunks/pt-BF72W8M5.mjs +0 -2
  887. package/dist/chunks/pt-BF72W8M5.mjs.map +0 -1
  888. package/dist/chunks/pt-BX_t4luI.mjs +0 -2
  889. package/dist/chunks/pt-BX_t4luI.mjs.map +0 -1
  890. package/dist/chunks/pt-B_XJ2s9X.mjs +0 -2
  891. package/dist/chunks/pt-B_XJ2s9X.mjs.map +0 -1
  892. package/dist/chunks/pt-C-Vp7Rxj.mjs +0 -2
  893. package/dist/chunks/pt-C-Vp7Rxj.mjs.map +0 -1
  894. package/dist/chunks/pt-CD2aCZXf.mjs +0 -2
  895. package/dist/chunks/pt-CD2aCZXf.mjs.map +0 -1
  896. package/dist/chunks/pt-CFjzqIbS.mjs +0 -2
  897. package/dist/chunks/pt-CFjzqIbS.mjs.map +0 -1
  898. package/dist/chunks/pt-CHjmBegF.mjs +0 -2
  899. package/dist/chunks/pt-CHjmBegF.mjs.map +0 -1
  900. package/dist/chunks/pt-CQRzEocL.mjs +0 -2
  901. package/dist/chunks/pt-CQRzEocL.mjs.map +0 -1
  902. package/dist/chunks/pt-Cem2WxUk.mjs +0 -2
  903. package/dist/chunks/pt-Cem2WxUk.mjs.map +0 -1
  904. package/dist/chunks/pt-D6kdF3fH.mjs +0 -2
  905. package/dist/chunks/pt-D6kdF3fH.mjs.map +0 -1
  906. package/dist/chunks/pt-DJfJVeY8.mjs +0 -2
  907. package/dist/chunks/pt-DJfJVeY8.mjs.map +0 -1
  908. package/dist/chunks/pt-DfB-IaYi.mjs +0 -2
  909. package/dist/chunks/pt-DfB-IaYi.mjs.map +0 -1
  910. package/dist/chunks/pt-DlNdH9pu.mjs +0 -2
  911. package/dist/chunks/pt-DlNdH9pu.mjs.map +0 -1
  912. package/dist/chunks/pt-DrJ0-8Yo.mjs +0 -2
  913. package/dist/chunks/pt-DrJ0-8Yo.mjs.map +0 -1
  914. package/dist/chunks/pt-DsBJpgpe.mjs +0 -2
  915. package/dist/chunks/pt-DsBJpgpe.mjs.map +0 -1
  916. package/dist/chunks/pt-DwdSYJzC.mjs +0 -2
  917. package/dist/chunks/pt-DwdSYJzC.mjs.map +0 -1
  918. package/dist/chunks/pt-Dx9UkZ3j.mjs +0 -2
  919. package/dist/chunks/pt-Dx9UkZ3j.mjs.map +0 -1
  920. package/dist/chunks/pt-K0BUlM9X.mjs +0 -2
  921. package/dist/chunks/pt-K0BUlM9X.mjs.map +0 -1
  922. package/dist/chunks/pt-TuA3_GDM.mjs +0 -2
  923. package/dist/chunks/pt-TuA3_GDM.mjs.map +0 -1
  924. package/dist/chunks/pt-cN6r-f7f.mjs +0 -2
  925. package/dist/chunks/pt-cN6r-f7f.mjs.map +0 -1
  926. package/dist/chunks/pt-uNGpVM3D.mjs +0 -2
  927. package/dist/chunks/pt-uNGpVM3D.mjs.map +0 -1
  928. package/dist/chunks/pt-v1E9u-Jx.mjs +0 -2
  929. package/dist/chunks/pt-v1E9u-Jx.mjs.map +0 -1
  930. package/dist/chunks/ru-0h51zrqE.mjs +0 -2
  931. package/dist/chunks/ru-0h51zrqE.mjs.map +0 -1
  932. package/dist/chunks/ru-4S8w6UN_.mjs +0 -2
  933. package/dist/chunks/ru-4S8w6UN_.mjs.map +0 -1
  934. package/dist/chunks/ru-B0cRw90L.mjs +0 -2
  935. package/dist/chunks/ru-B0cRw90L.mjs.map +0 -1
  936. package/dist/chunks/ru-B3O7WXNM.mjs +0 -2
  937. package/dist/chunks/ru-B3O7WXNM.mjs.map +0 -1
  938. package/dist/chunks/ru-B6zVAzvI.mjs +0 -2
  939. package/dist/chunks/ru-B6zVAzvI.mjs.map +0 -1
  940. package/dist/chunks/ru-B8teJin_.mjs +0 -2
  941. package/dist/chunks/ru-B8teJin_.mjs.map +0 -1
  942. package/dist/chunks/ru-BCriPw-8.mjs +0 -2
  943. package/dist/chunks/ru-BCriPw-8.mjs.map +0 -1
  944. package/dist/chunks/ru-BNOU16E5.mjs +0 -2
  945. package/dist/chunks/ru-BNOU16E5.mjs.map +0 -1
  946. package/dist/chunks/ru-BO6BIS5W.mjs +0 -2
  947. package/dist/chunks/ru-BO6BIS5W.mjs.map +0 -1
  948. package/dist/chunks/ru-Bdy1lLuc.mjs +0 -2
  949. package/dist/chunks/ru-Bdy1lLuc.mjs.map +0 -1
  950. package/dist/chunks/ru-BgBctNVm.mjs +0 -2
  951. package/dist/chunks/ru-BgBctNVm.mjs.map +0 -1
  952. package/dist/chunks/ru-CNLx7T3O.mjs +0 -2
  953. package/dist/chunks/ru-CNLx7T3O.mjs.map +0 -1
  954. package/dist/chunks/ru-CVSCT776.mjs +0 -2
  955. package/dist/chunks/ru-CVSCT776.mjs.map +0 -1
  956. package/dist/chunks/ru-CZvkdGnf.mjs +0 -2
  957. package/dist/chunks/ru-CZvkdGnf.mjs.map +0 -1
  958. package/dist/chunks/ru-CegMPuML.mjs +0 -2
  959. package/dist/chunks/ru-CegMPuML.mjs.map +0 -1
  960. package/dist/chunks/ru-CiLrD2Nz.mjs +0 -2
  961. package/dist/chunks/ru-CiLrD2Nz.mjs.map +0 -1
  962. package/dist/chunks/ru-ClEM6OKY.mjs +0 -2
  963. package/dist/chunks/ru-ClEM6OKY.mjs.map +0 -1
  964. package/dist/chunks/ru-CrbxCeQf.mjs +0 -2
  965. package/dist/chunks/ru-CrbxCeQf.mjs.map +0 -1
  966. package/dist/chunks/ru-D3j2x2xu.mjs +0 -2
  967. package/dist/chunks/ru-D3j2x2xu.mjs.map +0 -1
  968. package/dist/chunks/ru-DdHqb4Mh.mjs +0 -2
  969. package/dist/chunks/ru-DdHqb4Mh.mjs.map +0 -1
  970. package/dist/chunks/ru-DjgNdOdJ.mjs +0 -2
  971. package/dist/chunks/ru-DjgNdOdJ.mjs.map +0 -1
  972. package/dist/chunks/ru-Tzd5N37W.mjs +0 -2
  973. package/dist/chunks/ru-Tzd5N37W.mjs.map +0 -1
  974. package/dist/chunks/ru-XKNCzkR2.mjs +0 -2
  975. package/dist/chunks/ru-XKNCzkR2.mjs.map +0 -1
  976. package/dist/chunks/zh--oNSMazK.mjs +0 -2
  977. package/dist/chunks/zh--oNSMazK.mjs.map +0 -1
  978. package/dist/chunks/zh-BfeWdPIz.mjs +0 -2
  979. package/dist/chunks/zh-BfeWdPIz.mjs.map +0 -1
  980. package/dist/chunks/zh-BnOxGKxF.mjs +0 -2
  981. package/dist/chunks/zh-BnOxGKxF.mjs.map +0 -1
  982. package/dist/chunks/zh-BqMtE-jN.mjs +0 -2
  983. package/dist/chunks/zh-BqMtE-jN.mjs.map +0 -1
  984. package/dist/chunks/zh-C3aI7A2o.mjs +0 -2
  985. package/dist/chunks/zh-C3aI7A2o.mjs.map +0 -1
  986. package/dist/chunks/zh-C6YALJZt.mjs +0 -2
  987. package/dist/chunks/zh-C6YALJZt.mjs.map +0 -1
  988. package/dist/chunks/zh-CWdTbUOP.mjs +0 -2
  989. package/dist/chunks/zh-CWdTbUOP.mjs.map +0 -1
  990. package/dist/chunks/zh-CY01pMD4.mjs +0 -2
  991. package/dist/chunks/zh-CY01pMD4.mjs.map +0 -1
  992. package/dist/chunks/zh-Cmt7n9FY.mjs +0 -2
  993. package/dist/chunks/zh-Cmt7n9FY.mjs.map +0 -1
  994. package/dist/chunks/zh-CpP2kee3.mjs +0 -2
  995. package/dist/chunks/zh-CpP2kee3.mjs.map +0 -1
  996. package/dist/chunks/zh-Cpbg4evx.mjs +0 -2
  997. package/dist/chunks/zh-Cpbg4evx.mjs.map +0 -1
  998. package/dist/chunks/zh-Cqb55JWa.mjs +0 -2
  999. package/dist/chunks/zh-Cqb55JWa.mjs.map +0 -1
  1000. package/dist/chunks/zh-DCQZ6gss.mjs +0 -2
  1001. package/dist/chunks/zh-DCQZ6gss.mjs.map +0 -1
  1002. package/dist/chunks/zh-DG2CNTUU.mjs +0 -2
  1003. package/dist/chunks/zh-DG2CNTUU.mjs.map +0 -1
  1004. package/dist/chunks/zh-DTiTJbzz.mjs +0 -2
  1005. package/dist/chunks/zh-DTiTJbzz.mjs.map +0 -1
  1006. package/dist/chunks/zh-Da1z6qbB.mjs +0 -2
  1007. package/dist/chunks/zh-Da1z6qbB.mjs.map +0 -1
  1008. package/dist/chunks/zh-Di3WqY4_.mjs +0 -2
  1009. package/dist/chunks/zh-Di3WqY4_.mjs.map +0 -1
  1010. package/dist/chunks/zh-DlBt06Pr.mjs +0 -2
  1011. package/dist/chunks/zh-DlBt06Pr.mjs.map +0 -1
  1012. package/dist/chunks/zh-Dt-wVrNr.mjs +0 -2
  1013. package/dist/chunks/zh-Dt-wVrNr.mjs.map +0 -1
  1014. package/dist/chunks/zh-ND6vW2M-.mjs +0 -2
  1015. package/dist/chunks/zh-ND6vW2M-.mjs.map +0 -1
  1016. package/dist/chunks/zh-Yd3GNsa0.mjs +0 -2
  1017. package/dist/chunks/zh-Yd3GNsa0.mjs.map +0 -1
  1018. package/dist/chunks/zh-lhynyH6Q.mjs +0 -2
  1019. package/dist/chunks/zh-lhynyH6Q.mjs.map +0 -1
  1020. package/dist/chunks/zh-v9NmlEIN.mjs +0 -2
  1021. package/dist/chunks/zh-v9NmlEIN.mjs.map +0 -1
  1022. package/dist/fonts.mjs.map +0 -1
  1023. package/dist/full.mjs.map +0 -1
  1024. package/dist/html.mjs.map +0 -1
  1025. package/dist/notectl-core.mjs.map +0 -1
  1026. package/dist/plugins/alignment.mjs.map +0 -1
  1027. package/dist/plugins/blockquote.mjs.map +0 -1
  1028. package/dist/plugins/caret-navigation.mjs.map +0 -1
  1029. package/dist/plugins/code-block.mjs.map +0 -1
  1030. package/dist/plugins/font-size.mjs.map +0 -1
  1031. package/dist/plugins/font.mjs.map +0 -1
  1032. package/dist/plugins/gap-cursor.mjs.map +0 -1
  1033. package/dist/plugins/hard-break.mjs.map +0 -1
  1034. package/dist/plugins/heading.mjs.map +0 -1
  1035. package/dist/plugins/highlight.mjs.map +0 -1
  1036. package/dist/plugins/horizontal-rule.mjs.map +0 -1
  1037. package/dist/plugins/image.mjs.map +0 -1
  1038. package/dist/plugins/link.mjs.map +0 -1
  1039. package/dist/plugins/list.mjs.map +0 -1
  1040. package/dist/plugins/print.mjs.map +0 -1
  1041. package/dist/plugins/shared.mjs.map +0 -1
  1042. package/dist/plugins/smart-paste.mjs.map +0 -1
  1043. package/dist/plugins/strikethrough.mjs.map +0 -1
  1044. package/dist/plugins/super-sub.mjs.map +0 -1
  1045. package/dist/plugins/table.mjs.map +0 -1
  1046. package/dist/plugins/text-color.mjs.map +0 -1
  1047. package/dist/plugins/text-direction-advanced.mjs.map +0 -1
  1048. package/dist/plugins/text-direction.mjs.map +0 -1
  1049. package/dist/plugins/text-formatting.mjs.map +0 -1
  1050. package/dist/plugins/toolbar.mjs.map +0 -1
  1051. package/dist/presets/full.mjs.map +0 -1
  1052. package/dist/presets/minimal.mjs.map +0 -1
  1053. package/dist/presets.mjs.map +0 -1
package/dist/full.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"full.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/dist/html.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"html.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"notectl-core.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"alignment.mjs","sources":["../../src/plugins/alignment/AlignmentLocale.ts","../../src/plugins/alignment/AlignmentPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the AlignmentPlugin. */\n\nexport interface AlignmentLocale {\n\treadonly alignStart: string;\n\treadonly alignCenter: string;\n\treadonly alignEnd: string;\n\treadonly justify: string;\n\treadonly toolbarLabel: string;\n\treadonly toolbarTooltip: string;\n}\n\n// --- Default English Locale ---\n\nexport const ALIGNMENT_LOCALE_EN: AlignmentLocale = {\n\talignStart: 'Align Start',\n\talignCenter: 'Align Center',\n\talignEnd: 'Align End',\n\tjustify: 'Justify',\n\ttoolbarLabel: 'Alignment',\n\ttoolbarTooltip: 'Alignment',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: AlignmentLocale }>> =\n\timport.meta.glob<{ default: AlignmentLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadAlignmentLocale(lang: string): Promise<AlignmentLocale> {\n\tif (lang === 'en') return ALIGNMENT_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return ALIGNMENT_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn ALIGNMENT_LOCALE_EN;\n\t}\n}\n","/**\n * AlignmentPlugin: adds start/center/end/justify alignment as a block\n * attribute on paragraphs, headings, images, and other alignable types.\n * Uses logical values (`start`/`end`) instead of physical (`left`/`right`)\n * for correct behavior with RTL text direction. Patches NodeSpecs to render\n * the `align` attribute via inline `text-align` style and provides toggle\n * commands, keyboard shortcuts, and a toolbar dropdown.\n */\n\nimport type { BlockAlignment } from '../../model/BlockAlignment.js';\nimport type { BlockNode } from '../../model/Document.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport {\n\tcapitalize,\n\tgetSelectedBlock,\n\tgetSelectedBlockId,\n\tresolveLocale,\n} from '../shared/PluginHelpers.js';\nimport {\n\tALIGNMENT_LOCALE_EN,\n\ttype AlignmentLocale,\n\tloadAlignmentLocale,\n} from './AlignmentLocale.js';\n\n// --- Public Types ---\n\nexport interface AlignmentConfig {\n\t/** Which alignments to expose. Defaults to all four. */\n\treadonly alignments: readonly BlockAlignment[];\n\t/** Block types that support alignment. Defaults to paragraph + heading + title + subtitle + table_cell + image. */\n\treadonly alignableTypes: readonly string[];\n\t/** Per-type default alignment (e.g. `{ image: 'center' }`). Falls back to `'start'`. */\n\treadonly defaults: Readonly<Record<string, BlockAlignment>>;\n\treadonly locale?: AlignmentLocale;\n}\n\n// --- Constants ---\n\nconst DEFAULT_CONFIG: AlignmentConfig = {\n\talignments: ['start', 'center', 'end', 'justify'],\n\talignableTypes: ['paragraph', 'heading', 'title', 'subtitle', 'table_cell', 'image'],\n\tdefaults: { image: 'center' },\n};\n\nexport const ALIGNMENT_ICONS: Readonly<Record<BlockAlignment, string>> = {\n\tstart:\n\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"/></svg>',\n\tcenter:\n\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"/></svg>',\n\tend: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"/></svg>',\n\tjustify:\n\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zM3 3v2h18V3H3z\"/></svg>',\n};\n\n// --- Plugin ---\n\nexport class AlignmentPlugin implements Plugin {\n\treadonly id = 'alignment';\n\treadonly name = 'Alignment';\n\treadonly priority = 90;\n\n\tprivate readonly config: AlignmentConfig;\n\tprivate locale!: AlignmentLocale;\n\tprivate alignableTypes!: ReadonlySet<string>;\n\n\tconstructor(config?: Partial<AlignmentConfig>) {\n\t\tthis.config = {\n\t\t\t...DEFAULT_CONFIG,\n\t\t\t...config,\n\t\t\tdefaults: { ...DEFAULT_CONFIG.defaults, ...config?.defaults },\n\t\t};\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\tALIGNMENT_LOCALE_EN,\n\t\t\tloadAlignmentLocale,\n\t\t);\n\n\t\tthis.alignableTypes = new Set(this.config.alignableTypes);\n\t\tthis.patchNodeSpecs(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymaps(context);\n\t\tthis.registerToolbarItem(context);\n\t\tthis.registerMiddleware(context);\n\t}\n\n\t// --- NodeSpec Patching ---\n\n\t/**\n\t * Patches existing NodeSpecs for alignable block types to support the\n\t * `align` attribute and render it as an inline style. Skips types\n\t * that already define an `align` attribute in their spec.\n\t */\n\tprivate patchNodeSpecs(context: PluginContext): void {\n\t\tconst registry = context.getSchemaRegistry();\n\n\t\tfor (const type of this.config.alignableTypes) {\n\t\t\tconst spec = registry.getNodeSpec(type);\n\t\t\tif (!spec) continue;\n\n\t\t\t// Skip types that already declare an `align` attr (e.g. image)\n\t\t\tif (spec.attrs?.align) continue;\n\n\t\t\tconst originalToDOM = spec.toDOM;\n\t\t\tconst defaultAlign: BlockAlignment = this.config.defaults[type] ?? 'start';\n\n\t\t\tregistry.removeNodeSpec(type);\n\t\t\tregistry.registerNodeSpec({\n\t\t\t\t...spec,\n\t\t\t\tattrs: {\n\t\t\t\t\t...spec.attrs,\n\t\t\t\t\talign: { default: defaultAlign },\n\t\t\t\t},\n\t\t\t\ttoDOM(node) {\n\t\t\t\t\tconst el = originalToDOM.call(spec, node);\n\t\t\t\t\tapplyAlignment(el, node);\n\t\t\t\t\treturn el;\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- Commands ---\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tfor (const alignment of this.config.alignments) {\n\t\t\tcontext.registerCommand(`align${capitalize(alignment)}`, () => {\n\t\t\t\treturn this.setAlignment(context, alignment);\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- Keymaps ---\n\n\tprivate registerKeymaps(context: PluginContext): void {\n\t\tconst bindings: Record<string, () => boolean> = {};\n\n\t\tif (this.config.alignments.includes('start')) {\n\t\t\tbindings['Mod-Shift-L'] = () => context.executeCommand('alignStart');\n\t\t}\n\t\tif (this.config.alignments.includes('center')) {\n\t\t\tbindings['Mod-Shift-E'] = () => context.executeCommand('alignCenter');\n\t\t}\n\t\tif (this.config.alignments.includes('end')) {\n\t\t\tbindings['Mod-Shift-R'] = () => context.executeCommand('alignEnd');\n\t\t}\n\t\tif (this.config.alignments.includes('justify')) {\n\t\t\tbindings['Mod-Shift-J'] = () => context.executeCommand('alignJustify');\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\t// --- Toolbar ---\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst dropdownItems = this.config.alignments.map((alignment) => ({\n\t\t\tlabel: this.getAlignmentLabel(alignment),\n\t\t\tcommand: `align${capitalize(alignment)}`,\n\t\t\ticon: ALIGNMENT_ICONS[alignment],\n\t\t}));\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'alignment',\n\t\t\tgroup: 'block',\n\t\t\ticon: ALIGNMENT_ICONS.start,\n\t\t\tlabel: this.locale.toolbarLabel,\n\t\t\ttooltip: this.locale.toolbarTooltip,\n\t\t\tcommand: 'alignStart',\n\t\t\tpopupType: 'dropdown',\n\t\t\tpopupConfig: { items: dropdownItems },\n\t\t\tisActive: (state) => this.isNonDefaultAlignment(state),\n\t\t\tisEnabled: (state) => this.isAlignable(state),\n\t\t});\n\t}\n\n\tprivate getAlignmentLabel(alignment: BlockAlignment): string {\n\t\tconst labels: Record<BlockAlignment, string> = {\n\t\t\tstart: this.locale.alignStart,\n\t\t\tcenter: this.locale.alignCenter,\n\t\t\tend: this.locale.alignEnd,\n\t\t\tjustify: this.locale.justify,\n\t\t};\n\t\treturn labels[alignment];\n\t}\n\n\t// --- Middleware ---\n\n\t/**\n\t * Preserves the `align` attribute when other plugins change the block\n\t * type (e.g. paragraph → heading) via `setBlockType`, which replaces attrs.\n\t */\n\tprivate registerMiddleware(context: PluginContext): void {\n\t\tcontext.registerMiddleware(\n\t\t\t(tr, _state, next) => {\n\t\t\t\tlet patched = false;\n\n\t\t\t\tconst patchedSteps = tr.steps.map((step) => {\n\t\t\t\t\tif (step.type !== 'setBlockType') return step;\n\t\t\t\t\tif (!this.alignableTypes.has(step.nodeType)) return step;\n\n\t\t\t\t\tconst prevAlign = step.previousAttrs?.align;\n\t\t\t\t\tif (!prevAlign || prevAlign === 'start') return step;\n\n\t\t\t\t\t// Carry forward align into new attrs\n\t\t\t\t\tpatched = true;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...step,\n\t\t\t\t\t\tattrs: { ...step.attrs, align: prevAlign },\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tnext(patched ? { ...tr, steps: patchedSteps } : tr);\n\t\t\t},\n\t\t\t{ name: 'alignment:preserve-align' },\n\t\t);\n\t}\n\n\t// --- Alignment Logic ---\n\n\tprivate setAlignment(context: PluginContext, alignment: BlockAlignment): boolean {\n\t\tconst state = context.getState();\n\t\tconst block = getSelectedBlock(state);\n\t\tif (!block || !this.alignableTypes.has(block.type)) return false;\n\n\t\tconst id = getSelectedBlockId(state);\n\t\tif (!id) return false;\n\n\t\tconst path = state.getNodePath(id);\n\t\tif (!path) return false;\n\n\t\tconst newAttrs = { ...block.attrs, align: alignment };\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setNodeAttr(path as BlockId[], newAttrs)\n\t\t\t.setSelection(state.selection)\n\t\t\t.build();\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\tprivate isNonDefaultAlignment(state: EditorState): boolean {\n\t\tconst block = getSelectedBlock(state);\n\t\tif (!block || !this.alignableTypes.has(block.type)) return false;\n\t\tconst align = block.attrs?.align;\n\t\tconst defaultAlign: BlockAlignment = this.config.defaults[block.type] ?? 'start';\n\t\treturn align != null && align !== defaultAlign;\n\t}\n\n\tprivate isAlignable(state: EditorState): boolean {\n\t\tconst block = getSelectedBlock(state);\n\t\treturn block != null && this.alignableTypes.has(block.type);\n\t}\n}\n\n// --- Helpers ---\n\nfunction applyAlignment(el: HTMLElement, node: BlockNode): void {\n\tconst align = node.attrs?.align;\n\tif (typeof align === 'string' && align !== 'start') {\n\t\tsetStyleProperty(el, 'textAlign', align);\n\t}\n}\n"],"names":["ALIGNMENT_LOCALE_EN","alignStart","alignCenter","alignEnd","justify","toolbarLabel","toolbarTooltip","localeModules","assign","import","async","loadAlignmentLocale","lang","loader","default","DEFAULT_CONFIG","alignments","alignableTypes","defaults","image","ALIGNMENT_ICONS","start","center","end","AlignmentPlugin","id","name","priority","config","locale","constructor","this","init","context","resolveLocale","Set","patchNodeSpecs","registerCommands","registerKeymaps","registerToolbarItem","registerMiddleware","registry","getSchemaRegistry","type","spec","getNodeSpec","attrs","align","originalToDOM","toDOM","defaultAlign","removeNodeSpec","registerNodeSpec","node","el","call","applyAlignment","alignment","registerCommand","capitalize","setAlignment","bindings","includes","executeCommand","Object","keys","length","registerKeymap","dropdownItems","map","label","getAlignmentLabel","command","icon","group","tooltip","popupType","popupConfig","items","isActive","state","isNonDefaultAlignment","isEnabled","isAlignable","tr","_state","next","patched","patchedSteps","steps","step","has","nodeType","prevAlign","previousAttrs","getState","block","getSelectedBlock","getSelectedBlockId","path","getNodePath","newAttrs","transaction","setNodeAttr","setSelection","selection","build","dispatch","setStyleProperty"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"blockquote.mjs","sources":["../../src/plugins/blockquote/BlockquoteKeyboardHandlers.ts","../../src/plugins/blockquote/BlockquoteLocale.ts","../../src/plugins/blockquote/BlockquoteStyles.ts","../../src/plugins/blockquote/BlockquotePlugin.ts"],"sourcesContent":["/**\n * Keyboard handlers for blockquote boundary navigation and escape.\n *\n * Handles ArrowDown/ArrowUp at block boundaries, Enter on empty blockquote\n * (converts to paragraph), and Backspace at offset 0 (reverts to paragraph).\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport { generateBlockId, getBlockLength } 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 { Transaction } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\n\n// --- Context Guard ---\n\ninterface BlockquoteContext {\n\treadonly state: EditorState;\n\treadonly block: BlockNode;\n\treadonly blockId: BlockId;\n\treadonly offset: number;\n}\n\n/**\n * Guards against non-blockquote contexts.\n * Returns false (not handled) if the cursor is not inside a blockquote.\n */\nfunction withBlockquoteContext(\n\tcontext: PluginContext,\n\thandler: (ctx: BlockquoteContext) => 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 || block.type !== 'blockquote') 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 blockquote keyboard handlers at context priority. */\nexport function registerBlockquoteKeymaps(context: PluginContext): void {\n\tcontext.registerKeymap(\n\t\t{\n\t\t\tArrowDown: () => handleArrowDown(context),\n\t\t\tArrowUp: () => handleArrowUp(context),\n\t\t\tEnter: () => handleEnterOnEmpty(context),\n\t\t\tBackspace: () => handleBackspaceAtStart(context),\n\t\t},\n\t\t{ priority: 'context' },\n\t);\n}\n\n// --- Handler Functions ---\n\n/**\n * Moves cursor to the next block when at the end of the blockquote text.\n * If no next block exists, inserts a new paragraph after the blockquote.\n */\nfunction handleArrowDown(context: PluginContext): boolean {\n\treturn withBlockquoteContext(context, ({ state, block, blockId, offset }) => {\n\t\tconst textLength: number = getBlockLength(block);\n\t\tif (offset !== textLength) return false;\n\n\t\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\t\tconst idx: number = blockOrder.indexOf(blockId);\n\n\t\tif (idx < blockOrder.length - 1) {\n\t\t\tconst nextId: BlockId = blockOrder[idx + 1] as BlockId;\n\t\t\tconst tr: Transaction = state\n\t\t\t\t.transaction('command')\n\t\t\t\t.setSelection(createCollapsedSelection(nextId, 0))\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t} else {\n\t\t\tinsertParagraphAfter(context, blockId);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\n/**\n * Moves cursor to the previous block when at the start of the blockquote text.\n * Returns false if no previous block exists.\n */\nfunction handleArrowUp(context: PluginContext): boolean {\n\treturn withBlockquoteContext(context, ({ state, blockId, offset }) => {\n\t\tif (offset !== 0) return false;\n\n\t\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\t\tconst idx: number = blockOrder.indexOf(blockId);\n\n\t\tif (idx > 0) {\n\t\t\tconst prevId: BlockId = blockOrder[idx - 1] as BlockId;\n\t\t\tconst prevBlock: BlockNode | undefined = state.getBlock(prevId);\n\t\t\tconst prevLen: number = prevBlock ? getBlockLength(prevBlock) : 0;\n\t\t\tconst tr: Transaction = state\n\t\t\t\t.transaction('command')\n\t\t\t\t.setSelection(createCollapsedSelection(prevId, prevLen))\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/**\n * Converts an empty blockquote to a paragraph on Enter.\n * Returns false for non-empty blockquotes, letting splitBlock handle them.\n */\nfunction handleEnterOnEmpty(context: PluginContext): boolean {\n\treturn withBlockquoteContext(context, ({ state, block, blockId }) => {\n\t\tif (getBlockLength(block) > 0) return false;\n\n\t\tconst tr: Transaction = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(blockId, nodeType('paragraph'))\n\t\t\t.setSelection(createCollapsedSelection(blockId, 0))\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t});\n}\n\n/**\n * Converts a blockquote to a paragraph when Backspace is pressed at offset 0.\n */\nfunction handleBackspaceAtStart(context: PluginContext): boolean {\n\treturn withBlockquoteContext(context, ({ state, blockId, offset }) => {\n\t\tif (offset !== 0) return false;\n\n\t\tconst tr: Transaction = state\n\t\t\t.transaction('input')\n\t\t\t.setBlockType(blockId, nodeType('paragraph'))\n\t\t\t.setSelection(state.selection)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t});\n}\n\n// --- Shared Helpers ---\n\nfunction insertParagraphAfter(context: PluginContext, bid: BlockId): void {\n\tconst state: EditorState = context.getState();\n\tconst block: BlockNode | undefined = state.getBlock(bid);\n\tif (!block) return;\n\n\tconst blockLength: number = getBlockLength(block);\n\tconst newId: BlockId = generateBlockId();\n\n\tconst tr: Transaction = state\n\t\t.transaction('command')\n\t\t.splitBlock(bid, blockLength, newId)\n\t\t.setBlockType(newId, nodeType('paragraph'))\n\t\t.setSelection(createCollapsedSelection(newId, 0))\n\t\t.build();\n\n\tcontext.dispatch(tr);\n}\n","/**\n * Locale interface and default English locale for the BlockquotePlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface BlockquoteLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const BLOCKQUOTE_LOCALE_EN: BlockquoteLocale = {\n\tlabel: 'Blockquote',\n\ttooltip: (shortcut: string) => `Blockquote (${shortcut})`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: BlockquoteLocale }>> =\n\timport.meta.glob<{ default: BlockquoteLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadBlockquoteLocale(lang: string): Promise<BlockquoteLocale> {\n\tif (lang === 'en') return BLOCKQUOTE_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return BLOCKQUOTE_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn BLOCKQUOTE_LOCALE_EN;\n\t}\n}\n","/** Blockquote styles using CSS logical properties for RTL support. */\nexport const BLOCKQUOTE_CSS = `\n.notectl-content blockquote {\n\tmargin: 0;\n\tpadding: 2px 0;\n\tpadding-inline-start: 16px;\n\tborder-inline-start: 3px solid var(--notectl-border);\n\tmin-height: 1.6em;\n}\n`;\n","/**\n * BlockquotePlugin: registers a blockquote block type with NodeSpec,\n * toggle command, keyboard shortcut, input rule, and a toolbar button.\n */\n\nimport { isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { type NodeTypeName, nodeType } from '../../model/TypeBrands.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 { registerBlockquoteKeymaps } from './BlockquoteKeyboardHandlers.js';\nimport {\n\tBLOCKQUOTE_LOCALE_EN,\n\ttype BlockquoteLocale,\n\tloadBlockquoteLocale,\n} from './BlockquoteLocale.js';\nimport { BLOCKQUOTE_CSS } from './BlockquoteStyles.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\tblockquote: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\nexport interface BlockquoteConfig {\n\treadonly locale?: BlockquoteLocale;\n}\n\nconst DEFAULT_CONFIG: BlockquoteConfig = {};\n\n// --- Plugin ---\n\nexport class BlockquotePlugin implements Plugin {\n\treadonly id = 'blockquote';\n\treadonly name = 'Blockquote';\n\treadonly priority = 35;\n\n\tprivate readonly config: BlockquoteConfig;\n\tprivate locale!: BlockquoteLocale;\n\n\tconstructor(config?: Partial<BlockquoteConfig>) {\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\tBLOCKQUOTE_LOCALE_EN,\n\t\t\tloadBlockquoteLocale,\n\t\t);\n\t\tcontext.registerStyleSheet(BLOCKQUOTE_CSS);\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: 'blockquote',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\ttoDOM(node) {\n\t\t\t\treturn createBlockElement('blockquote', node.id);\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<blockquote>${content || '<br>'}</blockquote>`;\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'blockquote' }],\n\t\t\tsanitize: { tags: ['blockquote'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('toggleBlockquote', () => {\n\t\t\treturn this.toggleBlockquote(context);\n\t\t});\n\n\t\tcontext.registerCommand('setBlockquote', () => {\n\t\t\treturn this.setBlockType(context, nodeType('blockquote'));\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-Shift->': () => context.executeCommand('toggleBlockquote'),\n\t\t});\n\t\tregisterBlockquoteKeymaps(context);\n\t}\n\n\tprivate registerInputRule(context: PluginContext): void {\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 + 2)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('blockquote'))\n\t\t\t\t\t.setSelection(sel)\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=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'blockquote',\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->')),\n\t\t\tcommand: 'toggleBlockquote',\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 === 'blockquote';\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Toggles between blockquote and paragraph.\n\t * If the block is already a blockquote, resets to paragraph.\n\t */\n\tprivate toggleBlockquote(context: PluginContext): boolean {\n\t\tconst state = context.getState();\n\t\tif (!isTextSelection(state.selection)) return false;\n\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\tif (!block) return false;\n\n\t\tif (block.type === 'blockquote') {\n\t\t\treturn this.setBlockType(context, nodeType('paragraph'));\n\t\t}\n\n\t\treturn this.setBlockType(context, nodeType('blockquote'));\n\t}\n\n\tprivate setBlockType(\n\t\tcontext: PluginContext,\n\t\ttype: NodeTypeName,\n\t\tattrs?: Record<string, string | number | boolean>,\n\t): boolean {\n\t\tconst state = context.getState();\n\t\tconst sel = state.selection;\n\t\tif (!isTextSelection(sel)) return false;\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(sel.anchor.blockId, type, attrs)\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n}\n"],"names":["withBlockquoteContext","context","handler","state","getState","isTextSelection","selection","sel","isCollapsed","block","getBlock","anchor","blockId","type","offset","BLOCKQUOTE_LOCALE_EN","label","tooltip","shortcut","localeModules","assign","import","async","loadBlockquoteLocale","lang","loader","default","DEFAULT_CONFIG","BlockquotePlugin","id","name","priority","config","locale","constructor","this","init","resolveLocale","registerStyleSheet","registerNodeSpec","registerCommands","registerKeymap","registerInputRule","registerToolbarItem","group","content","allow","toDOM","node","createBlockElement","toHTML","_node","parseHTML","tag","sanitize","tags","registerCommand","toggleBlockquote","setBlockType","nodeType","executeCommand","ArrowDown","getBlockLength","blockOrder","getBlockOrder","idx","indexOf","length","nextId","tr","transaction","setSelection","createCollapsedSelection","build","dispatch","bid","blockLength","newId","generateBlockId","splitBlock","insertParagraphAfter","handleArrowDown","ArrowUp","prevId","prevBlock","prevLen","handleArrowUp","Enter","handleEnterOnEmpty","Backspace","handleBackspaceAtStart","registerBlockquoteKeymaps","pattern","_match","start","_end","deleteTextAt","icon","formatShortcut","command","isActive","attrs"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"caret-navigation.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-block.mjs","sources":["../../src/plugins/code-block/CodeBlockKeyboardHandlers.ts","../../src/plugins/code-block/CodeBlockCommands.ts","../../src/plugins/code-block/CodeBlockLocale.ts","../../src/plugins/code-block/CodeBlockTypes.ts","../../src/plugins/code-block/CodeBlockService.ts","../../src/plugins/code-block/highlighter/RegexTokenizer.ts","../../src/plugins/code-block/highlighter/languages/json.ts","../../src/plugins/code-block/highlighter/languages/xml.ts","../../src/plugins/code-block/CodeBlockPlugin.ts","../../src/editor/styles/code-block.ts","../../src/plugins/code-block/CodeBlockNodeView.ts"],"sourcesContent":["/**\n * Keyboard handlers for code-block navigation and editing.\n * Handles Enter, Backspace, Tab, Shift-Tab, Escape, Arrow keys,\n * and configurable shortcuts (Mod+Enter, toggle).\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 { Transaction } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { CodeBlockConfig, CodeBlockKeymap } from './CodeBlockTypes.js';\n\n// --- Context Guard ---\n\ninterface CodeBlockContext {\n\treadonly state: EditorState;\n\treadonly block: BlockNode;\n\treadonly blockId: BlockId;\n\treadonly offset: number;\n}\n\n/**\n * Guards against NodeSelection and non-code-block blocks.\n * Returns false (not handled) if the cursor is not inside a code block.\n */\nfunction withCodeBlockContext(\n\tcontext: PluginContext,\n\thandler: (ctx: CodeBlockContext) => boolean,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\n\tconst sel = state.selection;\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block || block.type !== 'code_block') 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 code-block keyboard handlers. */\nexport function registerCodeBlockKeymaps(\n\tcontext: PluginContext,\n\tconfig: CodeBlockConfig,\n\tresolvedKeymap: Readonly<Record<keyof CodeBlockKeymap, string | null>>,\n): void {\n\tconst keymap: Record<string, () => boolean> = {\n\t\tEnter: () => handleEnter(context),\n\t\tBackspace: () => handleBackspace(context),\n\t\tTab: () => handleTab(context, config),\n\t\t'Shift-Tab': () => handleShiftTab(context, config),\n\t\tEscape: () => handleEscape(context),\n\t\tArrowDown: () => handleArrowDown(context),\n\t\tArrowUp: () => handleArrowUp(context),\n\t\tArrowRight: () => handleArrowRight(context),\n\t\tArrowLeft: () => handleArrowLeft(context),\n\t};\n\n\tconst { insertAfter, toggle } = resolvedKeymap;\n\n\tif (insertAfter) {\n\t\tkeymap[insertAfter] = () => handleModEnter(context);\n\t}\n\tif (toggle) {\n\t\tkeymap[toggle] = () => context.executeCommand('toggleCodeBlock');\n\t}\n\n\tcontext.registerKeymap(keymap, { priority: 'context' });\n}\n\n// --- Handler Functions ---\n\nfunction handleBackspace(context: PluginContext): boolean {\n\treturn withCodeBlockContext(context, ({ state, blockId, offset }) => {\n\t\tif (!isCollapsed(state.selection)) return false;\n\t\tif (offset !== 0) return false;\n\n\t\tconst tr: Transaction = state\n\t\t\t.transaction('input')\n\t\t\t.setBlockType(blockId, nodeType('paragraph'))\n\t\t\t.setSelection(state.selection)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t});\n}\n\nfunction handleEnter(context: PluginContext): boolean {\n\treturn withCodeBlockContext(context, ({ state, block, blockId, offset }) => {\n\t\tif (!isCollapsed(state.selection)) return false;\n\n\t\tconst text: string = getBlockText(block);\n\n\t\tif (text.endsWith('\\n') && offset === text.length) {\n\t\t\treturn exitOnDoubleEnter(context, blockId, text);\n\t\t}\n\n\t\tconst tr: Transaction = state\n\t\t\t.transaction('input')\n\t\t\t.insertText(blockId, offset, '\\n', [])\n\t\t\t.setSelection(createCollapsedSelection(blockId, offset + 1))\n\t\t\t.build();\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t});\n}\n\nfunction handleTab(context: PluginContext, config: CodeBlockConfig): boolean {\n\treturn withCodeBlockContext(context, ({ state, blockId, offset }) => {\n\t\tconst indent: string = config.useSpaces ? ' '.repeat(config.spaceCount ?? 2) : '\\t';\n\n\t\tconst tr: Transaction = state\n\t\t\t.transaction('input')\n\t\t\t.insertText(blockId, offset, indent, [])\n\t\t\t.setSelection(createCollapsedSelection(blockId, offset + indent.length))\n\t\t\t.build();\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t});\n}\n\nfunction handleShiftTab(context: PluginContext, config: CodeBlockConfig): boolean {\n\treturn withCodeBlockContext(context, ({ state, block, blockId, offset }) => {\n\t\tconst text: string = getBlockText(block);\n\t\tconst lineStart: number = text.lastIndexOf('\\n', offset - 1) + 1;\n\n\t\tif (config.useSpaces) {\n\t\t\tconst spaceCount: number = config.spaceCount ?? 2;\n\t\t\tconst linePrefix: string = text.slice(lineStart, lineStart + spaceCount);\n\t\t\tif (linePrefix === ' '.repeat(spaceCount)) {\n\t\t\t\tconst tr: Transaction = state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.deleteTextAt(blockId, lineStart, lineStart + spaceCount)\n\t\t\t\t\t.setSelection(createCollapsedSelection(blockId, Math.max(lineStart, offset - spaceCount)))\n\t\t\t\t\t.build();\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if (text[lineStart] === '\\t') {\n\t\t\tconst tr: Transaction = state\n\t\t\t\t.transaction('input')\n\t\t\t\t.deleteTextAt(blockId, lineStart, lineStart + 1)\n\t\t\t\t.setSelection(createCollapsedSelection(blockId, Math.max(lineStart, offset - 1)))\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn true; // Consume event even if no dedent possible\n\t});\n}\n\n/**\n * Exits the code block to the next block or creates a new paragraph.\n * Exported for use by the `exitCodeBlock` command.\n */\nexport function handleEscape(context: PluginContext): boolean {\n\treturn withCodeBlockContext(context, ({ state, blockId }) => {\n\t\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\t\tconst idx: number = blockOrder.indexOf(blockId);\n\n\t\tif (idx < blockOrder.length - 1) {\n\t\t\tconst nextId: BlockId = blockOrder[idx + 1] as BlockId;\n\t\t\tconst tr: Transaction = state\n\t\t\t\t.transaction('command')\n\t\t\t\t.setSelection(createCollapsedSelection(nextId, 0))\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t} else {\n\t\t\tinsertParagraphAfter(context, blockId);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\nfunction handleArrowDown(context: PluginContext): boolean {\n\treturn withCodeBlockContext(context, ({ state, block, blockId, offset }) => {\n\t\tif (!isCollapsed(state.selection)) return false;\n\n\t\tconst text: string = getBlockText(block);\n\t\tconst nextNewline: number = text.indexOf('\\n', offset);\n\t\tif (nextNewline !== -1) return false;\n\n\t\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\t\tconst idx: number = blockOrder.indexOf(blockId);\n\n\t\tif (idx < blockOrder.length - 1) {\n\t\t\tconst nextId: BlockId = blockOrder[idx + 1] as BlockId;\n\t\t\tconst tr: Transaction = state\n\t\t\t\t.transaction('command')\n\t\t\t\t.setSelection(createCollapsedSelection(nextId, 0))\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t} else {\n\t\t\tinsertParagraphAfter(context, blockId);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\nfunction handleArrowUp(context: PluginContext): boolean {\n\treturn withCodeBlockContext(context, ({ state, block, blockId, offset }) => {\n\t\tif (!isCollapsed(state.selection)) return false;\n\n\t\tconst text: string = getBlockText(block);\n\t\tconst firstNewline: number = text.indexOf('\\n');\n\t\tif (firstNewline !== -1 && offset > firstNewline) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\t\tconst idx: number = blockOrder.indexOf(blockId);\n\n\t\tif (idx > 0) {\n\t\t\tconst prevId: BlockId = blockOrder[idx - 1] as BlockId;\n\t\t\tconst prevBlock: BlockNode | undefined = state.getBlock(prevId);\n\t\t\tconst prevLen: number = prevBlock ? getBlockLength(prevBlock) : 0;\n\t\t\tconst tr: Transaction = state\n\t\t\t\t.transaction('command')\n\t\t\t\t.setSelection(createCollapsedSelection(prevId, prevLen))\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\nfunction handleArrowRight(context: PluginContext): boolean {\n\treturn withCodeBlockContext(context, ({ state, block, blockId, offset }) => {\n\t\tif (!isCollapsed(state.selection)) return false;\n\n\t\tconst text: string = getBlockText(block);\n\t\tif (offset !== text.length) return false;\n\n\t\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\t\tconst idx: number = blockOrder.indexOf(blockId);\n\n\t\tif (idx < blockOrder.length - 1) {\n\t\t\tconst nextId: BlockId = blockOrder[idx + 1] as BlockId;\n\t\t\tconst tr: Transaction = state\n\t\t\t\t.transaction('command')\n\t\t\t\t.setSelection(createCollapsedSelection(nextId, 0))\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t} else {\n\t\t\tinsertParagraphAfter(context, blockId);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\nfunction handleArrowLeft(context: PluginContext): boolean {\n\treturn withCodeBlockContext(context, ({ state, blockId, offset }) => {\n\t\tif (!isCollapsed(state.selection)) return false;\n\t\tif (offset !== 0) return false;\n\n\t\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\t\tconst idx: number = blockOrder.indexOf(blockId);\n\n\t\tif (idx > 0) {\n\t\t\tconst prevId: BlockId = blockOrder[idx - 1] as BlockId;\n\t\t\tconst prevBlock: BlockNode | undefined = state.getBlock(prevId);\n\t\t\tconst prevLen: number = prevBlock ? getBlockLength(prevBlock) : 0;\n\t\t\tconst tr: Transaction = state\n\t\t\t\t.transaction('command')\n\t\t\t\t.setSelection(createCollapsedSelection(prevId, prevLen))\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\nfunction handleModEnter(context: PluginContext): boolean {\n\treturn withCodeBlockContext(context, ({ blockId }) => {\n\t\tinsertParagraphAfter(context, blockId);\n\t\treturn true;\n\t});\n}\n\n// --- Shared Helpers ---\n\nfunction insertParagraphAfter(context: PluginContext, bid: BlockId): void {\n\tconst state: EditorState = context.getState();\n\tconst block: BlockNode | undefined = state.getBlock(bid);\n\tif (!block) return;\n\n\tconst blockLength: number = getBlockLength(block);\n\tconst newId: BlockId = generateBlockId();\n\n\tconst tr: Transaction = state\n\t\t.transaction('command')\n\t\t.splitBlock(bid, blockLength, newId)\n\t\t.setBlockType(newId, nodeType('paragraph'))\n\t\t.setSelection(createCollapsedSelection(newId, 0))\n\t\t.build();\n\n\tcontext.dispatch(tr);\n}\n\nfunction exitOnDoubleEnter(context: PluginContext, bid: BlockId, text: string): boolean {\n\tconst state: EditorState = context.getState();\n\tconst trimmedLen: number = text.length - 1;\n\tconst newId: BlockId = generateBlockId();\n\n\tconst tr: Transaction = state\n\t\t.transaction('input')\n\t\t.deleteTextAt(bid, trimmedLen, text.length)\n\t\t.splitBlock(bid, trimmedLen, newId)\n\t\t.setBlockType(newId, nodeType('paragraph'))\n\t\t.setSelection(createCollapsedSelection(newId, 0))\n\t\t.build();\n\n\tcontext.dispatch(tr);\n\treturn true;\n}\n","/**\n * Command registration and implementations for code blocks.\n * Handles toggle, insert, exit, and mark stripping.\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport { getBlockLength, getInlineChildren, isTextNode } from '../../model/Document.js';\nimport { createCollapsedSelection, isTextSelection } from '../../model/Selection.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { Transaction, TransactionBuilder } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { handleEscape } from './CodeBlockKeyboardHandlers.js';\nimport type { CodeBlockConfig } from './CodeBlockTypes.js';\n\n/** Registers all code-block commands. */\nexport function registerCodeBlockCommands(context: PluginContext, config: CodeBlockConfig): void {\n\tcontext.registerCommand('toggleCodeBlock', () => toggleCodeBlock(context, config));\n\n\tcontext.registerCommand('insertCodeBlock', () => insertCodeBlock(context, config));\n\n\tcontext.registerCommand('setCodeBlockLanguage', () => false);\n\n\tcontext.registerCommand('setCodeBlockBackground', () => false);\n\n\tcontext.registerCommand('exitCodeBlock', () => handleEscape(context));\n}\n\n// --- Command Implementations ---\n\nfunction toggleCodeBlock(context: PluginContext, config: CodeBlockConfig): boolean {\n\tconst state = 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 === 'code_block') {\n\t\tconst tr: Transaction = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(state.selection.anchor.blockId, nodeType('paragraph'))\n\t\t\t.setSelection(state.selection)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\treturn insertCodeBlock(context, config);\n}\n\nfunction insertCodeBlock(context: PluginContext, config: CodeBlockConfig): boolean {\n\tconst state = 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 || block.type === 'code_block') return false;\n\n\tconst attrs: Record<string, string | number | boolean> = {\n\t\tlanguage: config.defaultLanguage ?? '',\n\t\tbackgroundColor: '',\n\t};\n\n\tconst builder: TransactionBuilder = state.transaction('command');\n\tstripAllMarks(builder, block);\n\tbuilder\n\t\t.setBlockType(sel.anchor.blockId, nodeType('code_block'), attrs)\n\t\t.setSelection(createCollapsedSelection(sel.anchor.blockId, 0));\n\n\tcontext.dispatch(builder.build());\n\treturn true;\n}\n\n/**\n * Strips all marks from a block's inline content.\n * Used when converting to code_block so no formatting carries over.\n */\nfunction stripAllMarks(builder: TransactionBuilder, block: BlockNode): void {\n\tconst blockLength: number = getBlockLength(block);\n\tif (blockLength === 0) return;\n\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\tbuilder.removeMark(block.id, offset, offset + child.text.length, mark);\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","/** Locale interface and default English locale for the CodeBlockPlugin. */\n\n// --- Locale Interface ---\n\nexport interface CodeBlockLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut?: string) => string;\n\treadonly enteredCodeBlock: string;\n\treadonly leftCodeBlock: string;\n\treadonly copyCodeAria: string;\n\treadonly escToExit: string;\n\treadonly codeBlockAriaLabel: (lang: string) => string;\n\treadonly copiedToClipboard: string;\n}\n\n// --- Default English Locale ---\n\nexport const CODE_BLOCK_LOCALE_EN: CodeBlockLocale = {\n\tlabel: 'Code Block',\n\ttooltip: (shortcut?: string) => (shortcut ? `Code Block (${shortcut})` : 'Code Block'),\n\tenteredCodeBlock: 'Entered code block. Press Escape to exit.',\n\tleftCodeBlock: 'Left code block.',\n\tcopyCodeAria: 'Copy code',\n\tescToExit: 'Esc to exit',\n\tcodeBlockAriaLabel: (lang: string) => `${lang} code block. Press Escape to exit.`,\n\tcopiedToClipboard: 'Copied to clipboard',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: CodeBlockLocale }>> =\n\timport.meta.glob<{ default: CodeBlockLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadCodeBlockLocale(lang: string): Promise<CodeBlockLocale> {\n\tif (lang === 'en') return CODE_BLOCK_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return CODE_BLOCK_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn CODE_BLOCK_LOCALE_EN;\n\t}\n}\n","/**\n * Types, interfaces, and constants for the code-block plugin.\n */\n\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport { ServiceKey } from '../Plugin.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\tcode_block: {\n\t\t\tlanguage: string;\n\t\t\tbackgroundColor: string;\n\t\t};\n\t}\n}\n\n// --- Syntax Highlighting Types ---\n\nexport interface SyntaxToken {\n\treadonly from: number;\n\treadonly to: number;\n\treadonly type: string;\n}\n\nexport interface SyntaxHighlighter {\n\ttokenize(code: string, language: string): readonly SyntaxToken[];\n\tgetSupportedLanguages(): readonly string[];\n\tregisterLanguage?(def: import('./highlighter/TokenizerTypes.js').LanguageDefinition): void;\n}\n\n// --- Configuration ---\n\n/**\n * Configurable keyboard bindings for CodeBlockPlugin actions.\n * Omit a slot to use the default; set to `null` to disable the binding.\n *\n * Key descriptor format: `'Mod-Enter'`, `'Mod-Shift-M'`, etc.\n * `Mod` resolves to Cmd on macOS, Ctrl on Windows/Linux.\n */\nexport interface CodeBlockKeymap {\n\t/**\n\t * Insert a new paragraph below the code block and move the cursor there.\n\t * @default 'Mod-Enter'\n\t */\n\treadonly insertAfter?: string | null;\n\n\t/**\n\t * Toggle the current block between code block and paragraph.\n\t * @default 'Mod-Shift-M'\n\t */\n\treadonly toggle?: string | null;\n}\n\nexport const DEFAULT_KEYMAP: Readonly<Record<keyof CodeBlockKeymap, string>> = {\n\tinsertAfter: 'Mod-Enter',\n\ttoggle: 'Mod-Shift-M',\n};\n\nexport interface CodeBlockConfig {\n\treadonly highlighter?: SyntaxHighlighter;\n\treadonly defaultLanguage?: string;\n\treadonly useSpaces?: boolean;\n\treadonly spaceCount?: number;\n\treadonly showCopyButton?: boolean;\n\t/** Default body background color (overrides --notectl-code-block-bg). */\n\treadonly background?: string;\n\t/** Default header background color (overrides --notectl-code-block-header-bg). */\n\treadonly headerBackground?: string;\n\t/** Default text color (overrides --notectl-code-block-color). */\n\treadonly textColor?: string;\n\t/** Default header/label text color (overrides --notectl-code-block-header-color). */\n\treadonly headerColor?: string;\n\t/** Customize keyboard bindings for code block actions. */\n\treadonly keymap?: CodeBlockKeymap;\n\t/** Locale override for user-facing strings. */\n\treadonly locale?: import('./CodeBlockLocale.js').CodeBlockLocale;\n}\n\nexport const DEFAULT_CONFIG: CodeBlockConfig = {\n\tdefaultLanguage: '',\n\tuseSpaces: false,\n\tspaceCount: 2,\n\tshowCopyButton: true,\n};\n\n// --- Service Types ---\n\nexport interface CodeBlockService {\n\tsetLanguage(blockId: BlockId, language: string): void;\n\tgetLanguage(blockId: BlockId): string;\n\tsetBackground(blockId: BlockId, color: string): void;\n\tgetBackground(blockId: BlockId): string;\n\tisCodeBlock(blockId: BlockId): boolean;\n\tgetSupportedLanguages(): readonly string[];\n}\n\nexport const CODE_BLOCK_SERVICE_KEY = new ServiceKey<CodeBlockService>('codeBlock');\n\n// --- Syntax Highlighter Service ---\n\nexport interface SyntaxHighlighterService {\n\tregisterLanguage(def: import('./highlighter/TokenizerTypes.js').LanguageDefinition): void;\n\tgetSupportedLanguages(): readonly string[];\n\ttokenize(code: string, language: string): readonly SyntaxToken[];\n}\n\nexport const SYNTAX_HIGHLIGHTER_SERVICE_KEY = new ServiceKey<SyntaxHighlighterService>(\n\t'syntaxHighlighter',\n);\n\n// --- SVG Icon ---\n\nexport const CODE_BLOCK_ICON =\n\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 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"/></svg>';\n","/**\n * Service API for code blocks.\n * Provides language/background getters and setters.\n */\n\nimport type { BlockAttrs, BlockNode } from '../../model/Document.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { CodeBlockConfig } from './CodeBlockTypes.js';\nimport { CODE_BLOCK_SERVICE_KEY } from './CodeBlockTypes.js';\n\n/** Registers the CodeBlockService on the given context. */\nexport function registerCodeBlockService(\n\tcontext: PluginContext,\n\tconfig: CodeBlockConfig,\n\tgetContext: () => PluginContext | null,\n): void {\n\tcontext.registerService(CODE_BLOCK_SERVICE_KEY, {\n\t\tsetLanguage(bid: BlockId, language: string): void {\n\t\t\tsetAttr(context, bid, 'language', language);\n\t\t},\n\n\t\tgetLanguage(bid: BlockId): string {\n\t\t\tconst ctx: PluginContext | null = getContext();\n\t\t\tif (!ctx) return '';\n\t\t\tconst block: BlockNode | undefined = ctx.getState().getBlock(bid);\n\t\t\tif (!block || block.type !== 'code_block') return '';\n\t\t\treturn (block.attrs?.language as string) ?? '';\n\t\t},\n\n\t\tsetBackground(bid: BlockId, color: string): void {\n\t\t\tsetAttr(context, bid, 'backgroundColor', color);\n\t\t},\n\n\t\tgetBackground(bid: BlockId): string {\n\t\t\tconst ctx: PluginContext | null = getContext();\n\t\t\tif (!ctx) return '';\n\t\t\tconst block: BlockNode | undefined = ctx.getState().getBlock(bid);\n\t\t\tif (!block || block.type !== 'code_block') return '';\n\t\t\treturn (block.attrs?.backgroundColor as string) ?? '';\n\t\t},\n\n\t\tisCodeBlock(bid: BlockId): boolean {\n\t\t\tconst ctx: PluginContext | null = getContext();\n\t\t\tif (!ctx) return false;\n\t\t\tconst block: BlockNode | undefined = ctx.getState().getBlock(bid);\n\t\t\treturn block?.type === 'code_block';\n\t\t},\n\n\t\tgetSupportedLanguages(): readonly string[] {\n\t\t\tif (config.highlighter) {\n\t\t\t\treturn config.highlighter.getSupportedLanguages();\n\t\t\t}\n\t\t\treturn [];\n\t\t},\n\t});\n}\n\n// --- Helper ---\n\nfunction setAttr(context: PluginContext, bid: BlockId, key: string, value: string): void {\n\tconst state = context.getState();\n\tconst block: BlockNode | undefined = state.getBlock(bid);\n\tif (!block || block.type !== 'code_block') return;\n\n\tconst path: BlockId[] | undefined = state.getNodePath(bid);\n\tif (!path) return;\n\n\tconst newAttrs: BlockAttrs = { ...block.attrs, [key]: value };\n\tconst tr: Transaction = state.transaction('command').setNodeAttr(path, newAttrs).build();\n\n\tcontext.dispatch(tr);\n}\n","/**\n * Regex-based syntax tokenizer.\n * Implements the SyntaxHighlighter interface using linear regex scanning.\n */\n\nimport type { SyntaxHighlighter, SyntaxToken } from '../CodeBlockTypes.js';\nimport type { LanguageDefinition } from './TokenizerTypes.js';\n\nexport class RegexTokenizer implements SyntaxHighlighter {\n\tprivate readonly languageMap = new Map<string, LanguageDefinition>();\n\n\tconstructor(languages?: readonly LanguageDefinition[]) {\n\t\tif (languages) {\n\t\t\tfor (const lang of languages) {\n\t\t\t\tthis.registerLanguageInternal(lang);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Registers a language definition. Overwrites existing definitions for the same name/aliases. */\n\tregisterLanguage(def: LanguageDefinition): void {\n\t\tthis.registerLanguageInternal(def);\n\t}\n\n\t/** Tokenizes code using the specified language. Returns empty array for unknown languages. */\n\ttokenize(code: string, language: string): readonly SyntaxToken[] {\n\t\tconst lang: LanguageDefinition | undefined = this.languageMap.get(language.toLowerCase());\n\t\tif (!lang) return [];\n\n\t\tconst tokens: SyntaxToken[] = [];\n\t\tlet pos = 0;\n\n\t\twhile (pos < code.length) {\n\t\t\tlet matched = false;\n\n\t\t\tfor (const pattern of lang.patterns) {\n\t\t\t\tconst match: RegExpExecArray | null = pattern.pattern.exec(code.slice(pos));\n\t\t\t\tif (match && match[0].length > 0) {\n\t\t\t\t\ttokens.push({\n\t\t\t\t\t\tfrom: pos,\n\t\t\t\t\t\tto: pos + match[0].length,\n\t\t\t\t\t\ttype: pattern.type,\n\t\t\t\t\t});\n\t\t\t\t\tpos += match[0].length;\n\t\t\t\t\tmatched = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!matched) {\n\t\t\t\tpos++;\n\t\t\t}\n\t\t}\n\n\t\treturn tokens;\n\t}\n\n\t/** Returns all registered language names and aliases. */\n\tgetSupportedLanguages(): readonly string[] {\n\t\tconst names = new Set<string>();\n\t\tfor (const lang of this.languageMap.values()) {\n\t\t\tnames.add(lang.name);\n\t\t\tfor (const alias of lang.aliases) {\n\t\t\t\tnames.add(alias);\n\t\t\t}\n\t\t}\n\t\treturn [...names];\n\t}\n\n\tprivate registerLanguageInternal(def: LanguageDefinition): void {\n\t\tthis.languageMap.set(def.name.toLowerCase(), def);\n\t\tfor (const alias of def.aliases) {\n\t\t\tthis.languageMap.set(alias.toLowerCase(), def);\n\t\t}\n\t}\n}\n","/**\n * JSON language definition for regex-based syntax highlighting.\n */\n\nimport type { LanguageDefinition } from '../TokenizerTypes.js';\n\nexport const JSON_LANGUAGE: LanguageDefinition = {\n\tname: 'json',\n\taliases: ['jsonc'],\n\tpatterns: [\n\t\t{ type: 'property', pattern: /^\"(?:[^\"\\\\]|\\\\.)*\"(?=\\s*:)/ },\n\t\t{ type: 'string', pattern: /^\"(?:[^\"\\\\]|\\\\.)*\"/ },\n\t\t{ type: 'number', pattern: /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/ },\n\t\t{ type: 'boolean', pattern: /^(?:true|false)\\b/ },\n\t\t{ type: 'null', pattern: /^null\\b/ },\n\t\t{ type: 'punctuation', pattern: /^[{}[\\]:,]/ },\n\t],\n};\n","/**\n * XML language definition for regex-based syntax highlighting.\n *\n * Token type mapping:\n * - `comment` — XML comments `<!-- ... -->`\n * - `keyword` — tag names (consumed with `<`/`</` prefix), processing instructions, CDATA\n * - `property` — attribute names (identifier followed by `=`)\n * - `string` — attribute values (double or single quoted)\n * - `punctuation` — delimiters `/>`, `>`, `=`\n *\n * Tag names are combined with their `<` or `</` prefix into a single `keyword` token\n * to prevent text content between tags from being incorrectly highlighted.\n */\n\nimport { XML_TAG_NAME } from '../../../shared/XmlPatterns.js';\nimport type { LanguageDefinition } from '../TokenizerTypes.js';\n\nexport const XML_LANGUAGE: LanguageDefinition = {\n\tname: 'xml',\n\taliases: ['html', 'xhtml', 'svg', 'xsl'],\n\tpatterns: [\n\t\t{ type: 'comment', pattern: /^<!--[\\s\\S]*?-->/ },\n\t\t{ type: 'keyword', pattern: /^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/ },\n\t\t{ type: 'keyword', pattern: /^<\\?[\\s\\S]*?\\?>/ },\n\t\t{ type: 'keyword', pattern: new RegExp(`^<\\\\/${XML_TAG_NAME}`) },\n\t\t{ type: 'keyword', pattern: new RegExp(`^<${XML_TAG_NAME}`) },\n\t\t{ type: 'punctuation', pattern: /^\\/>|^>|^=/ },\n\t\t{ type: 'property', pattern: new RegExp(`^${XML_TAG_NAME}(?=\\\\s*=)`) },\n\t\t{ type: 'string', pattern: /^\"[^\"]*\"/ },\n\t\t{ type: 'string', pattern: /^'[^']*'/ },\n\t],\n};\n","/**\n * CodeBlockPlugin: orchestrates code block registration by delegating to\n * focused modules for keyboard handling, commands, and service API.\n *\n * Inline responsibilities: NodeSpec, NodeView, InputRule, Toolbar,\n * Middleware, Decorations, and lifecycle hooks (focus tracking).\n */\n\nimport type { Decoration, DecorationSet } from '../../decorations/Decoration.js';\nimport {\n\tinline as inlineDecoration,\n\tnode as nodeDecoration,\n} from '../../decorations/Decoration.js';\nimport { DecorationSet as DecorationSetClass } from '../../decorations/Decoration.js';\nimport { CODE_BLOCK_CSS } from '../../editor/styles/code-block.js';\nimport type { BlockNode } from '../../model/Document.js';\nimport { getBlockText } from '../../model/Document.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { HTMLExportContext } from '../../model/NodeSpec.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 { Transaction } from '../../state/Transaction.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 { registerCodeBlockCommands } from './CodeBlockCommands.js';\nimport { registerCodeBlockKeymaps } from './CodeBlockKeyboardHandlers.js';\nimport {\n\tCODE_BLOCK_LOCALE_EN,\n\ttype CodeBlockLocale,\n\tloadCodeBlockLocale,\n} from './CodeBlockLocale.js';\nimport { createCodeBlockNodeViewFactory } from './CodeBlockNodeView.js';\nimport { registerCodeBlockService } from './CodeBlockService.js';\nimport type {\n\tCodeBlockConfig,\n\tCodeBlockKeymap,\n\tSyntaxHighlighter,\n\tSyntaxToken,\n} from './CodeBlockTypes.js';\nimport {\n\tCODE_BLOCK_ICON,\n\tDEFAULT_CONFIG,\n\tDEFAULT_KEYMAP,\n\tSYNTAX_HIGHLIGHTER_SERVICE_KEY,\n} from './CodeBlockTypes.js';\nimport { RegexTokenizer } from './highlighter/RegexTokenizer.js';\nimport { JSON_LANGUAGE } from './highlighter/languages/json.js';\nimport { XML_LANGUAGE } from './highlighter/languages/xml.js';\n\nexport class CodeBlockPlugin implements Plugin {\n\treadonly id = 'code-block';\n\treadonly name = 'Code Block';\n\treadonly priority = 36;\n\n\tprivate readonly config: CodeBlockConfig;\n\tprivate readonly resolvedKeymap: Readonly<Record<keyof CodeBlockKeymap, string | null>>;\n\tprivate context: PluginContext | null = null;\n\tprivate locale!: CodeBlockLocale;\n\tprivate highlighter: SyntaxHighlighter | null = null;\n\tprivate readonly tokenCache = new Map<\n\t\tBlockId,\n\t\t{\n\t\t\treadonly text: string;\n\t\t\treadonly language: string;\n\t\t\treadonly tokens: readonly SyntaxToken[];\n\t\t}\n\t>();\n\n\tconstructor(config?: Partial<CodeBlockConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t\tthis.resolvedKeymap = {\n\t\t\t...DEFAULT_KEYMAP,\n\t\t\t...config?.keymap,\n\t\t};\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\tCODE_BLOCK_LOCALE_EN,\n\t\t\tloadCodeBlockLocale,\n\t\t);\n\t\tcontext.registerStyleSheet(CODE_BLOCK_CSS);\n\t\tthis.context = context;\n\n\t\tthis.initHighlighter();\n\t\tthis.registerNodeSpec(context);\n\t\tthis.registerNodeView(context);\n\t\tregisterCodeBlockCommands(context, this.config);\n\t\tregisterCodeBlockKeymaps(context, this.config, this.resolvedKeymap);\n\t\tthis.registerInputRule(context);\n\t\tthis.registerToolbarItem(context);\n\t\tthis.registerMiddleware(context);\n\t\tregisterCodeBlockService(context, this.config, () => this.context);\n\t\tthis.registerSyntaxHighlighterService(context);\n\t\tthis.patchTableCellContent(context);\n\t}\n\n\tdestroy(): void {\n\t\tthis.context = null;\n\t\tthis.highlighter = null;\n\t\tthis.tokenCache.clear();\n\t}\n\n\tonStateChange(oldState: EditorState, newState: EditorState, _tr: Transaction): void {\n\t\tif (!this.context) return;\n\n\t\tconst oldBlockId: BlockId | null = !isTextSelection(oldState.selection)\n\t\t\t? null\n\t\t\t: oldState.selection.anchor.blockId;\n\t\tconst newBlockId: BlockId | null = !isTextSelection(newState.selection)\n\t\t\t? null\n\t\t\t: newState.selection.anchor.blockId;\n\n\t\tconst oldBlock: BlockNode | undefined = oldBlockId ? oldState.getBlock(oldBlockId) : undefined;\n\t\tconst newBlock: BlockNode | undefined = newBlockId ? newState.getBlock(newBlockId) : undefined;\n\n\t\tconst wasInCode: boolean = oldBlock?.type === 'code_block';\n\t\tconst nowInCode: boolean = newBlock?.type === 'code_block';\n\n\t\tif (!wasInCode && nowInCode) {\n\t\t\tthis.context.announce(this.locale.enteredCodeBlock);\n\t\t} else if (wasInCode && !nowInCode) {\n\t\t\tthis.context.announce(this.locale.leftCodeBlock);\n\t\t}\n\t}\n\n\tdecorations(state: EditorState): DecorationSet {\n\t\tconst decorations: Decoration[] = [];\n\n\t\tconst focusedBlockId: BlockId | null = this.getFocusedCodeBlockId(state);\n\t\tif (focusedBlockId) {\n\t\t\tdecorations.push(nodeDecoration(focusedBlockId, { class: 'notectl-code-block--focused' }));\n\t\t}\n\n\t\tif (this.highlighter) {\n\t\t\tconst activeBlockIds = new Set<BlockId>();\n\t\t\tfor (const bid of state.getBlockOrder()) {\n\t\t\t\tconst block: BlockNode | undefined = state.getBlock(bid);\n\t\t\t\tif (!block || block.type !== 'code_block') continue;\n\n\t\t\t\tconst lang: string = (block.attrs?.language as string) ?? '';\n\t\t\t\tif (!lang) continue;\n\n\t\t\t\tconst text: string = getBlockText(block);\n\t\t\t\tif (!text) continue;\n\n\t\t\t\tactiveBlockIds.add(bid);\n\t\t\t\tconst tokens: readonly SyntaxToken[] = this.getCachedTokens(bid, text, lang);\n\t\t\t\tfor (const token of tokens) {\n\t\t\t\t\tdecorations.push(\n\t\t\t\t\t\tinlineDecoration(bid, token.from, token.to, {\n\t\t\t\t\t\t\tclass: `notectl-token--${token.type}`,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Purge stale cache entries\n\t\t\tfor (const cachedId of this.tokenCache.keys()) {\n\t\t\t\tif (!activeBlockIds.has(cachedId)) {\n\t\t\t\t\tthis.tokenCache.delete(cachedId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (decorations.length === 0) return DecorationSetClass.empty;\n\t\treturn DecorationSetClass.create(decorations);\n\t}\n\n\t// --- NodeSpec ---\n\n\tprivate registerNodeSpec(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'code_block',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\tselectable: true,\n\t\t\tattrs: {\n\t\t\t\tlanguage: { default: '' },\n\t\t\t\tbackgroundColor: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(node) {\n\t\t\t\tconst pre: HTMLElement = createBlockElement('pre', node.id);\n\t\t\t\tpre.className = 'notectl-code-block';\n\t\t\t\tpre.setAttribute('dir', 'ltr');\n\t\t\t\tconst code: HTMLElement = document.createElement('code');\n\t\t\t\tcode.className = 'notectl-code-block__content';\n\t\t\t\tpre.appendChild(code);\n\t\t\t\treturn pre;\n\t\t\t},\n\t\t\ttoHTML(node, content, ctx?: HTMLExportContext) {\n\t\t\t\tconst lang: string = escapeHTML((node.attrs?.language as string) ?? '');\n\t\t\t\tconst bg: string = escapeHTML((node.attrs?.backgroundColor as string) ?? '');\n\t\t\t\tconst langClass: string = lang ? ` class=\"language-${lang}\"` : '';\n\t\t\t\tconst bgAttr: string = bg\n\t\t\t\t\t? (ctx?.styleAttr(`background-color: ${bg}`) ?? ` style=\"background-color: ${bg}\"`)\n\t\t\t\t\t: '';\n\t\t\t\treturn `<pre dir=\"ltr\"${bgAttr}><code${langClass}>${content || ''}</code></pre>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'pre',\n\t\t\t\t\tgetAttrs(el: HTMLElement) {\n\t\t\t\t\t\tconst code: HTMLElement | null = el.querySelector('code');\n\t\t\t\t\t\tconst langClass: string = code?.className.match(/language-(\\S+)/)?.[1] ?? '';\n\t\t\t\t\t\tconst dataLang: string = code?.getAttribute('data-language') ?? '';\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tlanguage: dataLang || langClass,\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: {\n\t\t\t\ttags: ['pre', 'code'],\n\t\t\t\tattrs: ['data-language', 'class', 'style'],\n\t\t\t},\n\t\t});\n\t}\n\n\t// --- NodeView ---\n\n\tprivate registerNodeView(context: PluginContext): void {\n\t\tcontext.registerNodeView(\n\t\t\t'code_block',\n\t\t\tcreateCodeBlockNodeViewFactory(this.config, this.locale),\n\t\t);\n\t}\n\n\t// --- Input Rule ---\n\n\tprivate registerInputRule(context: PluginContext): void {\n\t\tcontext.registerInputRule({\n\t\t\tpattern: /^```(\\w*) $/,\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 !== 'paragraph') return null;\n\n\t\t\t\tconst language: string = match[1] ?? '';\n\t\t\t\tconst attrs: Record<string, string | number | boolean> = {\n\t\t\t\t\tlanguage,\n\t\t\t\t\tbackgroundColor: '',\n\t\t\t\t};\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 + match[0].length)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('code_block'), attrs)\n\t\t\t\t\t.setSelection(createCollapsedSelection(sel.anchor.blockId, 0))\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n\n\t// --- Toolbar ---\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'code_block',\n\t\t\tgroup: 'block',\n\t\t\ticon: CODE_BLOCK_ICON,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip(\n\t\t\t\tthis.resolvedKeymap.toggle ? formatShortcut(this.resolvedKeymap.toggle) : undefined,\n\t\t\t),\n\t\t\tcommand: 'toggleCodeBlock',\n\t\t\tisActive: (state) => {\n\t\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\t\tconst block: BlockNode | undefined = state.getBlock(state.selection.anchor.blockId);\n\t\t\t\treturn block?.type === 'code_block';\n\t\t\t},\n\t\t});\n\t}\n\n\t// --- Middleware (Mark Prevention) ---\n\n\tprivate registerMiddleware(context: PluginContext): void {\n\t\tcontext.registerMiddleware(\n\t\t\t(tr, state, next) => {\n\t\t\t\tconst hasMarkInCodeBlock: boolean = tr.steps.some((step) => {\n\t\t\t\t\tif (step.type !== 'addMark') return false;\n\t\t\t\t\tconst block: BlockNode | undefined = state.getBlock(step.blockId);\n\t\t\t\t\treturn block?.type === 'code_block';\n\t\t\t\t});\n\n\t\t\t\tif (!hasMarkInCodeBlock) {\n\t\t\t\t\tnext(tr);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst filtered = tr.steps.filter((step) => {\n\t\t\t\t\tif (step.type !== 'addMark') return true;\n\t\t\t\t\tconst block: BlockNode | undefined = state.getBlock(step.blockId);\n\t\t\t\t\treturn block?.type !== 'code_block';\n\t\t\t\t});\n\n\t\t\t\tnext({ ...tr, steps: filtered });\n\t\t\t},\n\t\t\t{ name: 'code-block:mark-guard', priority: 50 },\n\t\t);\n\t}\n\n\t// --- Table Cell Patching ---\n\n\tprivate patchTableCellContent(context: PluginContext): void {\n\t\tconst registry = context.getSchemaRegistry();\n\t\tconst cellSpec = registry.getNodeSpec('table_cell');\n\t\tif (!cellSpec?.content) return;\n\n\t\tconst currentAllow: readonly string[] = cellSpec.content.allow ?? [];\n\t\tif (currentAllow.includes('code_block')) return;\n\n\t\tregistry.removeNodeSpec('table_cell');\n\t\tregistry.registerNodeSpec({\n\t\t\t...cellSpec,\n\t\t\tcontent: {\n\t\t\t\t...cellSpec.content,\n\t\t\t\tallow: [...currentAllow, 'code_block'],\n\t\t\t},\n\t\t});\n\t}\n\n\t// --- Highlighter Setup ---\n\n\tprivate initHighlighter(): void {\n\t\tif (this.config.highlighter) {\n\t\t\tthis.highlighter = this.config.highlighter;\n\t\t} else {\n\t\t\tthis.highlighter = new RegexTokenizer([JSON_LANGUAGE, XML_LANGUAGE]);\n\t\t}\n\t}\n\n\tprivate registerSyntaxHighlighterService(context: PluginContext): void {\n\t\tconst tokenizer = this.highlighter;\n\t\tif (!tokenizer) return;\n\n\t\tcontext.registerService(SYNTAX_HIGHLIGHTER_SERVICE_KEY, {\n\t\t\tregisterLanguage: (def) => {\n\t\t\t\ttokenizer.registerLanguage?.(def);\n\t\t\t\tthis.tokenCache.clear();\n\t\t\t},\n\t\t\tgetSupportedLanguages: () => tokenizer.getSupportedLanguages(),\n\t\t\ttokenize: (code, language) => tokenizer.tokenize(code, language),\n\t\t});\n\t}\n\n\tprivate getCachedTokens(\n\t\tblockId: BlockId,\n\t\ttext: string,\n\t\tlanguage: string,\n\t): readonly SyntaxToken[] {\n\t\tconst cached = this.tokenCache.get(blockId);\n\t\tif (cached && cached.text === text && cached.language === language) {\n\t\t\treturn cached.tokens;\n\t\t}\n\t\tconst tokens: readonly SyntaxToken[] = this.highlighter?.tokenize(text, language) ?? [];\n\t\tthis.tokenCache.set(blockId, { text, language, tokens });\n\t\treturn tokens;\n\t}\n\n\t// --- Helpers ---\n\n\tprivate getFocusedCodeBlockId(state: EditorState): BlockId | null {\n\t\tif (!isTextSelection(state.selection)) return null;\n\t\tconst blockId: BlockId = state.selection.anchor.blockId;\n\t\tconst block: BlockNode | undefined = state.getBlock(blockId);\n\t\tif (block?.type === 'code_block') return blockId;\n\t\treturn null;\n\t}\n}\n","/** Code block styles — syntax highlighting container, header, copy button. */\nexport const CODE_BLOCK_CSS = `\n/* Code Block — uses theme custom properties */\n.notectl-code-block {\n\tposition: relative;\n\tmargin: 8px 0;\n\tborder-radius: 6px;\n\tbackground: var(--notectl-code-block-bg);\n\tcolor: var(--notectl-code-block-color);\n\tfont-family: 'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, Consolas, monospace;\n\tfont-size: 14px;\n\tline-height: 1.5;\n\toverflow: hidden;\n}\n\n.notectl-code-block__header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 6px 12px;\n\tbackground: var(--notectl-code-block-header-bg);\n\tborder-bottom: 1px solid var(--notectl-code-block-header-border);\n\tfont-size: 12px;\n\tcolor: var(--notectl-code-block-header-color);\n\tuser-select: none;\n}\n\n.notectl-code-block__language {\n\tfont-weight: 500;\n\tletter-spacing: 0.02em;\n}\n\n.notectl-code-block__copy {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 24px;\n\theight: 24px;\n\tborder: none;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcolor: var(--notectl-code-block-header-color);\n\tcursor: pointer;\n\tpadding: 0;\n\ttransition: background 0.15s, color 0.15s;\n}\n\n.notectl-code-block__copy:hover {\n\tbackground: rgba(128, 128, 128, 0.15);\n\tcolor: var(--notectl-code-block-color);\n}\n\n.notectl-code-block__copy svg {\n\tfill: currentColor;\n}\n\n.notectl-code-block__content {\n\tdisplay: block;\n\tpadding: 12px 16px;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n\ttab-size: 4;\n\t-moz-tab-size: 4;\n\toutline: none;\n\tmin-height: 1.5em;\n}\n\n.notectl-code-block--selected {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 2px;\n}\n\n.notectl-code-block__esc-hint {\n\tdisplay: none;\n\tposition: absolute;\n\tbottom: 4px;\n\tinset-inline-end: 8px;\n\tfont-size: 11px;\n\tcolor: var(--notectl-code-block-header-color);\n\topacity: 0.5;\n\tpointer-events: none;\n\tuser-select: none;\n\tfont-family: system-ui, sans-serif;\n}\n\n.notectl-code-block--focused .notectl-code-block__esc-hint {\n\tdisplay: block;\n}\n\n/* Syntax highlighting token classes */\n.notectl-token--keyword { color: var(--notectl-code-token-keyword); }\n.notectl-token--string { color: var(--notectl-code-token-string); }\n.notectl-token--comment { color: var(--notectl-code-token-comment); font-style: italic; }\n.notectl-token--number { color: var(--notectl-code-token-number); }\n.notectl-token--function { color: var(--notectl-code-token-function); }\n.notectl-token--operator { color: var(--notectl-code-token-operator); }\n.notectl-token--punctuation { color: var(--notectl-code-token-punctuation); }\n.notectl-token--boolean { color: var(--notectl-code-token-boolean); }\n.notectl-token--null { color: var(--notectl-code-token-null); }\n.notectl-token--property { color: var(--notectl-code-token-property); }\n`;\n","/**\n * NodeView factory for code blocks.\n * Renders <pre> with a non-editable header (language label + copy button)\n * and a <code> content area where the Reconciler renders text.\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport { getBlockText } from '../../model/Document.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 type { NodeView, NodeViewFactory } from '../../view/NodeView.js';\nimport { CODE_BLOCK_LOCALE_EN, type CodeBlockLocale } from './CodeBlockLocale.js';\nimport type { CodeBlockConfig } from './CodeBlockTypes.js';\n\nconst COPY_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"14\" height=\"14\"><path d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"/></svg>';\n\n/** Creates a NodeViewFactory for code_block nodes. */\nexport function createCodeBlockNodeViewFactory(\n\tconfig: CodeBlockConfig,\n\tlocale: CodeBlockLocale = CODE_BLOCK_LOCALE_EN,\n): NodeViewFactory {\n\treturn (\n\t\tnode: BlockNode,\n\t\tgetState: () => EditorState,\n\t\t_dispatch: (tr: Transaction) => void,\n\t): NodeView => {\n\t\t// --- DOM Construction ---\n\t\tconst pre: HTMLElement = document.createElement('pre');\n\t\tpre.className = 'notectl-code-block';\n\t\tpre.setAttribute('data-block-id', node.id);\n\t\tpre.setAttribute('dir', 'ltr');\n\t\tpre.setAttribute('role', 'group');\n\t\tpre.setAttribute('aria-roledescription', 'code block');\n\n\t\t// Header (non-editable)\n\t\tconst header: HTMLDivElement = document.createElement('div');\n\t\theader.className = 'notectl-code-block__header';\n\t\theader.setAttribute('contenteditable', 'false');\n\n\t\tconst langLabel: HTMLSpanElement = document.createElement('span');\n\t\tlangLabel.className = 'notectl-code-block__language';\n\n\t\tconst showCopy: boolean = config.showCopyButton !== false;\n\t\tlet copyBtn: HTMLButtonElement | null = null;\n\n\t\tif (showCopy) {\n\t\t\tcopyBtn = document.createElement('button');\n\t\t\tcopyBtn.className = 'notectl-code-block__copy';\n\t\t\tcopyBtn.setAttribute('aria-label', locale.copyCodeAria);\n\t\t\tcopyBtn.setAttribute('data-notectl-no-print', '');\n\t\t\tcopyBtn.type = 'button';\n\t\t\tcopyBtn.innerHTML = COPY_ICON;\n\t\t}\n\n\t\t// Screen reader live region for copy feedback\n\t\tconst copyAnnouncer: HTMLSpanElement = document.createElement('span');\n\t\tcopyAnnouncer.className = 'notectl-sr-only';\n\t\tcopyAnnouncer.setAttribute('aria-live', 'assertive');\n\t\tcopyAnnouncer.setAttribute('aria-atomic', 'true');\n\n\t\theader.appendChild(langLabel);\n\t\tif (copyBtn) {\n\t\t\theader.appendChild(copyBtn);\n\t\t}\n\t\theader.appendChild(copyAnnouncer);\n\n\t\t// Content area (Reconciler target)\n\t\tconst code: HTMLElement = document.createElement('code');\n\t\tcode.className = 'notectl-code-block__content';\n\n\t\t// Escape hint (visible only when focused, CSS-driven)\n\t\tconst escHint: HTMLDivElement = document.createElement('div');\n\t\tescHint.className = 'notectl-code-block__esc-hint';\n\t\tescHint.setAttribute('contenteditable', 'false');\n\t\tescHint.setAttribute('aria-hidden', 'true');\n\t\tescHint.setAttribute('data-notectl-no-print', '');\n\t\tescHint.textContent = locale.escToExit;\n\n\t\tpre.appendChild(header);\n\t\tpre.appendChild(code);\n\t\tpre.appendChild(escHint);\n\n\t\t// Apply config-level color overrides as CSS custom properties\n\t\tif (config.background) {\n\t\t\tsetStyleProperty(pre, '--notectl-code-block-bg', config.background);\n\t\t}\n\t\tif (config.headerBackground) {\n\t\t\tsetStyleProperty(pre, '--notectl-code-block-header-bg', config.headerBackground);\n\t\t}\n\t\tif (config.textColor) {\n\t\t\tsetStyleProperty(pre, '--notectl-code-block-color', config.textColor);\n\t\t}\n\t\tif (config.headerColor) {\n\t\t\tsetStyleProperty(pre, '--notectl-code-block-header-color', config.headerColor);\n\t\t}\n\n\t\tlet currentNodeId: BlockId = node.id;\n\n\t\t// --- Attribute Application ---\n\n\t\tfunction applyAttrs(n: BlockNode): void {\n\t\t\tconst lang: string = (n.attrs?.language as string) ?? '';\n\t\t\tconst langName: string = lang || 'plain';\n\t\t\tlangLabel.textContent = langName;\n\t\t\tpre.setAttribute('aria-label', locale.codeBlockAriaLabel(langName));\n\n\t\t\tif (lang) {\n\t\t\t\tcode.setAttribute('data-language', lang);\n\t\t\t} else {\n\t\t\t\tcode.removeAttribute('data-language');\n\t\t\t}\n\n\t\t\tconst bg: string = (n.attrs?.backgroundColor as string) ?? '';\n\t\t\tsetStyleProperty(pre, 'backgroundColor', bg || '');\n\t\t}\n\n\t\tapplyAttrs(node);\n\n\t\t// --- Copy Button Handler ---\n\n\t\tif (copyBtn) {\n\t\t\tcopyBtn.addEventListener('click', (e: MouseEvent) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\tconst state: EditorState = getState();\n\t\t\t\tconst block: BlockNode | undefined = state.getBlock(currentNodeId);\n\t\t\t\tif (!block) return;\n\n\t\t\t\tconst text: string = getBlockText(block);\n\t\t\t\tnavigator.clipboard.writeText(text);\n\n\t\t\t\t// Announce to screen readers\n\t\t\t\tcopyAnnouncer.textContent = locale.copiedToClipboard;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tcopyAnnouncer.textContent = '';\n\t\t\t\t}, 1000);\n\t\t\t});\n\t\t}\n\n\t\t// --- NodeView Interface ---\n\n\t\treturn {\n\t\t\tdom: pre,\n\t\t\tcontentDOM: code,\n\n\t\t\tupdate(updatedNode: BlockNode): boolean {\n\t\t\t\tif (updatedNode.type !== 'code_block') return false;\n\t\t\t\tcurrentNodeId = updatedNode.id;\n\t\t\t\tpre.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\tpre.classList.add('notectl-code-block--selected');\n\t\t\t},\n\n\t\t\tdeselectNode(): void {\n\t\t\t\tpre.classList.remove('notectl-code-block--selected');\n\t\t\t},\n\n\t\t\tdestroy(): void {\n\t\t\t\t// No cleanup needed\n\t\t\t},\n\t\t};\n\t};\n}\n"],"names":["withCodeBlockContext","context","handler","state","getState","isTextSelection","selection","sel","block","getBlock","anchor","blockId","type","offset","handleEscape","blockOrder","getBlockOrder","idx","indexOf","length","nextId","tr","transaction","setSelection","createCollapsedSelection","build","dispatch","insertParagraphAfter","bid","blockLength","getBlockLength","newId","generateBlockId","splitBlock","setBlockType","nodeType","insertCodeBlock","config","attrs","language","defaultLanguage","backgroundColor","builder","inlineChildren","getInlineChildren","child","isTextNode","text","mark","marks","removeMark","id","stripAllMarks","CODE_BLOCK_LOCALE_EN","label","tooltip","shortcut","enteredCodeBlock","leftCodeBlock","copyCodeAria","escToExit","codeBlockAriaLabel","lang","copiedToClipboard","localeModules","assign","import","async","loadCodeBlockLocale","loader","default","DEFAULT_KEYMAP","insertAfter","toggle","DEFAULT_CONFIG","useSpaces","spaceCount","showCopyButton","CODE_BLOCK_SERVICE_KEY","ServiceKey","SYNTAX_HIGHLIGHTER_SERVICE_KEY","setAttr","key","value","path","getNodePath","newAttrs","setNodeAttr","RegexTokenizer","languageMap","Map","constructor","languages","this","registerLanguageInternal","registerLanguage","def","tokenize","code","get","toLowerCase","tokens","pos","matched","pattern","patterns","match","exec","slice","push","from","to","getSupportedLanguages","names","Set","values","add","name","alias","aliases","set","JSON_LANGUAGE","XML_LANGUAGE","RegExp","XML_TAG_NAME","CodeBlockPlugin","priority","resolvedKeymap","locale","highlighter","tokenCache","keymap","init","resolveLocale","registerStyleSheet","initHighlighter","registerNodeSpec","registerNodeView","registerCommand","toggleCodeBlock","registerCodeBlockCommands","Enter","isCollapsed","getBlockText","endsWith","trimmedLen","deleteTextAt","exitOnDoubleEnter","insertText","handleEnter","Backspace","handleBackspace","Tab","indent","repeat","handleTab","lineStart","lastIndexOf","Math","max","handleShiftTab","Escape","ArrowDown","handleArrowDown","ArrowUp","firstNewline","prevId","prevBlock","prevLen","handleArrowUp","ArrowRight","handleArrowRight","ArrowLeft","handleArrowLeft","handleModEnter","executeCommand","registerKeymap","registerCodeBlockKeymaps","registerInputRule","registerToolbarItem","registerMiddleware","getContext","registerService","setLanguage","getLanguage","ctx","setBackground","color","getBackground","isCodeBlock","registerCodeBlockService","registerSyntaxHighlighterService","patchTableCellContent","destroy","clear","onStateChange","oldState","newState","_tr","oldBlockId","newBlockId","oldBlock","newBlock","wasInCode","nowInCode","announce","decorations","focusedBlockId","getFocusedCodeBlockId","nodeDecoration","class","activeBlockIds","getCachedTokens","token","inlineDecoration","cachedId","keys","has","delete","DecorationSetClass","empty","create","group","content","allow","selectable","toDOM","node","pre","createBlockElement","className","setAttribute","document","createElement","appendChild","toHTML","escapeHTML","bg","langClass","styleAttr","parseHTML","tag","getAttrs","el","querySelector","getAttribute","sanitize","tags","_dispatch","header","langLabel","copyBtn","innerHTML","copyAnnouncer","escHint","textContent","background","setStyleProperty","headerBackground","textColor","headerColor","currentNodeId","applyAttrs","n","langName","removeAttribute","addEventListener","e","preventDefault","stopPropagation","navigator","clipboard","writeText","setTimeout","dom","contentDOM","update","updatedNode","selectNode","classList","deselectNode","remove","createCodeBlockNodeViewFactory","start","_end","icon","formatShortcut","command","isActive","next","steps","some","step","filtered","filter","registry","getSchemaRegistry","cellSpec","getNodeSpec","currentAllow","includes","removeNodeSpec","tokenizer","cached"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"font-size.mjs","sources":["../../src/editor/styles/font-size-select.ts","../../src/plugins/font-size/FontSizeLocale.ts","../../src/plugins/font-size/FontSizeOperations.ts","../../src/plugins/font-size/FontSizePopup.ts","../../src/plugins/font-size/FontSizePlugin.ts"],"sourcesContent":["/** Font size picker toolbar combobox + popup styles. */\nexport const FONT_SIZE_SELECT_CSS = `\n/* Font Size Select — Width overrides for combobox button */\n.notectl-toolbar-btn--fontSize {\n\tmin-width: 60px;\n\tmax-width: 80px;\n}\n\n/* Font Size Picker Popup */\n.notectl-font-size-picker {\n\tmin-width: 140px;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.notectl-font-size-picker__input-wrapper {\n\tpadding: 8px 8px 4px;\n}\n\n.notectl-font-size-picker__input {\n\twidth: 100%;\n\tpadding: 6px 8px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tfont-family: inherit;\n\tcolor: var(--notectl-fg);\n\tbackground: var(--notectl-bg);\n\toutline: none;\n\tbox-sizing: border-box;\n\t-moz-appearance: textfield;\n}\n\n.notectl-font-size-picker__input::-webkit-inner-spin-button,\n.notectl-font-size-picker__input::-webkit-outer-spin-button {\n\t-webkit-appearance: none;\n\tmargin: 0;\n}\n\n.notectl-font-size-picker__input:focus {\n\tborder-color: var(--notectl-border-focus);\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.notectl-font-size-picker__list {\n\tmax-height: 280px;\n\toverflow-y: auto;\n\tpadding: 4px 0;\n}\n\n.notectl-font-size-picker__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tpadding: 7px 12px;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tline-height: 1.4;\n\ttext-align: start;\n\twhite-space: nowrap;\n\tfont-family: inherit;\n\ttransition: background 0.1s;\n\toutline: none;\n}\n\n@media (hover: hover) {\n\t.notectl-font-size-picker__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-font-size-picker__item--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n@media (hover: hover) {\n\t.notectl-font-size-picker__item--active:hover {\n\t\tbackground: var(--notectl-active-bg);\n\t}\n}\n\n.notectl-font-size-picker__item--focused {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: -2px;\n}\n\n.notectl-font-size-picker__check {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\tflex-shrink: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-font-size-picker__label {\n\tflex: 1;\n}\n`;\n","/** Locale interface and default English locale for the FontSizePlugin. */\n\n// --- Locale Interface ---\n\nexport interface FontSizeLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n\treadonly customFontSizeAria: string;\n\treadonly fontSizesAria: string;\n}\n\n// --- Default English Locale ---\n\nexport const FONT_SIZE_LOCALE_EN: FontSizeLocale = {\n\tlabel: 'Font Size',\n\ttooltip: 'Font Size',\n\tcustomFontSizeAria: 'Custom font size',\n\tfontSizesAria: 'Font sizes',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: FontSizeLocale }>> = import.meta.glob<{\n\tdefault: FontSizeLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadFontSizeLocale(lang: string): Promise<FontSizeLocale> {\n\tif (lang === 'en') return FONT_SIZE_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return FONT_SIZE_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn FONT_SIZE_LOCALE_EN;\n\t}\n}\n","/**\n * Pure business logic for font-size state queries and transaction builders.\n * All functions are DOM-free and operate on EditorState / PluginContext.\n *\n * Delegates to the generic AttributedMarkCommands helpers for the\n * collapsed-vs-range branching logic.\n */\n\nimport {\n\tapplyAttributedMark,\n\tgetMarkAttrAtSelection,\n\tisAttributedMarkActive,\n\tremoveAttributedMark,\n} from '../../commands/AttributedMarkCommands.js';\nimport { markType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\n\n// --- State Queries ---\n\n/** Returns the raw fontSize CSS value at the current selection, or null. */\nexport function getActiveSize(state: EditorState): string | null {\n\treturn getMarkAttrAtSelection(state, 'fontSize', (m) => m.attrs.size ?? null);\n}\n\n/** Returns the active font size as a number, falling back to defaultSize. */\nexport function getActiveSizeNumeric(state: EditorState, defaultSize: number): number {\n\tconst raw: string | null = getActiveSize(state);\n\tif (!raw) return defaultSize;\n\tconst parsed: number = Number.parseInt(raw, 10);\n\treturn Number.isNaN(parsed) ? defaultSize : parsed;\n}\n\n/** Returns true when the selection carries a fontSize mark. */\nexport function isFontSizeActive(state: EditorState): boolean {\n\treturn isAttributedMarkActive(state, 'fontSize');\n}\n\n// --- Commands ---\n\n/** Applies a fontSize mark with the given CSS size string to the selection. */\nexport function applyFontSize(context: PluginContext, state: EditorState, size: string): boolean {\n\tconst mark = { type: markType('fontSize'), attrs: { size } };\n\tconst tr = applyAttributedMark(state, mark);\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Removes the fontSize mark from the current selection. */\nexport function removeFontSize(context: PluginContext, state: EditorState): boolean {\n\tconst tr = removeAttributedMark(state, markType('fontSize'));\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Steps the font size up or down through the preset list. */\nexport function stepFontSize(\n\tcontext: PluginContext,\n\tstate: EditorState,\n\tdirection: 'up' | 'down',\n\tsizes: readonly number[],\n\tdefaultSize: number,\n): boolean {\n\tconst current: number = getActiveSizeNumeric(state, defaultSize);\n\tconst next: number | null = getNextPresetSize(current, direction, sizes);\n\tif (next === null) return false;\n\n\tif (next === defaultSize) {\n\t\treturn removeFontSize(context, state);\n\t}\n\treturn applyFontSize(context, state, `${next}px`);\n}\n\n/**\n * Selects a specific font size: removes the mark when size equals the\n * default, otherwise applies the new size.\n */\nexport function selectSize(context: PluginContext, size: number, defaultSize: number): void {\n\tif (size === defaultSize) {\n\t\tcontext.executeCommand('removeFontSize');\n\t} else {\n\t\tapplyFontSize(context, context.getState(), `${size}px`);\n\t}\n}\n\n// --- Helpers ---\n\n/** Finds the next preset size in the given direction, or null at boundaries. */\nexport function getNextPresetSize(\n\tcurrent: number,\n\tdirection: 'up' | 'down',\n\tsizes: readonly number[],\n): number | null {\n\tif (direction === 'up') {\n\t\tfor (const size of sizes) {\n\t\t\tif (size > current) return size;\n\t\t}\n\t\treturn null;\n\t}\n\tfor (let i: number = sizes.length - 1; i >= 0; i--) {\n\t\tconst size: number | undefined = sizes[i];\n\t\tif (size !== undefined && size < current) return size;\n\t}\n\treturn null;\n}\n","/**\n * Renders the font-size picker popup with a custom numeric input\n * and an accessible preset list with keyboard navigation.\n */\n\nimport type { PluginContext } from '../Plugin.js';\nimport type { PopupCloseOptions } from '../shared/PopupManager.js';\nimport type { FontSizeLocale } from './FontSizeLocale.js';\nimport { getActiveSizeNumeric, selectSize } from './FontSizeOperations.js';\n\n// --- Constants ---\n\nconst MIN_CUSTOM_SIZE = 1;\nconst MAX_CUSTOM_SIZE = 400;\n\n// --- Config ---\n\nexport interface FontSizePopupConfig {\n\treadonly sizes: readonly number[];\n\treadonly defaultSize: number;\n\treadonly onClose: (options?: PopupCloseOptions) => void;\n\treadonly contentElement: HTMLElement;\n\treadonly locale: FontSizeLocale;\n}\n\n// --- Public Entry Point ---\n\n/** Builds the font-size picker DOM inside the given container. */\nexport function renderFontSizePopup(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\tconfig: FontSizePopupConfig,\n): void {\n\tcontainer.classList.add('notectl-font-size-picker');\n\n\tconst currentSize: number = getActiveSizeNumeric(context.getState(), config.defaultSize);\n\n\tconst input: HTMLInputElement = buildCustomInput(currentSize, config);\n\tappendInputWrapper(container, input);\n\n\tconst { list, items } = buildSizeList(config.sizes, currentSize, context, config);\n\tcontainer.appendChild(list);\n\n\tscrollActiveIntoView(items, config.sizes, currentSize, list);\n\tattachKeyboardNavigation(input, list, items, context, config);\n}\n\n// --- Custom Input ---\n\nfunction buildCustomInput(currentSize: number, config: FontSizePopupConfig): HTMLInputElement {\n\tconst input: HTMLInputElement = document.createElement('input');\n\tinput.type = 'number';\n\tinput.className = 'notectl-font-size-picker__input';\n\tinput.min = String(MIN_CUSTOM_SIZE);\n\tinput.max = String(MAX_CUSTOM_SIZE);\n\tinput.value = String(currentSize);\n\tinput.setAttribute('aria-label', config.locale.customFontSizeAria);\n\treturn input;\n}\n\nfunction appendInputWrapper(container: HTMLElement, input: HTMLInputElement): void {\n\tconst wrapper: HTMLDivElement = document.createElement('div');\n\twrapper.className = 'notectl-font-size-picker__input-wrapper';\n\twrapper.appendChild(input);\n\tcontainer.appendChild(wrapper);\n}\n\n// --- Size List ---\n\ninterface SizeListResult {\n\treadonly list: HTMLDivElement;\n\treadonly items: HTMLButtonElement[];\n}\n\nfunction buildSizeList(\n\tsizes: readonly number[],\n\tcurrentSize: number,\n\tcontext: PluginContext,\n\tconfig: FontSizePopupConfig,\n): SizeListResult {\n\tconst list: HTMLDivElement = document.createElement('div');\n\tlist.className = 'notectl-font-size-picker__list';\n\tlist.setAttribute('role', 'listbox');\n\tlist.setAttribute('aria-label', config.locale.fontSizesAria);\n\n\tconst items: HTMLButtonElement[] = [];\n\n\tfor (const size of sizes) {\n\t\tconst isActive: boolean = size === currentSize;\n\t\tconst item: HTMLButtonElement = buildSizeItem(size, isActive);\n\n\t\titem.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tselectSize(context, size, config.defaultSize);\n\t\t\tconfig.onClose({ restoreFocusTo: config.contentElement });\n\t\t});\n\n\t\titems.push(item);\n\t\tlist.appendChild(item);\n\t}\n\n\treturn { list, items };\n}\n\nfunction buildSizeItem(size: number, isActive: boolean): HTMLButtonElement {\n\tconst item: HTMLButtonElement = document.createElement('button');\n\titem.type = 'button';\n\titem.id = `notectl-font-size-option-${size}`;\n\titem.className = 'notectl-font-size-picker__item';\n\titem.setAttribute('role', 'option');\n\titem.setAttribute('aria-selected', String(isActive));\n\n\tif (isActive) {\n\t\titem.classList.add('notectl-font-size-picker__item--active');\n\t}\n\n\tconst check: HTMLSpanElement = document.createElement('span');\n\tcheck.className = 'notectl-font-size-picker__check';\n\tcheck.textContent = isActive ? '\\u2713' : '';\n\titem.appendChild(check);\n\n\tconst label: HTMLSpanElement = document.createElement('span');\n\tlabel.className = 'notectl-font-size-picker__label';\n\tlabel.textContent = String(size);\n\titem.appendChild(label);\n\n\treturn item;\n}\n\n// --- Scroll ---\n\nfunction scrollActiveIntoView(\n\titems: HTMLButtonElement[],\n\tsizes: readonly number[],\n\tcurrentSize: number,\n\tlist: HTMLDivElement,\n): void {\n\tconst activeIdx: number = sizes.indexOf(currentSize);\n\tif (activeIdx < 0) return;\n\n\tconst activeItem: HTMLButtonElement | undefined = items[activeIdx];\n\tif (!activeItem) return;\n\n\trequestAnimationFrame(() => {\n\t\tactiveItem.scrollIntoView({ block: 'nearest' });\n\t});\n\tlist.setAttribute('aria-activedescendant', activeItem.id);\n}\n\n// --- Keyboard Navigation ---\n\nfunction attachKeyboardNavigation(\n\tinput: HTMLInputElement,\n\tlist: HTMLDivElement,\n\titems: HTMLButtonElement[],\n\tcontext: PluginContext,\n\tconfig: FontSizePopupConfig,\n): void {\n\tlet focusedIndex = -1;\n\n\tconst setFocused = (idx: number): void => {\n\t\tif (focusedIndex >= 0 && focusedIndex < items.length) {\n\t\t\titems[focusedIndex]?.classList.remove('notectl-font-size-picker__item--focused');\n\t\t}\n\t\tfocusedIndex = idx;\n\t\tconst el: HTMLButtonElement | undefined = items[focusedIndex];\n\t\tif (focusedIndex >= 0 && focusedIndex < items.length && el) {\n\t\t\tel.classList.add('notectl-font-size-picker__item--focused');\n\t\t\tel.scrollIntoView({ block: 'nearest' });\n\t\t\tlist.setAttribute('aria-activedescendant', el.id);\n\t\t}\n\t};\n\n\tinput.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\tif (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\t\t\tconst val: number = Number.parseInt(input.value, 10);\n\t\t\tif (!Number.isNaN(val) && val >= MIN_CUSTOM_SIZE && val <= MAX_CUSTOM_SIZE) {\n\t\t\t\tselectSize(context, val, config.defaultSize);\n\t\t\t\tconfig.onClose({ restoreFocusTo: config.contentElement });\n\t\t\t}\n\t\t} else if (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tsetFocused(0);\n\t\t\titems[0]?.focus();\n\t\t} else if (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tconfig.onClose({ restoreFocusTo: config.contentElement });\n\t\t}\n\t});\n\n\tlist.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\tif (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tif (focusedIndex < items.length - 1) {\n\t\t\t\tsetFocused(focusedIndex + 1);\n\t\t\t\titems[focusedIndex]?.focus();\n\t\t\t}\n\t\t} else if (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tif (focusedIndex > 0) {\n\t\t\t\tsetFocused(focusedIndex - 1);\n\t\t\t\titems[focusedIndex]?.focus();\n\t\t\t} else {\n\t\t\t\tsetFocused(-1);\n\t\t\t\tinput.focus();\n\t\t\t}\n\t\t} else if (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\t\t\tconst selectedSize: number | undefined = config.sizes[focusedIndex];\n\t\t\tif (focusedIndex >= 0 && focusedIndex < config.sizes.length && selectedSize !== undefined) {\n\t\t\t\tselectSize(context, selectedSize, config.defaultSize);\n\t\t\t\tconfig.onClose({ restoreFocusTo: config.contentElement });\n\t\t\t}\n\t\t} else if (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tconfig.onClose({ restoreFocusTo: config.contentElement });\n\t\t}\n\t});\n}\n","/**\n * FontSizePlugin: registers a fontSize mark with attrs, a combobox-style\n * toolbar selector with WCAG-accessible popup, and commands for\n * increasing / decreasing font size.\n */\n\nimport { FONT_SIZE_SELECT_CSS } from '../../editor/styles/font-size-select.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { HTMLExportContext } from '../../model/NodeSpec.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isValidCSSFontSize } from '../shared/ColorValidation.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { FONT_SIZE_LOCALE_EN, type FontSizeLocale, loadFontSizeLocale } from './FontSizeLocale.js';\nimport {\n\tgetActiveSizeNumeric,\n\tisFontSizeActive,\n\tremoveFontSize,\n\tstepFontSize,\n} from './FontSizeOperations.js';\nimport { renderFontSizePopup } from './FontSizePopup.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tfontSize: { size: string };\n\t}\n}\n\n// --- Constants ---\n\n/** Default preset sizes shown in the font size dropdown. */\nexport const DEFAULT_FONT_SIZES: readonly number[] = [\n\t8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 48, 64, 72, 96,\n];\n\nconst DEFAULT_FONT_SIZE = 16;\n\n// --- Configuration ---\n\nexport interface FontSizeConfig {\n\t/**\n\t * Preset sizes shown in the font size dropdown.\n\t * Must contain positive integers. Values are sorted and deduplicated automatically.\n\t * Defaults to {@link DEFAULT_FONT_SIZES} when omitted or empty.\n\t */\n\treadonly sizes?: readonly number[];\n\t/**\n\t * The base font size that text has when no fontSize mark is applied.\n\t * Shown as the initial value in the toolbar combo and used as the\n\t * \"neutral\" size — selecting it removes the mark instead of applying one.\n\t * Defaults to 16.\n\t */\n\treadonly defaultSize?: number;\n\treadonly locale?: FontSizeLocale;\n}\n\n// --- Plugin ---\n\nexport class FontSizePlugin implements Plugin {\n\treadonly id = 'fontSize';\n\treadonly name = 'Font Size';\n\treadonly priority = 21;\n\n\tprivate readonly config: FontSizeConfig;\n\tprivate readonly sizes: readonly number[];\n\tprivate readonly defaultSize: number;\n\tprivate locale!: FontSizeLocale;\n\n\tconstructor(config?: Partial<FontSizeConfig>) {\n\t\tthis.config = { ...config };\n\t\tthis.sizes = resolveSizes(config?.sizes);\n\t\tthis.defaultSize = resolveDefaultSize(config?.defaultSize);\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tFONT_SIZE_LOCALE_EN,\n\t\t\tloadFontSizeLocale,\n\t\t);\n\n\t\tcontext.registerStyleSheet(FONT_SIZE_SELECT_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymaps(context);\n\t\tthis.registerToolbarItem(context);\n\t\tthis.applyDefaultSizeToContainer(context);\n\t}\n\n\tdestroy(): void {\n\t\t// no-op: nothing to clean up\n\t}\n\n\t// --- Schema ---\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'fontSize',\n\t\t\trank: 4,\n\t\t\tattrs: {\n\t\t\t\tsize: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst span: HTMLElement = document.createElement('span');\n\t\t\t\tconst size: string = mark.attrs?.size ?? '';\n\t\t\t\tif (size) {\n\t\t\t\t\tsetStyleProperty(span, 'fontSize', size);\n\t\t\t\t}\n\t\t\t\treturn span;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content, ctx?: HTMLExportContext) => {\n\t\t\t\tconst size: string = String(mark.attrs?.size ?? '');\n\t\t\t\tif (!size || !isValidCSSFontSize(size)) return content;\n\t\t\t\tconst decl: string = `font-size: ${escapeHTML(size)}`;\n\t\t\t\tconst attr: string = ctx?.styleAttr(decl) ?? ` style=\"${decl}\"`;\n\t\t\t\treturn `<span${attr}>${content}</span>`;\n\t\t\t},\n\t\t\ttoHTMLStyle: (mark) => {\n\t\t\t\tconst size: string = String(mark.attrs?.size ?? '');\n\t\t\t\tif (!size || !isValidCSSFontSize(size)) return null;\n\t\t\t\treturn `font-size: ${escapeHTML(size)}`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst size: string = el.style.fontSize;\n\t\t\t\t\t\tif (!size) return false;\n\t\t\t\t\t\treturn { size };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['span'] },\n\t\t});\n\t}\n\n\t// --- Commands ---\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeFontSize', () => {\n\t\t\treturn removeFontSize(context, context.getState());\n\t\t});\n\n\t\tcontext.registerCommand('setFontSize', () => {\n\t\t\treturn false;\n\t\t});\n\n\t\tcontext.registerCommand('increaseFontSize', () => {\n\t\t\treturn stepFontSize(context, context.getState(), 'up', this.sizes, this.defaultSize);\n\t\t});\n\n\t\tcontext.registerCommand('decreaseFontSize', () => {\n\t\t\treturn stepFontSize(context, context.getState(), 'down', this.sizes, this.defaultSize);\n\t\t});\n\t}\n\n\t// --- Keymaps ---\n\n\tprivate registerKeymaps(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-Shift-+': () => {\n\t\t\t\treturn stepFontSize(context, context.getState(), 'up', this.sizes, this.defaultSize);\n\t\t\t},\n\t\t\t'Mod-Shift-_': () => {\n\t\t\t\treturn stepFontSize(context, context.getState(), 'down', this.sizes, this.defaultSize);\n\t\t\t},\n\t\t});\n\t}\n\n\t// --- Toolbar ---\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'fontSize',\n\t\t\tgroup: 'format',\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeFontSize',\n\t\t\tpopupType: 'combobox',\n\t\t\tgetLabel: (state: EditorState): string =>\n\t\t\t\tString(getActiveSizeNumeric(state, this.defaultSize)),\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderFontSizePopup(container, ctx, {\n\t\t\t\t\tsizes: this.sizes,\n\t\t\t\t\tdefaultSize: this.defaultSize,\n\t\t\t\t\tonClose,\n\t\t\t\t\tcontentElement: ctx.getContainer(),\n\t\t\t\t\tlocale: this.locale,\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (state) => isFontSizeActive(state),\n\t\t});\n\t}\n\n\t/**\n\t * Sets the configured default font size on the editor content container\n\t * so that unformatted text renders at the correct size instead of the\n\t * browser default (16px).\n\t */\n\tprivate applyDefaultSizeToContainer(context: PluginContext): void {\n\t\tconst container: HTMLElement = context.getContainer();\n\t\tsetStyleProperty(container, 'fontSize', `${this.defaultSize}px`);\n\t}\n}\n\n// --- Helpers ---\n\nfunction resolveSizes(sizes: readonly number[] | undefined): readonly number[] {\n\tif (!sizes || sizes.length === 0) return DEFAULT_FONT_SIZES;\n\tconst unique: number[] = [...new Set(sizes)].filter((n) => Number.isInteger(n) && n > 0);\n\tunique.sort((a, b) => a - b);\n\treturn unique.length > 0 ? unique : DEFAULT_FONT_SIZES;\n}\n\nfunction resolveDefaultSize(size: number | undefined): number {\n\tif (size === undefined) return DEFAULT_FONT_SIZE;\n\treturn Number.isInteger(size) && size > 0 ? size : DEFAULT_FONT_SIZE;\n}\n"],"names":["FONT_SIZE_LOCALE_EN","label","tooltip","customFontSizeAria","fontSizesAria","localeModules","assign","import","async","loadFontSizeLocale","lang","loader","default","getActiveSizeNumeric","state","defaultSize","raw","getMarkAttrAtSelection","m","attrs","size","getActiveSize","parsed","Number","parseInt","isNaN","applyFontSize","context","mark","type","markType","tr","applyAttributedMark","dispatch","removeFontSize","removeAttributedMark","stepFontSize","direction","sizes","next","current","i","length","getNextPresetSize","selectSize","executeCommand","getState","buildSizeItem","isActive","item","document","createElement","id","className","setAttribute","String","classList","add","check","textContent","appendChild","DEFAULT_FONT_SIZES","FontSizePlugin","name","priority","config","locale","constructor","this","unique","Set","filter","n","isInteger","sort","a","b","resolveSizes","init","resolveLocale","registerStyleSheet","registerMarkSpec","registerCommands","registerKeymaps","registerToolbarItem","applyDefaultSizeToContainer","destroy","rank","toDOM","span","setStyleProperty","toHTMLString","content","ctx","isValidCSSFontSize","decl","escapeHTML","styleAttr","toHTMLStyle","parseHTML","tag","getAttrs","el","style","fontSize","sanitize","tags","registerCommand","registerKeymap","group","command","popupType","getLabel","renderPopup","container","onClose","currentSize","input","min","max","value","buildCustomInput","wrapper","appendInputWrapper","list","items","addEventListener","e","preventDefault","stopPropagation","restoreFocusTo","contentElement","push","buildSizeList","activeIdx","indexOf","activeItem","requestAnimationFrame","scrollIntoView","block","scrollActiveIntoView","focusedIndex","setFocused","idx","remove","key","val","focus","selectedSize","attachKeyboardNavigation","renderFontSizePopup","getContainer","isAttributedMarkActive","isFontSizeActive"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"font.mjs","sources":["../../src/editor/styles/font-select.ts","../../src/plugins/font/FontLocale.ts","../../src/plugins/font/FontPlugin.ts"],"sourcesContent":["/** Font picker toolbar combobox + popup styles. */\nexport const FONT_SELECT_CSS = `\n/* Font Select — Width overrides for combobox button */\n.notectl-toolbar-btn--font {\n\tmin-width: 100px;\n\tmax-width: 160px;\n}\n\n/* Font Picker Popup */\n.notectl-font-picker {\n\tmin-width: 200px;\n\tmax-height: 320px;\n\toverflow-y: auto;\n}\n\n.notectl-font-picker__list {\n\tpadding: 4px 0;\n}\n\n.notectl-font-picker__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tpadding: 7px 12px;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tline-height: 1.4;\n\ttext-align: start;\n\twhite-space: nowrap;\n\tfont-family: inherit;\n\ttransition: background 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-font-picker__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-font-picker__item--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n@media (hover: hover) {\n\t.notectl-font-picker__item--active:hover {\n\t\tbackground: var(--notectl-active-bg);\n\t}\n}\n\n.notectl-font-picker__check {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\tflex-shrink: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-font-picker__label {\n\tflex: 1;\n}\n\n.notectl-font-picker__separator {\n\theight: 1px;\n\tbackground: var(--notectl-border);\n\tmargin: 4px 8px;\n}\n`;\n","/** Locale interface and default English locale for the FontPlugin. */\n\n// --- Locale Interface ---\n\nexport interface FontLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n}\n\n// --- Default English Locale ---\n\nexport const FONT_LOCALE_EN: FontLocale = {\n\tlabel: 'Font',\n\ttooltip: 'Font Family',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: FontLocale }>> = import.meta.glob<{\n\tdefault: FontLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadFontLocale(lang: string): Promise<FontLocale> {\n\tif (lang === 'en') return FONT_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return FONT_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn FONT_LOCALE_EN;\n\t}\n}\n","/**\n * FontPlugin: registers a font-family mark, a combobox-style toolbar selector\n * for font selection, and a developer-friendly API for registering custom fonts\n * (WOFF2, TTF, OTF).\n */\n\nimport {\n\tapplyAttributedMark,\n\tgetMarkAttrAtSelection,\n\tisAttributedMarkActive,\n\tremoveAttributedMark,\n} from '../../commands/AttributedMarkCommands.js';\nimport { FONT_SELECT_CSS } from '../../editor/styles/font-select.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { HTMLExportContext } from '../../model/NodeSpec.js';\nimport { markType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { getStyleNonceForNode, setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isValidCSSFontFamily } from '../shared/ColorValidation.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport type { PopupCloseOptions } from '../shared/PopupManager.js';\nimport { FONT_LOCALE_EN, type FontLocale, loadFontLocale } from './FontLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tfont: { family: string };\n\t}\n}\n\n// --- Public Types ---\n\n/** Describes a single @font-face source. */\nexport interface FontFaceDescriptor {\n\t/** CSS `src` value, e.g. `\"url('/fonts/My.woff2') format('woff2')\"`. */\n\treadonly src: string;\n\t/** Font weight, e.g. `'400'` or `'300 700'` for variable fonts. */\n\treadonly weight?: string;\n\t/** Font style, e.g. `'normal'` or `'italic'`. */\n\treadonly style?: string;\n\t/** Font display strategy. Defaults to `'swap'`. */\n\treadonly display?: string;\n}\n\n/** Defines a font available in the editor. */\nexport interface FontDefinition {\n\t/** Display name shown in the toolbar dropdown. */\n\treadonly name: string;\n\t/** CSS `font-family` value, e.g. `\"'Fira Code', monospace\"`. */\n\treadonly family: string;\n\t/** Font category for grouping in the UI. */\n\treadonly category?: 'serif' | 'sans-serif' | 'monospace' | 'display' | 'handwriting';\n\t/**\n\t * Optional `@font-face` descriptors. When provided, the plugin\n\t * auto-injects the corresponding CSS rules into the document.\n\t */\n\treadonly fontFaces?: readonly FontFaceDescriptor[];\n}\n\n// --- Configuration ---\n\nexport interface FontConfig {\n\t/**\n\t * Fonts available in the editor. System fonts require no `fontFaces`.\n\t * Custom fonts with `fontFaces` get their `@font-face` rules auto-injected.\n\t *\n\t * Use `STARTER_FONTS` for a pre-configured set of fonts:\n\t * ```ts\n\t * new FontPlugin({ fonts: [...STARTER_FONTS] })\n\t * ```\n\t */\n\treadonly fonts: readonly FontDefinition[];\n\t/**\n\t * Name of the font that acts as the editor's default.\n\t * Selecting this font removes the mark (since the editor already uses it).\n\t * Defaults to the first font in the list.\n\t */\n\treadonly defaultFont?: string;\n\treadonly locale?: FontLocale;\n}\n\n// --- Plugin ---\n\nexport class FontPlugin implements Plugin {\n\treadonly id = 'font';\n\treadonly name = 'Font';\n\treadonly priority = 22;\n\n\tprivate readonly config: FontConfig;\n\tprivate locale!: FontLocale;\n\tprivate injectedStyleElement: HTMLStyleElement | null = null;\n\tprivate context: PluginContext | null = null;\n\n\tconstructor(config: FontConfig) {\n\t\tthis.config = config;\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(context, this.config.locale, FONT_LOCALE_EN, loadFontLocale);\n\n\t\tcontext.registerStyleSheet(FONT_SELECT_CSS);\n\t\tthis.context = context;\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerToolbarItem(context);\n\t\tthis.injectFontFaces();\n\t}\n\n\tdestroy(): void {\n\t\tthis.injectedStyleElement?.remove();\n\t\tthis.injectedStyleElement = null;\n\t\tthis.context = null;\n\t}\n\n\t// --- Schema ---\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'font',\n\t\t\trank: 6,\n\t\t\tattrs: {\n\t\t\t\tfamily: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst span: HTMLElement = document.createElement('span');\n\t\t\t\tconst family: string = mark.attrs?.family ?? '';\n\t\t\t\tif (family) {\n\t\t\t\t\tsetStyleProperty(span, 'fontFamily', family);\n\t\t\t\t}\n\t\t\t\treturn span;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content, ctx?: HTMLExportContext) => {\n\t\t\t\tconst family: string = String(mark.attrs?.family ?? '');\n\t\t\t\tif (!family || !isValidCSSFontFamily(family)) return content;\n\t\t\t\tconst decl: string = `font-family: ${escapeHTML(family)}`;\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 family: string = String(mark.attrs?.family ?? '');\n\t\t\t\tif (!family || !isValidCSSFontFamily(family)) return null;\n\t\t\t\treturn `font-family: ${escapeHTML(family)}`;\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 family: string = el.style.fontFamily;\n\t\t\t\t\t\tif (!family) return false;\n\t\t\t\t\t\t// Browsers normalize CSS quotes to double-quotes;\n\t\t\t\t\t\t// our internal convention uses single-quotes.\n\t\t\t\t\t\tconst normalized: string = family.replace(/\"/g, \"'\");\n\t\t\t\t\t\treturn { family: normalized };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['span'] },\n\t\t});\n\t}\n\n\t// --- Commands ---\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeFont', () => {\n\t\t\tconst state: EditorState = context.getState();\n\t\t\treturn this.removeFont(context, state);\n\t\t});\n\n\t\tcontext.registerCommand('setFont', () => {\n\t\t\treturn false;\n\t\t});\n\t}\n\n\t// --- Toolbar ---\n\n\tprivate get defaultFont(): FontDefinition {\n\t\tif (this.config.defaultFont) {\n\t\t\tconst found: FontDefinition | undefined = this.config.fonts.find(\n\t\t\t\t(f) => f.name === this.config.defaultFont,\n\t\t\t);\n\t\t\tif (found) return found;\n\t\t}\n\t\tconst first: FontDefinition | undefined = this.config.fonts[0];\n\t\tif (!first) throw new Error('FontPlugin: fonts list is empty');\n\t\treturn first;\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'font',\n\t\t\tgroup: 'format',\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeFont',\n\t\t\tpopupType: 'combobox',\n\t\t\tgetLabel: (state: EditorState): string => this.resolveFontName(this.getActiveFont(state)),\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\tthis.renderFontPopup(container, ctx, onClose);\n\t\t\t},\n\t\t\tisActive: (state) => this.isFontActive(state),\n\t\t});\n\t}\n\n\tprivate resolveFontName(family: string | null): string {\n\t\tif (!family) return this.defaultFont.name;\n\t\tconst match: FontDefinition | undefined = this.config.fonts.find((f) => f.family === family);\n\t\treturn match?.name ?? (family.split(',')[0] ?? '').trim().replace(/['\"]/g, '');\n\t}\n\n\t// --- State Queries ---\n\n\tprivate isFontActive(state: EditorState): boolean {\n\t\treturn isAttributedMarkActive(state, 'font');\n\t}\n\n\tgetActiveFont(state: EditorState): string | null {\n\t\treturn getMarkAttrAtSelection(state, 'font', (m) => m.attrs.family ?? null);\n\t}\n\n\t// --- Font Application ---\n\n\tapplyFont(context: PluginContext, state: EditorState, family: string): boolean {\n\t\tconst mark = { type: markType('font'), attrs: { family } };\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 removeFont(context: PluginContext, state: EditorState): boolean {\n\t\tconst tr = removeAttributedMark(state, markType('font'));\n\t\tif (!tr) return false;\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\t// --- @font-face Injection ---\n\n\tprivate injectFontFaces(): void {\n\t\tconst rules: string[] = [];\n\n\t\tfor (const font of this.config.fonts) {\n\t\t\tif (!font.fontFaces?.length) continue;\n\n\t\t\tfor (const face of font.fontFaces) {\n\t\t\t\tconst familyName: string = (font.family.split(',')[0] ?? '').trim().replace(/['\"]/g, '');\n\t\t\t\tconst declarations: string[] = [`font-family: '${familyName}'`, `src: ${face.src}`];\n\t\t\t\tif (face.weight) {\n\t\t\t\t\tdeclarations.push(`font-weight: ${face.weight}`);\n\t\t\t\t}\n\t\t\t\tif (face.style) {\n\t\t\t\t\tdeclarations.push(`font-style: ${face.style}`);\n\t\t\t\t}\n\t\t\t\tdeclarations.push(`font-display: ${face.display ?? 'swap'}`);\n\n\t\t\t\trules.push(`@font-face {\\n\\t${declarations.join(';\\n\\t')};\\n}`);\n\t\t\t}\n\t\t}\n\n\t\tif (rules.length === 0) return;\n\n\t\tconst style: HTMLStyleElement = document.createElement('style');\n\t\tstyle.setAttribute('data-notectl-fonts', '');\n\t\tconst nonce = this.context ? getStyleNonceForNode(this.context.getContainer()) : undefined;\n\t\tif (nonce) {\n\t\t\tstyle.setAttribute('nonce', nonce);\n\t\t}\n\t\tstyle.textContent = rules.join('\\n\\n');\n\t\tdocument.head.appendChild(style);\n\t\tthis.injectedStyleElement = style;\n\t}\n\n\t// --- Popup Rendering ---\n\n\tprivate renderFontPopup(\n\t\tcontainer: HTMLElement,\n\t\tcontext: PluginContext,\n\t\tonClose: (options?: PopupCloseOptions) => void,\n\t): void {\n\t\tcontainer.classList.add('notectl-font-picker');\n\n\t\tconst state: EditorState = context.getState();\n\t\tconst activeFont: string | null = this.getActiveFont(state);\n\t\tconst defaultFamily: string = this.defaultFont.family;\n\t\tconst contentElement: HTMLElement = context.getContainer();\n\n\t\tconst list: HTMLDivElement = document.createElement('div');\n\t\tlist.className = 'notectl-font-picker__list';\n\t\tlist.setAttribute('role', 'listbox');\n\t\tlist.setAttribute('aria-label', this.locale.label);\n\n\t\tfor (const font of this.config.fonts) {\n\t\t\tconst isDefault: boolean = font.family === defaultFamily;\n\t\t\tconst isActive: boolean = isDefault\n\t\t\t\t? !activeFont || activeFont === font.family\n\t\t\t\t: activeFont === font.family;\n\n\t\t\tconst item: HTMLButtonElement = this.createFontItem(\n\t\t\t\tfont.name,\n\t\t\t\tfont.family,\n\t\t\t\tisActive,\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\tif (isDefault) {\n\t\t\t\t\t\tcontext.executeCommand('removeFont');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.applyFont(context, context.getState(), font.family);\n\t\t\t\t\t}\n\t\t\t\t\tonClose({ restoreFocusTo: contentElement });\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (font.category) {\n\t\t\t\titem.setAttribute('data-category', font.category);\n\t\t\t}\n\n\t\t\tlist.appendChild(item);\n\t\t}\n\n\t\tcontainer.appendChild(list);\n\t}\n\n\tprivate createFontItem(\n\t\tname: string,\n\t\tfamily: string,\n\t\tisActive: boolean,\n\t\thandler: (e: MouseEvent) => void,\n\t): HTMLButtonElement {\n\t\tconst item: HTMLButtonElement = document.createElement('button');\n\t\titem.type = 'button';\n\t\titem.className = 'notectl-font-picker__item';\n\t\titem.setAttribute('role', 'option');\n\t\titem.setAttribute('aria-selected', String(isActive));\n\n\t\tif (isActive) {\n\t\t\titem.classList.add('notectl-font-picker__item--active');\n\t\t}\n\n\t\t// Checkmark indicator\n\t\tconst check: HTMLSpanElement = document.createElement('span');\n\t\tcheck.className = 'notectl-font-picker__check';\n\t\tcheck.textContent = isActive ? '\\u2713' : '';\n\t\titem.appendChild(check);\n\n\t\t// Font name label (rendered in the font itself for preview)\n\t\tconst label: HTMLSpanElement = document.createElement('span');\n\t\tlabel.className = 'notectl-font-picker__label';\n\t\tlabel.textContent = name;\n\t\tif (family) {\n\t\t\tsetStyleProperty(label, 'fontFamily', family);\n\t\t}\n\t\titem.appendChild(label);\n\n\t\titem.addEventListener('mousedown', handler);\n\t\treturn item;\n\t}\n}\n"],"names":["FONT_LOCALE_EN","label","tooltip","localeModules","assign","import","async","loadFontLocale","lang","loader","default","FontPlugin","id","name","priority","config","locale","injectedStyleElement","context","constructor","this","init","resolveLocale","registerStyleSheet","registerMarkSpec","registerCommands","registerToolbarItem","injectFontFaces","destroy","remove","type","rank","attrs","family","toDOM","mark","span","document","createElement","setStyleProperty","toHTMLString","content","ctx","String","isValidCSSFontFamily","decl","escapeHTML","styleAttr","toHTMLStyle","parseHTML","tag","getAttrs","el","style","fontFamily","replace","sanitize","tags","registerCommand","state","getState","removeFont","defaultFont","found","fonts","find","f","first","Error","group","command","popupType","getLabel","resolveFontName","getActiveFont","renderPopup","container","onClose","renderFontPopup","isActive","isFontActive","match","split","trim","isAttributedMarkActive","getMarkAttrAtSelection","m","applyFont","markType","tr","applyAttributedMark","dispatch","removeAttributedMark","rules","font","fontFaces","length","face","declarations","src","weight","push","display","join","setAttribute","nonce","getStyleNonceForNode","getContainer","textContent","head","appendChild","classList","add","activeFont","defaultFamily","contentElement","list","className","isDefault","item","createFontItem","e","preventDefault","stopPropagation","executeCommand","restoreFocusTo","category","handler","check","addEventListener"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gap-cursor.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hard-break.mjs","sources":["../../src/plugins/hard-break/HardBreakPlugin.ts"],"sourcesContent":["/**\n * HardBreakPlugin: registers a hard line break (Shift+Enter → `<br>`)\n * as an InlineNode, with command and keymap bindings.\n */\n\nimport { insertHardBreakCommand } from '../../commands/Commands.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface InlineNodeAttrRegistry {\n\t\thard_break: Record<string, never>;\n\t}\n}\n\n// --- Plugin ---\n\nexport class HardBreakPlugin implements Plugin {\n\treadonly id = 'hard-break';\n\treadonly name = 'Hard Break';\n\treadonly priority = 10;\n\n\tinit(context: PluginContext): void {\n\t\tthis.registerInlineNodeSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t}\n\n\tprivate registerInlineNodeSpec(context: PluginContext): void {\n\t\tcontext.registerInlineNodeSpec({\n\t\t\ttype: 'hard_break',\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement('br');\n\t\t\t},\n\t\t\ttoHTMLString() {\n\t\t\t\treturn '<br>';\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'br' }],\n\t\t\tsanitize: { tags: ['br'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('insertHardBreak', () => {\n\t\t\tconst state = context.getState();\n\t\t\tconst tr = insertHardBreakCommand(state);\n\t\t\tif (!tr) return false;\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Shift-Enter': () => {\n\t\t\t\tconst state = context.getState();\n\t\t\t\tconst tr = insertHardBreakCommand(state);\n\t\t\t\tif (!tr) return false;\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t});\n\t}\n}\n"],"names":["HardBreakPlugin","id","name","priority","init","context","this","registerInlineNodeSpec","registerCommands","registerKeymap","type","toDOM","document","createElement","toHTMLString","parseHTML","tag","sanitize","tags","registerCommand","state","getState","tr","insertHardBreakCommand","dispatch"],"mappings":"oDAkBO,MAAMA,EACHC,GAAK,aACLC,KAAO,aACPC,SAAW,GAEpB,IAAAC,CAAKC,GACJC,KAAKC,uBAAuBF,GAC5BC,KAAKE,iBAAiBH,GACtBC,KAAKG,eAAeJ,EACrB,CAEQ,sBAAAE,CAAuBF,GAC9BA,EAAQE,uBAAuB,CAC9BG,KAAM,aACNC,MAAA,IACQC,SAASC,cAAc,MAE/BC,aAAA,IACQ,OAERC,UAAW,CAAC,CAAEC,IAAK,OACnBC,SAAU,CAAEC,KAAM,CAAC,QAErB,CAEQ,gBAAAV,CAAiBH,GACxBA,EAAQc,gBAAgB,kBAAmB,KAC1C,MAAMC,EAAQf,EAAQgB,WAChBC,EAAKC,EAAuBH,GAClC,QAAKE,IACLjB,EAAQmB,SAASF,IACV,IAET,CAEQ,cAAAb,CAAeJ,GACtBA,EAAQI,eAAe,CACtB,cAAe,KACd,MAAMW,EAAQf,EAAQgB,WAChBC,EAAKC,EAAuBH,GAClC,QAAKE,IACLjB,EAAQmB,SAASF,IACV,KAGV"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"heading.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"highlight.mjs","sources":["../../src/plugins/highlight/HighlightLocale.ts","../../src/plugins/highlight/HighlightPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the HighlightPlugin. */\n\n// --- Locale Interface ---\n\nexport interface HighlightLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n\treadonly resetLabel: string;\n\treadonly ariaLabelPrefix: string;\n}\n\n// --- Default English Locale ---\n\nexport const HIGHLIGHT_LOCALE_EN: HighlightLocale = {\n\tlabel: 'Highlight',\n\ttooltip: 'Highlight Color',\n\tresetLabel: 'None',\n\tariaLabelPrefix: 'Highlight color',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: HighlightLocale }>> =\n\timport.meta.glob<{ default: HighlightLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadHighlightLocale(lang: string): Promise<HighlightLocale> {\n\tif (lang === 'en') return HIGHLIGHT_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return HIGHLIGHT_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn HIGHLIGHT_LOCALE_EN;\n\t}\n}\n","/**\n * HighlightPlugin: registers a highlight (background-color) mark with attrs,\n * toolbar button with a color picker popup, and removeHighlight command.\n */\n\nimport { COLOR_PICKER_CSS } from '../../editor/styles/color-picker.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { HTMLExportContext } from '../../model/NodeSpec.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isColorMarkActive, removeColorMark } from '../shared/ColorMarkOperations.js';\nimport { renderColorPickerPopup } from '../shared/ColorPickerPopup.js';\nimport { isValidCSSColor, resolveColors } from '../shared/ColorValidation.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport {\n\tHIGHLIGHT_LOCALE_EN,\n\ttype HighlightLocale,\n\tloadHighlightLocale,\n} from './HighlightLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\thighlight: { color: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface HighlightConfig {\n\t/**\n\t * Restricts the color picker to a specific set of hex colors.\n\t * Each value must be a valid hex color code (`#RGB` or `#RRGGBB`).\n\t * Duplicates are removed automatically (case-insensitive).\n\t * When omitted, the full default palette is shown.\n\t */\n\treadonly colors?: readonly string[];\n\treadonly locale?: HighlightLocale;\n}\n\n// --- Color Palette (Highlight-optimized: 10 columns x 5 rows) ---\n\nconst HIGHLIGHT_PALETTE: readonly string[] = [\n\t// Row 1 — Classic highlighter colors (bright, vivid)\n\t'#fff176',\n\t'#aed581',\n\t'#4dd0e1',\n\t'#64b5f6',\n\t'#ce93d8',\n\t'#f48fb1',\n\t'#ffab91',\n\t'#ff8a65',\n\t'#e6ee9c',\n\t'#80cbc4',\n\t// Row 2 — Light pastels\n\t'#fff9c4',\n\t'#dcedc8',\n\t'#e0f7fa',\n\t'#e3f2fd',\n\t'#f3e5f5',\n\t'#fce4ec',\n\t'#fff3e0',\n\t'#fbe9e7',\n\t'#f9fbe7',\n\t'#e0f2f1',\n\t// Row 3 — Medium pastels\n\t'#fff59d',\n\t'#c5e1a5',\n\t'#80deea',\n\t'#90caf9',\n\t'#e1bee7',\n\t'#f8bbd0',\n\t'#ffcc80',\n\t'#ffab91',\n\t'#e6ee9c',\n\t'#a5d6a7',\n\t// Row 4 — Bold pastels\n\t'#ffee58',\n\t'#9ccc65',\n\t'#26c6da',\n\t'#42a5f5',\n\t'#ab47bc',\n\t'#ec407a',\n\t'#ffa726',\n\t'#ff7043',\n\t'#d4e157',\n\t'#66bb6a',\n\t// Row 5 — Grays and neutral highlights\n\t'#ffffff',\n\t'#fafafa',\n\t'#f5f5f5',\n\t'#eeeeee',\n\t'#e0e0e0',\n\t'#bdbdbd',\n\t'#e8eaf6',\n\t'#efebe9',\n\t'#eceff1',\n\t'#fafafa',\n];\n\n// --- Plugin ---\n\nexport class HighlightPlugin implements Plugin {\n\treadonly id = 'highlight';\n\treadonly name = 'Highlight';\n\treadonly priority = 24;\n\n\tprivate readonly config: HighlightConfig;\n\tprivate readonly colors: readonly string[];\n\tprivate locale!: HighlightLocale;\n\n\tconstructor(config?: Partial<HighlightConfig>) {\n\t\tthis.config = { ...config };\n\t\tthis.colors = resolveColors(config?.colors, HIGHLIGHT_PALETTE, 'HighlightPlugin');\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tHIGHLIGHT_LOCALE_EN,\n\t\t\tloadHighlightLocale,\n\t\t);\n\n\t\tcontext.registerStyleSheet(COLOR_PICKER_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'highlight',\n\t\t\trank: 4,\n\t\t\tattrs: {\n\t\t\t\tcolor: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tconst color = mark.attrs?.color ?? '';\n\t\t\t\tsetStyleProperty(span, 'backgroundColor', color);\n\t\t\t\treturn span;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content, ctx?: HTMLExportContext) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\tif (!color || !isValidCSSColor(color)) return content;\n\t\t\t\tconst decl: string = `background-color: ${escapeHTML(color)}`;\n\t\t\t\tconst attr: string = ctx?.styleAttr(decl) ?? ` style=\"${decl}\"`;\n\t\t\t\treturn `<span${attr}>${content}</span>`;\n\t\t\t},\n\t\t\ttoHTMLStyle: (mark) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\tif (!color || !isValidCSSColor(color)) return null;\n\t\t\t\treturn `background-color: ${escapeHTML(color)}`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst color: string = el.style.backgroundColor;\n\t\t\t\t\t\tif (!color || !isValidCSSColor(color)) return false;\n\t\t\t\t\t\treturn { color };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['span'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeHighlight', () => {\n\t\t\treturn removeColorMark(context, context.getState(), 'highlight');\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst pathD =\n\t\t\t'M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2z' + 'm-1.38 9L12 5.67 14.38 12H9.62z';\n\t\tconst icon: string = [\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\"',\n\t\t\t' viewBox=\"0 0 24 24\">',\n\t\t\t`<path d=\"${pathD}\"/>`,\n\t\t\t'<rect x=\"3\" y=\"17\" width=\"18\" height=\"6\"',\n\t\t\t' rx=\"0.5\" fill=\"#fff176\"/>',\n\t\t\t'</svg>',\n\t\t].join('');\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'highlight',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeHighlight',\n\t\t\tpopupType: 'custom',\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderColorPickerPopup(container, ctx, {\n\t\t\t\t\tmarkType: 'highlight',\n\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\tcolumns: 10,\n\t\t\t\t\tresetLabel: this.locale.resetLabel,\n\t\t\t\t\tresetCommand: 'removeHighlight',\n\t\t\t\t\tariaLabelPrefix: this.locale.ariaLabelPrefix,\n\t\t\t\t\tonClose,\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (state: EditorState) => isColorMarkActive(state, 'highlight'),\n\t\t});\n\t}\n}\n"],"names":["HIGHLIGHT_LOCALE_EN","label","tooltip","resetLabel","ariaLabelPrefix","localeModules","assign","import","async","loadHighlightLocale","lang","loader","default","HIGHLIGHT_PALETTE","HighlightPlugin","id","name","priority","config","colors","locale","constructor","this","resolveColors","init","context","resolveLocale","registerStyleSheet","COLOR_PICKER_CSS","registerMarkSpec","registerCommands","registerToolbarItem","type","rank","attrs","color","toDOM","mark","span","document","createElement","setStyleProperty","toHTMLString","content","ctx","String","isValidCSSColor","decl","escapeHTML","styleAttr","toHTMLStyle","parseHTML","tag","getAttrs","el","style","backgroundColor","sanitize","tags","registerCommand","removeColorMark","getState","icon","join","group","command","popupType","renderPopup","container","onClose","renderColorPickerPopup","markType","columns","resetCommand","isActive","state","isColorMarkActive"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"horizontal-rule.mjs","sources":["../../src/plugins/horizontal-rule/HorizontalRuleLocale.ts","../../src/plugins/horizontal-rule/HorizontalRulePlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the HorizontalRulePlugin. */\n\n// --- Locale Interface ---\n\nexport interface HorizontalRuleLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const HORIZONTAL_RULE_LOCALE_EN: HorizontalRuleLocale = {\n\tlabel: 'Horizontal Rule',\n\ttooltip: (shortcut: string) => `Horizontal Rule (${shortcut})`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: HorizontalRuleLocale }>> =\n\timport.meta.glob<{ default: HorizontalRuleLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadHorizontalRuleLocale(lang: string): Promise<HorizontalRuleLocale> {\n\tif (lang === 'en') return HORIZONTAL_RULE_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return HORIZONTAL_RULE_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn HORIZONTAL_RULE_LOCALE_EN;\n\t}\n}\n","/**\n * HorizontalRulePlugin: registers a horizontal rule (divider) void block type\n * with NodeSpec, insert command, input rule, keyboard shortcut, and toolbar button.\n */\n\nimport { createBlockNode } from '../../model/Document.js';\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { createBlockElement } from '../../view/DomUtils.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport {\n\tHORIZONTAL_RULE_LOCALE_EN,\n\ttype HorizontalRuleLocale,\n\tloadHorizontalRuleLocale,\n} from './HorizontalRuleLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\thorizontal_rule: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\nexport interface HorizontalRuleConfig {\n\t/** Locale override for user-facing strings. */\n\treadonly locale?: HorizontalRuleLocale;\n}\n\nconst DEFAULT_CONFIG: HorizontalRuleConfig = {};\n\n// --- Helpers ---\n\n/** Finds the index of the cursor's block among top-level document children. */\nfunction findBlockIndexForCursor(state: EditorState): number {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return -1;\n\treturn state.doc.children.findIndex((b) => b.id === sel.anchor.blockId);\n}\n\n// --- Plugin ---\n\nexport class HorizontalRulePlugin implements Plugin {\n\treadonly id = 'horizontal-rule';\n\treadonly name = 'Horizontal Rule';\n\treadonly priority = 40;\n\n\tprivate readonly config: HorizontalRuleConfig;\n\tprivate locale!: HorizontalRuleLocale;\n\n\tconstructor(config?: Partial<HorizontalRuleConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tHORIZONTAL_RULE_LOCALE_EN,\n\t\t\tloadHorizontalRuleLocale,\n\t\t);\n\t\tthis.registerNodeSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t\tthis.registerInputRule(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerNodeSpec(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'horizontal_rule',\n\t\t\tgroup: 'block',\n\t\t\tisVoid: true,\n\t\t\ttoDOM(node) {\n\t\t\t\treturn createBlockElement('hr', node.id);\n\t\t\t},\n\t\t\ttoHTML() {\n\t\t\t\treturn '<hr>';\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'hr' }],\n\t\t\tsanitize: { tags: ['hr'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('insertHorizontalRule', () => {\n\t\t\treturn this.insertHorizontalRule(context);\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-Shift-H': () => context.executeCommand('insertHorizontalRule'),\n\t\t});\n\t}\n\n\tprivate registerInputRule(context: PluginContext): void {\n\t\tcontext.registerInputRule({\n\t\t\tpattern: /^-{3,} $/,\n\t\t\thandler(state, _match, _start, end) {\n\t\t\t\tconst sel = state.selection;\n\t\t\t\tif (!isTextSelection(sel)) return null;\n\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\tconst blockIndex: number = findBlockIndexForCursor(state);\n\t\t\t\tif (blockIndex === -1) return null;\n\n\t\t\t\tconst newParagraph = createBlockNode(nodeType('paragraph'));\n\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, 0, end)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('horizontal_rule'))\n\t\t\t\t\t.insertNode([], blockIndex + 1, newParagraph)\n\t\t\t\t\t.setSelection(createCollapsedSelection(newParagraph.id, 0))\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst icon =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 11h16v2H4z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'horizontal-rule',\n\t\t\tgroup: 'block',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip(formatShortcut('Mod-Shift-H')),\n\t\t\tcommand: 'insertHorizontalRule',\n\t\t\tisActive: () => false,\n\t\t});\n\t}\n\n\t/**\n\t * Inserts a horizontal rule after the current block,\n\t * followed by a new paragraph for continued editing.\n\t */\n\tprivate insertHorizontalRule(context: PluginContext): boolean {\n\t\tconst state: EditorState = context.getState();\n\t\tif (!isTextSelection(state.selection)) return false;\n\t\tconst blockIndex: number = findBlockIndexForCursor(state);\n\t\tif (blockIndex === -1) return false;\n\n\t\tconst hrBlock = createBlockNode(nodeType('horizontal_rule'));\n\t\tconst newParagraph = createBlockNode(nodeType('paragraph'));\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.insertNode([], blockIndex + 1, hrBlock)\n\t\t\t.insertNode([], blockIndex + 2, newParagraph)\n\t\t\t.setSelection(createCollapsedSelection(newParagraph.id, 0))\n\t\t\t.build();\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n}\n"],"names":["HORIZONTAL_RULE_LOCALE_EN","label","tooltip","shortcut","localeModules","assign","import","async","loadHorizontalRuleLocale","lang","loader","default","DEFAULT_CONFIG","findBlockIndexForCursor","state","sel","selection","isTextSelection","doc","children","findIndex","b","id","anchor","blockId","HorizontalRulePlugin","name","priority","config","locale","constructor","this","init","context","resolveLocale","registerNodeSpec","registerCommands","registerKeymap","registerInputRule","registerToolbarItem","type","group","isVoid","toDOM","node","createBlockElement","toHTML","parseHTML","tag","sanitize","tags","registerCommand","insertHorizontalRule","executeCommand","pattern","handler","_match","_start","end","isCollapsed","block","getBlock","blockIndex","newParagraph","createBlockNode","nodeType","transaction","deleteTextAt","setBlockType","insertNode","setSelection","createCollapsedSelection","build","icon","formatShortcut","command","isActive","getState","hrBlock","tr","dispatch"],"mappings":"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"}