@notectl/core 2.0.3 → 2.0.5

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 (1129) hide show
  1. package/dist/chunks/AlignmentPlugin-DGb1VtCU.mjs +2 -0
  2. package/dist/chunks/AlignmentPlugin-DGb1VtCU.mjs.map +1 -0
  3. package/dist/chunks/AttrRegistry-DvqbnJ6T.mjs +2 -0
  4. package/dist/chunks/AttrRegistry-DvqbnJ6T.mjs.map +1 -0
  5. package/dist/chunks/AttributedMarkCommands-BiJtiHpx.mjs +2 -0
  6. package/dist/chunks/AttributedMarkCommands-BiJtiHpx.mjs.map +1 -0
  7. package/dist/chunks/BlockInsertion-Q8B21SaG.mjs +2 -0
  8. package/dist/chunks/BlockInsertion-Q8B21SaG.mjs.map +1 -0
  9. package/dist/chunks/BlockTypePickerRegistry-5fFlS2i0.mjs +2 -0
  10. package/dist/chunks/BlockTypePickerRegistry-5fFlS2i0.mjs.map +1 -0
  11. package/dist/chunks/BlockquotePlugin-Dz8Pny1r.mjs +2 -0
  12. package/dist/chunks/BlockquotePlugin-Dz8Pny1r.mjs.map +1 -0
  13. package/dist/chunks/CaretNavigationPlugin-mQ1nxJ6m.mjs +2 -0
  14. package/dist/chunks/CaretNavigationPlugin-mQ1nxJ6m.mjs.map +1 -0
  15. package/dist/chunks/CodeBlockPlugin-oPGiMno0.mjs +2 -0
  16. package/dist/chunks/CodeBlockPlugin-oPGiMno0.mjs.map +1 -0
  17. package/dist/chunks/ColorGrid-CcF0bH26.mjs +2 -0
  18. package/dist/chunks/ColorGrid-CcF0bH26.mjs.map +1 -0
  19. package/dist/chunks/ColorPickerPopup-BZxMBDxy.mjs +2 -0
  20. package/dist/chunks/ColorPickerPopup-BZxMBDxy.mjs.map +1 -0
  21. package/dist/chunks/ColorValidation-rOrJxBBt.mjs +2 -0
  22. package/dist/chunks/ColorValidation-rOrJxBBt.mjs.map +1 -0
  23. package/dist/chunks/CommandHelpers-G6M-qXJR.mjs +2 -0
  24. package/dist/chunks/CommandHelpers-G6M-qXJR.mjs.map +1 -0
  25. package/dist/chunks/Commands-ByBjgD3-.mjs +2 -0
  26. package/dist/chunks/Commands-ByBjgD3-.mjs.map +1 -0
  27. package/dist/chunks/Decoration-D-yB-H5v.mjs +2 -0
  28. package/dist/chunks/Decoration-D-yB-H5v.mjs.map +1 -0
  29. package/dist/chunks/Document-DnPKbcPE.mjs +2 -0
  30. package/dist/chunks/Document-DnPKbcPE.mjs.map +1 -0
  31. package/dist/chunks/DocumentParser-KuBaEZN6.mjs +2 -0
  32. package/dist/chunks/DocumentParser-KuBaEZN6.mjs.map +1 -0
  33. package/dist/chunks/DocumentSerializer-DgdiJsES.mjs +2 -0
  34. package/dist/chunks/DocumentSerializer-DgdiJsES.mjs.map +1 -0
  35. package/dist/chunks/FontPlugin-DYntd3gN.mjs +2 -0
  36. package/dist/chunks/FontPlugin-DYntd3gN.mjs.map +1 -0
  37. package/dist/chunks/FontSizePlugin-CGlH-S6g.mjs +2 -0
  38. package/dist/chunks/FontSizePlugin-CGlH-S6g.mjs.map +1 -0
  39. package/dist/chunks/GapCursorNavigation-uytzcZ6C.mjs +2 -0
  40. package/dist/chunks/GapCursorNavigation-uytzcZ6C.mjs.map +1 -0
  41. package/dist/chunks/GapCursorPlugin-BQ2_-7i6.mjs +2 -0
  42. package/dist/chunks/GapCursorPlugin-BQ2_-7i6.mjs.map +1 -0
  43. package/dist/chunks/HardBreakPlugin-CCrP_Kec.mjs +2 -0
  44. package/dist/chunks/HardBreakPlugin-CCrP_Kec.mjs.map +1 -0
  45. package/dist/chunks/HeadingPlugin-BiDNuBmw.mjs +2 -0
  46. package/dist/chunks/HeadingPlugin-BiDNuBmw.mjs.map +1 -0
  47. package/dist/chunks/HighlightPlugin-CwrtRVfS.mjs +2 -0
  48. package/dist/chunks/HighlightPlugin-CwrtRVfS.mjs.map +1 -0
  49. package/dist/chunks/HorizontalRulePlugin-CKIkbVwn.mjs +2 -0
  50. package/dist/chunks/HorizontalRulePlugin-CKIkbVwn.mjs.map +1 -0
  51. package/dist/chunks/ImagePlugin-BqRAKlG1.mjs +2 -0
  52. package/dist/chunks/ImagePlugin-BqRAKlG1.mjs.map +1 -0
  53. package/dist/chunks/KeyboardNav-IMWHB6wc.mjs +2 -0
  54. package/dist/chunks/KeyboardNav-IMWHB6wc.mjs.map +1 -0
  55. package/dist/chunks/LinkPlugin-Cb2cpFe8.mjs +2 -0
  56. package/dist/chunks/LinkPlugin-Cb2cpFe8.mjs.map +1 -0
  57. package/dist/chunks/ListPlugin-CZgkinoS.mjs +2 -0
  58. package/dist/chunks/ListPlugin-CZgkinoS.mjs.map +1 -0
  59. package/dist/chunks/NodeResolver-BkOsZnuU.mjs +2 -0
  60. package/dist/chunks/NodeResolver-BkOsZnuU.mjs.map +1 -0
  61. package/dist/chunks/NodeSelectionCommands-U8xEdaE4.mjs +2 -0
  62. package/dist/chunks/NodeSelectionCommands-U8xEdaE4.mjs.map +1 -0
  63. package/dist/chunks/Platform-wPvKFB9m.mjs +2 -0
  64. package/dist/chunks/Platform-wPvKFB9m.mjs.map +1 -0
  65. package/dist/chunks/Plugin-C4cBw3bs.mjs +2 -0
  66. package/dist/chunks/Plugin-C4cBw3bs.mjs.map +1 -0
  67. package/dist/chunks/PluginHelpers-BZU5rE44.mjs +2 -0
  68. package/dist/chunks/PluginHelpers-BZU5rE44.mjs.map +1 -0
  69. package/dist/chunks/PopupManager-S2qQtTxR.mjs +2 -0
  70. package/dist/chunks/PopupManager-S2qQtTxR.mjs.map +1 -0
  71. package/dist/chunks/PopupPositioning-BdSCai19.mjs +2 -0
  72. package/dist/chunks/PopupPositioning-BdSCai19.mjs.map +1 -0
  73. package/dist/chunks/PrintPlugin-80SINLGF.mjs +2 -0
  74. package/dist/chunks/PrintPlugin-80SINLGF.mjs.map +1 -0
  75. package/dist/chunks/PrintTypes-CWIAfEaX.mjs +2 -0
  76. package/dist/chunks/PrintTypes-CWIAfEaX.mjs.map +1 -0
  77. package/dist/chunks/RangeIterator-DEuX1xKV.mjs +2 -0
  78. package/dist/chunks/RangeIterator-DEuX1xKV.mjs.map +1 -0
  79. package/dist/chunks/ShortcutFormatting-c0IajwWG.mjs +2 -0
  80. package/dist/chunks/ShortcutFormatting-c0IajwWG.mjs.map +1 -0
  81. package/dist/chunks/SmartPastePlugin-BvYBbHSA.mjs +2 -0
  82. package/dist/chunks/SmartPastePlugin-BvYBbHSA.mjs.map +1 -0
  83. package/dist/chunks/StrikethroughPlugin-XBOGv5Oi.mjs +2 -0
  84. package/dist/chunks/StrikethroughPlugin-XBOGv5Oi.mjs.map +1 -0
  85. package/dist/chunks/StyleRuntime-Bwde5icB.mjs +2 -0
  86. package/dist/chunks/StyleRuntime-Bwde5icB.mjs.map +1 -0
  87. package/dist/chunks/SuperSubPlugin-CVjU4W9y.mjs +2 -0
  88. package/dist/chunks/SuperSubPlugin-CVjU4W9y.mjs.map +1 -0
  89. package/dist/chunks/SyntaxTokenTypes-CY2-rJCA.mjs +2 -0
  90. package/dist/chunks/SyntaxTokenTypes-CY2-rJCA.mjs.map +1 -0
  91. package/dist/chunks/TablePlugin-BHpp6h9H.mjs +2 -0
  92. package/dist/chunks/TablePlugin-BHpp6h9H.mjs.map +1 -0
  93. package/dist/chunks/TextColorPlugin-CGbyMGTr.mjs +2 -0
  94. package/dist/chunks/TextColorPlugin-CGbyMGTr.mjs.map +1 -0
  95. package/dist/chunks/TextDirectionCorePlugin-DPU7wy6g.mjs +2 -0
  96. package/dist/chunks/TextDirectionCorePlugin-DPU7wy6g.mjs.map +1 -0
  97. package/dist/chunks/TextDirectionLocale-DxOfFixh.mjs +2 -0
  98. package/dist/chunks/TextDirectionLocale-DxOfFixh.mjs.map +1 -0
  99. package/dist/chunks/TextFormattingPlugin-CYVnhHH4.mjs +2 -0
  100. package/dist/chunks/TextFormattingPlugin-CYVnhHH4.mjs.map +1 -0
  101. package/dist/chunks/ToolbarPlugin-CWDkWXE8.mjs +2 -0
  102. package/dist/chunks/ToolbarPlugin-CWDkWXE8.mjs.map +1 -0
  103. package/dist/chunks/WordBoundary-BkxXn2JA.mjs +2 -0
  104. package/dist/chunks/WordBoundary-BkxXn2JA.mjs.map +1 -0
  105. package/dist/chunks/XmlDetector-BiWxa0RJ.mjs +2 -0
  106. package/dist/chunks/XmlDetector-BiWxa0RJ.mjs.map +1 -0
  107. package/dist/chunks/XmlPatterns-B-V-mHF4.mjs +2 -0
  108. package/dist/chunks/XmlPatterns-B-V-mHF4.mjs.map +1 -0
  109. package/dist/chunks/XmlSupport-Czr8xQB1.mjs +2 -0
  110. package/dist/chunks/XmlSupport-Czr8xQB1.mjs.map +1 -0
  111. package/dist/chunks/ar-BARk0vUs.mjs +2 -0
  112. package/dist/chunks/ar-BARk0vUs.mjs.map +1 -0
  113. package/dist/chunks/ar-BVnwjtBO.mjs +2 -0
  114. package/dist/chunks/ar-BVnwjtBO.mjs.map +1 -0
  115. package/dist/chunks/ar-BaLVMaVO.mjs +2 -0
  116. package/dist/chunks/ar-BaLVMaVO.mjs.map +1 -0
  117. package/dist/chunks/ar-BbXyJVxi.mjs +2 -0
  118. package/dist/chunks/ar-BbXyJVxi.mjs.map +1 -0
  119. package/dist/chunks/ar-Bj_U3O6Y.mjs +2 -0
  120. package/dist/chunks/ar-Bj_U3O6Y.mjs.map +1 -0
  121. package/dist/chunks/ar-CLEiZlfu.mjs +2 -0
  122. package/dist/chunks/ar-CLEiZlfu.mjs.map +1 -0
  123. package/dist/chunks/ar-CaE825oi.mjs +2 -0
  124. package/dist/chunks/ar-CaE825oi.mjs.map +1 -0
  125. package/dist/chunks/ar-CaRHAfkM.mjs +2 -0
  126. package/dist/chunks/ar-CaRHAfkM.mjs.map +1 -0
  127. package/dist/chunks/ar-Cg1wGAxo.mjs +2 -0
  128. package/dist/chunks/ar-Cg1wGAxo.mjs.map +1 -0
  129. package/dist/chunks/ar-Cp9qv7la.mjs +2 -0
  130. package/dist/chunks/ar-Cp9qv7la.mjs.map +1 -0
  131. package/dist/chunks/ar-CpZXocgF.mjs +2 -0
  132. package/dist/chunks/ar-CpZXocgF.mjs.map +1 -0
  133. package/dist/chunks/ar-CqD9pUY0.mjs +2 -0
  134. package/dist/chunks/ar-CqD9pUY0.mjs.map +1 -0
  135. package/dist/chunks/ar-D1DiKwV_.mjs +2 -0
  136. package/dist/chunks/ar-D1DiKwV_.mjs.map +1 -0
  137. package/dist/chunks/ar-D714r_62.mjs +2 -0
  138. package/dist/chunks/ar-D714r_62.mjs.map +1 -0
  139. package/dist/chunks/ar-D8hT58sd.mjs +2 -0
  140. package/dist/chunks/ar-D8hT58sd.mjs.map +1 -0
  141. package/dist/chunks/ar-DYA1zADy.mjs +2 -0
  142. package/dist/chunks/ar-DYA1zADy.mjs.map +1 -0
  143. package/dist/chunks/ar-Dc2VufjD.mjs +2 -0
  144. package/dist/chunks/ar-Dc2VufjD.mjs.map +1 -0
  145. package/dist/chunks/ar-DsmIDxDt.mjs +2 -0
  146. package/dist/chunks/ar-DsmIDxDt.mjs.map +1 -0
  147. package/dist/chunks/ar-M3QzJIS8.mjs +2 -0
  148. package/dist/chunks/ar-M3QzJIS8.mjs.map +1 -0
  149. package/dist/chunks/ar-UKi-TYFz.mjs +2 -0
  150. package/dist/chunks/ar-UKi-TYFz.mjs.map +1 -0
  151. package/dist/chunks/ar-UfrdJzT6.mjs +2 -0
  152. package/dist/chunks/ar-UfrdJzT6.mjs.map +1 -0
  153. package/dist/chunks/ar-fGsuiCw5.mjs +2 -0
  154. package/dist/chunks/ar-fGsuiCw5.mjs.map +1 -0
  155. package/dist/chunks/ar-fSElw9mJ.mjs +2 -0
  156. package/dist/chunks/ar-fSElw9mJ.mjs.map +1 -0
  157. package/dist/chunks/color-picker-iPmE48jm.mjs +2 -0
  158. package/dist/chunks/color-picker-iPmE48jm.mjs.map +1 -0
  159. package/dist/chunks/de-B4BcTYnc.mjs +2 -0
  160. package/dist/chunks/de-B4BcTYnc.mjs.map +1 -0
  161. package/dist/chunks/de-B7H06L3l.mjs +2 -0
  162. package/dist/chunks/de-B7H06L3l.mjs.map +1 -0
  163. package/dist/chunks/de-BWk2-9In.mjs +2 -0
  164. package/dist/chunks/de-BWk2-9In.mjs.map +1 -0
  165. package/dist/chunks/de-ByDTr_of.mjs +2 -0
  166. package/dist/chunks/de-ByDTr_of.mjs.map +1 -0
  167. package/dist/chunks/de-C5If_e7l.mjs +2 -0
  168. package/dist/chunks/de-C5If_e7l.mjs.map +1 -0
  169. package/dist/chunks/de-CAmM7IT5.mjs +2 -0
  170. package/dist/chunks/de-CAmM7IT5.mjs.map +1 -0
  171. package/dist/chunks/de-CF7zshOE.mjs +2 -0
  172. package/dist/chunks/de-CF7zshOE.mjs.map +1 -0
  173. package/dist/chunks/de-CXAESa_f.mjs +2 -0
  174. package/dist/chunks/de-CXAESa_f.mjs.map +1 -0
  175. package/dist/chunks/de-ChvJQZeC.mjs +2 -0
  176. package/dist/chunks/de-ChvJQZeC.mjs.map +1 -0
  177. package/dist/chunks/de-ClJaNWJr.mjs +2 -0
  178. package/dist/chunks/de-ClJaNWJr.mjs.map +1 -0
  179. package/dist/chunks/de-CpNFM0EP.mjs +2 -0
  180. package/dist/chunks/de-CpNFM0EP.mjs.map +1 -0
  181. package/dist/chunks/de-CwSQIBLx.mjs +2 -0
  182. package/dist/chunks/de-CwSQIBLx.mjs.map +1 -0
  183. package/dist/chunks/de-D3lxYgJa.mjs +2 -0
  184. package/dist/chunks/de-D3lxYgJa.mjs.map +1 -0
  185. package/dist/chunks/de-D8gRtvU4.mjs +2 -0
  186. package/dist/chunks/de-D8gRtvU4.mjs.map +1 -0
  187. package/dist/chunks/de-D_9IOrAk.mjs +2 -0
  188. package/dist/chunks/de-D_9IOrAk.mjs.map +1 -0
  189. package/dist/chunks/de-DcwZkO0v.mjs +2 -0
  190. package/dist/chunks/de-DcwZkO0v.mjs.map +1 -0
  191. package/dist/chunks/de-DeSVCxbd.mjs +2 -0
  192. package/dist/chunks/de-DeSVCxbd.mjs.map +1 -0
  193. package/dist/chunks/de-DqxnR2Y8.mjs +2 -0
  194. package/dist/chunks/de-DqxnR2Y8.mjs.map +1 -0
  195. package/dist/chunks/de-J82qPFkV.mjs +2 -0
  196. package/dist/chunks/de-J82qPFkV.mjs.map +1 -0
  197. package/dist/chunks/de-QDbUiCAO.mjs +2 -0
  198. package/dist/chunks/de-QDbUiCAO.mjs.map +1 -0
  199. package/dist/chunks/de-eAQXJdL9.mjs +2 -0
  200. package/dist/chunks/de-eAQXJdL9.mjs.map +1 -0
  201. package/dist/chunks/de-hneXQd4z.mjs +2 -0
  202. package/dist/chunks/de-hneXQd4z.mjs.map +1 -0
  203. package/dist/chunks/de-wXAi5Jyt.mjs +2 -0
  204. package/dist/chunks/de-wXAi5Jyt.mjs.map +1 -0
  205. package/dist/chunks/es-5c_5O95N.mjs +2 -0
  206. package/dist/chunks/es-5c_5O95N.mjs.map +1 -0
  207. package/dist/chunks/es-B2QB6DHA.mjs +2 -0
  208. package/dist/chunks/es-B2QB6DHA.mjs.map +1 -0
  209. package/dist/chunks/es-BEcu8DtV.mjs +2 -0
  210. package/dist/chunks/es-BEcu8DtV.mjs.map +1 -0
  211. package/dist/chunks/es-BXTkzYVW.mjs +2 -0
  212. package/dist/chunks/es-BXTkzYVW.mjs.map +1 -0
  213. package/dist/chunks/es-BemQV8dI.mjs +2 -0
  214. package/dist/chunks/es-BemQV8dI.mjs.map +1 -0
  215. package/dist/chunks/es-BfJM5zJ5.mjs +2 -0
  216. package/dist/chunks/es-BfJM5zJ5.mjs.map +1 -0
  217. package/dist/chunks/es-CnqxzYfU.mjs +2 -0
  218. package/dist/chunks/es-CnqxzYfU.mjs.map +1 -0
  219. package/dist/chunks/es-CrZtAd3-.mjs +2 -0
  220. package/dist/chunks/es-CrZtAd3-.mjs.map +1 -0
  221. package/dist/chunks/es-CsCCy0S5.mjs +2 -0
  222. package/dist/chunks/es-CsCCy0S5.mjs.map +1 -0
  223. package/dist/chunks/es-D62AfyHC.mjs +2 -0
  224. package/dist/chunks/es-D62AfyHC.mjs.map +1 -0
  225. package/dist/chunks/es-DA_zUbSs.mjs +2 -0
  226. package/dist/chunks/es-DA_zUbSs.mjs.map +1 -0
  227. package/dist/chunks/es-DFCDhXJb.mjs +2 -0
  228. package/dist/chunks/es-DFCDhXJb.mjs.map +1 -0
  229. package/dist/chunks/es-DHMIpSfB.mjs +2 -0
  230. package/dist/chunks/es-DHMIpSfB.mjs.map +1 -0
  231. package/dist/chunks/es-DIH9KVn1.mjs +2 -0
  232. package/dist/chunks/es-DIH9KVn1.mjs.map +1 -0
  233. package/dist/chunks/es-DOHIPZYT.mjs +2 -0
  234. package/dist/chunks/es-DOHIPZYT.mjs.map +1 -0
  235. package/dist/chunks/es-DPyejgTk.mjs +2 -0
  236. package/dist/chunks/es-DPyejgTk.mjs.map +1 -0
  237. package/dist/chunks/es-DUVk_Wkc.mjs +2 -0
  238. package/dist/chunks/es-DUVk_Wkc.mjs.map +1 -0
  239. package/dist/chunks/es-Di4t0cUf.mjs +2 -0
  240. package/dist/chunks/es-Di4t0cUf.mjs.map +1 -0
  241. package/dist/chunks/es-DjwvgN1j.mjs +2 -0
  242. package/dist/chunks/es-DjwvgN1j.mjs.map +1 -0
  243. package/dist/chunks/es-Nawgghri.mjs +2 -0
  244. package/dist/chunks/es-Nawgghri.mjs.map +1 -0
  245. package/dist/chunks/es-SuOzBFT7.mjs +2 -0
  246. package/dist/chunks/es-SuOzBFT7.mjs.map +1 -0
  247. package/dist/chunks/es-gB6GcNGB.mjs +2 -0
  248. package/dist/chunks/es-gB6GcNGB.mjs.map +1 -0
  249. package/dist/chunks/es-xSr9miNk.mjs +2 -0
  250. package/dist/chunks/es-xSr9miNk.mjs.map +1 -0
  251. package/dist/chunks/fonts-CG_dDwvT.mjs +2 -0
  252. package/dist/chunks/fonts-CG_dDwvT.mjs.map +1 -0
  253. package/dist/chunks/fr-B35gBW5Z.mjs +2 -0
  254. package/dist/chunks/fr-B35gBW5Z.mjs.map +1 -0
  255. package/dist/chunks/fr-BFngqWSa.mjs +2 -0
  256. package/dist/chunks/fr-BFngqWSa.mjs.map +1 -0
  257. package/dist/chunks/fr-BZRak2_s.mjs +2 -0
  258. package/dist/chunks/fr-BZRak2_s.mjs.map +1 -0
  259. package/dist/chunks/fr-Bj_GziCv.mjs +2 -0
  260. package/dist/chunks/fr-Bj_GziCv.mjs.map +1 -0
  261. package/dist/chunks/fr-BushvDBo.mjs +2 -0
  262. package/dist/chunks/fr-BushvDBo.mjs.map +1 -0
  263. package/dist/chunks/fr-Bz2JMdw5.mjs +2 -0
  264. package/dist/chunks/fr-Bz2JMdw5.mjs.map +1 -0
  265. package/dist/chunks/fr-C2y-quYa.mjs +2 -0
  266. package/dist/chunks/fr-C2y-quYa.mjs.map +1 -0
  267. package/dist/chunks/fr-C5g40qHr.mjs +2 -0
  268. package/dist/chunks/fr-C5g40qHr.mjs.map +1 -0
  269. package/dist/chunks/fr-CRPVlCtC.mjs +2 -0
  270. package/dist/chunks/fr-CRPVlCtC.mjs.map +1 -0
  271. package/dist/chunks/fr-Cf0xNw5j.mjs +2 -0
  272. package/dist/chunks/fr-Cf0xNw5j.mjs.map +1 -0
  273. package/dist/chunks/fr-Cr62KfH7.mjs +2 -0
  274. package/dist/chunks/fr-Cr62KfH7.mjs.map +1 -0
  275. package/dist/chunks/fr-D6XZTFJa.mjs +2 -0
  276. package/dist/chunks/fr-D6XZTFJa.mjs.map +1 -0
  277. package/dist/chunks/fr-D9u2mcht.mjs +2 -0
  278. package/dist/chunks/fr-D9u2mcht.mjs.map +1 -0
  279. package/dist/chunks/fr-DEWFKFrW.mjs +2 -0
  280. package/dist/chunks/fr-DEWFKFrW.mjs.map +1 -0
  281. package/dist/chunks/fr-DGBuhK3D.mjs +2 -0
  282. package/dist/chunks/fr-DGBuhK3D.mjs.map +1 -0
  283. package/dist/chunks/fr-DQBLPLlz.mjs +2 -0
  284. package/dist/chunks/fr-DQBLPLlz.mjs.map +1 -0
  285. package/dist/chunks/fr-DQM130Rf.mjs +2 -0
  286. package/dist/chunks/fr-DQM130Rf.mjs.map +1 -0
  287. package/dist/chunks/fr-Dg5SMkMo.mjs +2 -0
  288. package/dist/chunks/fr-Dg5SMkMo.mjs.map +1 -0
  289. package/dist/chunks/fr-Dv0GIx7Q.mjs +2 -0
  290. package/dist/chunks/fr-Dv0GIx7Q.mjs.map +1 -0
  291. package/dist/chunks/fr-DyGGhKFe.mjs +2 -0
  292. package/dist/chunks/fr-DyGGhKFe.mjs.map +1 -0
  293. package/dist/chunks/fr-DzQfRP8y.mjs +2 -0
  294. package/dist/chunks/fr-DzQfRP8y.mjs.map +1 -0
  295. package/dist/chunks/fr-SxdLDSEQ.mjs +2 -0
  296. package/dist/chunks/fr-SxdLDSEQ.mjs.map +1 -0
  297. package/dist/chunks/fr-VGC8qZxr.mjs +2 -0
  298. package/dist/chunks/fr-VGC8qZxr.mjs.map +1 -0
  299. package/dist/chunks/full-B-bw4M7L.mjs +2 -0
  300. package/dist/chunks/full-B-bw4M7L.mjs.map +1 -0
  301. package/dist/chunks/hi-8AQg9KKV.mjs +2 -0
  302. package/dist/chunks/hi-8AQg9KKV.mjs.map +1 -0
  303. package/dist/chunks/hi-B0EvMNl3.mjs +2 -0
  304. package/dist/chunks/hi-B0EvMNl3.mjs.map +1 -0
  305. package/dist/chunks/hi-B5sPMUNb.mjs +2 -0
  306. package/dist/chunks/hi-B5sPMUNb.mjs.map +1 -0
  307. package/dist/chunks/hi-BOfcnulc.mjs +2 -0
  308. package/dist/chunks/hi-BOfcnulc.mjs.map +1 -0
  309. package/dist/chunks/hi-BUveHWCk.mjs +2 -0
  310. package/dist/chunks/hi-BUveHWCk.mjs.map +1 -0
  311. package/dist/chunks/hi-BZ_n8-zx.mjs +2 -0
  312. package/dist/chunks/hi-BZ_n8-zx.mjs.map +1 -0
  313. package/dist/chunks/hi-BeLhPZ5d.mjs +2 -0
  314. package/dist/chunks/hi-BeLhPZ5d.mjs.map +1 -0
  315. package/dist/chunks/hi-Bg8jWcjX.mjs +2 -0
  316. package/dist/chunks/hi-Bg8jWcjX.mjs.map +1 -0
  317. package/dist/chunks/hi-BktVy4Yc.mjs +2 -0
  318. package/dist/chunks/hi-BktVy4Yc.mjs.map +1 -0
  319. package/dist/chunks/hi-Btg6DNgW.mjs +2 -0
  320. package/dist/chunks/hi-Btg6DNgW.mjs.map +1 -0
  321. package/dist/chunks/hi-C20PmckT.mjs +2 -0
  322. package/dist/chunks/hi-C20PmckT.mjs.map +1 -0
  323. package/dist/chunks/hi-C2DDsttW.mjs +2 -0
  324. package/dist/chunks/hi-C2DDsttW.mjs.map +1 -0
  325. package/dist/chunks/hi-CCDCfQV0.mjs +2 -0
  326. package/dist/chunks/hi-CCDCfQV0.mjs.map +1 -0
  327. package/dist/chunks/hi-CWX5sDy1.mjs +2 -0
  328. package/dist/chunks/hi-CWX5sDy1.mjs.map +1 -0
  329. package/dist/chunks/hi-ClSwgZfK.mjs +2 -0
  330. package/dist/chunks/hi-ClSwgZfK.mjs.map +1 -0
  331. package/dist/chunks/hi-D-apR3ri.mjs +2 -0
  332. package/dist/chunks/hi-D-apR3ri.mjs.map +1 -0
  333. package/dist/chunks/hi-D6ZQ_R6m.mjs +2 -0
  334. package/dist/chunks/hi-D6ZQ_R6m.mjs.map +1 -0
  335. package/dist/chunks/hi-D_rhcSL3.mjs +2 -0
  336. package/dist/chunks/hi-D_rhcSL3.mjs.map +1 -0
  337. package/dist/chunks/hi-DcA0CxZR.mjs +2 -0
  338. package/dist/chunks/hi-DcA0CxZR.mjs.map +1 -0
  339. package/dist/chunks/hi-Dd2GOD9r.mjs +2 -0
  340. package/dist/chunks/hi-Dd2GOD9r.mjs.map +1 -0
  341. package/dist/chunks/hi-DkEmvBok.mjs +2 -0
  342. package/dist/chunks/hi-DkEmvBok.mjs.map +1 -0
  343. package/dist/chunks/hi-nfmm9uwI.mjs +2 -0
  344. package/dist/chunks/hi-nfmm9uwI.mjs.map +1 -0
  345. package/dist/chunks/hi-wBX612X_.mjs +2 -0
  346. package/dist/chunks/hi-wBX612X_.mjs.map +1 -0
  347. package/dist/chunks/minimal-CMt909kl.mjs +2 -0
  348. package/dist/chunks/minimal-CMt909kl.mjs.map +1 -0
  349. package/dist/chunks/pt-BGQ7Sh6p.mjs +2 -0
  350. package/dist/chunks/pt-BGQ7Sh6p.mjs.map +1 -0
  351. package/dist/chunks/pt-BGQj9xok.mjs +2 -0
  352. package/dist/chunks/pt-BGQj9xok.mjs.map +1 -0
  353. package/dist/chunks/pt-BL5xNIhC.mjs +2 -0
  354. package/dist/chunks/pt-BL5xNIhC.mjs.map +1 -0
  355. package/dist/chunks/pt-BM8sUzpI.mjs +2 -0
  356. package/dist/chunks/pt-BM8sUzpI.mjs.map +1 -0
  357. package/dist/chunks/pt-BVLuZULN.mjs +2 -0
  358. package/dist/chunks/pt-BVLuZULN.mjs.map +1 -0
  359. package/dist/chunks/pt-BlGlrx3M.mjs +2 -0
  360. package/dist/chunks/pt-BlGlrx3M.mjs.map +1 -0
  361. package/dist/chunks/pt-CKaXK1FK.mjs +2 -0
  362. package/dist/chunks/pt-CKaXK1FK.mjs.map +1 -0
  363. package/dist/chunks/pt-CMpzmrVu.mjs +2 -0
  364. package/dist/chunks/pt-CMpzmrVu.mjs.map +1 -0
  365. package/dist/chunks/pt-Cw77qSTP.mjs +2 -0
  366. package/dist/chunks/pt-Cw77qSTP.mjs.map +1 -0
  367. package/dist/chunks/pt-DBNe2BiX.mjs +2 -0
  368. package/dist/chunks/pt-DBNe2BiX.mjs.map +1 -0
  369. package/dist/chunks/pt-DCfJFt-v.mjs +2 -0
  370. package/dist/chunks/pt-DCfJFt-v.mjs.map +1 -0
  371. package/dist/chunks/pt-DEs0I6eo.mjs +2 -0
  372. package/dist/chunks/pt-DEs0I6eo.mjs.map +1 -0
  373. package/dist/chunks/pt-DKONqS4g.mjs +2 -0
  374. package/dist/chunks/pt-DKONqS4g.mjs.map +1 -0
  375. package/dist/chunks/pt-DO4FbPvV.mjs +2 -0
  376. package/dist/chunks/pt-DO4FbPvV.mjs.map +1 -0
  377. package/dist/chunks/pt-DbDOQjV-.mjs +2 -0
  378. package/dist/chunks/pt-DbDOQjV-.mjs.map +1 -0
  379. package/dist/chunks/pt-DiYv0Ubf.mjs +2 -0
  380. package/dist/chunks/pt-DiYv0Ubf.mjs.map +1 -0
  381. package/dist/chunks/pt-Dk4Mr4yC.mjs +2 -0
  382. package/dist/chunks/pt-Dk4Mr4yC.mjs.map +1 -0
  383. package/dist/chunks/pt-DpLB51hL.mjs +2 -0
  384. package/dist/chunks/pt-DpLB51hL.mjs.map +1 -0
  385. package/dist/chunks/pt-Q5jXPjWo.mjs +2 -0
  386. package/dist/chunks/pt-Q5jXPjWo.mjs.map +1 -0
  387. package/dist/chunks/pt-kFy3gqNp.mjs +2 -0
  388. package/dist/chunks/pt-kFy3gqNp.mjs.map +1 -0
  389. package/dist/chunks/pt-ncNSxrVp.mjs +2 -0
  390. package/dist/chunks/pt-ncNSxrVp.mjs.map +1 -0
  391. package/dist/chunks/pt-tUVNk-7W.mjs +2 -0
  392. package/dist/chunks/pt-tUVNk-7W.mjs.map +1 -0
  393. package/dist/chunks/pt-zzij5vS0.mjs +2 -0
  394. package/dist/chunks/pt-zzij5vS0.mjs.map +1 -0
  395. package/dist/chunks/ru-B-XR4L6x.mjs +2 -0
  396. package/dist/chunks/ru-B-XR4L6x.mjs.map +1 -0
  397. package/dist/chunks/ru-B00ZXSqu.mjs +2 -0
  398. package/dist/chunks/ru-B00ZXSqu.mjs.map +1 -0
  399. package/dist/chunks/ru-B5wvkAtV.mjs +2 -0
  400. package/dist/chunks/ru-B5wvkAtV.mjs.map +1 -0
  401. package/dist/chunks/ru-BA5-gdMK.mjs +2 -0
  402. package/dist/chunks/ru-BA5-gdMK.mjs.map +1 -0
  403. package/dist/chunks/ru-BNTSKpWh.mjs +2 -0
  404. package/dist/chunks/ru-BNTSKpWh.mjs.map +1 -0
  405. package/dist/chunks/ru-BRy-L-TF.mjs +2 -0
  406. package/dist/chunks/ru-BRy-L-TF.mjs.map +1 -0
  407. package/dist/chunks/ru-BZrPeSDg.mjs +2 -0
  408. package/dist/chunks/ru-BZrPeSDg.mjs.map +1 -0
  409. package/dist/chunks/ru-B_8ujIHK.mjs +2 -0
  410. package/dist/chunks/ru-B_8ujIHK.mjs.map +1 -0
  411. package/dist/chunks/ru-BbgvH6r3.mjs +2 -0
  412. package/dist/chunks/ru-BbgvH6r3.mjs.map +1 -0
  413. package/dist/chunks/ru-CDm5R5CV.mjs +2 -0
  414. package/dist/chunks/ru-CDm5R5CV.mjs.map +1 -0
  415. package/dist/chunks/ru-CWLFWYwd.mjs +2 -0
  416. package/dist/chunks/ru-CWLFWYwd.mjs.map +1 -0
  417. package/dist/chunks/ru-CqsCwBQ_.mjs +2 -0
  418. package/dist/chunks/ru-CqsCwBQ_.mjs.map +1 -0
  419. package/dist/chunks/ru-CsFv_mi4.mjs +2 -0
  420. package/dist/chunks/ru-CsFv_mi4.mjs.map +1 -0
  421. package/dist/chunks/ru-Cv9Zbbn2.mjs +2 -0
  422. package/dist/chunks/ru-Cv9Zbbn2.mjs.map +1 -0
  423. package/dist/chunks/ru-CyTNK9dE.mjs +2 -0
  424. package/dist/chunks/ru-CyTNK9dE.mjs.map +1 -0
  425. package/dist/chunks/ru-DEkLlarB.mjs +2 -0
  426. package/dist/chunks/ru-DEkLlarB.mjs.map +1 -0
  427. package/dist/chunks/ru-DZge62_-.mjs +2 -0
  428. package/dist/chunks/ru-DZge62_-.mjs.map +1 -0
  429. package/dist/chunks/ru-DiVRD-Ds.mjs +2 -0
  430. package/dist/chunks/ru-DiVRD-Ds.mjs.map +1 -0
  431. package/dist/chunks/ru-DkP8YLYT.mjs +2 -0
  432. package/dist/chunks/ru-DkP8YLYT.mjs.map +1 -0
  433. package/dist/chunks/ru-OKZRZ5c-.mjs +2 -0
  434. package/dist/chunks/ru-OKZRZ5c-.mjs.map +1 -0
  435. package/dist/chunks/ru-aYY1QVJS.mjs +2 -0
  436. package/dist/chunks/ru-aYY1QVJS.mjs.map +1 -0
  437. package/dist/chunks/ru-ejPBB15H.mjs +2 -0
  438. package/dist/chunks/ru-ejPBB15H.mjs.map +1 -0
  439. package/dist/chunks/ru-tp62bXSj.mjs +2 -0
  440. package/dist/chunks/ru-tp62bXSj.mjs.map +1 -0
  441. package/dist/chunks/shared-DJ08jwra.mjs +2 -0
  442. package/dist/chunks/shared-DJ08jwra.mjs.map +1 -0
  443. package/dist/chunks/src-DOyzNZ94.mjs +2 -0
  444. package/dist/chunks/src-DOyzNZ94.mjs.map +1 -0
  445. package/dist/chunks/text-direction-advanced-B71gUwvk.mjs +2 -0
  446. package/dist/chunks/text-direction-advanced-B71gUwvk.mjs.map +1 -0
  447. package/dist/chunks/zh-2gEqF3OX.mjs +2 -0
  448. package/dist/chunks/zh-2gEqF3OX.mjs.map +1 -0
  449. package/dist/chunks/zh-B5J1sSsk.mjs +2 -0
  450. package/dist/chunks/zh-B5J1sSsk.mjs.map +1 -0
  451. package/dist/chunks/zh-B5LmYVQ2.mjs +2 -0
  452. package/dist/chunks/zh-B5LmYVQ2.mjs.map +1 -0
  453. package/dist/chunks/zh-BBOheLpv.mjs +2 -0
  454. package/dist/chunks/zh-BBOheLpv.mjs.map +1 -0
  455. package/dist/chunks/zh-BOy5F5Jq.mjs +2 -0
  456. package/dist/chunks/zh-BOy5F5Jq.mjs.map +1 -0
  457. package/dist/chunks/zh-BRlo0ayI.mjs +2 -0
  458. package/dist/chunks/zh-BRlo0ayI.mjs.map +1 -0
  459. package/dist/chunks/zh-BgTAzt6l.mjs +2 -0
  460. package/dist/chunks/zh-BgTAzt6l.mjs.map +1 -0
  461. package/dist/chunks/zh-BjY4TNQf.mjs +2 -0
  462. package/dist/chunks/zh-BjY4TNQf.mjs.map +1 -0
  463. package/dist/chunks/zh-BtD9NFJS.mjs +2 -0
  464. package/dist/chunks/zh-BtD9NFJS.mjs.map +1 -0
  465. package/dist/chunks/zh-BvSLqJFE.mjs +2 -0
  466. package/dist/chunks/zh-BvSLqJFE.mjs.map +1 -0
  467. package/dist/chunks/zh-C4rxe0Zk.mjs +2 -0
  468. package/dist/chunks/zh-C4rxe0Zk.mjs.map +1 -0
  469. package/dist/chunks/zh-CyX2tIRP.mjs +2 -0
  470. package/dist/chunks/zh-CyX2tIRP.mjs.map +1 -0
  471. package/dist/chunks/zh-D9QN2C7q.mjs +2 -0
  472. package/dist/chunks/zh-D9QN2C7q.mjs.map +1 -0
  473. package/dist/chunks/zh-DTnSCP1F.mjs +2 -0
  474. package/dist/chunks/zh-DTnSCP1F.mjs.map +1 -0
  475. package/dist/chunks/zh-DWlBkrGZ.mjs +2 -0
  476. package/dist/chunks/zh-DWlBkrGZ.mjs.map +1 -0
  477. package/dist/chunks/zh-DcY4Ouin.mjs +2 -0
  478. package/dist/chunks/zh-DcY4Ouin.mjs.map +1 -0
  479. package/dist/chunks/zh-DovMZIDF.mjs +2 -0
  480. package/dist/chunks/zh-DovMZIDF.mjs.map +1 -0
  481. package/dist/chunks/zh-DtzwqBHS.mjs +2 -0
  482. package/dist/chunks/zh-DtzwqBHS.mjs.map +1 -0
  483. package/dist/chunks/zh-DunJzfVR.mjs +2 -0
  484. package/dist/chunks/zh-DunJzfVR.mjs.map +1 -0
  485. package/dist/chunks/zh-Pd1HqYSs.mjs +2 -0
  486. package/dist/chunks/zh-Pd1HqYSs.mjs.map +1 -0
  487. package/dist/chunks/zh-Yvqfkdln.mjs +2 -0
  488. package/dist/chunks/zh-Yvqfkdln.mjs.map +1 -0
  489. package/dist/chunks/zh-Z9seusJc.mjs +2 -0
  490. package/dist/chunks/zh-Z9seusJc.mjs.map +1 -0
  491. package/dist/chunks/zh-fAa_AbWI.mjs +2 -0
  492. package/dist/chunks/zh-fAa_AbWI.mjs.map +1 -0
  493. package/dist/commands/CommandHelpers.d.ts +0 -2
  494. package/dist/commands/CommandHelpers.d.ts.map +1 -1
  495. package/dist/commands/Commands.d.ts +1 -1
  496. package/dist/commands/Commands.d.ts.map +1 -1
  497. package/dist/commands/GapCursorCommands.d.ts.map +1 -1
  498. package/dist/commands/NodeSelectionCommands.d.ts.map +1 -1
  499. package/dist/commands/RangeIterator.d.ts +6 -0
  500. package/dist/commands/RangeIterator.d.ts.map +1 -1
  501. package/dist/editor/EditorInitializer.d.ts.map +1 -1
  502. package/dist/editor/styles/code-block.d.ts +1 -1
  503. package/dist/editor/styles/code-block.d.ts.map +1 -1
  504. package/dist/editor/styles/color-picker.d.ts +1 -1
  505. package/dist/editor/styles/color-picker.d.ts.map +1 -1
  506. package/dist/editor/styles/font-size-select.d.ts +1 -1
  507. package/dist/editor/styles/font-size-select.d.ts.map +1 -1
  508. package/dist/editor/styles/image.d.ts +1 -1
  509. package/dist/editor/styles/image.d.ts.map +1 -1
  510. package/dist/editor/styles/table.d.ts +1 -1
  511. package/dist/editor/styles/table.d.ts.map +1 -1
  512. package/dist/editor/styles/toolbar.d.ts +1 -1
  513. package/dist/editor/styles/toolbar.d.ts.map +1 -1
  514. package/dist/editor/theme/SyntaxTokenTypes.d.ts +26 -0
  515. package/dist/editor/theme/SyntaxTokenTypes.d.ts.map +1 -0
  516. package/dist/editor/theme/ThemeEngine.d.ts.map +1 -1
  517. package/dist/editor/theme/ThemeTokens.d.ts +6 -16
  518. package/dist/editor/theme/ThemeTokens.d.ts.map +1 -1
  519. package/dist/fonts.mjs +1 -1
  520. package/dist/full.d.ts +1 -0
  521. package/dist/full.d.ts.map +1 -1
  522. package/dist/full.mjs +1 -1
  523. package/dist/html.mjs +1 -1
  524. package/dist/index.d.ts +4 -2
  525. package/dist/index.d.ts.map +1 -1
  526. package/dist/model/Document.d.ts +2 -0
  527. package/dist/model/Document.d.ts.map +1 -1
  528. package/dist/model/KeymapRegistry.d.ts.map +1 -1
  529. package/dist/notectl-core.mjs +1 -1
  530. package/dist/notectl-core.umd.js +1 -1
  531. package/dist/notectl-core.umd.js.map +1 -1
  532. package/dist/plugins/alignment.mjs +1 -1
  533. package/dist/plugins/blockquote.mjs +1 -1
  534. package/dist/plugins/caret-navigation.mjs +1 -1
  535. package/dist/plugins/code-block/CodeBlockCommands.d.ts +5 -0
  536. package/dist/plugins/code-block/CodeBlockCommands.d.ts.map +1 -1
  537. package/dist/plugins/code-block/CodeBlockLocale.d.ts +2 -0
  538. package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -1
  539. package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -1
  540. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +4 -0
  541. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  542. package/dist/plugins/code-block/CodeBlockTypes.d.ts +2 -1
  543. package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
  544. package/dist/plugins/code-block/highlighter/TokenizerTypes.d.ts +2 -4
  545. package/dist/plugins/code-block/highlighter/TokenizerTypes.d.ts.map +1 -1
  546. package/dist/plugins/code-block/highlighter/languages/index.d.ts +1 -0
  547. package/dist/plugins/code-block/highlighter/languages/index.d.ts.map +1 -1
  548. package/dist/plugins/code-block/highlighter/languages/java.d.ts +3 -0
  549. package/dist/plugins/code-block/highlighter/languages/java.d.ts.map +1 -0
  550. package/dist/plugins/code-block/highlighter/languages/xml.d.ts.map +1 -1
  551. package/dist/plugins/code-block/index.d.ts +1 -0
  552. package/dist/plugins/code-block/index.d.ts.map +1 -1
  553. package/dist/plugins/code-block/locales/ar.d.ts.map +1 -1
  554. package/dist/plugins/code-block/locales/de.d.ts.map +1 -1
  555. package/dist/plugins/code-block/locales/es.d.ts.map +1 -1
  556. package/dist/plugins/code-block/locales/fr.d.ts.map +1 -1
  557. package/dist/plugins/code-block/locales/hi.d.ts.map +1 -1
  558. package/dist/plugins/code-block/locales/pt.d.ts.map +1 -1
  559. package/dist/plugins/code-block/locales/ru.d.ts.map +1 -1
  560. package/dist/plugins/code-block/locales/zh.d.ts.map +1 -1
  561. package/dist/plugins/code-block.mjs +1 -1
  562. package/dist/plugins/font-size.mjs +1 -1
  563. package/dist/plugins/font.mjs +1 -1
  564. package/dist/plugins/gap-cursor.mjs +1 -1
  565. package/dist/plugins/hard-break.mjs +1 -1
  566. package/dist/plugins/heading.mjs +1 -1
  567. package/dist/plugins/highlight.mjs +1 -1
  568. package/dist/plugins/horizontal-rule.mjs +1 -1
  569. package/dist/plugins/image.mjs +1 -1
  570. package/dist/plugins/language/LanguageRegistry.d.ts +15 -0
  571. package/dist/plugins/language/LanguageRegistry.d.ts.map +1 -0
  572. package/dist/plugins/language/LanguageTypes.d.ts +54 -0
  573. package/dist/plugins/language/LanguageTypes.d.ts.map +1 -0
  574. package/dist/plugins/language/bundles/JavaSupport.d.ts +3 -0
  575. package/dist/plugins/language/bundles/JavaSupport.d.ts.map +1 -0
  576. package/dist/plugins/language/bundles/JsonSupport.d.ts +3 -0
  577. package/dist/plugins/language/bundles/JsonSupport.d.ts.map +1 -0
  578. package/dist/plugins/language/bundles/XmlSupport.d.ts +3 -0
  579. package/dist/plugins/language/bundles/XmlSupport.d.ts.map +1 -0
  580. package/dist/plugins/language/bundles/index.d.ts +4 -0
  581. package/dist/plugins/language/bundles/index.d.ts.map +1 -0
  582. package/dist/plugins/language/index.d.ts +4 -0
  583. package/dist/plugins/language/index.d.ts.map +1 -0
  584. package/dist/plugins/language.mjs +1 -0
  585. package/dist/plugins/link.mjs +1 -1
  586. package/dist/plugins/list/ListAttrsFactory.d.ts +5 -0
  587. package/dist/plugins/list/ListAttrsFactory.d.ts.map +1 -0
  588. package/dist/plugins/list/ListCommands.d.ts +13 -0
  589. package/dist/plugins/list/ListCommands.d.ts.map +1 -0
  590. package/dist/plugins/list/ListDefinitions.d.ts +9 -0
  591. package/dist/plugins/list/ListDefinitions.d.ts.map +1 -0
  592. package/dist/plugins/list/ListInputRules.d.ts +5 -0
  593. package/dist/plugins/list/ListInputRules.d.ts.map +1 -0
  594. package/dist/plugins/list/ListKeyboardHandlers.d.ts +4 -0
  595. package/dist/plugins/list/ListKeyboardHandlers.d.ts.map +1 -0
  596. package/dist/plugins/list/ListPlugin.d.ts +0 -22
  597. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  598. package/dist/plugins/list/ListToolbarItems.d.ts +6 -0
  599. package/dist/plugins/list/ListToolbarItems.d.ts.map +1 -0
  600. package/dist/plugins/list.mjs +1 -1
  601. package/dist/plugins/print.mjs +1 -1
  602. package/dist/plugins/shared/PopupPositioning.d.ts +20 -0
  603. package/dist/plugins/shared/PopupPositioning.d.ts.map +1 -1
  604. package/dist/plugins/shared.mjs +1 -1
  605. package/dist/plugins/smart-paste/ContentSplitter.d.ts +14 -0
  606. package/dist/plugins/smart-paste/ContentSplitter.d.ts.map +1 -0
  607. package/dist/plugins/smart-paste/SmartPasteLocale.d.ts +1 -0
  608. package/dist/plugins/smart-paste/SmartPasteLocale.d.ts.map +1 -1
  609. package/dist/plugins/smart-paste/SmartPastePlugin.d.ts +6 -1
  610. package/dist/plugins/smart-paste/SmartPastePlugin.d.ts.map +1 -1
  611. package/dist/plugins/smart-paste/SmartPasteTypes.d.ts +5 -0
  612. package/dist/plugins/smart-paste/SmartPasteTypes.d.ts.map +1 -1
  613. package/dist/plugins/smart-paste/detectors/JavaDetector.d.ts +7 -0
  614. package/dist/plugins/smart-paste/detectors/JavaDetector.d.ts.map +1 -0
  615. package/dist/plugins/smart-paste/index.d.ts +2 -1
  616. package/dist/plugins/smart-paste/index.d.ts.map +1 -1
  617. package/dist/plugins/smart-paste/locales/ar.d.ts.map +1 -1
  618. package/dist/plugins/smart-paste/locales/de.d.ts.map +1 -1
  619. package/dist/plugins/smart-paste/locales/es.d.ts.map +1 -1
  620. package/dist/plugins/smart-paste/locales/fr.d.ts.map +1 -1
  621. package/dist/plugins/smart-paste/locales/hi.d.ts.map +1 -1
  622. package/dist/plugins/smart-paste/locales/pt.d.ts.map +1 -1
  623. package/dist/plugins/smart-paste/locales/ru.d.ts.map +1 -1
  624. package/dist/plugins/smart-paste/locales/zh.d.ts.map +1 -1
  625. package/dist/plugins/smart-paste.mjs +1 -1
  626. package/dist/plugins/strikethrough.mjs +1 -1
  627. package/dist/plugins/super-sub.mjs +1 -1
  628. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  629. package/dist/plugins/table/TableContextMenu.d.ts.map +1 -1
  630. package/dist/plugins/table.mjs +1 -1
  631. package/dist/plugins/text-color.mjs +1 -1
  632. package/dist/plugins/text-direction-advanced.mjs +1 -1
  633. package/dist/plugins/text-direction.mjs +1 -1
  634. package/dist/plugins/text-formatting.mjs +1 -1
  635. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -1
  636. package/dist/plugins/toolbar/ToolbarTooltip.d.ts.map +1 -1
  637. package/dist/plugins/toolbar.mjs +1 -1
  638. package/dist/presets/full.mjs +1 -1
  639. package/dist/presets/minimal.mjs +1 -1
  640. package/dist/presets.mjs +1 -1
  641. package/dist/view/CaretNavigation.d.ts +9 -2
  642. package/dist/view/CaretNavigation.d.ts.map +1 -1
  643. package/dist/view/DomPointUtils.d.ts +2 -3
  644. package/dist/view/DomPointUtils.d.ts.map +1 -1
  645. package/dist/view/EditorViewEvents.d.ts.map +1 -1
  646. package/dist/view/EditorViewNavigation.d.ts.map +1 -1
  647. package/package.json +5 -1
  648. package/dist/chunks/AlignmentPlugin-CIkPaP2h.mjs +0 -2
  649. package/dist/chunks/AlignmentPlugin-CIkPaP2h.mjs.map +0 -1
  650. package/dist/chunks/AttrRegistry-B1iBFcKO.mjs +0 -2
  651. package/dist/chunks/AttrRegistry-B1iBFcKO.mjs.map +0 -1
  652. package/dist/chunks/AttributedMarkCommands-Cmet1IuC.mjs +0 -2
  653. package/dist/chunks/AttributedMarkCommands-Cmet1IuC.mjs.map +0 -1
  654. package/dist/chunks/BlockInsertion-DTIE2BiH.mjs +0 -2
  655. package/dist/chunks/BlockInsertion-DTIE2BiH.mjs.map +0 -1
  656. package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs +0 -2
  657. package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs.map +0 -1
  658. package/dist/chunks/BlockquotePlugin-DmbnFmNj.mjs +0 -2
  659. package/dist/chunks/BlockquotePlugin-DmbnFmNj.mjs.map +0 -1
  660. package/dist/chunks/CaretNavigationPlugin-4EaHvYXR.mjs +0 -2
  661. package/dist/chunks/CaretNavigationPlugin-4EaHvYXR.mjs.map +0 -1
  662. package/dist/chunks/CodeBlockPlugin-BP3XaOGj.mjs +0 -2
  663. package/dist/chunks/CodeBlockPlugin-BP3XaOGj.mjs.map +0 -1
  664. package/dist/chunks/ColorGrid-taTKtdsm.mjs +0 -2
  665. package/dist/chunks/ColorGrid-taTKtdsm.mjs.map +0 -1
  666. package/dist/chunks/ColorPickerPopup-JJQ-gMBN.mjs +0 -2
  667. package/dist/chunks/ColorPickerPopup-JJQ-gMBN.mjs.map +0 -1
  668. package/dist/chunks/ColorValidation-3viVw_tK.mjs +0 -2
  669. package/dist/chunks/ColorValidation-3viVw_tK.mjs.map +0 -1
  670. package/dist/chunks/CommandHelpers-D0LIFM4O.mjs +0 -2
  671. package/dist/chunks/CommandHelpers-D0LIFM4O.mjs.map +0 -1
  672. package/dist/chunks/Commands-DJSVqp7b.mjs +0 -2
  673. package/dist/chunks/Commands-DJSVqp7b.mjs.map +0 -1
  674. package/dist/chunks/Decoration-6dhb8k3b.mjs +0 -2
  675. package/dist/chunks/Decoration-6dhb8k3b.mjs.map +0 -1
  676. package/dist/chunks/Document-CkQLx84k.mjs +0 -2
  677. package/dist/chunks/Document-CkQLx84k.mjs.map +0 -1
  678. package/dist/chunks/DocumentParser-QJUmtPp9.mjs +0 -2
  679. package/dist/chunks/DocumentParser-QJUmtPp9.mjs.map +0 -1
  680. package/dist/chunks/DocumentSerializer-bwcxM9WV.mjs +0 -2
  681. package/dist/chunks/DocumentSerializer-bwcxM9WV.mjs.map +0 -1
  682. package/dist/chunks/FontPlugin-Cz4qEYGh.mjs +0 -2
  683. package/dist/chunks/FontPlugin-Cz4qEYGh.mjs.map +0 -1
  684. package/dist/chunks/FontSizePlugin-D1WtDqrH.mjs +0 -2
  685. package/dist/chunks/FontSizePlugin-D1WtDqrH.mjs.map +0 -1
  686. package/dist/chunks/GapCursorNavigation-CKKq42kA.mjs +0 -2
  687. package/dist/chunks/GapCursorNavigation-CKKq42kA.mjs.map +0 -1
  688. package/dist/chunks/GapCursorPlugin-0CyOaciK.mjs +0 -2
  689. package/dist/chunks/GapCursorPlugin-0CyOaciK.mjs.map +0 -1
  690. package/dist/chunks/HardBreakPlugin-BOz-L53p.mjs +0 -2
  691. package/dist/chunks/HardBreakPlugin-BOz-L53p.mjs.map +0 -1
  692. package/dist/chunks/HeadingPlugin-C1F-5Ail.mjs +0 -2
  693. package/dist/chunks/HeadingPlugin-C1F-5Ail.mjs.map +0 -1
  694. package/dist/chunks/HighlightPlugin-LYARYuDC.mjs +0 -2
  695. package/dist/chunks/HighlightPlugin-LYARYuDC.mjs.map +0 -1
  696. package/dist/chunks/HorizontalRulePlugin-fmdbzWDQ.mjs +0 -2
  697. package/dist/chunks/HorizontalRulePlugin-fmdbzWDQ.mjs.map +0 -1
  698. package/dist/chunks/ImagePlugin-CrfnT1sD.mjs +0 -2
  699. package/dist/chunks/ImagePlugin-CrfnT1sD.mjs.map +0 -1
  700. package/dist/chunks/KeyboardNav-BZIHDPDV.mjs +0 -2
  701. package/dist/chunks/KeyboardNav-BZIHDPDV.mjs.map +0 -1
  702. package/dist/chunks/LinkPlugin-DzFJLnfQ.mjs +0 -2
  703. package/dist/chunks/LinkPlugin-DzFJLnfQ.mjs.map +0 -1
  704. package/dist/chunks/ListPlugin-C_Rcz3bV.mjs +0 -2
  705. package/dist/chunks/ListPlugin-C_Rcz3bV.mjs.map +0 -1
  706. package/dist/chunks/NodeResolver-CCA8UVRr.mjs +0 -2
  707. package/dist/chunks/NodeResolver-CCA8UVRr.mjs.map +0 -1
  708. package/dist/chunks/NodeSelectionCommands-CE_73CxF.mjs +0 -2
  709. package/dist/chunks/NodeSelectionCommands-CE_73CxF.mjs.map +0 -1
  710. package/dist/chunks/Platform-D9TRT4Mn.mjs +0 -2
  711. package/dist/chunks/Platform-D9TRT4Mn.mjs.map +0 -1
  712. package/dist/chunks/PluginHelpers-DLKHJWJn.mjs +0 -2
  713. package/dist/chunks/PluginHelpers-DLKHJWJn.mjs.map +0 -1
  714. package/dist/chunks/PopupManager-RWOaksC0.mjs +0 -2
  715. package/dist/chunks/PopupManager-RWOaksC0.mjs.map +0 -1
  716. package/dist/chunks/PopupPositioning-a1ADYSmx.mjs +0 -2
  717. package/dist/chunks/PopupPositioning-a1ADYSmx.mjs.map +0 -1
  718. package/dist/chunks/PrintPlugin-CwbEz3eP.mjs +0 -2
  719. package/dist/chunks/PrintPlugin-CwbEz3eP.mjs.map +0 -1
  720. package/dist/chunks/PrintTypes-B2DXeAEG.mjs +0 -2
  721. package/dist/chunks/PrintTypes-B2DXeAEG.mjs.map +0 -1
  722. package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs +0 -2
  723. package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs.map +0 -1
  724. package/dist/chunks/SmartPastePlugin-CXqJ0CPO.mjs +0 -2
  725. package/dist/chunks/SmartPastePlugin-CXqJ0CPO.mjs.map +0 -1
  726. package/dist/chunks/StrikethroughPlugin-CRl69jm3.mjs +0 -2
  727. package/dist/chunks/StrikethroughPlugin-CRl69jm3.mjs.map +0 -1
  728. package/dist/chunks/StyleRuntime-0yPPJK9H.mjs +0 -2
  729. package/dist/chunks/StyleRuntime-0yPPJK9H.mjs.map +0 -1
  730. package/dist/chunks/SuperSubPlugin-CAnaTJVm.mjs +0 -2
  731. package/dist/chunks/SuperSubPlugin-CAnaTJVm.mjs.map +0 -1
  732. package/dist/chunks/TablePlugin-D_7bgrqm.mjs +0 -2
  733. package/dist/chunks/TablePlugin-D_7bgrqm.mjs.map +0 -1
  734. package/dist/chunks/TextColorPlugin-Dfhvl1qG.mjs +0 -2
  735. package/dist/chunks/TextColorPlugin-Dfhvl1qG.mjs.map +0 -1
  736. package/dist/chunks/TextDirectionCorePlugin-CyKw-C8X.mjs +0 -2
  737. package/dist/chunks/TextDirectionCorePlugin-CyKw-C8X.mjs.map +0 -1
  738. package/dist/chunks/TextDirectionLocale-rlU1yNly.mjs +0 -2
  739. package/dist/chunks/TextDirectionLocale-rlU1yNly.mjs.map +0 -1
  740. package/dist/chunks/TextFormattingPlugin-xtQczzCs.mjs +0 -2
  741. package/dist/chunks/TextFormattingPlugin-xtQczzCs.mjs.map +0 -1
  742. package/dist/chunks/ToolbarPlugin-BFEniyH-.mjs +0 -2
  743. package/dist/chunks/ToolbarPlugin-BFEniyH-.mjs.map +0 -1
  744. package/dist/chunks/WordBoundary-iZXLMFyk.mjs +0 -2
  745. package/dist/chunks/WordBoundary-iZXLMFyk.mjs.map +0 -1
  746. package/dist/chunks/XmlPatterns-Ub8I1jdE.mjs +0 -2
  747. package/dist/chunks/XmlPatterns-Ub8I1jdE.mjs.map +0 -1
  748. package/dist/chunks/ar-3-z4mZhh.mjs +0 -2
  749. package/dist/chunks/ar-3-z4mZhh.mjs.map +0 -1
  750. package/dist/chunks/ar-B-l6wR4D.mjs +0 -2
  751. package/dist/chunks/ar-B-l6wR4D.mjs.map +0 -1
  752. package/dist/chunks/ar-B3NByR5H.mjs +0 -2
  753. package/dist/chunks/ar-B3NByR5H.mjs.map +0 -1
  754. package/dist/chunks/ar-BRvm4F78.mjs +0 -2
  755. package/dist/chunks/ar-BRvm4F78.mjs.map +0 -1
  756. package/dist/chunks/ar-BUMXujtS.mjs +0 -2
  757. package/dist/chunks/ar-BUMXujtS.mjs.map +0 -1
  758. package/dist/chunks/ar-BhVHv8Lx.mjs +0 -2
  759. package/dist/chunks/ar-BhVHv8Lx.mjs.map +0 -1
  760. package/dist/chunks/ar-BhwRD9Cg.mjs +0 -2
  761. package/dist/chunks/ar-BhwRD9Cg.mjs.map +0 -1
  762. package/dist/chunks/ar-Bm8ORJ3H.mjs +0 -2
  763. package/dist/chunks/ar-Bm8ORJ3H.mjs.map +0 -1
  764. package/dist/chunks/ar-BpxuRQB2.mjs +0 -2
  765. package/dist/chunks/ar-BpxuRQB2.mjs.map +0 -1
  766. package/dist/chunks/ar-CA0-ysCj.mjs +0 -2
  767. package/dist/chunks/ar-CA0-ysCj.mjs.map +0 -1
  768. package/dist/chunks/ar-CAkFpIju.mjs +0 -2
  769. package/dist/chunks/ar-CAkFpIju.mjs.map +0 -1
  770. package/dist/chunks/ar-CU6qxyFp.mjs +0 -2
  771. package/dist/chunks/ar-CU6qxyFp.mjs.map +0 -1
  772. package/dist/chunks/ar-CXcTrZVc.mjs +0 -2
  773. package/dist/chunks/ar-CXcTrZVc.mjs.map +0 -1
  774. package/dist/chunks/ar-CeO_osWz.mjs +0 -2
  775. package/dist/chunks/ar-CeO_osWz.mjs.map +0 -1
  776. package/dist/chunks/ar-CxRSPJDE.mjs +0 -2
  777. package/dist/chunks/ar-CxRSPJDE.mjs.map +0 -1
  778. package/dist/chunks/ar-DHes6Igy.mjs +0 -2
  779. package/dist/chunks/ar-DHes6Igy.mjs.map +0 -1
  780. package/dist/chunks/ar-DN1aHdqb.mjs +0 -2
  781. package/dist/chunks/ar-DN1aHdqb.mjs.map +0 -1
  782. package/dist/chunks/ar-DNzmHN3q.mjs +0 -2
  783. package/dist/chunks/ar-DNzmHN3q.mjs.map +0 -1
  784. package/dist/chunks/ar-DVdWier2.mjs +0 -2
  785. package/dist/chunks/ar-DVdWier2.mjs.map +0 -1
  786. package/dist/chunks/ar-G_ADWoCx.mjs +0 -2
  787. package/dist/chunks/ar-G_ADWoCx.mjs.map +0 -1
  788. package/dist/chunks/ar-KAaQxKMo.mjs +0 -2
  789. package/dist/chunks/ar-KAaQxKMo.mjs.map +0 -1
  790. package/dist/chunks/ar-MHdV5PAO.mjs +0 -2
  791. package/dist/chunks/ar-MHdV5PAO.mjs.map +0 -1
  792. package/dist/chunks/ar-S2VfgLMv.mjs +0 -2
  793. package/dist/chunks/ar-S2VfgLMv.mjs.map +0 -1
  794. package/dist/chunks/color-picker-DumtHdqh.mjs +0 -2
  795. package/dist/chunks/color-picker-DumtHdqh.mjs.map +0 -1
  796. package/dist/chunks/de-0x8V-vch.mjs +0 -2
  797. package/dist/chunks/de-0x8V-vch.mjs.map +0 -1
  798. package/dist/chunks/de-B5xIP9en.mjs +0 -2
  799. package/dist/chunks/de-B5xIP9en.mjs.map +0 -1
  800. package/dist/chunks/de-BBohFIqw.mjs +0 -2
  801. package/dist/chunks/de-BBohFIqw.mjs.map +0 -1
  802. package/dist/chunks/de-BWPmC-2S.mjs +0 -2
  803. package/dist/chunks/de-BWPmC-2S.mjs.map +0 -1
  804. package/dist/chunks/de-Bo1kM9rb.mjs +0 -2
  805. package/dist/chunks/de-Bo1kM9rb.mjs.map +0 -1
  806. package/dist/chunks/de-BqzR2XMP.mjs +0 -2
  807. package/dist/chunks/de-BqzR2XMP.mjs.map +0 -1
  808. package/dist/chunks/de-CIZibvOC.mjs +0 -2
  809. package/dist/chunks/de-CIZibvOC.mjs.map +0 -1
  810. package/dist/chunks/de-CLToQn0o.mjs +0 -2
  811. package/dist/chunks/de-CLToQn0o.mjs.map +0 -1
  812. package/dist/chunks/de-CNoAAJul.mjs +0 -2
  813. package/dist/chunks/de-CNoAAJul.mjs.map +0 -1
  814. package/dist/chunks/de-CPb7rgkk.mjs +0 -2
  815. package/dist/chunks/de-CPb7rgkk.mjs.map +0 -1
  816. package/dist/chunks/de-CdmBKVDW.mjs +0 -2
  817. package/dist/chunks/de-CdmBKVDW.mjs.map +0 -1
  818. package/dist/chunks/de-DDgeyWgp.mjs +0 -2
  819. package/dist/chunks/de-DDgeyWgp.mjs.map +0 -1
  820. package/dist/chunks/de-DGXQ4OiR.mjs +0 -2
  821. package/dist/chunks/de-DGXQ4OiR.mjs.map +0 -1
  822. package/dist/chunks/de-DJbvKl4E.mjs +0 -2
  823. package/dist/chunks/de-DJbvKl4E.mjs.map +0 -1
  824. package/dist/chunks/de-DKNvYM_G.mjs +0 -2
  825. package/dist/chunks/de-DKNvYM_G.mjs.map +0 -1
  826. package/dist/chunks/de-DOHm_P4A.mjs +0 -2
  827. package/dist/chunks/de-DOHm_P4A.mjs.map +0 -1
  828. package/dist/chunks/de-DTMX75rn.mjs +0 -2
  829. package/dist/chunks/de-DTMX75rn.mjs.map +0 -1
  830. package/dist/chunks/de-DfkQds5F.mjs +0 -2
  831. package/dist/chunks/de-DfkQds5F.mjs.map +0 -1
  832. package/dist/chunks/de-TEQW-F4t.mjs +0 -2
  833. package/dist/chunks/de-TEQW-F4t.mjs.map +0 -1
  834. package/dist/chunks/de-WzdZ_NJ6.mjs +0 -2
  835. package/dist/chunks/de-WzdZ_NJ6.mjs.map +0 -1
  836. package/dist/chunks/de-_vqVfXeo.mjs +0 -2
  837. package/dist/chunks/de-_vqVfXeo.mjs.map +0 -1
  838. package/dist/chunks/de-gR6jt-sS.mjs +0 -2
  839. package/dist/chunks/de-gR6jt-sS.mjs.map +0 -1
  840. package/dist/chunks/de-qOBFRCGL.mjs +0 -2
  841. package/dist/chunks/de-qOBFRCGL.mjs.map +0 -1
  842. package/dist/chunks/es-1udUsTJd.mjs +0 -2
  843. package/dist/chunks/es-1udUsTJd.mjs.map +0 -1
  844. package/dist/chunks/es-3H7h0_G5.mjs +0 -2
  845. package/dist/chunks/es-3H7h0_G5.mjs.map +0 -1
  846. package/dist/chunks/es-4-5iRK0M.mjs +0 -2
  847. package/dist/chunks/es-4-5iRK0M.mjs.map +0 -1
  848. package/dist/chunks/es-89LD3TlT.mjs +0 -2
  849. package/dist/chunks/es-89LD3TlT.mjs.map +0 -1
  850. package/dist/chunks/es-B2KFVoHa.mjs +0 -2
  851. package/dist/chunks/es-B2KFVoHa.mjs.map +0 -1
  852. package/dist/chunks/es-BUP1scLX.mjs +0 -2
  853. package/dist/chunks/es-BUP1scLX.mjs.map +0 -1
  854. package/dist/chunks/es-Bhhj-yh0.mjs +0 -2
  855. package/dist/chunks/es-Bhhj-yh0.mjs.map +0 -1
  856. package/dist/chunks/es-Bo0NTtQH.mjs +0 -2
  857. package/dist/chunks/es-Bo0NTtQH.mjs.map +0 -1
  858. package/dist/chunks/es-Bovw7l2W.mjs +0 -2
  859. package/dist/chunks/es-Bovw7l2W.mjs.map +0 -1
  860. package/dist/chunks/es-C7xAs1yn.mjs +0 -2
  861. package/dist/chunks/es-C7xAs1yn.mjs.map +0 -1
  862. package/dist/chunks/es-CIdF7MzV.mjs +0 -2
  863. package/dist/chunks/es-CIdF7MzV.mjs.map +0 -1
  864. package/dist/chunks/es-CPit7Z6w.mjs +0 -2
  865. package/dist/chunks/es-CPit7Z6w.mjs.map +0 -1
  866. package/dist/chunks/es-CQzgvQI6.mjs +0 -2
  867. package/dist/chunks/es-CQzgvQI6.mjs.map +0 -1
  868. package/dist/chunks/es-CSteuqi5.mjs +0 -2
  869. package/dist/chunks/es-CSteuqi5.mjs.map +0 -1
  870. package/dist/chunks/es-ClJxqhu_.mjs +0 -2
  871. package/dist/chunks/es-ClJxqhu_.mjs.map +0 -1
  872. package/dist/chunks/es-CrmqYoVh.mjs +0 -2
  873. package/dist/chunks/es-CrmqYoVh.mjs.map +0 -1
  874. package/dist/chunks/es-CwRwLkfr.mjs +0 -2
  875. package/dist/chunks/es-CwRwLkfr.mjs.map +0 -1
  876. package/dist/chunks/es-D7DRGnkZ.mjs +0 -2
  877. package/dist/chunks/es-D7DRGnkZ.mjs.map +0 -1
  878. package/dist/chunks/es-DET1uMu-.mjs +0 -2
  879. package/dist/chunks/es-DET1uMu-.mjs.map +0 -1
  880. package/dist/chunks/es-Dj83hJxy.mjs +0 -2
  881. package/dist/chunks/es-Dj83hJxy.mjs.map +0 -1
  882. package/dist/chunks/es-DwYWucI6.mjs +0 -2
  883. package/dist/chunks/es-DwYWucI6.mjs.map +0 -1
  884. package/dist/chunks/es-DwrcpThR.mjs +0 -2
  885. package/dist/chunks/es-DwrcpThR.mjs.map +0 -1
  886. package/dist/chunks/es-z7xjgDdk.mjs +0 -2
  887. package/dist/chunks/es-z7xjgDdk.mjs.map +0 -1
  888. package/dist/chunks/fonts-CG5ZnGux.mjs +0 -2
  889. package/dist/chunks/fonts-CG5ZnGux.mjs.map +0 -1
  890. package/dist/chunks/fr-B73tOEzO.mjs +0 -2
  891. package/dist/chunks/fr-B73tOEzO.mjs.map +0 -1
  892. package/dist/chunks/fr-BEbsFEkX.mjs +0 -2
  893. package/dist/chunks/fr-BEbsFEkX.mjs.map +0 -1
  894. package/dist/chunks/fr-BFCaEBSV.mjs +0 -2
  895. package/dist/chunks/fr-BFCaEBSV.mjs.map +0 -1
  896. package/dist/chunks/fr-BJ69XrDO.mjs +0 -2
  897. package/dist/chunks/fr-BJ69XrDO.mjs.map +0 -1
  898. package/dist/chunks/fr-BdQ_-Iwg.mjs +0 -2
  899. package/dist/chunks/fr-BdQ_-Iwg.mjs.map +0 -1
  900. package/dist/chunks/fr-BhnuBA0i.mjs +0 -2
  901. package/dist/chunks/fr-BhnuBA0i.mjs.map +0 -1
  902. package/dist/chunks/fr-BiLmpXZ9.mjs +0 -2
  903. package/dist/chunks/fr-BiLmpXZ9.mjs.map +0 -1
  904. package/dist/chunks/fr-C1Pak7kS.mjs +0 -2
  905. package/dist/chunks/fr-C1Pak7kS.mjs.map +0 -1
  906. package/dist/chunks/fr-CFDoFELm.mjs +0 -2
  907. package/dist/chunks/fr-CFDoFELm.mjs.map +0 -1
  908. package/dist/chunks/fr-CmsH8BnY.mjs +0 -2
  909. package/dist/chunks/fr-CmsH8BnY.mjs.map +0 -1
  910. package/dist/chunks/fr-Cz2qWiuV.mjs +0 -2
  911. package/dist/chunks/fr-Cz2qWiuV.mjs.map +0 -1
  912. package/dist/chunks/fr-CzTPuD1P.mjs +0 -2
  913. package/dist/chunks/fr-CzTPuD1P.mjs.map +0 -1
  914. package/dist/chunks/fr-D1LQMsjB.mjs +0 -2
  915. package/dist/chunks/fr-D1LQMsjB.mjs.map +0 -1
  916. package/dist/chunks/fr-D84mXQrZ.mjs +0 -2
  917. package/dist/chunks/fr-D84mXQrZ.mjs.map +0 -1
  918. package/dist/chunks/fr-DX7z_ld0.mjs +0 -2
  919. package/dist/chunks/fr-DX7z_ld0.mjs.map +0 -1
  920. package/dist/chunks/fr-DXkQUerf.mjs +0 -2
  921. package/dist/chunks/fr-DXkQUerf.mjs.map +0 -1
  922. package/dist/chunks/fr-Di5gv5P8.mjs +0 -2
  923. package/dist/chunks/fr-Di5gv5P8.mjs.map +0 -1
  924. package/dist/chunks/fr-Dq5MrVWd.mjs +0 -2
  925. package/dist/chunks/fr-Dq5MrVWd.mjs.map +0 -1
  926. package/dist/chunks/fr-DtfEjLSL.mjs +0 -2
  927. package/dist/chunks/fr-DtfEjLSL.mjs.map +0 -1
  928. package/dist/chunks/fr-DvW-dpp3.mjs +0 -2
  929. package/dist/chunks/fr-DvW-dpp3.mjs.map +0 -1
  930. package/dist/chunks/fr-UJFNrn-V.mjs +0 -2
  931. package/dist/chunks/fr-UJFNrn-V.mjs.map +0 -1
  932. package/dist/chunks/fr-hK8X-sM6.mjs +0 -2
  933. package/dist/chunks/fr-hK8X-sM6.mjs.map +0 -1
  934. package/dist/chunks/fr-uuOSXj4L.mjs +0 -2
  935. package/dist/chunks/fr-uuOSXj4L.mjs.map +0 -1
  936. package/dist/chunks/full-216JgIG1.mjs +0 -2
  937. package/dist/chunks/full-216JgIG1.mjs.map +0 -1
  938. package/dist/chunks/hi-B2kXjElO.mjs +0 -2
  939. package/dist/chunks/hi-B2kXjElO.mjs.map +0 -1
  940. package/dist/chunks/hi-B2mEQ5gX.mjs +0 -2
  941. package/dist/chunks/hi-B2mEQ5gX.mjs.map +0 -1
  942. package/dist/chunks/hi-B61lTO2W.mjs +0 -2
  943. package/dist/chunks/hi-B61lTO2W.mjs.map +0 -1
  944. package/dist/chunks/hi-BD5HrbxU.mjs +0 -2
  945. package/dist/chunks/hi-BD5HrbxU.mjs.map +0 -1
  946. package/dist/chunks/hi-BHTvSWXw.mjs +0 -2
  947. package/dist/chunks/hi-BHTvSWXw.mjs.map +0 -1
  948. package/dist/chunks/hi-BYyaOBqY.mjs +0 -2
  949. package/dist/chunks/hi-BYyaOBqY.mjs.map +0 -1
  950. package/dist/chunks/hi-Bhlbz5gX.mjs +0 -2
  951. package/dist/chunks/hi-Bhlbz5gX.mjs.map +0 -1
  952. package/dist/chunks/hi-BniuSk3L.mjs +0 -2
  953. package/dist/chunks/hi-BniuSk3L.mjs.map +0 -1
  954. package/dist/chunks/hi-CBODdhOq.mjs +0 -2
  955. package/dist/chunks/hi-CBODdhOq.mjs.map +0 -1
  956. package/dist/chunks/hi-CKWQCooT.mjs +0 -2
  957. package/dist/chunks/hi-CKWQCooT.mjs.map +0 -1
  958. package/dist/chunks/hi-CkoruGVs.mjs +0 -2
  959. package/dist/chunks/hi-CkoruGVs.mjs.map +0 -1
  960. package/dist/chunks/hi-D6Ge3Lp5.mjs +0 -2
  961. package/dist/chunks/hi-D6Ge3Lp5.mjs.map +0 -1
  962. package/dist/chunks/hi-DEreeBFj.mjs +0 -2
  963. package/dist/chunks/hi-DEreeBFj.mjs.map +0 -1
  964. package/dist/chunks/hi-Dj4JW-9k.mjs +0 -2
  965. package/dist/chunks/hi-Dj4JW-9k.mjs.map +0 -1
  966. package/dist/chunks/hi-DkP4pHSX.mjs +0 -2
  967. package/dist/chunks/hi-DkP4pHSX.mjs.map +0 -1
  968. package/dist/chunks/hi-DknCX8Nx.mjs +0 -2
  969. package/dist/chunks/hi-DknCX8Nx.mjs.map +0 -1
  970. package/dist/chunks/hi-Dm1KJQQ5.mjs +0 -2
  971. package/dist/chunks/hi-Dm1KJQQ5.mjs.map +0 -1
  972. package/dist/chunks/hi-Dx-LTWg-.mjs +0 -2
  973. package/dist/chunks/hi-Dx-LTWg-.mjs.map +0 -1
  974. package/dist/chunks/hi-RDoZtwMm.mjs +0 -2
  975. package/dist/chunks/hi-RDoZtwMm.mjs.map +0 -1
  976. package/dist/chunks/hi-Tq9eDRk7.mjs +0 -2
  977. package/dist/chunks/hi-Tq9eDRk7.mjs.map +0 -1
  978. package/dist/chunks/hi-_vJ_Eo4p.mjs +0 -2
  979. package/dist/chunks/hi-_vJ_Eo4p.mjs.map +0 -1
  980. package/dist/chunks/hi-l8E-czFm.mjs +0 -2
  981. package/dist/chunks/hi-l8E-czFm.mjs.map +0 -1
  982. package/dist/chunks/hi-ydmPh3HB.mjs +0 -2
  983. package/dist/chunks/hi-ydmPh3HB.mjs.map +0 -1
  984. package/dist/chunks/minimal-D-QxXO1C.mjs +0 -2
  985. package/dist/chunks/minimal-D-QxXO1C.mjs.map +0 -1
  986. package/dist/chunks/pt-B4NUSLW8.mjs +0 -2
  987. package/dist/chunks/pt-B4NUSLW8.mjs.map +0 -1
  988. package/dist/chunks/pt-B8VKEboV.mjs +0 -2
  989. package/dist/chunks/pt-B8VKEboV.mjs.map +0 -1
  990. package/dist/chunks/pt-BMDKykEi.mjs +0 -2
  991. package/dist/chunks/pt-BMDKykEi.mjs.map +0 -1
  992. package/dist/chunks/pt-BmWE3xXF.mjs +0 -2
  993. package/dist/chunks/pt-BmWE3xXF.mjs.map +0 -1
  994. package/dist/chunks/pt-CJWKE1SW.mjs +0 -2
  995. package/dist/chunks/pt-CJWKE1SW.mjs.map +0 -1
  996. package/dist/chunks/pt-CKETXoPa.mjs +0 -2
  997. package/dist/chunks/pt-CKETXoPa.mjs.map +0 -1
  998. package/dist/chunks/pt-CKRs16QH.mjs +0 -2
  999. package/dist/chunks/pt-CKRs16QH.mjs.map +0 -1
  1000. package/dist/chunks/pt-Cb-1GHq4.mjs +0 -2
  1001. package/dist/chunks/pt-Cb-1GHq4.mjs.map +0 -1
  1002. package/dist/chunks/pt-CgpU74p4.mjs +0 -2
  1003. package/dist/chunks/pt-CgpU74p4.mjs.map +0 -1
  1004. package/dist/chunks/pt-CtOdAphq.mjs +0 -2
  1005. package/dist/chunks/pt-CtOdAphq.mjs.map +0 -1
  1006. package/dist/chunks/pt-CzaPFMSx.mjs +0 -2
  1007. package/dist/chunks/pt-CzaPFMSx.mjs.map +0 -1
  1008. package/dist/chunks/pt-DGuLcW0m.mjs +0 -2
  1009. package/dist/chunks/pt-DGuLcW0m.mjs.map +0 -1
  1010. package/dist/chunks/pt-DHzSXzlf.mjs +0 -2
  1011. package/dist/chunks/pt-DHzSXzlf.mjs.map +0 -1
  1012. package/dist/chunks/pt-DWDdBfLk.mjs +0 -2
  1013. package/dist/chunks/pt-DWDdBfLk.mjs.map +0 -1
  1014. package/dist/chunks/pt-DZ6Liq_x.mjs +0 -2
  1015. package/dist/chunks/pt-DZ6Liq_x.mjs.map +0 -1
  1016. package/dist/chunks/pt-D_MD7MJu.mjs +0 -2
  1017. package/dist/chunks/pt-D_MD7MJu.mjs.map +0 -1
  1018. package/dist/chunks/pt-DgaY_yNG.mjs +0 -2
  1019. package/dist/chunks/pt-DgaY_yNG.mjs.map +0 -1
  1020. package/dist/chunks/pt-DgzgCxdH.mjs +0 -2
  1021. package/dist/chunks/pt-DgzgCxdH.mjs.map +0 -1
  1022. package/dist/chunks/pt-Dh7nUcAM.mjs +0 -2
  1023. package/dist/chunks/pt-Dh7nUcAM.mjs.map +0 -1
  1024. package/dist/chunks/pt-P914L5AX.mjs +0 -2
  1025. package/dist/chunks/pt-P914L5AX.mjs.map +0 -1
  1026. package/dist/chunks/pt-XT1vsWZj.mjs +0 -2
  1027. package/dist/chunks/pt-XT1vsWZj.mjs.map +0 -1
  1028. package/dist/chunks/pt-jJ0XXSVz.mjs +0 -2
  1029. package/dist/chunks/pt-jJ0XXSVz.mjs.map +0 -1
  1030. package/dist/chunks/pt-tuOLwYkM.mjs +0 -2
  1031. package/dist/chunks/pt-tuOLwYkM.mjs.map +0 -1
  1032. package/dist/chunks/ru-7m8CMM17.mjs +0 -2
  1033. package/dist/chunks/ru-7m8CMM17.mjs.map +0 -1
  1034. package/dist/chunks/ru-9Qh1fR-K.mjs +0 -2
  1035. package/dist/chunks/ru-9Qh1fR-K.mjs.map +0 -1
  1036. package/dist/chunks/ru-B5gK8OLp.mjs +0 -2
  1037. package/dist/chunks/ru-B5gK8OLp.mjs.map +0 -1
  1038. package/dist/chunks/ru-BRNN6ldH.mjs +0 -2
  1039. package/dist/chunks/ru-BRNN6ldH.mjs.map +0 -1
  1040. package/dist/chunks/ru-BiyE9o-D.mjs +0 -2
  1041. package/dist/chunks/ru-BiyE9o-D.mjs.map +0 -1
  1042. package/dist/chunks/ru-BpGTIPbv.mjs +0 -2
  1043. package/dist/chunks/ru-BpGTIPbv.mjs.map +0 -1
  1044. package/dist/chunks/ru-CAzMaI4y.mjs +0 -2
  1045. package/dist/chunks/ru-CAzMaI4y.mjs.map +0 -1
  1046. package/dist/chunks/ru-COo6HpcD.mjs +0 -2
  1047. package/dist/chunks/ru-COo6HpcD.mjs.map +0 -1
  1048. package/dist/chunks/ru-CgEOZsUs.mjs +0 -2
  1049. package/dist/chunks/ru-CgEOZsUs.mjs.map +0 -1
  1050. package/dist/chunks/ru-CptzezhV.mjs +0 -2
  1051. package/dist/chunks/ru-CptzezhV.mjs.map +0 -1
  1052. package/dist/chunks/ru-Ct0qNMLS.mjs +0 -2
  1053. package/dist/chunks/ru-Ct0qNMLS.mjs.map +0 -1
  1054. package/dist/chunks/ru-Ct2IrzbA.mjs +0 -2
  1055. package/dist/chunks/ru-Ct2IrzbA.mjs.map +0 -1
  1056. package/dist/chunks/ru-CyHnlWLN.mjs +0 -2
  1057. package/dist/chunks/ru-CyHnlWLN.mjs.map +0 -1
  1058. package/dist/chunks/ru-DF0vhzeC.mjs +0 -2
  1059. package/dist/chunks/ru-DF0vhzeC.mjs.map +0 -1
  1060. package/dist/chunks/ru-DH6rsOWL.mjs +0 -2
  1061. package/dist/chunks/ru-DH6rsOWL.mjs.map +0 -1
  1062. package/dist/chunks/ru-DHH8k6G8.mjs +0 -2
  1063. package/dist/chunks/ru-DHH8k6G8.mjs.map +0 -1
  1064. package/dist/chunks/ru-GVReqjM4.mjs +0 -2
  1065. package/dist/chunks/ru-GVReqjM4.mjs.map +0 -1
  1066. package/dist/chunks/ru-IzloX5CY.mjs +0 -2
  1067. package/dist/chunks/ru-IzloX5CY.mjs.map +0 -1
  1068. package/dist/chunks/ru-ZrzXB0f6.mjs +0 -2
  1069. package/dist/chunks/ru-ZrzXB0f6.mjs.map +0 -1
  1070. package/dist/chunks/ru-asRKygvE.mjs +0 -2
  1071. package/dist/chunks/ru-asRKygvE.mjs.map +0 -1
  1072. package/dist/chunks/ru-m19l8nRA.mjs +0 -2
  1073. package/dist/chunks/ru-m19l8nRA.mjs.map +0 -1
  1074. package/dist/chunks/ru-vfQ5Xaz4.mjs +0 -2
  1075. package/dist/chunks/ru-vfQ5Xaz4.mjs.map +0 -1
  1076. package/dist/chunks/ru-wVOlNily.mjs +0 -2
  1077. package/dist/chunks/ru-wVOlNily.mjs.map +0 -1
  1078. package/dist/chunks/shared-DxmfXZH7.mjs +0 -2
  1079. package/dist/chunks/shared-DxmfXZH7.mjs.map +0 -1
  1080. package/dist/chunks/src-DFXIsulM.mjs +0 -2
  1081. package/dist/chunks/src-DFXIsulM.mjs.map +0 -1
  1082. package/dist/chunks/text-direction-advanced-B5JuIs0P.mjs +0 -2
  1083. package/dist/chunks/text-direction-advanced-B5JuIs0P.mjs.map +0 -1
  1084. package/dist/chunks/zh-0uhsRxfq.mjs +0 -2
  1085. package/dist/chunks/zh-0uhsRxfq.mjs.map +0 -1
  1086. package/dist/chunks/zh-1BrLr5Wk.mjs +0 -2
  1087. package/dist/chunks/zh-1BrLr5Wk.mjs.map +0 -1
  1088. package/dist/chunks/zh-BNHeXa_M.mjs +0 -2
  1089. package/dist/chunks/zh-BNHeXa_M.mjs.map +0 -1
  1090. package/dist/chunks/zh-BOpBzSX3.mjs +0 -2
  1091. package/dist/chunks/zh-BOpBzSX3.mjs.map +0 -1
  1092. package/dist/chunks/zh-BV2uDDGf.mjs +0 -2
  1093. package/dist/chunks/zh-BV2uDDGf.mjs.map +0 -1
  1094. package/dist/chunks/zh-BkoPteNb.mjs +0 -2
  1095. package/dist/chunks/zh-BkoPteNb.mjs.map +0 -1
  1096. package/dist/chunks/zh-C2z0g7OC.mjs +0 -2
  1097. package/dist/chunks/zh-C2z0g7OC.mjs.map +0 -1
  1098. package/dist/chunks/zh-CeJw45yo.mjs +0 -2
  1099. package/dist/chunks/zh-CeJw45yo.mjs.map +0 -1
  1100. package/dist/chunks/zh-CwVkxL4q.mjs +0 -2
  1101. package/dist/chunks/zh-CwVkxL4q.mjs.map +0 -1
  1102. package/dist/chunks/zh-Cy7mujpx.mjs +0 -2
  1103. package/dist/chunks/zh-Cy7mujpx.mjs.map +0 -1
  1104. package/dist/chunks/zh-D-P00ENX.mjs +0 -2
  1105. package/dist/chunks/zh-D-P00ENX.mjs.map +0 -1
  1106. package/dist/chunks/zh-D5d-NAuv.mjs +0 -2
  1107. package/dist/chunks/zh-D5d-NAuv.mjs.map +0 -1
  1108. package/dist/chunks/zh-D6gTQA2W.mjs +0 -2
  1109. package/dist/chunks/zh-D6gTQA2W.mjs.map +0 -1
  1110. package/dist/chunks/zh-DLwq4e4-.mjs +0 -2
  1111. package/dist/chunks/zh-DLwq4e4-.mjs.map +0 -1
  1112. package/dist/chunks/zh-D_Yb8Eg6.mjs +0 -2
  1113. package/dist/chunks/zh-D_Yb8Eg6.mjs.map +0 -1
  1114. package/dist/chunks/zh-DaNHqNDY.mjs +0 -2
  1115. package/dist/chunks/zh-DaNHqNDY.mjs.map +0 -1
  1116. package/dist/chunks/zh-De7-Y4O5.mjs +0 -2
  1117. package/dist/chunks/zh-De7-Y4O5.mjs.map +0 -1
  1118. package/dist/chunks/zh-Dj7kHEcp.mjs +0 -2
  1119. package/dist/chunks/zh-Dj7kHEcp.mjs.map +0 -1
  1120. package/dist/chunks/zh-Dl0oVWiK.mjs +0 -2
  1121. package/dist/chunks/zh-Dl0oVWiK.mjs.map +0 -1
  1122. package/dist/chunks/zh-Do0plBjM.mjs +0 -2
  1123. package/dist/chunks/zh-Do0plBjM.mjs.map +0 -1
  1124. package/dist/chunks/zh-Q0aDk5UA.mjs +0 -2
  1125. package/dist/chunks/zh-Q0aDk5UA.mjs.map +0 -1
  1126. package/dist/chunks/zh-eSgs8mzc.mjs +0 -2
  1127. package/dist/chunks/zh-eSgs8mzc.mjs.map +0 -1
  1128. package/dist/chunks/zh-giWyGMSZ.mjs +0 -2
  1129. package/dist/chunks/zh-giWyGMSZ.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"FontPlugin-Cz4qEYGh.mjs","names":[],"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"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{i as t}from"./TypeBrands-BQR8dEYU.mjs";import{r as e}from"./HTMLUtils-BLwp5G4f.mjs";import{i as n,n as o,r as i,t as r}from"./AttributedMarkCommands-Cmet1IuC.mjs";import{s}from"./StyleRuntime-0yPPJK9H.mjs";import{i as a}from"./PluginHelpers-DLKHJWJn.mjs";import{r as l}from"./ColorValidation-3viVw_tK.mjs";var c={label:"Font Size",tooltip:"Font Size",customFontSizeAria:"Custom font size",fontSizesAria:"Font sizes"},p=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-DNzmHN3q.mjs"),"./locales/de.ts":()=>import("./de-_vqVfXeo.mjs"),"./locales/es.ts":()=>import("./es-1udUsTJd.mjs"),"./locales/fr.ts":()=>import("./fr-D1LQMsjB.mjs"),"./locales/hi.ts":()=>import("./hi-D6Ge3Lp5.mjs"),"./locales/pt.ts":()=>import("./pt-DGuLcW0m.mjs"),"./locales/ru.ts":()=>import("./ru-CAzMaI4y.mjs"),"./locales/zh.ts":()=>import("./zh-1BrLr5Wk.mjs")});async function u(t){if("en"===t)return c;const e=p[`./locales/${t}.ts`];if(!e)return c;try{return(await e()).default}catch{return c}}function f(t,e){const n=function(t){return o(t,"fontSize",t=>t.attrs.size??null)}(t);if(!n)return e;const i=Number.parseInt(n,10);return Number.isNaN(i)?e:i}function m(e,n,o){const i=r(n,{type:t("fontSize"),attrs:{size:o}});return!!i&&(e.dispatch(i),!0)}function d(e,o){const i=n(o,t("fontSize"));return!!i&&(e.dispatch(i),!0)}function z(t,e,n,o,i){const r=function(t,e,n){if("up"===e){for(const e of n)if(e>t)return e;return null}for(let o=n.length-1;o>=0;o--){const e=n[o];if(void 0!==e&&e<t)return e}return null}(f(e,i),n,o);return null!==r&&(r===i?d(t,e):m(t,e,`${r}px`))}function g(t,e,n){e===n?t.executeCommand("removeFontSize"):m(t,t.getState(),`${e}px`)}function h(t,e){const n=document.createElement("button");n.type="button",n.id=`notectl-font-size-option-${t}`,n.className="notectl-font-size-picker__item",n.setAttribute("role","option"),n.setAttribute("aria-selected",String(e)),e&&n.classList.add("notectl-font-size-picker__item--active");const o=document.createElement("span");o.className="notectl-font-size-picker__check",o.textContent=e?"✓":"",n.appendChild(o);const i=document.createElement("span");return i.className="notectl-font-size-picker__label",i.textContent=String(t),n.appendChild(i),n}var S=[8,9,10,11,12,14,16,18,20,24,28,32,36,48,64,72,96],b=class{id="fontSize";name="Font Size";priority=21;config;sizes;defaultSize;locale;constructor(t){var e;this.config={...t},this.sizes=function(t){if(!t||0===t.length)return S;const e=[...new Set(t)].filter(t=>Number.isInteger(t)&&t>0);return e.sort((t,e)=>t-e),e.length>0?e:S}(t?.sizes),this.defaultSize=(e=t?.defaultSize,void 0===e?16:Number.isInteger(e)&&e>0?e:16)}async init(t){this.locale=await a(t,this.config.locale,c,u),t.registerStyleSheet("\n/* Font Size Select — Width overrides for combobox button */\n.notectl-toolbar-btn--fontSize {\n\tmin-width: 60px;\n\tmax-width: 80px;\n}\n\n/* Font Size Picker Popup */\n.notectl-font-size-picker {\n\tmin-width: 140px;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.notectl-font-size-picker__input-wrapper {\n\tpadding: 8px 8px 4px;\n}\n\n.notectl-font-size-picker__input {\n\twidth: 100%;\n\tpadding: 6px 8px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tfont-family: inherit;\n\tcolor: var(--notectl-fg);\n\tbackground: var(--notectl-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"),this.registerMarkSpec(t),this.registerCommands(t),this.registerKeymaps(t),this.registerToolbarItem(t),this.applyDefaultSizeToContainer(t)}destroy(){}registerMarkSpec(t){t.registerMarkSpec({type:"fontSize",rank:4,attrs:{size:{default:""}},toDOM(t){const e=document.createElement("span"),n=t.attrs?.size??"";return n&&s(e,"fontSize",n),e},toHTMLString:(t,n,o)=>{const i=String(t.attrs?.size??"");if(!i||!l(i))return n;const r=`font-size: ${e(i)}`;return`<span${o?.styleAttr(r)??` style="${r}"`}>${n}</span>`},toHTMLStyle:t=>{const n=String(t.attrs?.size??"");return n&&l(n)?`font-size: ${e(n)}`:null},parseHTML:[{tag:"span",getAttrs:t=>{const e=t.style.fontSize;return!!e&&{size:e}}}],sanitize:{tags:["span"]}})}registerCommands(t){t.registerCommand("removeFontSize",()=>d(t,t.getState())),t.registerCommand("setFontSize",()=>!1),t.registerCommand("increaseFontSize",()=>z(t,t.getState(),"up",this.sizes,this.defaultSize)),t.registerCommand("decreaseFontSize",()=>z(t,t.getState(),"down",this.sizes,this.defaultSize))}registerKeymaps(t){t.registerKeymap({"Mod-Shift-+":()=>z(t,t.getState(),"up",this.sizes,this.defaultSize),"Mod-Shift-_":()=>z(t,t.getState(),"down",this.sizes,this.defaultSize)})}registerToolbarItem(t){t.registerToolbarItem({id:"fontSize",group:"format",label:this.locale.label,tooltip:this.locale.tooltip,command:"removeFontSize",popupType:"combobox",getLabel:t=>String(f(t,this.defaultSize)),renderPopup:(t,e,n)=>{!function(t,e,n){t.classList.add("notectl-font-size-picker");const o=f(e.getState(),n.defaultSize),i=function(t,e){const n=document.createElement("input");return n.type="number",n.className="notectl-font-size-picker__input",n.min=String(1),n.max=String(400),n.value=String(t),n.setAttribute("aria-label",e.locale.customFontSizeAria),n}(o,n);!function(t,e){const n=document.createElement("div");n.className="notectl-font-size-picker__input-wrapper",n.appendChild(e),t.appendChild(n)}(t,i);const{list:r,items:s}=function(t,e,n,o){const i=document.createElement("div");i.className="notectl-font-size-picker__list",i.setAttribute("role","listbox"),i.setAttribute("aria-label",o.locale.fontSizesAria);const r=[];for(const s of t){const t=h(s,s===e);t.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),g(n,s,o.defaultSize),o.onClose({restoreFocusTo:o.contentElement})}),r.push(t),i.appendChild(t)}return{list:i,items:r}}(n.sizes,o,e,n);t.appendChild(r),function(t,e,n,o){const i=e.indexOf(n);if(i<0)return;const r=t[i];r&&(requestAnimationFrame(()=>{r.scrollIntoView({block:"nearest"})}),o.setAttribute("aria-activedescendant",r.id))}(s,n.sizes,o,r),function(t,e,n,o,i){let r=-1;const s=t=>{r>=0&&r<n.length&&n[r]?.classList.remove("notectl-font-size-picker__item--focused"),r=t;const o=n[r];r>=0&&r<n.length&&o&&(o.classList.add("notectl-font-size-picker__item--focused"),o.scrollIntoView({block:"nearest"}),e.setAttribute("aria-activedescendant",o.id))};t.addEventListener("keydown",e=>{if("Enter"===e.key){e.preventDefault();const n=Number.parseInt(t.value,10);!Number.isNaN(n)&&n>=1&&n<=400&&(g(o,n,i.defaultSize),i.onClose({restoreFocusTo:i.contentElement}))}else"ArrowDown"===e.key?(e.preventDefault(),s(0),n[0]?.focus()):"Escape"===e.key&&(e.preventDefault(),i.onClose({restoreFocusTo:i.contentElement}))}),e.addEventListener("keydown",e=>{if("ArrowDown"===e.key)e.preventDefault(),r<n.length-1&&(s(r+1),n[r]?.focus());else if("ArrowUp"===e.key)e.preventDefault(),r>0?(s(r-1),n[r]?.focus()):(s(-1),t.focus());else if("Enter"===e.key){e.preventDefault();const t=i.sizes[r];r>=0&&r<i.sizes.length&&void 0!==t&&(g(o,t,i.defaultSize),i.onClose({restoreFocusTo:i.contentElement}))}else"Escape"===e.key&&(e.preventDefault(),i.onClose({restoreFocusTo:i.contentElement}))})}(i,r,s,e,n)}(t,e,{sizes:this.sizes,defaultSize:this.defaultSize,onClose:n,contentElement:e.getContainer(),locale:this.locale})},isActive:t=>function(t){return i(t,"fontSize")}(t)})}applyDefaultSizeToContainer(t){s(t.getContainer(),"fontSize",`${this.defaultSize}px`)}};export{c as n,u as r,b as t};
2
- //# sourceMappingURL=FontSizePlugin-D1WtDqrH.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FontSizePlugin-D1WtDqrH.mjs","names":[],"sources":["../../src/editor/styles/font-size-select.ts","../../src/plugins/font-size/FontSizeLocale.ts","../../src/plugins/font-size/FontSizeOperations.ts","../../src/plugins/font-size/FontSizePopup.ts","../../src/plugins/font-size/FontSizePlugin.ts"],"sourcesContent":["/** Font size picker toolbar combobox + popup styles. */\nexport const FONT_SIZE_SELECT_CSS = `\n/* Font Size Select — Width overrides for combobox button */\n.notectl-toolbar-btn--fontSize {\n\tmin-width: 60px;\n\tmax-width: 80px;\n}\n\n/* Font Size Picker Popup */\n.notectl-font-size-picker {\n\tmin-width: 140px;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.notectl-font-size-picker__input-wrapper {\n\tpadding: 8px 8px 4px;\n}\n\n.notectl-font-size-picker__input {\n\twidth: 100%;\n\tpadding: 6px 8px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tfont-family: inherit;\n\tcolor: var(--notectl-fg);\n\tbackground: var(--notectl-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"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{u as t}from"./Document-CkQLx84k.mjs";import{a as e,c as r,r as n,t as o}from"./Selection-B14e7gd0.mjs";import{n as s}from"./NodeResolver-CCA8UVRr.mjs";import{i}from"./NavigationQueries-CgYPG6oY.mjs";import{t as l}from"./Platform-D9TRT4Mn.mjs";function u(t,e,r){return t.transaction("input").setSelection(o(e,r)).setStoredMarks(null,t.storedMarks).build()}function c(t,e){const r=s(t.doc,e)??[];return t.transaction("input").setSelection(n(e,r)).setStoredMarks(null,t.storedMarks).build()}function a(t,r,n,o,s){return t.transaction("input").setSelection(e({blockId:r,offset:n},{blockId:o,offset:s})).setStoredMarks(null,t.storedMarks).build()}function f(e,n,o){const s=e.selection;if(!r(s))return null;const a=e.getBlockOrder(),f=a.indexOf(s.blockId);if(f<0)return null;const d=function(t,e,r){if(!r)return t;if("left"!==t&&"right"!==t)return t;const n=r.querySelector(`[data-block-id="${e}"]`);return n instanceof HTMLElement?"rtl"!==l(n)?t:"left"===t?"right":"left":t}(n,s.blockId,o);if("before"===s.side&&("right"===d||"down"===d)||"after"===s.side&&("left"===d||"up"===d))return c(e,s.blockId);const m="before"===s.side?f-1:f+1;if(m<0||m>=a.length)return null;const k=a[m];if(!k)return null;if(i(e,k))return c(e,k);const b=e.getBlock(k);return b?u(e,k,"left"===d||"up"===d?t(b):0):null}export{c as i,a as n,u as r,f as t};
2
- //# sourceMappingURL=GapCursorNavigation-CKKq42kA.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GapCursorNavigation-CKKq42kA.mjs","names":[],"sources":["../../src/state/SelectionTransactions.ts","../../src/view/GapCursorNavigation.ts"],"sourcesContent":["/**\n * Shared transaction builders for cursor and selection movement.\n *\n * These helpers encapsulate the common pattern of building a transaction\n * that sets a new selection and clears storedMarks.\n */\n\nimport { findNodePath } from '../model/NodeResolver.js';\nimport {\n\tcreateCollapsedSelection,\n\tcreateNodeSelection,\n\tcreateSelection,\n} from '../model/Selection.js';\nimport type { BlockId } from '../model/TypeBrands.js';\nimport type { EditorState } from './EditorState.js';\nimport type { Transaction } from './Transaction.js';\n\n/** Builds a collapsed-cursor transaction that clears storedMarks. */\nexport function moveTx(state: EditorState, blockId: BlockId, offset: number): Transaction {\n\treturn state\n\t\t.transaction('input')\n\t\t.setSelection(createCollapsedSelection(blockId, offset))\n\t\t.setStoredMarks(null, state.storedMarks)\n\t\t.build();\n}\n\n/** Builds a NodeSelection transaction that clears storedMarks. */\nexport function nodeSelTx(state: EditorState, targetId: BlockId): Transaction {\n\tconst path: BlockId[] = (findNodePath(state.doc, targetId) ?? []) as BlockId[];\n\treturn state\n\t\t.transaction('input')\n\t\t.setSelection(createNodeSelection(targetId, path))\n\t\t.setStoredMarks(null, state.storedMarks)\n\t\t.build();\n}\n\n/** Builds a range-selection transaction that clears storedMarks. */\nexport function extendTx(\n\tstate: EditorState,\n\tanchorBlockId: BlockId,\n\tanchorOffset: number,\n\theadBlockId: BlockId,\n\theadOffset: number,\n): Transaction {\n\treturn state\n\t\t.transaction('input')\n\t\t.setSelection(\n\t\t\tcreateSelection(\n\t\t\t\t{ blockId: anchorBlockId, offset: anchorOffset },\n\t\t\t\t{ blockId: headBlockId, offset: headOffset },\n\t\t\t),\n\t\t)\n\t\t.setStoredMarks(null, state.storedMarks)\n\t\t.build();\n}\n","import { getBlockLength } from '../model/Document.js';\nimport { isGapCursor } from '../model/Selection.js';\nimport type { BlockId } from '../model/TypeBrands.js';\nimport { getTextDirection } from '../platform/Platform.js';\nimport type { EditorState } from '../state/EditorState.js';\nimport { isVoidBlock } from '../state/NavigationQueries.js';\nimport { moveTx, nodeSelTx } from '../state/SelectionTransactions.js';\nimport type { Transaction } from '../state/Transaction.js';\n\nexport type GapCursorDirection = 'left' | 'right' | 'up' | 'down';\n\n/**\n * Navigates from a GapCursor position.\n *\n * - Arrow toward the adjacent void block -> NodeSelection of that block.\n * - Arrow away from the void block -> find next block: void -> NodeSelection,\n * text -> TextSelection, document boundary -> no-op.\n */\nexport function navigateFromGapCursor(\n\tstate: EditorState,\n\tdirection: GapCursorDirection,\n\tcontainer?: HTMLElement,\n): Transaction | null {\n\tconst sel = state.selection;\n\tif (!isGapCursor(sel)) return null;\n\n\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\tconst blockIdx: number = blockOrder.indexOf(sel.blockId);\n\tif (blockIdx < 0) return null;\n\n\t// Resolve effective horizontal direction for RTL blocks\n\tconst effectiveDir: GapCursorDirection = resolveEffectiveDirection(\n\t\tdirection,\n\t\tsel.blockId,\n\t\tcontainer,\n\t);\n\n\tconst towardVoid: boolean =\n\t\t(sel.side === 'before' && (effectiveDir === 'right' || effectiveDir === 'down')) ||\n\t\t(sel.side === 'after' && (effectiveDir === 'left' || effectiveDir === 'up'));\n\n\tif (towardVoid) return nodeSelTx(state, sel.blockId);\n\n\t// Moving away from the void block - find the neighbor in the other direction\n\tconst awayIdx: number = sel.side === 'before' ? blockIdx - 1 : blockIdx + 1;\n\tif (awayIdx < 0 || awayIdx >= blockOrder.length) return null;\n\n\tconst targetId: BlockId | undefined = blockOrder[awayIdx];\n\tif (!targetId) return null;\n\n\tif (isVoidBlock(state, targetId)) return nodeSelTx(state, targetId);\n\n\t// Text block: place cursor at start or end\n\tconst targetBlock = state.getBlock(targetId);\n\tif (!targetBlock) return null;\n\n\tconst targetOffset: number =\n\t\teffectiveDir === 'left' || effectiveDir === 'up' ? getBlockLength(targetBlock) : 0;\n\treturn moveTx(state, targetId, targetOffset);\n}\n\n/**\n * Resolves the effective navigation direction by flipping left/right\n * when the block is RTL. Vertical directions are unaffected.\n */\nfunction resolveEffectiveDirection(\n\tdirection: GapCursorDirection,\n\tblockId: BlockId,\n\tcontainer?: HTMLElement,\n): GapCursorDirection {\n\tif (!container) return direction;\n\tif (direction !== 'left' && direction !== 'right') return direction;\n\n\tconst blockEl: Element | null = container.querySelector(`[data-block-id=\"${blockId}\"]`);\n\tif (!(blockEl instanceof HTMLElement)) return direction;\n\n\tconst isRtl: boolean = getTextDirection(blockEl) === 'rtl';\n\tif (!isRtl) return direction;\n\n\treturn direction === 'left' ? 'right' : 'left';\n}\n"],"mappings":"0PAkBA,SAAgB,EAAO,EAAoB,EAAkB,GAC5D,OAAO,EACL,YAAY,SACZ,aAAa,EAAyB,EAAS,IAC/C,eAAe,KAAM,EAAM,aAC3B,QAIH,SAAgB,EAAU,EAAoB,GAC7C,MAAM,EAAmB,EAAa,EAAM,IAAK,IAAa,GAC9D,OAAO,EACL,YAAY,SACZ,aAAa,EAAoB,EAAU,IAC3C,eAAe,KAAM,EAAM,aAC3B,QAIH,SAAgB,EACf,EACA,EACA,EACA,EACA,GAEA,OAAO,EACL,YAAY,SACZ,aACA,EACC,CAAE,QAAS,EAAe,OAAQ,GAClC,CAAE,QAAS,EAAa,OAAQ,KAGjC,eAAe,KAAM,EAAM,aAC3B,QCnCH,SAAgB,EACf,EACA,EACA,GAEA,MAAM,EAAM,EAAM,UAClB,IAAK,EAAY,GAAM,OAAO,KAE9B,MAAM,EAAiC,EAAM,gBACvC,EAAmB,EAAW,QAAQ,EAAI,SAChD,GAAI,EAAW,EAAG,OAAO,KAGzB,MAAM,EAkCP,SACC,EACA,EACA,GAEA,IAAK,EAAW,OAAO,EACvB,GAAkB,SAAd,GAAsC,UAAd,EAAuB,OAAO,EAE1D,MAAM,EAA0B,EAAU,cAAc,mBAAmB,OAC3E,OAAM,aAAmB,YAE4B,QAA9B,EAAiB,GACrB,EAEE,SAAd,EAAuB,QAAU,OALM,EA3CL,CACxC,EACA,EAAI,QACJ,GAOD,GAHe,WAAb,EAAI,OAAuC,UAAjB,GAA6C,SAAjB,IACzC,UAAb,EAAI,OAAsC,SAAjB,GAA4C,OAAjB,GAEtC,OAAO,EAAU,EAAO,EAAI,SAG5C,MAAM,EAA+B,WAAb,EAAI,KAAoB,EAAW,EAAI,EAAW,EAC1E,GAAI,EAAU,GAAK,GAAW,EAAW,OAAQ,OAAO,KAExD,MAAM,EAAgC,EAAW,GACjD,IAAK,EAAU,OAAO,KAEtB,GAAI,EAAY,EAAO,GAAW,OAAO,EAAU,EAAO,GAG1D,MAAM,EAAc,EAAM,SAAS,GACnC,OAAK,EAIE,EAAO,EAAO,EADH,SAAjB,GAA4C,OAAjB,EAAwB,EAAe,GAAe,GAHzD"}
@@ -1,2 +0,0 @@
1
- import{c as t}from"./Selection-B14e7gd0.mjs";import{t as e}from"./GapCursorNavigation-CKKq42kA.mjs";import{i as n}from"./PluginHelpers-DLKHJWJn.mjs";var o={gapCursorActive:"Gap cursor active. Type to insert new paragraph."},r=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-BpxuRQB2.mjs"),"./locales/de.ts":()=>import("./de-BWPmC-2S.mjs"),"./locales/es.ts":()=>import("./es-4-5iRK0M.mjs"),"./locales/fr.ts":()=>import("./fr-DX7z_ld0.mjs"),"./locales/hi.ts":()=>import("./hi-DkP4pHSX.mjs"),"./locales/pt.ts":()=>import("./pt-D_MD7MJu.mjs"),"./locales/ru.ts":()=>import("./ru-CptzezhV.mjs"),"./locales/zh.ts":()=>import("./zh-0uhsRxfq.mjs")});async function s(t){if("en"===t)return o;const e=r[`./locales/${t}.ts`];if(!e)return o;try{return(await e()).default}catch{return o}}var i=class{id="gap-cursor";name="Gap Cursor";priority=5;context=null;activeCursorBlockId=null;activeCursorSide=null;locale=o;async init(r){this.locale=await n(r,void 0,o,s),this.context=r,r.registerStyleSheet("\n.notectl-gap-cursor--before,\n.notectl-gap-cursor--after {\n\tposition: relative;\n}\n.notectl-gap-cursor--before::before {\n\tcontent: '';\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 0;\n\twidth: 100%;\n\theight: 1px;\n\tbackground: currentColor;\n\ttransform: translateY(-50%);\n\tpointer-events: none;\n\tz-index: 1;\n\tanimation: notectl-gap-blink 1.1s step-end infinite;\n}\n.notectl-gap-cursor--after::after {\n\tcontent: '';\n\tdisplay: block;\n\tposition: absolute;\n\tbottom: 0;\n\tinset-inline-start: 0;\n\twidth: 100%;\n\theight: 1px;\n\tbackground: currentColor;\n\ttransform: translateY(50%);\n\tpointer-events: none;\n\tz-index: 1;\n\tanimation: notectl-gap-blink 1.1s step-end infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n\t.notectl-gap-cursor--before::before,\n\t.notectl-gap-cursor--after::after {\n\t\tanimation: none;\n\t}\n}\n@keyframes notectl-gap-blink {\n\t50% { opacity: 0; }\n}\n");const i={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"},a={};for(const[n,o]of Object.entries(i))a[n]=()=>{const n=r.getState();if(!t(n.selection))return!1;const s=e(n,o,r.getContainer());return!!s&&(r.dispatch(s),!0)};r.registerKeymap(a,{priority:"navigation"})}onReady(){this.context&&this.syncCursorClass(this.context.getState())}onStateChange(e,n,o){this.context&&(this.syncCursorClass(n),!t(e.selection)&&t(n.selection)&&this.context.announce(this.locale.gapCursorActive))}destroy(){this.clearCursorClass(),this.context=null}syncCursorClass(e){if(this.clearCursorClass(),!t(e.selection)||!this.context)return;const n="before"===e.selection.side?"notectl-gap-cursor--before":"notectl-gap-cursor--after",o=this.context.getContainer().querySelector(`[data-block-id="${e.selection.blockId}"]`);o instanceof HTMLElement&&(o.classList.add(n),this.activeCursorBlockId=e.selection.blockId,this.activeCursorSide=e.selection.side)}clearCursorClass(){if(!this.context||!this.activeCursorBlockId||!this.activeCursorSide)return;const t=this.context.getContainer().querySelector(`[data-block-id="${this.activeCursorBlockId}"]`);t instanceof HTMLElement&&t.classList.remove("notectl-gap-cursor--before","notectl-gap-cursor--after"),this.activeCursorBlockId=null,this.activeCursorSide=null}};export{i as t};
2
- //# sourceMappingURL=GapCursorPlugin-0CyOaciK.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GapCursorPlugin-0CyOaciK.mjs","names":[],"sources":["../../src/plugins/gap-cursor/GapCursorLocale.ts","../../src/plugins/gap-cursor/GapCursorPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the GapCursorPlugin. */\n\n// --- Locale Interface ---\n\nexport interface GapCursorLocale {\n\treadonly gapCursorActive: string;\n}\n\n// --- Default English Locale ---\n\nexport const GAP_CURSOR_LOCALE_EN: GapCursorLocale = {\n\tgapCursorActive: 'Gap cursor active. Type to insert new paragraph.',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: GapCursorLocale }>> =\n\timport.meta.glob<{ default: GapCursorLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadGapCursorLocale(lang: string): Promise<GapCursorLocale> {\n\tif (lang === 'en') return GAP_CURSOR_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return GAP_CURSOR_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn GAP_CURSOR_LOCALE_EN;\n\t}\n}\n","/**\n * GapCursorPlugin: renders a virtual cursor at boundaries of void blocks\n * where no native browser caret can exist (e.g. between two HRs or at\n * the document edge adjacent to a void block).\n */\n\nimport { isGapCursor } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport { navigateFromGapCursor } from '../../view/GapCursorNavigation.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport {\n\tGAP_CURSOR_LOCALE_EN,\n\ttype GapCursorLocale,\n\tloadGapCursorLocale,\n} from './GapCursorLocale.js';\n\nconst GAP_CURSOR_CSS = `\n.notectl-gap-cursor--before,\n.notectl-gap-cursor--after {\n\tposition: relative;\n}\n.notectl-gap-cursor--before::before {\n\tcontent: '';\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 0;\n\twidth: 100%;\n\theight: 1px;\n\tbackground: currentColor;\n\ttransform: translateY(-50%);\n\tpointer-events: none;\n\tz-index: 1;\n\tanimation: notectl-gap-blink 1.1s step-end infinite;\n}\n.notectl-gap-cursor--after::after {\n\tcontent: '';\n\tdisplay: block;\n\tposition: absolute;\n\tbottom: 0;\n\tinset-inline-start: 0;\n\twidth: 100%;\n\theight: 1px;\n\tbackground: currentColor;\n\ttransform: translateY(50%);\n\tpointer-events: none;\n\tz-index: 1;\n\tanimation: notectl-gap-blink 1.1s step-end infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n\t.notectl-gap-cursor--before::before,\n\t.notectl-gap-cursor--after::after {\n\t\tanimation: none;\n\t}\n}\n@keyframes notectl-gap-blink {\n\t50% { opacity: 0; }\n}\n`;\n\nexport class GapCursorPlugin implements Plugin {\n\treadonly id = 'gap-cursor';\n\treadonly name = 'Gap Cursor';\n\treadonly priority = 5;\n\n\tprivate context: PluginContext | null = null;\n\tprivate activeCursorBlockId: BlockId | null = null;\n\tprivate activeCursorSide: 'before' | 'after' | null = null;\n\tprivate locale: GapCursorLocale = GAP_CURSOR_LOCALE_EN;\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tundefined,\n\t\t\tGAP_CURSOR_LOCALE_EN,\n\t\t\tloadGapCursorLocale,\n\t\t);\n\n\t\tthis.context = context;\n\n\t\tcontext.registerStyleSheet(GAP_CURSOR_CSS);\n\n\t\tconst directions: Record<string, 'left' | 'right' | 'up' | 'down'> = {\n\t\t\tArrowLeft: 'left',\n\t\t\tArrowRight: 'right',\n\t\t\tArrowUp: 'up',\n\t\t\tArrowDown: 'down',\n\t\t};\n\n\t\tconst keymap: Record<string, () => boolean> = {};\n\t\tfor (const [key, dir] of Object.entries(directions)) {\n\t\t\tkeymap[key] = (): boolean => {\n\t\t\t\tconst state: EditorState = context.getState();\n\t\t\t\tif (!isGapCursor(state.selection)) return false;\n\n\t\t\t\tconst container: HTMLElement = context.getContainer();\n\t\t\t\tconst tr: Transaction | null = navigateFromGapCursor(state, dir, container);\n\t\t\t\tif (tr) {\n\t\t\t\t\tcontext.dispatch(tr);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}\n\n\t\tcontext.registerKeymap(keymap, { priority: 'navigation' });\n\t}\n\n\tonReady(): void {\n\t\tif (!this.context) return;\n\t\tthis.syncCursorClass(this.context.getState());\n\t}\n\n\tonStateChange(oldState: EditorState, newState: EditorState, _tr: Transaction): void {\n\t\tif (!this.context) return;\n\n\t\tthis.syncCursorClass(newState);\n\n\t\tif (!isGapCursor(oldState.selection) && isGapCursor(newState.selection)) {\n\t\t\tthis.context.announce(this.locale.gapCursorActive);\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tthis.clearCursorClass();\n\t\tthis.context = null;\n\t}\n\n\tprivate syncCursorClass(state: EditorState): void {\n\t\tthis.clearCursorClass();\n\t\tif (!isGapCursor(state.selection) || !this.context) return;\n\n\t\tconst className: string =\n\t\t\tstate.selection.side === 'before'\n\t\t\t\t? 'notectl-gap-cursor--before'\n\t\t\t\t: 'notectl-gap-cursor--after';\n\n\t\tconst blockEl: Element | null = this.context\n\t\t\t.getContainer()\n\t\t\t.querySelector(`[data-block-id=\"${state.selection.blockId}\"]`);\n\t\tif (!(blockEl instanceof HTMLElement)) return;\n\n\t\tblockEl.classList.add(className);\n\t\tthis.activeCursorBlockId = state.selection.blockId;\n\t\tthis.activeCursorSide = state.selection.side;\n\t}\n\n\tprivate clearCursorClass(): void {\n\t\tif (!this.context || !this.activeCursorBlockId || !this.activeCursorSide) return;\n\n\t\tconst blockEl: Element | null = this.context\n\t\t\t.getContainer()\n\t\t\t.querySelector(`[data-block-id=\"${this.activeCursorBlockId}\"]`);\n\t\tif (blockEl instanceof HTMLElement) {\n\t\t\tblockEl.classList.remove('notectl-gap-cursor--before', 'notectl-gap-cursor--after');\n\t\t}\n\n\t\tthis.activeCursorBlockId = null;\n\t\tthis.activeCursorSide = null;\n\t}\n}\n"],"mappings":"qJAUA,IAAa,EAAwC,CACpD,gBAAiB,oDAKZ,iBACL,OAAA,OAAA,CAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,uBAED,eAAsB,EAAoB,GACzC,GAAa,OAAT,EAAe,OAAO,EAC1B,MAAM,EAAS,EAAc,aAAa,QAC1C,IAAK,EAAQ,OAAO,EACpB,IAEC,aADkB,KACP,cAEX,OAAO,GCRT,IA4Ca,EAAb,MACC,GAAc,aACd,KAAgB,aAChB,SAAoB,EAEpB,QAAwC,KACxC,oBAA8C,KAC9C,iBAAsD,KACtD,OAAkC,EAElC,UAAM,CAAK,GACV,KAAK,aAAe,EACnB,OACA,EACA,EACA,GAGD,KAAK,QAAU,EAEf,EAAQ,mBAhEa,07BAkErB,MAAM,EAA+D,CACpE,UAAW,OACX,WAAY,QACZ,QAAS,KACT,UAAW,QAGN,EAAwC,CAAA,EAC9C,IAAK,MAAO,EAAK,KAAQ,OAAO,QAAQ,GACvC,EAAO,GAAA,KACN,MAAM,EAAqB,EAAQ,WACnC,IAAK,EAAY,EAAM,WAAY,OAAO,EAG1C,MAAM,EAAyB,EAAsB,EAAO,EAD7B,EAAQ,gBAEvC,QAAI,IACH,EAAQ,SAAS,IACV,IAMV,EAAQ,eAAe,EAAQ,CAAE,SAAU,eAG5C,OAAA,GACM,KAAK,SACV,KAAK,gBAAgB,KAAK,QAAQ,YAGnC,aAAA,CAAc,EAAuB,EAAuB,GACtD,KAAK,UAEV,KAAK,gBAAgB,IAEhB,EAAY,EAAS,YAAc,EAAY,EAAS,YAC5D,KAAK,QAAQ,SAAS,KAAK,OAAO,kBAIpC,OAAA,GACC,KAAK,mBACL,KAAK,QAAU,KAGhB,eAAA,CAAwB,GAEvB,GADA,KAAK,oBACA,EAAY,EAAM,aAAe,KAAK,QAAS,OAEpD,MAAM,EACoB,WAAzB,EAAM,UAAU,KACb,6BACA,4BAEE,EAA0B,KAAK,QACnC,eACA,cAAc,mBAAmB,EAAM,UAAU,aAC7C,aAAmB,cAEzB,EAAQ,UAAU,IAAI,GACtB,KAAK,oBAAsB,EAAM,UAAU,QAC3C,KAAK,iBAAmB,EAAM,UAAU,MAGzC,gBAAA,GACC,IAAK,KAAK,UAAY,KAAK,sBAAwB,KAAK,iBAAkB,OAE1E,MAAM,EAA0B,KAAK,QACnC,eACA,cAAc,mBAAmB,KAAK,yBACpC,aAAmB,aACtB,EAAQ,UAAU,OAAO,6BAA8B,6BAGxD,KAAK,oBAAsB,KAC3B,KAAK,iBAAmB"}
@@ -1,2 +0,0 @@
1
- import{r as e}from"./Commands-DJSVqp7b.mjs";var r=class{id="hard-break";name="Hard Break";priority=10;init(e){this.registerInlineNodeSpec(e),this.registerCommands(e),this.registerKeymap(e)}registerInlineNodeSpec(e){e.registerInlineNodeSpec({type:"hard_break",toDOM:()=>document.createElement("br"),toHTMLString:()=>"<br>",parseHTML:[{tag:"br"}],sanitize:{tags:["br"]}})}registerCommands(r){r.registerCommand("insertHardBreak",()=>{const t=e(r.getState());return!!t&&(r.dispatch(t),!0)})}registerKeymap(r){r.registerKeymap({"Shift-Enter":()=>{const t=e(r.getState());return!!t&&(r.dispatch(t),!0)}})}};export{r as t};
2
- //# sourceMappingURL=HardBreakPlugin-BOz-L53p.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HardBreakPlugin-BOz-L53p.mjs","names":[],"sources":["../../src/plugins/hard-break/HardBreakPlugin.ts"],"sourcesContent":["/**\n * HardBreakPlugin: registers a hard line break (Shift+Enter → `<br>`)\n * as an InlineNode, with command and keymap bindings.\n */\n\nimport { insertHardBreakCommand } from '../../commands/Commands.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface InlineNodeAttrRegistry {\n\t\thard_break: Record<string, never>;\n\t}\n}\n\n// --- Plugin ---\n\nexport class HardBreakPlugin implements Plugin {\n\treadonly id = 'hard-break';\n\treadonly name = 'Hard Break';\n\treadonly priority = 10;\n\n\tinit(context: PluginContext): void {\n\t\tthis.registerInlineNodeSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t}\n\n\tprivate registerInlineNodeSpec(context: PluginContext): void {\n\t\tcontext.registerInlineNodeSpec({\n\t\t\ttype: 'hard_break',\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement('br');\n\t\t\t},\n\t\t\ttoHTMLString() {\n\t\t\t\treturn '<br>';\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'br' }],\n\t\t\tsanitize: { tags: ['br'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('insertHardBreak', () => {\n\t\t\tconst state = context.getState();\n\t\t\tconst tr = insertHardBreakCommand(state);\n\t\t\tif (!tr) return false;\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Shift-Enter': () => {\n\t\t\t\tconst state = context.getState();\n\t\t\t\tconst tr = insertHardBreakCommand(state);\n\t\t\t\tif (!tr) return false;\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t});\n\t}\n}\n"],"mappings":"4CAkBA,IAAa,EAAb,MACC,GAAc,aACd,KAAgB,aAChB,SAAoB,GAEpB,IAAA,CAAK,GACJ,KAAK,uBAAuB,GAC5B,KAAK,iBAAiB,GACtB,KAAK,eAAe,GAGrB,sBAAA,CAA+B,GAC9B,EAAQ,uBAAuB,CAC9B,KAAM,aACN,MAAA,IACQ,SAAS,cAAc,MAE/B,aAAA,IACQ,OAER,UAAW,CAAC,CAAE,IAAK,OACnB,SAAU,CAAE,KAAM,CAAC,SAIrB,gBAAA,CAAyB,GACxB,EAAQ,gBAAgB,kBAAA,KAEvB,MAAM,EAAK,EADG,EAAQ,YAEtB,QAAK,IACL,EAAQ,SAAS,IACV,KAIT,cAAA,CAAuB,GACtB,EAAQ,eAAe,CACtB,cAAA,KAEC,MAAM,EAAK,EADG,EAAQ,YAEtB,QAAK,IACL,EAAQ,SAAS,IACV"}
@@ -1,2 +0,0 @@
1
- import{h as t,p as e,s as n,u as o,x as i}from"./Document-CkQLx84k.mjs";import{o as r,t as a,u as s}from"./Selection-B14e7gd0.mjs";import{a as c}from"./TypeBrands-BQR8dEYU.mjs";import{n as l}from"./DomUtils-BkyCg-OO.mjs";import{o as g}from"./StyleRuntime-0yPPJK9H.mjs";import{i as p}from"./PluginHelpers-DLKHJWJn.mjs";function d(t,e,n,o){const i=document.createElement("button");i.type="button",i.className="notectl-heading-picker__item",i.setAttribute("role","option"),i.setAttribute("aria-selected",String(e)),e&&i.classList.add("notectl-heading-picker__item--active");const r=document.createElement("span");r.className="notectl-heading-picker__check",r.textContent=e?"✓":"",i.appendChild(r);const a=document.createElement("span");return a.className="notectl-heading-picker__label",a.textContent=t,o&&g(a,{fontSize:o.fontSize,fontWeight:o.fontWeight}),i.appendChild(a),i.addEventListener("mousedown",n),i}function h(t,e){return t[`heading${e}`]}function u(t,e){const n=t.getState();if(!s(n.selection))return!1;const o=n.getBlock(n.selection.anchor.blockId);return!!o&&(o.type===e?m(t,c("paragraph")):m(t,c(e)))}function f(t,e){const n=t.getState(),o=n.selection;if(!s(o))return!1;const i=n.getBlock(o.anchor.blockId);return!!i&&("heading"===i.type&&i.attrs?.level===e?m(t,c("paragraph")):m(t,c("heading"),{level:e}))}function m(e,n,r){const a=e.getState(),c=a.selection;if(!s(c))return!1;const l=a.getBlock(c.anchor.blockId);if(!l)return!1;const g=a.transaction("command"),p=e.getSchemaRegistry().getNodeSpec(n);p?.excludeMarks&&p.excludeMarks.length>0&&(function(e,n,r){if(0===o(n))return;const a=new Set(r),s=t(n);let c=0;for(const t of s)if(i(t)){if(t.text.length>0)for(const o of t.marks)a.has(o.type)&&e.removeMark(n.id,c,c+t.text.length,o);c+=t.text.length}else c+=1}(g,l,p.excludeMarks),function(t,e,n){if(!e.storedMarks)return;const o=new Set(n),i=e.storedMarks.filter(t=>!o.has(t.type));i.length!==e.storedMarks.length&&t.setStoredMarks(i.length>0?i:null,e.storedMarks)}(g,a,p.excludeMarks));const d=g.setBlockType(c.anchor.blockId,n,r).setSelection(c).build();return e.dispatch(d),!0}var k=new Set(["heading","title","subtitle"]);var b={paragraph:"Paragraph",title:"Title",subtitle:"Subtitle",heading1:"Heading 1",heading2:"Heading 2",heading3:"Heading 3",heading4:"Heading 4",heading5:"Heading 5",heading6:"Heading 6",blockTypeLabel:"Block Type",blockTypesAria:"Block types"},y=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-CxRSPJDE.mjs"),"./locales/de.ts":()=>import("./de-TEQW-F4t.mjs"),"./locales/es.ts":()=>import("./es-ClJxqhu_.mjs"),"./locales/fr.ts":()=>import("./fr-CFDoFELm.mjs"),"./locales/hi.ts":()=>import("./hi-ydmPh3HB.mjs"),"./locales/pt.ts":()=>import("./pt-Dh7nUcAM.mjs"),"./locales/ru.ts":()=>import("./ru-DHH8k6G8.mjs"),"./locales/zh.ts":()=>import("./zh-CwVkxL4q.mjs")});async function v(t){if("en"===t)return b;const e=y[`./locales/${t}.ts`];if(!e)return b;try{return(await e()).default}catch{return b}}var x={levels:[1,2,3,4,5,6]},S={1:"h1",2:"h2",3:"h3",4:"h4",5:"h5",6:"h6"},T=class{id="heading";name="Heading";priority=30;config;locale;constructor(t){this.config={...x,...t}}async init(t){this.locale=await p(t,this.config.locale,b,v),t.registerStyleSheet("\n/* Heading Select — Width overrides for combobox button */\n.notectl-toolbar-btn--heading {\n\tmin-width: 100px;\n\tmax-width: 160px;\n}\n\n/* Heading Picker Popup */\n.notectl-heading-picker {\n\tmin-width: 200px;\n\tmax-height: 320px;\n\toverflow-y: auto;\n}\n\n.notectl-heading-picker__list {\n\tpadding: 4px 0;\n}\n\n.notectl-heading-picker__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tpadding: 7px 12px;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\ttext-align: start;\n\twhite-space: nowrap;\n\tfont-family: inherit;\n\ttransition: background 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-heading-picker__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-heading-picker__item--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n@media (hover: hover) {\n\t.notectl-heading-picker__item--active:hover {\n\t\tbackground: var(--notectl-active-bg);\n\t}\n}\n\n.notectl-heading-picker__check {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\tflex-shrink: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-heading-picker__label {\n\tflex: 1;\n}\n"),this.registerNodeSpecs(t),function(t,e){t.registerCommand("setTitle",()=>u(t,"title")),t.registerCommand("setSubtitle",()=>u(t,"subtitle"));for(const n of e.levels)t.registerCommand(`setHeading${n}`,()=>f(t,n));t.registerCommand("toggleHeading",()=>f(t,1)),t.registerCommand("setParagraph",()=>m(t,c("paragraph")))}(t,this.config),function(t,i){const l={Enter:()=>function(t){return function(t,e){const n=t.getState();if(!s(n.selection))return!1;const o=n.selection;if(!r(o))return!1;const i=n.getBlock(o.anchor.blockId);return!(!i||!k.has(i.type))&&e({state:n,block:i,blockId:o.anchor.blockId,offset:o.anchor.offset})}(t,i=>{if(""===e(i.block)){const e=i.state.transaction("input").setBlockType(i.blockId,c("paragraph")).setSelection(i.state.selection).build();return t.dispatch(e),!0}const r=o(i.block);if(i.offset>=r){const e=n(),o=i.state.transaction("input").splitBlock(i.blockId,i.offset,e).setBlockType(e,c("paragraph")).setSelection(a(e,0)).build();return t.dispatch(o),!0}return!1})}(t)};for(const e of i.levels)e<=6&&(l[`Mod-Shift-${e}`]=()=>t.executeCommand(`setHeading${e}`));t.registerKeymap(l)}(t,this.config),function(t,e){for(const n of e.levels){const e="#".repeat(n),o=new RegExp(`^${e} $`);t.registerInputRule({pattern:o,handler(t,e,o,i){const l=t.selection;if(!s(l))return null;if(!r(l))return null;const g=t.getBlock(l.anchor.blockId);return g&&"paragraph"===g.type?t.transaction("input").deleteTextAt(l.anchor.blockId,o,o+n+1).setBlockType(l.anchor.blockId,c("heading"),{level:n}).setSelection(a(l.anchor.blockId,0)).build():null}})}}(t,this.config),function(t,e,n){t.registerBlockTypePickerEntry({id:"paragraph",label:n.paragraph,command:"setParagraph",priority:10,isActive:t=>!!s(t.selection)&&"paragraph"===t.getBlock(t.selection.anchor.blockId)?.type}),t.registerBlockTypePickerEntry({id:"title",label:n.title,command:"setTitle",priority:20,style:{fontSize:"1.6em",fontWeight:"700"},isActive:t=>!!s(t.selection)&&"title"===t.getBlock(t.selection.anchor.blockId)?.type}),t.registerBlockTypePickerEntry({id:"subtitle",label:n.subtitle,command:"setSubtitle",priority:30,style:{fontSize:"1.3em",fontWeight:"500"},isActive:t=>!!s(t.selection)&&"subtitle"===t.getBlock(t.selection.anchor.blockId)?.type});for(const o of e.levels)t.registerBlockTypePickerEntry({id:`heading-${o}`,label:h(n,o),command:`setHeading${o}`,priority:100+o,style:{fontSize:1.4-.1*o+"em",fontWeight:"600"},isActive:t=>{if(!s(t.selection))return!1;const e=t.getBlock(t.selection.anchor.blockId);return"heading"===e?.type&&e.attrs?.level===o}})}(t,this.config,this.locale),function(t,e){t.registerToolbarItem({id:"heading",group:"block",label:e.blockTypeLabel,tooltip:e.blockTypeLabel,command:"setParagraph",popupType:"combobox",getLabel:n=>function(t,e,n){if(!s(t.selection))return n.paragraph;const o=e.getBlockTypePickerRegistry().getBlockTypePickerEntries();for(const i of o)if(i.isActive(t))return i.label;return n.paragraph}(n,t,e),renderPopup:(t,n,o)=>{!function(t,e,n,o){t.classList.add("notectl-heading-picker");const i=e.getState();if(!s(i.selection))return;const r=e.getContainer(),a=document.createElement("div");a.className="notectl-heading-picker__list",a.setAttribute("role","listbox"),a.setAttribute("aria-label",n.blockTypesAria);const c=e.getBlockTypePickerRegistry().getBlockTypePickerEntries();for(const s of c){const t=s.isActive(i);a.appendChild(d(s.label,t,t=>{t.preventDefault(),t.stopPropagation(),e.executeCommand(s.command),o({restoreFocusTo:r})},s.style))}t.appendChild(a)}(t,n,e,o)},isActive:e=>t.getBlockTypePickerRegistry().getBlockTypePickerEntries().some(t=>"paragraph"!==t.id&&t.isActive(e))})}(t,this.locale)}registerNodeSpecs(t){t.registerNodeSpec({type:"title",group:"block",content:{allow:["text"]},excludeMarks:["fontSize"],toDOM(t){const e=l("h1",t.id);return e.classList.add("notectl-title"),e},toHTML:(t,e)=>`<h1 class="notectl-title">${e||"<br>"}</h1>`,parseHTML:[{tag:"h1",priority:60,getAttrs:t=>!!t.classList.contains("notectl-title")&&{}}],sanitize:{tags:["h1"],attrs:["class"]}}),t.registerNodeSpec({type:"subtitle",group:"block",content:{allow:["text"]},excludeMarks:["fontSize"],toDOM(t){const e=l("h2",t.id);return e.classList.add("notectl-subtitle"),e},toHTML:(t,e)=>`<h2 class="notectl-subtitle">${e||"<br>"}</h2>`,parseHTML:[{tag:"h2",priority:60,getAttrs:t=>!!t.classList.contains("notectl-subtitle")&&{}}],sanitize:{tags:["h2"],attrs:["class"]}}),t.registerNodeSpec({type:"heading",group:"block",content:{allow:["text"]},excludeMarks:["fontSize"],attrs:{level:{default:1}},toDOM:t=>l(S[t.attrs?.level??1]??"h1",t.id),toHTML(t,e){const n=S[t.attrs?.level??1]??"h1";return`<${n}>${e||"<br>"}</${n}>`},parseHTML:[{tag:"h1",getAttrs:()=>({level:1})},{tag:"h2",getAttrs:()=>({level:2})},{tag:"h3",getAttrs:()=>({level:3})},{tag:"h4",getAttrs:()=>({level:4})},{tag:"h5",getAttrs:()=>({level:5})},{tag:"h6",getAttrs:()=>({level:6})}],sanitize:{tags:["h1","h2","h3","h4","h5","h6"]}})}};export{b as n,v as r,T as t};
2
- //# sourceMappingURL=HeadingPlugin-C1F-5Ail.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HeadingPlugin-C1F-5Ail.mjs","names":[],"sources":["../../src/editor/styles/heading-select.ts","../../src/plugins/heading/HeadingBlockTypePicker.ts","../../src/plugins/heading/HeadingCommands.ts","../../src/plugins/heading/HeadingInputRules.ts","../../src/plugins/heading/HeadingKeyboardHandlers.ts","../../src/plugins/heading/HeadingLocale.ts","../../src/plugins/heading/HeadingPlugin.ts"],"sourcesContent":["/** Heading picker toolbar combobox + popup styles. */\nexport const HEADING_SELECT_CSS = `\n/* Heading Select — Width overrides for combobox button */\n.notectl-toolbar-btn--heading {\n\tmin-width: 100px;\n\tmax-width: 160px;\n}\n\n/* Heading Picker Popup */\n.notectl-heading-picker {\n\tmin-width: 200px;\n\tmax-height: 320px;\n\toverflow-y: auto;\n}\n\n.notectl-heading-picker__list {\n\tpadding: 4px 0;\n}\n\n.notectl-heading-picker__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tpadding: 7px 12px;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\ttext-align: start;\n\twhite-space: nowrap;\n\tfont-family: inherit;\n\ttransition: background 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-heading-picker__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-heading-picker__item--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n@media (hover: hover) {\n\t.notectl-heading-picker__item--active:hover {\n\t\tbackground: var(--notectl-active-bg);\n\t}\n}\n\n.notectl-heading-picker__check {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\tflex-shrink: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-heading-picker__label {\n\tflex: 1;\n}\n`;\n","/**\n * Block type picker entries and toolbar dropdown for heading block types.\n * Registers picker entries for paragraph, title, subtitle, and all heading levels,\n * plus a combobox-style toolbar item with a custom popup.\n */\n\nimport { isTextSelection } from '../../model/Selection.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperties } from '../../style/StyleRuntime.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { PopupCloseOptions } from '../shared/PopupManager.js';\nimport type { PickerEntryStyle } from './BlockTypePickerEntry.js';\nimport type { HeadingLocale } from './HeadingLocale.js';\nimport type { HeadingConfig } from './HeadingPlugin.js';\nimport type { HeadingLevel } from './HeadingPlugin.js';\n\n// --- Picker Entry Registration ---\n\n/** Registers block type picker entries for paragraph, title, subtitle, and heading levels. */\nexport function registerHeadingPickerEntries(\n\tcontext: PluginContext,\n\tconfig: HeadingConfig,\n\tlocale: HeadingLocale,\n): void {\n\tcontext.registerBlockTypePickerEntry({\n\t\tid: 'paragraph',\n\t\tlabel: locale.paragraph,\n\t\tcommand: 'setParagraph',\n\t\tpriority: 10,\n\t\tisActive: (state) => {\n\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\treturn block?.type === 'paragraph';\n\t\t},\n\t});\n\n\tcontext.registerBlockTypePickerEntry({\n\t\tid: 'title',\n\t\tlabel: locale.title,\n\t\tcommand: 'setTitle',\n\t\tpriority: 20,\n\t\tstyle: { fontSize: '1.6em', fontWeight: '700' },\n\t\tisActive: (state) => {\n\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\treturn block?.type === 'title';\n\t\t},\n\t});\n\n\tcontext.registerBlockTypePickerEntry({\n\t\tid: 'subtitle',\n\t\tlabel: locale.subtitle,\n\t\tcommand: 'setSubtitle',\n\t\tpriority: 30,\n\t\tstyle: { fontSize: '1.3em', fontWeight: '500' },\n\t\tisActive: (state) => {\n\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\treturn block?.type === 'subtitle';\n\t\t},\n\t});\n\n\tfor (const level of config.levels) {\n\t\tcontext.registerBlockTypePickerEntry({\n\t\t\tid: `heading-${level}`,\n\t\t\tlabel: getHeadingLabel(locale, level),\n\t\t\tcommand: `setHeading${level}`,\n\t\t\tpriority: 100 + level,\n\t\t\tstyle: { fontSize: `${1.4 - level * 0.1}em`, fontWeight: '600' },\n\t\t\tisActive: (state) => {\n\t\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\t\treturn block?.type === 'heading' && block.attrs?.level === level;\n\t\t\t},\n\t\t});\n\t}\n}\n\n// --- Toolbar Item ---\n\n/** Registers the heading toolbar dropdown with a combobox picker popup. */\nexport function registerHeadingToolbarItem(context: PluginContext, locale: HeadingLocale): void {\n\tcontext.registerToolbarItem({\n\t\tid: 'heading',\n\t\tgroup: 'block',\n\t\tlabel: locale.blockTypeLabel,\n\t\ttooltip: locale.blockTypeLabel,\n\t\tcommand: 'setParagraph',\n\t\tpopupType: 'combobox',\n\t\tgetLabel: (state: EditorState): string => getActiveLabel(state, context, locale),\n\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\trenderHeadingPopup(container, ctx, locale, onClose);\n\t\t},\n\t\tisActive: (state) => {\n\t\t\tconst entries = context.getBlockTypePickerRegistry().getBlockTypePickerEntries();\n\t\t\treturn entries.some((entry) => entry.id !== 'paragraph' && entry.isActive(state));\n\t\t},\n\t});\n}\n\n// --- Popup Rendering ---\n\nfunction renderHeadingPopup(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\tlocale: HeadingLocale,\n\tonClose: (options?: PopupCloseOptions) => void,\n): void {\n\tcontainer.classList.add('notectl-heading-picker');\n\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return;\n\n\tconst contentElement: HTMLElement = context.getContainer();\n\n\tconst list: HTMLDivElement = document.createElement('div');\n\tlist.className = 'notectl-heading-picker__list';\n\tlist.setAttribute('role', 'listbox');\n\tlist.setAttribute('aria-label', locale.blockTypesAria);\n\n\tconst entries = context.getBlockTypePickerRegistry().getBlockTypePickerEntries();\n\tfor (const entry of entries) {\n\t\tconst active: boolean = entry.isActive(state);\n\t\tlist.appendChild(\n\t\t\tcreatePickerItem(\n\t\t\t\tentry.label,\n\t\t\t\tactive,\n\t\t\t\t(e: MouseEvent) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tcontext.executeCommand(entry.command);\n\t\t\t\t\tonClose({ restoreFocusTo: contentElement });\n\t\t\t\t},\n\t\t\t\tentry.style,\n\t\t\t),\n\t\t);\n\t}\n\n\tcontainer.appendChild(list);\n}\n\nfunction createPickerItem(\n\tlabel: string,\n\tisActive: boolean,\n\thandler: (e: MouseEvent) => void,\n\tstyle?: PickerEntryStyle,\n): HTMLButtonElement {\n\tconst item: HTMLButtonElement = document.createElement('button');\n\titem.type = 'button';\n\titem.className = 'notectl-heading-picker__item';\n\titem.setAttribute('role', 'option');\n\titem.setAttribute('aria-selected', String(isActive));\n\n\tif (isActive) {\n\t\titem.classList.add('notectl-heading-picker__item--active');\n\t}\n\n\tconst check: HTMLSpanElement = document.createElement('span');\n\tcheck.className = 'notectl-heading-picker__check';\n\tcheck.textContent = isActive ? '\\u2713' : '';\n\titem.appendChild(check);\n\n\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\tlabelSpan.className = 'notectl-heading-picker__label';\n\tlabelSpan.textContent = label;\n\tif (style) {\n\t\tsetStyleProperties(labelSpan, {\n\t\t\tfontSize: style.fontSize,\n\t\t\tfontWeight: style.fontWeight,\n\t\t});\n\t}\n\titem.appendChild(labelSpan);\n\n\titem.addEventListener('mousedown', handler);\n\treturn item;\n}\n\n// --- Helpers ---\n\nfunction getHeadingLabel(locale: HeadingLocale, level: HeadingLevel): string {\n\tconst key = `heading${level}` as keyof HeadingLocale;\n\treturn locale[key] as string;\n}\n\nfunction getActiveLabel(state: EditorState, context: PluginContext, locale: HeadingLocale): string {\n\tif (!isTextSelection(state.selection)) return locale.paragraph;\n\tconst entries = context.getBlockTypePickerRegistry().getBlockTypePickerEntries();\n\tfor (const entry of entries) {\n\t\tif (entry.isActive(state)) return entry.label;\n\t}\n\treturn locale.paragraph;\n}\n","/**\n * Command registration and implementations for heading block types.\n * Handles toggle between heading/title/subtitle and paragraph,\n * plus excluded-mark stripping when switching block types.\n */\n\nimport type { BlockNode, Mark } from '../../model/Document.js';\nimport { getBlockLength, getInlineChildren, isTextNode } from '../../model/Document.js';\nimport { isTextSelection } from '../../model/Selection.js';\nimport { type NodeTypeName, nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { TransactionBuilder } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { HeadingConfig, HeadingLevel } from './HeadingPlugin.js';\n\n/** Registers all heading commands (setTitle, setSubtitle, setHeadingN, toggleHeading, setParagraph). */\nexport function registerHeadingCommands(context: PluginContext, config: HeadingConfig): void {\n\tcontext.registerCommand('setTitle', () => toggleSpecialBlock(context, 'title'));\n\n\tcontext.registerCommand('setSubtitle', () => toggleSpecialBlock(context, 'subtitle'));\n\n\tfor (const level of config.levels) {\n\t\tcontext.registerCommand(`setHeading${level}`, () => toggleHeading(context, level));\n\t}\n\n\tcontext.registerCommand('toggleHeading', () => toggleHeading(context, 1));\n\n\tcontext.registerCommand('setParagraph', () => setBlockType(context, nodeType('paragraph')));\n}\n\n// --- Command Implementations ---\n\n/**\n * Toggles between a special block type (title/subtitle) and paragraph.\n * If the block is already that type, resets to paragraph.\n */\nfunction toggleSpecialBlock(context: PluginContext, type: string): boolean {\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(state.selection.anchor.blockId);\n\tif (!block) return false;\n\n\tif (block.type === type) {\n\t\treturn setBlockType(context, nodeType('paragraph'));\n\t}\n\n\treturn setBlockType(context, nodeType(type) as NodeTypeName);\n}\n\n/**\n * Toggles between heading (at given level) and paragraph.\n * If the block is already a heading at the same level, resets to paragraph.\n */\nfunction toggleHeading(context: PluginContext, level: HeadingLevel): boolean {\n\tconst state: EditorState = context.getState();\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block) return false;\n\n\tif (block.type === 'heading' && block.attrs?.level === level) {\n\t\treturn setBlockType(context, nodeType('paragraph'));\n\t}\n\n\treturn setBlockType(context, nodeType('heading'), { level });\n}\n\nfunction setBlockType(\n\tcontext: PluginContext,\n\ttype: NodeTypeName,\n\tattrs?: Record<string, string | number | boolean>,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block) return false;\n\n\tconst builder: TransactionBuilder = state.transaction('command');\n\n\tconst spec = context.getSchemaRegistry().getNodeSpec(type);\n\tif (spec?.excludeMarks && spec.excludeMarks.length > 0) {\n\t\tstripExcludedMarks(builder, block, spec.excludeMarks);\n\t\tclearExcludedStoredMarks(builder, state, spec.excludeMarks);\n\t}\n\n\tconst tr = builder.setBlockType(sel.anchor.blockId, type, attrs).setSelection(sel).build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n// --- Mark Stripping Helpers ---\n\n/**\n * Adds removeMark steps for each excluded mark type found\n * on the block's inline text content.\n */\nfunction stripExcludedMarks(\n\tbuilder: TransactionBuilder,\n\tblock: BlockNode,\n\texcludeMarks: readonly string[],\n): void {\n\tconst blockLength: number = getBlockLength(block);\n\tif (blockLength === 0) return;\n\n\tconst excludeSet: Set<string> = new Set(excludeMarks);\n\tconst inlineChildren = getInlineChildren(block);\n\tlet offset = 0;\n\n\tfor (const child of inlineChildren) {\n\t\tif (isTextNode(child)) {\n\t\t\tif (child.text.length > 0) {\n\t\t\t\tfor (const mark of child.marks) {\n\t\t\t\t\tif (excludeSet.has(mark.type)) {\n\t\t\t\t\t\tbuilder.removeMark(block.id, offset, offset + child.text.length, mark);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\toffset += child.text.length;\n\t\t} else {\n\t\t\toffset += 1;\n\t\t}\n\t}\n}\n\n/**\n * Clears excluded mark types from stored marks so that\n * subsequent typing does not reintroduce them.\n */\nfunction clearExcludedStoredMarks(\n\tbuilder: TransactionBuilder,\n\tstate: EditorState,\n\texcludeMarks: readonly string[],\n): void {\n\tif (!state.storedMarks) return;\n\n\tconst excludeSet: Set<string> = new Set(excludeMarks);\n\tconst filtered: readonly Mark[] = state.storedMarks.filter((m: Mark) => !excludeSet.has(m.type));\n\n\tif (filtered.length !== state.storedMarks.length) {\n\t\tbuilder.setStoredMarks(filtered.length > 0 ? filtered : null, state.storedMarks);\n\t}\n}\n","/**\n * Input rule registration for heading block types.\n * Converts `# `, `## `, etc. at the start of a paragraph into headings.\n */\n\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { HeadingConfig } from './HeadingPlugin.js';\n\n/** Registers markdown-style input rules (e.g. `# ` → H1) for configured heading levels. */\nexport function registerHeadingInputRules(context: PluginContext, config: HeadingConfig): void {\n\tfor (const level of config.levels) {\n\t\tconst hashes: string = '#'.repeat(level);\n\t\tconst pattern: RegExp = new RegExp(`^${hashes} $`);\n\n\t\tcontext.registerInputRule({\n\t\t\tpattern,\n\t\t\thandler(state, _match, start, _end) {\n\t\t\t\tconst sel = state.selection;\n\t\t\t\tif (!isTextSelection(sel)) return null;\n\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, start, start + level + 1)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('heading'), { level })\n\t\t\t\t\t.setSelection(createCollapsedSelection(sel.anchor.blockId, 0))\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n}\n","/**\n * Keyboard handlers for heading block types.\n * Handles Enter key behavior: empty heading → paragraph, cursor at end → split + paragraph.\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport { generateBlockId, getBlockLength, getBlockText } from '../../model/Document.js';\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\nimport type { HeadingConfig } from './HeadingPlugin.js';\n\n// --- Context Guard ---\n\nconst HEADING_TYPES: ReadonlySet<string> = new Set(['heading', 'title', 'subtitle']);\n\ninterface HeadingContext {\n\treadonly state: EditorState;\n\treadonly block: BlockNode;\n\treadonly blockId: BlockId;\n\treadonly offset: number;\n}\n\n/**\n * Guards against NodeSelection, non-collapsed selections, and non-heading blocks.\n * Returns false (not handled) if the cursor is not inside a heading-type block.\n */\nfunction withHeadingContext(\n\tcontext: PluginContext,\n\thandler: (ctx: HeadingContext) => boolean,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\n\tconst sel = state.selection;\n\tif (!isCollapsed(sel)) return false;\n\n\tconst block: BlockNode | undefined = state.getBlock(sel.anchor.blockId);\n\tif (!block || !HEADING_TYPES.has(block.type)) return false;\n\n\treturn handler({\n\t\tstate,\n\t\tblock,\n\t\tblockId: sel.anchor.blockId,\n\t\toffset: sel.anchor.offset,\n\t});\n}\n\n/** Registers all heading keyboard handlers (Enter, Mod-Shift-N shortcuts). */\nexport function registerHeadingKeymaps(context: PluginContext, config: HeadingConfig): void {\n\tconst keymap: Record<string, () => boolean> = {\n\t\tEnter: () => handleEnter(context),\n\t};\n\n\tfor (const level of config.levels) {\n\t\tif (level <= 6) {\n\t\t\tkeymap[`Mod-Shift-${level}`] = () => context.executeCommand(`setHeading${level}`);\n\t\t}\n\t}\n\n\tcontext.registerKeymap(keymap);\n}\n\n// --- Enter Handler ---\n\n/**\n * Handles Enter inside a heading block.\n * Empty heading → convert to paragraph.\n * Cursor at end → split and convert new block to paragraph.\n * Cursor in middle → normal split (both stay heading).\n */\nfunction handleEnter(context: PluginContext): boolean {\n\treturn withHeadingContext(context, (ctx) => {\n\t\tconst text: string = getBlockText(ctx.block);\n\n\t\tif (text === '') {\n\t\t\tconst tr = ctx.state\n\t\t\t\t.transaction('input')\n\t\t\t\t.setBlockType(ctx.blockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(ctx.state.selection)\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\tconst blockLength: number = getBlockLength(ctx.block);\n\n\t\tif (ctx.offset >= blockLength) {\n\t\t\tconst newBlockId = generateBlockId();\n\t\t\tconst tr = ctx.state\n\t\t\t\t.transaction('input')\n\t\t\t\t.splitBlock(ctx.blockId, ctx.offset, newBlockId)\n\t\t\t\t.setBlockType(newBlockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(createCollapsedSelection(newBlockId, 0))\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t});\n}\n","/**\n * Locale interface and default English locale for the HeadingPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface HeadingLocale {\n\treadonly paragraph: string;\n\treadonly title: string;\n\treadonly subtitle: string;\n\treadonly heading1: string;\n\treadonly heading2: string;\n\treadonly heading3: string;\n\treadonly heading4: string;\n\treadonly heading5: string;\n\treadonly heading6: string;\n\treadonly blockTypeLabel: string;\n\treadonly blockTypesAria: string;\n}\n\n// --- Default English Locale ---\n\nexport const HEADING_LOCALE_EN: HeadingLocale = {\n\tparagraph: 'Paragraph',\n\ttitle: 'Title',\n\tsubtitle: 'Subtitle',\n\theading1: 'Heading 1',\n\theading2: 'Heading 2',\n\theading3: 'Heading 3',\n\theading4: 'Heading 4',\n\theading5: 'Heading 5',\n\theading6: 'Heading 6',\n\tblockTypeLabel: 'Block Type',\n\tblockTypesAria: 'Block types',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: HeadingLocale }>> = import.meta.glob<{\n\tdefault: HeadingLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadHeadingLocale(lang: string): Promise<HeadingLocale> {\n\tif (lang === 'en') return HEADING_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return HEADING_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn HEADING_LOCALE_EN;\n\t}\n}\n","/**\n * HeadingPlugin: registers Title, Subtitle, and H1–H6 heading block types\n * with NodeSpec, toggle commands, keyboard shortcuts, input rules, and a\n * combobox-style toolbar dropdown that reflects the current block type.\n *\n * This file is a thin orchestrator — command logic, input rules, keyboard\n * handlers, and picker/toolbar rendering are delegated to dedicated modules.\n */\n\nimport { HEADING_SELECT_CSS } from '../../editor/styles/heading-select.js';\nimport type { BlockAlignment } from '../../model/BlockAlignment.js';\nimport { createBlockElement } from '../../view/DomUtils.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport {\n\tregisterHeadingPickerEntries,\n\tregisterHeadingToolbarItem,\n} from './HeadingBlockTypePicker.js';\nimport { registerHeadingCommands } from './HeadingCommands.js';\nimport { registerHeadingInputRules } from './HeadingInputRules.js';\nimport { registerHeadingKeymaps } from './HeadingKeyboardHandlers.js';\nimport { HEADING_LOCALE_EN, type HeadingLocale, loadHeadingLocale } from './HeadingLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\theading: { level: HeadingLevel; align?: BlockAlignment };\n\t\ttitle: { align?: BlockAlignment };\n\t\tsubtitle: { align?: BlockAlignment };\n\t}\n}\n\n// --- Configuration ---\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface HeadingConfig {\n\t/** Which heading levels to enable. Defaults to [1, 2, 3, 4, 5, 6]. */\n\treadonly levels: readonly HeadingLevel[];\n\treadonly locale?: HeadingLocale;\n}\n\nconst DEFAULT_CONFIG: HeadingConfig = {\n\tlevels: [1, 2, 3, 4, 5, 6],\n};\n\n// --- Heading Tag Mapping ---\n\nconst HEADING_TAGS: Record<HeadingLevel, string> = {\n\t1: 'h1',\n\t2: 'h2',\n\t3: 'h3',\n\t4: 'h4',\n\t5: 'h5',\n\t6: 'h6',\n};\n\n// --- Plugin ---\n\nexport class HeadingPlugin implements Plugin {\n\treadonly id = 'heading';\n\treadonly name = 'Heading';\n\treadonly priority = 30;\n\n\tprivate readonly config: HeadingConfig;\n\tprivate locale!: HeadingLocale;\n\n\tconstructor(config?: Partial<HeadingConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tHEADING_LOCALE_EN,\n\t\t\tloadHeadingLocale,\n\t\t);\n\t\tcontext.registerStyleSheet(HEADING_SELECT_CSS);\n\n\t\tthis.registerNodeSpecs(context);\n\t\tregisterHeadingCommands(context, this.config);\n\t\tregisterHeadingKeymaps(context, this.config);\n\t\tregisterHeadingInputRules(context, this.config);\n\t\tregisterHeadingPickerEntries(context, this.config, this.locale);\n\t\tregisterHeadingToolbarItem(context, this.locale);\n\t}\n\n\tprivate registerNodeSpecs(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'title',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\texcludeMarks: ['fontSize'],\n\t\t\ttoDOM(node) {\n\t\t\t\tconst el = createBlockElement('h1', node.id);\n\t\t\t\tel.classList.add('notectl-title');\n\t\t\t\treturn el;\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<h1 class=\"notectl-title\">${content || '<br>'}</h1>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'h1',\n\t\t\t\t\tpriority: 60,\n\t\t\t\t\tgetAttrs: (el) => (el.classList.contains('notectl-title') ? {} : false),\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['h1'], attrs: ['class'] },\n\t\t});\n\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'subtitle',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\texcludeMarks: ['fontSize'],\n\t\t\ttoDOM(node) {\n\t\t\t\tconst el = createBlockElement('h2', node.id);\n\t\t\t\tel.classList.add('notectl-subtitle');\n\t\t\t\treturn el;\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<h2 class=\"notectl-subtitle\">${content || '<br>'}</h2>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'h2',\n\t\t\t\t\tpriority: 60,\n\t\t\t\t\tgetAttrs: (el) => (el.classList.contains('notectl-subtitle') ? {} : false),\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['h2'], attrs: ['class'] },\n\t\t});\n\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'heading',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\texcludeMarks: ['fontSize'],\n\t\t\tattrs: {\n\t\t\t\tlevel: { default: 1 },\n\t\t\t},\n\t\t\ttoDOM(node) {\n\t\t\t\tconst level = node.attrs?.level ?? 1;\n\t\t\t\tconst tag = HEADING_TAGS[level] ?? 'h1';\n\t\t\t\treturn createBlockElement(tag, node.id);\n\t\t\t},\n\t\t\ttoHTML(node, content) {\n\t\t\t\tconst level = (node.attrs?.level ?? 1) as HeadingLevel;\n\t\t\t\tconst tag: string = HEADING_TAGS[level] ?? 'h1';\n\t\t\t\treturn `<${tag}>${content || '<br>'}</${tag}>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{ tag: 'h1', getAttrs: () => ({ level: 1 }) },\n\t\t\t\t{ tag: 'h2', getAttrs: () => ({ level: 2 }) },\n\t\t\t\t{ tag: 'h3', getAttrs: () => ({ level: 3 }) },\n\t\t\t\t{ tag: 'h4', getAttrs: () => ({ level: 4 }) },\n\t\t\t\t{ tag: 'h5', getAttrs: () => ({ level: 5 }) },\n\t\t\t\t{ tag: 'h6', getAttrs: () => ({ level: 6 }) },\n\t\t\t],\n\t\t\tsanitize: { tags: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] },\n\t\t});\n\t}\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{r as e}from"./HTMLUtils-BLwp5G4f.mjs";import{s as t}from"./StyleRuntime-0yPPJK9H.mjs";import{i as r}from"./PluginHelpers-DLKHJWJn.mjs";import{a as o,t as a}from"./ColorValidation-3viVw_tK.mjs";import{t as s}from"./color-picker-DumtHdqh.mjs";import{a as i,i as l,t as c}from"./ColorPickerPopup-JJQ-gMBN.mjs";var f={label:"Highlight",tooltip:"Highlight Color",resetLabel:"None",ariaLabelPrefix:"Highlight color"},n=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-CeO_osWz.mjs"),"./locales/de.ts":()=>import("./de-DJbvKl4E.mjs"),"./locales/es.ts":()=>import("./es-Bhhj-yh0.mjs"),"./locales/fr.ts":()=>import("./fr-DXkQUerf.mjs"),"./locales/hi.ts":()=>import("./hi-Dj4JW-9k.mjs"),"./locales/pt.ts":()=>import("./pt-CtOdAphq.mjs"),"./locales/ru.ts":()=>import("./ru-IzloX5CY.mjs"),"./locales/zh.ts":()=>import("./zh-D6gTQA2W.mjs")});async function g(e){if("en"===e)return f;const t=n[`./locales/${e}.ts`];if(!t)return f;try{return(await t()).default}catch{return f}}var h=["#fff176","#aed581","#4dd0e1","#64b5f6","#ce93d8","#f48fb1","#ffab91","#ff8a65","#e6ee9c","#80cbc4","#fff9c4","#dcedc8","#e0f7fa","#e3f2fd","#f3e5f5","#fce4ec","#fff3e0","#fbe9e7","#f9fbe7","#e0f2f1","#fff59d","#c5e1a5","#80deea","#90caf9","#e1bee7","#f8bbd0","#ffcc80","#ffab91","#e6ee9c","#a5d6a7","#ffee58","#9ccc65","#26c6da","#42a5f5","#ab47bc","#ec407a","#ffa726","#ff7043","#d4e157","#66bb6a","#ffffff","#fafafa","#f5f5f5","#eeeeee","#e0e0e0","#bdbdbd","#e8eaf6","#efebe9","#eceff1","#fafafa"],m=class{id="highlight";name="Highlight";priority=24;config;colors;locale;constructor(e){this.config={...e},this.colors=o(e?.colors,h,"HighlightPlugin")}async init(e){this.locale=await r(e,this.config.locale,f,g),e.registerStyleSheet(s),this.registerMarkSpec(e),this.registerCommands(e),this.registerToolbarItem(e)}registerMarkSpec(r){r.registerMarkSpec({type:"highlight",rank:4,attrs:{color:{default:""}},toDOM(e){const r=document.createElement("span");return t(r,"backgroundColor",e.attrs?.color??""),r},toHTMLString:(t,r,o)=>{const s=String(t.attrs?.color??"");if(!s||!a(s))return r;const i=`background-color: ${e(s)}`;return`<span${o?.styleAttr(i)??` style="${i}"`}>${r}</span>`},toHTMLStyle:t=>{const r=String(t.attrs?.color??"");return r&&a(r)?`background-color: ${e(r)}`:null},parseHTML:[{tag:"span",getAttrs:e=>{const t=e.style.backgroundColor;return!(!t||!a(t))&&{color:t}}}],sanitize:{tags:["span"]}})}registerCommands(e){e.registerCommand("removeHighlight",()=>i(e,e.getState(),"highlight"))}registerToolbarItem(e){const t=['<svg xmlns="http://www.w3.org/2000/svg"',' viewBox="0 0 24 24">','<path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/>','<rect x="3" y="17" width="18" height="6"',' rx="0.5" fill="#fff176"/>',"</svg>"].join("");e.registerToolbarItem({id:"highlight",group:"format",icon:t,label:this.locale.label,tooltip:this.locale.tooltip,command:"removeHighlight",popupType:"custom",renderPopup:(e,t,r)=>{c(e,t,{markType:"highlight",colors:this.colors,columns:10,resetLabel:this.locale.resetLabel,resetCommand:"removeHighlight",ariaLabelPrefix:this.locale.ariaLabelPrefix,onClose:r})},isActive:e=>l(e,"highlight")})}};export{f as n,g as r,m as t};
2
- //# sourceMappingURL=HighlightPlugin-LYARYuDC.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HighlightPlugin-LYARYuDC.mjs","names":[],"sources":["../../src/plugins/highlight/HighlightLocale.ts","../../src/plugins/highlight/HighlightPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the HighlightPlugin. */\n\n// --- Locale Interface ---\n\nexport interface HighlightLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n\treadonly resetLabel: string;\n\treadonly ariaLabelPrefix: string;\n}\n\n// --- Default English Locale ---\n\nexport const HIGHLIGHT_LOCALE_EN: HighlightLocale = {\n\tlabel: 'Highlight',\n\ttooltip: 'Highlight Color',\n\tresetLabel: 'None',\n\tariaLabelPrefix: 'Highlight color',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: HighlightLocale }>> =\n\timport.meta.glob<{ default: HighlightLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadHighlightLocale(lang: string): Promise<HighlightLocale> {\n\tif (lang === 'en') return HIGHLIGHT_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return HIGHLIGHT_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn HIGHLIGHT_LOCALE_EN;\n\t}\n}\n","/**\n * HighlightPlugin: registers a highlight (background-color) mark with attrs,\n * toolbar button with a color picker popup, and removeHighlight command.\n */\n\nimport { COLOR_PICKER_CSS } from '../../editor/styles/color-picker.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { HTMLExportContext } from '../../model/NodeSpec.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isColorMarkActive, removeColorMark } from '../shared/ColorMarkOperations.js';\nimport { renderColorPickerPopup } from '../shared/ColorPickerPopup.js';\nimport { isValidCSSColor, resolveColors } from '../shared/ColorValidation.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport {\n\tHIGHLIGHT_LOCALE_EN,\n\ttype HighlightLocale,\n\tloadHighlightLocale,\n} from './HighlightLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\thighlight: { color: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface HighlightConfig {\n\t/**\n\t * Restricts the color picker to a specific set of hex colors.\n\t * Each value must be a valid hex color code (`#RGB` or `#RRGGBB`).\n\t * Duplicates are removed automatically (case-insensitive).\n\t * When omitted, the full default palette is shown.\n\t */\n\treadonly colors?: readonly string[];\n\treadonly locale?: HighlightLocale;\n}\n\n// --- Color Palette (Highlight-optimized: 10 columns x 5 rows) ---\n\nconst HIGHLIGHT_PALETTE: readonly string[] = [\n\t// Row 1 — Classic highlighter colors (bright, vivid)\n\t'#fff176',\n\t'#aed581',\n\t'#4dd0e1',\n\t'#64b5f6',\n\t'#ce93d8',\n\t'#f48fb1',\n\t'#ffab91',\n\t'#ff8a65',\n\t'#e6ee9c',\n\t'#80cbc4',\n\t// Row 2 — Light pastels\n\t'#fff9c4',\n\t'#dcedc8',\n\t'#e0f7fa',\n\t'#e3f2fd',\n\t'#f3e5f5',\n\t'#fce4ec',\n\t'#fff3e0',\n\t'#fbe9e7',\n\t'#f9fbe7',\n\t'#e0f2f1',\n\t// Row 3 — Medium pastels\n\t'#fff59d',\n\t'#c5e1a5',\n\t'#80deea',\n\t'#90caf9',\n\t'#e1bee7',\n\t'#f8bbd0',\n\t'#ffcc80',\n\t'#ffab91',\n\t'#e6ee9c',\n\t'#a5d6a7',\n\t// Row 4 — Bold pastels\n\t'#ffee58',\n\t'#9ccc65',\n\t'#26c6da',\n\t'#42a5f5',\n\t'#ab47bc',\n\t'#ec407a',\n\t'#ffa726',\n\t'#ff7043',\n\t'#d4e157',\n\t'#66bb6a',\n\t// Row 5 — Grays and neutral highlights\n\t'#ffffff',\n\t'#fafafa',\n\t'#f5f5f5',\n\t'#eeeeee',\n\t'#e0e0e0',\n\t'#bdbdbd',\n\t'#e8eaf6',\n\t'#efebe9',\n\t'#eceff1',\n\t'#fafafa',\n];\n\n// --- Plugin ---\n\nexport class HighlightPlugin implements Plugin {\n\treadonly id = 'highlight';\n\treadonly name = 'Highlight';\n\treadonly priority = 24;\n\n\tprivate readonly config: HighlightConfig;\n\tprivate readonly colors: readonly string[];\n\tprivate locale!: HighlightLocale;\n\n\tconstructor(config?: Partial<HighlightConfig>) {\n\t\tthis.config = { ...config };\n\t\tthis.colors = resolveColors(config?.colors, HIGHLIGHT_PALETTE, 'HighlightPlugin');\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tHIGHLIGHT_LOCALE_EN,\n\t\t\tloadHighlightLocale,\n\t\t);\n\n\t\tcontext.registerStyleSheet(COLOR_PICKER_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'highlight',\n\t\t\trank: 4,\n\t\t\tattrs: {\n\t\t\t\tcolor: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tconst color = mark.attrs?.color ?? '';\n\t\t\t\tsetStyleProperty(span, 'backgroundColor', color);\n\t\t\t\treturn span;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content, ctx?: HTMLExportContext) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\tif (!color || !isValidCSSColor(color)) return content;\n\t\t\t\tconst decl: string = `background-color: ${escapeHTML(color)}`;\n\t\t\t\tconst attr: string = ctx?.styleAttr(decl) ?? ` style=\"${decl}\"`;\n\t\t\t\treturn `<span${attr}>${content}</span>`;\n\t\t\t},\n\t\t\ttoHTMLStyle: (mark) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\tif (!color || !isValidCSSColor(color)) return null;\n\t\t\t\treturn `background-color: ${escapeHTML(color)}`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst color: string = el.style.backgroundColor;\n\t\t\t\t\t\tif (!color || !isValidCSSColor(color)) return false;\n\t\t\t\t\t\treturn { color };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['span'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeHighlight', () => {\n\t\t\treturn removeColorMark(context, context.getState(), 'highlight');\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst pathD =\n\t\t\t'M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2z' + 'm-1.38 9L12 5.67 14.38 12H9.62z';\n\t\tconst icon: string = [\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\"',\n\t\t\t' viewBox=\"0 0 24 24\">',\n\t\t\t`<path d=\"${pathD}\"/>`,\n\t\t\t'<rect x=\"3\" y=\"17\" width=\"18\" height=\"6\"',\n\t\t\t' rx=\"0.5\" fill=\"#fff176\"/>',\n\t\t\t'</svg>',\n\t\t].join('');\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'highlight',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeHighlight',\n\t\t\tpopupType: 'custom',\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderColorPickerPopup(container, ctx, {\n\t\t\t\t\tmarkType: 'highlight',\n\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\tcolumns: 10,\n\t\t\t\t\tresetLabel: this.locale.resetLabel,\n\t\t\t\t\tresetCommand: 'removeHighlight',\n\t\t\t\t\tariaLabelPrefix: this.locale.ariaLabelPrefix,\n\t\t\t\t\tonClose,\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (state: EditorState) => isColorMarkActive(state, 'highlight'),\n\t\t});\n\t}\n}\n"],"mappings":"0TAaA,IAAa,EAAuC,CACnD,MAAO,YACP,QAAS,kBACT,WAAY,OACZ,gBAAiB,mBAKZ,iBACL,OAAA,OAAA,CAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,uBAED,eAAsB,EAAoB,GACzC,GAAa,OAAT,EAAe,OAAO,EAC1B,MAAM,EAAS,EAAc,aAAa,QAC1C,IAAK,EAAQ,OAAO,EACpB,IAEC,aADkB,KACP,cAEX,OAAO,GCWT,IAAM,EAAuC,CAE5C,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAKY,EAAb,MACC,GAAc,YACd,KAAgB,YAChB,SAAoB,GAEpB,OACA,OACA,OAEA,WAAA,CAAY,GACX,KAAK,OAAS,IAAK,GACnB,KAAK,OAAS,EAAc,GAAQ,OAAQ,EAAmB,mBAGhE,UAAM,CAAK,GACV,KAAK,aAAe,EACnB,EACA,KAAK,OAAO,OACZ,EACA,GAGD,EAAQ,mBAAmB,GAC3B,KAAK,iBAAiB,GACtB,KAAK,iBAAiB,GACtB,KAAK,oBAAoB,GAG1B,gBAAA,CAAyB,GACxB,EAAQ,iBAAiB,CACxB,KAAM,YACN,KAAM,EACN,MAAO,CACN,MAAO,CAAE,QAAS,KAEnB,KAAA,CAAM,GACL,MAAM,EAAO,SAAS,cAAc,QAGpC,OADA,EAAiB,EAAM,kBADT,EAAK,OAAO,OAAS,IAE5B,GAER,aAAA,CAAe,EAAM,EAAS,KAC7B,MAAM,EAAgB,OAAO,EAAK,OAAO,OAAS,IAClD,IAAK,IAAU,EAAgB,GAAQ,OAAO,EAC9C,MAAM,EAAe,qBAAqB,EAAW,KAErD,MAAO,QADc,GAAK,UAAU,IAAS,WAAW,QACjC,YAExB,YAAc,IACb,MAAM,EAAgB,OAAO,EAAK,OAAO,OAAS,IAClD,OAAK,GAAU,EAAgB,GACxB,qBAAqB,EAAW,KADO,MAG/C,UAAW,CACV,CACC,IAAK,OACL,SAAW,IACV,MAAM,EAAgB,EAAG,MAAM,gBAC/B,SAAK,IAAU,EAAgB,KACxB,CAAE,YAIZ,SAAU,CAAE,KAAM,CAAC,WAIrB,gBAAA,CAAyB,GACxB,EAAQ,gBAAgB,kBAAA,IAChB,EAAgB,EAAS,EAAQ,WAAY,cAItD,mBAAA,CAA4B,GAG3B,MAAM,EAAe,CACpB,0CACA,wBACA,gGACA,2CACA,6BACA,UACC,KAAK,IAEP,EAAQ,oBAAoB,CAC3B,GAAI,YACJ,MAAO,SACP,OACA,MAAO,KAAK,OAAO,MACnB,QAAS,KAAK,OAAO,QACrB,QAAS,kBACT,UAAW,SACX,YAAA,CAAc,EAAW,EAAK,KAC7B,EAAuB,EAAW,EAAK,CACtC,SAAU,YACV,OAAQ,KAAK,OACb,QAAS,GACT,WAAY,KAAK,OAAO,WACxB,aAAc,kBACd,gBAAiB,KAAK,OAAO,gBAC7B,aAGF,SAAW,GAAuB,EAAkB,EAAO"}
@@ -1,2 +0,0 @@
1
- import{r as t}from"./Document-CkQLx84k.mjs";import{o as r,t as e,u as o}from"./Selection-B14e7gd0.mjs";import{a as i}from"./TypeBrands-BQR8dEYU.mjs";import{n as s}from"./DomUtils-BkyCg-OO.mjs";import{i as l}from"./PluginHelpers-DLKHJWJn.mjs";import{t as n}from"./ShortcutFormatting-DQPMvupx.mjs";var a={label:"Horizontal Rule",tooltip:t=>`Horizontal Rule (${t})`},c=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-CA0-ysCj.mjs"),"./locales/de.ts":()=>import("./de-B5xIP9en.mjs"),"./locales/es.ts":()=>import("./es-89LD3TlT.mjs"),"./locales/fr.ts":()=>import("./fr-DtfEjLSL.mjs"),"./locales/hi.ts":()=>import("./hi-B2kXjElO.mjs"),"./locales/pt.ts":()=>import("./pt-B8VKEboV.mjs"),"./locales/ru.ts":()=>import("./ru-7m8CMM17.mjs"),"./locales/zh.ts":()=>import("./zh-Dl0oVWiK.mjs")});async function m(t){if("en"===t)return a;const r=c[`./locales/${t}.ts`];if(!r)return a;try{return(await r()).default}catch{return a}}var u={};function p(t){const r=t.selection;return o(r)?t.doc.children.findIndex(t=>t.id===r.anchor.blockId):-1}var h=class{id="horizontal-rule";name="Horizontal Rule";priority=40;config;locale;constructor(t){this.config={...u,...t}}async init(t){this.locale=await l(t,this.config.locale,a,m),this.registerNodeSpec(t),this.registerCommands(t),this.registerKeymap(t),this.registerInputRule(t),this.registerToolbarItem(t)}registerNodeSpec(t){t.registerNodeSpec({type:"horizontal_rule",group:"block",isVoid:!0,toDOM:t=>s("hr",t.id),toHTML:()=>"<hr>",parseHTML:[{tag:"hr"}],sanitize:{tags:["hr"]}})}registerCommands(t){t.registerCommand("insertHorizontalRule",()=>this.insertHorizontalRule(t))}registerKeymap(t){t.registerKeymap({"Mod-Shift-H":()=>t.executeCommand("insertHorizontalRule")})}registerInputRule(s){s.registerInputRule({pattern:/^-{3,} $/,handler(s,l,n,a){const c=s.selection;if(!o(c))return null;if(!r(c))return null;const m=s.getBlock(c.anchor.blockId);if(!m||"paragraph"!==m.type)return null;const u=p(s);if(-1===u)return null;const h=t(i("paragraph"));return s.transaction("input").deleteTextAt(c.anchor.blockId,0,a).setBlockType(c.anchor.blockId,i("horizontal_rule")).insertNode([],u+1,h).setSelection(e(h.id,0)).build()}})}registerToolbarItem(t){t.registerToolbarItem({id:"horizontal-rule",group:"block",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11h16v2H4z"/></svg>',label:this.locale.label,tooltip:this.locale.tooltip(n("Mod-Shift-H")),command:"insertHorizontalRule",isActive:()=>!1})}insertHorizontalRule(r){const s=r.getState();if(!o(s.selection))return!1;const l=p(s);if(-1===l)return!1;const n=t(i("horizontal_rule")),a=t(i("paragraph")),c=s.transaction("command").insertNode([],l+1,n).insertNode([],l+2,a).setSelection(e(a.id,0)).build();return r.dispatch(c),!0}};export{a as n,m as r,h as t};
2
- //# sourceMappingURL=HorizontalRulePlugin-fmdbzWDQ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HorizontalRulePlugin-fmdbzWDQ.mjs","names":[],"sources":["../../src/plugins/horizontal-rule/HorizontalRuleLocale.ts","../../src/plugins/horizontal-rule/HorizontalRulePlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the HorizontalRulePlugin. */\n\n// --- Locale Interface ---\n\nexport interface HorizontalRuleLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const HORIZONTAL_RULE_LOCALE_EN: HorizontalRuleLocale = {\n\tlabel: 'Horizontal Rule',\n\ttooltip: (shortcut: string) => `Horizontal Rule (${shortcut})`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: HorizontalRuleLocale }>> =\n\timport.meta.glob<{ default: HorizontalRuleLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadHorizontalRuleLocale(lang: string): Promise<HorizontalRuleLocale> {\n\tif (lang === 'en') return HORIZONTAL_RULE_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return HORIZONTAL_RULE_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn HORIZONTAL_RULE_LOCALE_EN;\n\t}\n}\n","/**\n * HorizontalRulePlugin: registers a horizontal rule (divider) void block type\n * with NodeSpec, insert command, input rule, keyboard shortcut, and toolbar button.\n */\n\nimport { createBlockNode } from '../../model/Document.js';\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { createBlockElement } from '../../view/DomUtils.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport {\n\tHORIZONTAL_RULE_LOCALE_EN,\n\ttype HorizontalRuleLocale,\n\tloadHorizontalRuleLocale,\n} from './HorizontalRuleLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\thorizontal_rule: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\nexport interface HorizontalRuleConfig {\n\t/** Locale override for user-facing strings. */\n\treadonly locale?: HorizontalRuleLocale;\n}\n\nconst DEFAULT_CONFIG: HorizontalRuleConfig = {};\n\n// --- Helpers ---\n\n/** Finds the index of the cursor's block among top-level document children. */\nfunction findBlockIndexForCursor(state: EditorState): number {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return -1;\n\treturn state.doc.children.findIndex((b) => b.id === sel.anchor.blockId);\n}\n\n// --- Plugin ---\n\nexport class HorizontalRulePlugin implements Plugin {\n\treadonly id = 'horizontal-rule';\n\treadonly name = 'Horizontal Rule';\n\treadonly priority = 40;\n\n\tprivate readonly config: HorizontalRuleConfig;\n\tprivate locale!: HorizontalRuleLocale;\n\n\tconstructor(config?: Partial<HorizontalRuleConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tHORIZONTAL_RULE_LOCALE_EN,\n\t\t\tloadHorizontalRuleLocale,\n\t\t);\n\t\tthis.registerNodeSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t\tthis.registerInputRule(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerNodeSpec(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'horizontal_rule',\n\t\t\tgroup: 'block',\n\t\t\tisVoid: true,\n\t\t\ttoDOM(node) {\n\t\t\t\treturn createBlockElement('hr', node.id);\n\t\t\t},\n\t\t\ttoHTML() {\n\t\t\t\treturn '<hr>';\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'hr' }],\n\t\t\tsanitize: { tags: ['hr'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('insertHorizontalRule', () => {\n\t\t\treturn this.insertHorizontalRule(context);\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-Shift-H': () => context.executeCommand('insertHorizontalRule'),\n\t\t});\n\t}\n\n\tprivate registerInputRule(context: PluginContext): void {\n\t\tcontext.registerInputRule({\n\t\t\tpattern: /^-{3,} $/,\n\t\t\thandler(state, _match, _start, end) {\n\t\t\t\tconst sel = state.selection;\n\t\t\t\tif (!isTextSelection(sel)) return null;\n\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\tconst blockIndex: number = findBlockIndexForCursor(state);\n\t\t\t\tif (blockIndex === -1) return null;\n\n\t\t\t\tconst newParagraph = createBlockNode(nodeType('paragraph'));\n\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, 0, end)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('horizontal_rule'))\n\t\t\t\t\t.insertNode([], blockIndex + 1, newParagraph)\n\t\t\t\t\t.setSelection(createCollapsedSelection(newParagraph.id, 0))\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst icon =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 11h16v2H4z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'horizontal-rule',\n\t\t\tgroup: 'block',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip(formatShortcut('Mod-Shift-H')),\n\t\t\tcommand: 'insertHorizontalRule',\n\t\t\tisActive: () => false,\n\t\t});\n\t}\n\n\t/**\n\t * Inserts a horizontal rule after the current block,\n\t * followed by a new paragraph for continued editing.\n\t */\n\tprivate insertHorizontalRule(context: PluginContext): boolean {\n\t\tconst state: EditorState = context.getState();\n\t\tif (!isTextSelection(state.selection)) return false;\n\t\tconst blockIndex: number = findBlockIndexForCursor(state);\n\t\tif (blockIndex === -1) return false;\n\n\t\tconst hrBlock = createBlockNode(nodeType('horizontal_rule'));\n\t\tconst newParagraph = createBlockNode(nodeType('paragraph'));\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.insertNode([], blockIndex + 1, hrBlock)\n\t\t\t.insertNode([], blockIndex + 2, newParagraph)\n\t\t\t.setSelection(createCollapsedSelection(newParagraph.id, 0))\n\t\t\t.build();\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n}\n"],"mappings":"wSAWA,IAAa,EAAkD,CAC9D,MAAO,kBACP,QAAU,GAAqB,oBAAoB,MAK9C,iBACL,OAAA,OAAA,CAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,uBAED,eAAsB,EAAyB,GAC9C,GAAa,OAAT,EAAe,OAAO,EAC1B,MAAM,EAAS,EAAc,aAAa,QAC1C,IAAK,EAAQ,OAAO,EACpB,IAEC,aADkB,KACP,cAEX,OAAO,GCKT,IAAM,EAAuC,CAAA,EAK7C,SAAS,EAAwB,GAChC,MAAM,EAAM,EAAM,UAClB,OAAK,EAAgB,GACd,EAAM,IAAI,SAAS,UAAW,GAAM,EAAE,KAAO,EAAI,OAAO,UAD7B,EAMnC,IAAa,EAAb,MACC,GAAc,kBACd,KAAgB,kBAChB,SAAoB,GAEpB,OACA,OAEA,WAAA,CAAY,GACX,KAAK,OAAS,IAAK,KAAmB,GAGvC,UAAM,CAAK,GACV,KAAK,aAAe,EACnB,EACA,KAAK,OAAO,OACZ,EACA,GAED,KAAK,iBAAiB,GACtB,KAAK,iBAAiB,GACtB,KAAK,eAAe,GACpB,KAAK,kBAAkB,GACvB,KAAK,oBAAoB,GAG1B,gBAAA,CAAyB,GACxB,EAAQ,iBAAiB,CACxB,KAAM,kBACN,MAAO,QACP,QAAQ,EACR,MAAM,GACE,EAAmB,KAAM,EAAK,IAEtC,OAAA,IACQ,OAER,UAAW,CAAC,CAAE,IAAK,OACnB,SAAU,CAAE,KAAM,CAAC,SAIrB,gBAAA,CAAyB,GACxB,EAAQ,gBAAgB,uBAAA,IAChB,KAAK,qBAAqB,IAInC,cAAA,CAAuB,GACtB,EAAQ,eAAe,CACtB,cAAA,IAAqB,EAAQ,eAAe,0BAI9C,iBAAA,CAA0B,GACzB,EAAQ,kBAAkB,CACzB,QAAS,WACT,OAAA,CAAQ,EAAO,EAAQ,EAAQ,GAC9B,MAAM,EAAM,EAAM,UAClB,IAAK,EAAgB,GAAM,OAAO,KAClC,IAAK,EAAY,GAAM,OAAO,KAE9B,MAAM,EAAQ,EAAM,SAAS,EAAI,OAAO,SACxC,IAAK,GAAwB,cAAf,EAAM,KAAsB,OAAO,KAEjD,MAAM,EAAqB,EAAwB,GACnD,IAAmB,IAAf,EAAmB,OAAO,KAE9B,MAAM,EAAe,EAAgB,EAAS,cAE9C,OAAO,EACL,YAAY,SACZ,aAAa,EAAI,OAAO,QAAS,EAAG,GACpC,aAAa,EAAI,OAAO,QAAS,EAAS,oBAC1C,WAAW,GAAI,EAAa,EAAG,GAC/B,aAAa,EAAyB,EAAa,GAAI,IACvD,WAKL,mBAAA,CAA4B,GAI3B,EAAQ,oBAAoB,CAC3B,GAAI,kBACJ,MAAO,QACP,KALA,8FAMA,MAAO,KAAK,OAAO,MACnB,QAAS,KAAK,OAAO,QAAQ,EAAe,gBAC5C,QAAS,uBACT,SAAA,KAAgB,IAQlB,oBAAA,CAA6B,GAC5B,MAAM,EAAqB,EAAQ,WACnC,IAAK,EAAgB,EAAM,WAAY,OAAO,EAC9C,MAAM,EAAqB,EAAwB,GACnD,IAAmB,IAAf,EAAmB,OAAO,EAE9B,MAAM,EAAU,EAAgB,EAAS,oBACnC,EAAe,EAAgB,EAAS,cAExC,EAAK,EACT,YAAY,WACZ,WAAW,GAAI,EAAa,EAAG,GAC/B,WAAW,GAAI,EAAa,EAAG,GAC/B,aAAa,EAAyB,EAAa,GAAI,IACvD,QAGF,OADA,EAAQ,SAAS,IACV"}
@@ -1,2 +0,0 @@
1
- import{c as t,r as e,v as n}from"./Document-CkQLx84k.mjs";import{c as i,l as r,r as o}from"./Selection-B14e7gd0.mjs";import{a}from"./TypeBrands-BQR8dEYU.mjs";import{n as s}from"./DomUtils-BkyCg-OO.mjs";import{r as l}from"./HTMLUtils-BLwp5G4f.mjs";import{t as c}from"./NodeSelectionCommands-CE_73CxF.mjs";import{t as d}from"./Platform-D9TRT4Mn.mjs";import{c as g,o as m,r as u,s as p}from"./StyleRuntime-0yPPJK9H.mjs";import{i as h,l as f}from"./PluginHelpers-DLKHJWJn.mjs";import{t as b}from"./ShortcutFormatting-DQPMvupx.mjs";function v(s,l){const c=s.getState(),d=c.selection,g={src:l.src,alt:l.alt??"",align:l.align??"center",...void 0!==l.width?{width:l.width}:{},...void 0!==l.height?{height:l.height}:{}};if(i(d))return!1;const m=r(d)?d.nodeId:d.anchor.blockId,u=function(t,e){if("table_cell"===t.getBlock(e)?.type)return e;const n=t.getNodePath(e);if(n)for(const i of n)if("table_cell"===t.getBlock(i)?.type)return i}(c,m);return u?function(i,r,s,l){const c=i.getNodePath(s);if(!c)return!1;const d=e(a("image"),[],void 0,l),g=i.getBlock(s);if(!g)return!1;const m=i.transaction("command"),u=t(g);for(let t=u.length-1;t>=0;t--){const e=g.children.findIndex(e=>n(e)&&e.id===u[t]?.id);-1!==e&&m.removeNode(c,e)}return m.insertNode(c,0,d),m.setSelection(o(d.id,[...c,d.id])),r.dispatch(m.build()),!0}(c,s,u,g):function(t,n,i,r){const s=t.doc.children.findIndex(t=>t.id===i);if(-1===s)return!1;const l=e(a("image"),[],void 0,r),c=e(a("paragraph")),d=t.transaction("command").insertNode([],s+1,l).insertNode([],s+2,c).setSelection(o(l.id,[])).build();return n.dispatch(d),!0}(c,s,m,g)}function x(t,e,n){const i=t.getState(),o=i.selection;if(!r(o))return!1;const a=i.getBlock(o.nodeId);if(!a||"image"!==a.type)return!1;const s=a.attrs?.width,l=a.attrs?.height;if(void 0===s||void 0===l)return!1;const c=l>0?s/l:1,d=Math.max(50,Math.min(n,s+e)),g=Math.round(d/c);return(d!==s||g!==l)&&function(t,e){const n=t.getState(),i=n.selection;if(!r(i))return!1;const o=n.getBlock(i.nodeId);if(!o||"image"!==o.type)return!1;const a=n.getNodePath(i.nodeId);if(!a)return!1;const s={...o.attrs??{},...e},l=n.transaction("command").setNodeAttr(a,s).build();return t.dispatch(l),!0}(t,{width:d,height:g})}var w={insertImage:"Insert Image",insertImageTooltip:"Insert Image",uploadFromComputer:"Upload from computer",uploadAria:"Upload image from computer",separator:"or",urlPlaceholder:"https://...",urlAria:"Image URL",insertButton:"Insert",insertAria:"Insert image",imageAria:(t,e,n)=>{const i=[t||"Image"];return void 0!==e&&void 0!==n&&i.push(`${e} by ${n} pixels`),i.join(", ")},resetToNaturalSize:"Image reset to natural size.",uploadFailed:"Upload failed.",uploading:"Uploading...",resizeHandleLabel:t=>`Resize ${t}`,imageSelected:"Image selected.",altTextPrefix:"Alt text: ",imageSizeAnnounce:(t,e)=>`Size: ${t} by ${e} pixels.`,resizeHint:(t,e)=>`${t} / ${e} to resize.`,imageResized:(t,e)=>`Image resized to ${t} by ${e} pixels.`,keyboardResizeHint:(t,e)=>`${t} / ${e} to resize`},z=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-CU6qxyFp.mjs"),"./locales/de.ts":()=>import("./de-gR6jt-sS.mjs"),"./locales/es.ts":()=>import("./es-CIdF7MzV.mjs"),"./locales/fr.ts":()=>import("./fr-CzTPuD1P.mjs"),"./locales/hi.ts":()=>import("./hi-Dx-LTWg-.mjs"),"./locales/pt.ts":()=>import("./pt-jJ0XXSVz.mjs"),"./locales/ru.ts":()=>import("./ru-B5gK8OLp.mjs"),"./locales/zh.ts":()=>import("./zh-CeJw45yo.mjs")});async function y(t){if("en"===t)return w;const e=z[`./locales/${t}.ts`];if(!e)return w;try{return(await e()).default}catch{return w}}var _={start:"notectl-image--start",center:"notectl-image--center",end:"notectl-image--end"},S={nw:"nwse-resize",ne:"nesw-resize",sw:"nesw-resize",se:"nwse-resize"},I={nw:-1,ne:1,sw:-1,se:1},k={nw:"top-left",ne:"top-right",sw:"bottom-left",se:"bottom-right"},L={nw:"top-right",ne:"top-left",sw:"bottom-right",se:"bottom-left"},A={nw:"nesw-resize",ne:"nwse-resize",sw:"nwse-resize",se:"nesw-resize"};function C(t,e,n=w){const i=(e?L:k)[t];return n.resizeHandleLabel(i)}var N=null;function j(){N&&(N.remove(),N=null)}function E(t,e,n,i=w){return(r,o,a)=>{const s=document.createElement("figure");s.className="notectl-image",s.setAttribute("data-block-id",r.id),s.setAttribute("data-void","true"),s.setAttribute("data-selectable","true");const l=document.createElement("div");l.className="notectl-image__container";const c=document.createElement("img");c.className="notectl-image__img",c.draggable=!1;const g=document.createElement("div");g.className="notectl-image__overlay",l.appendChild(c),l.appendChild(g),s.appendChild(l);let h=r.id,f=null;function v(t){const n=t.attrs?.src??"",r=t.attrs?.alt??"",o=t.attrs?.width,a=t.attrs?.height,l=t.attrs?.align??"center";c.src!==n&&(c.src=n),c.alt=r,p(c,"width",void 0!==o?`${o}px`:""),p(c,"height",void 0!==a?`${a}px`:"");for(const e of Object.values(_))s.classList.remove(e);const d=_[l];d&&s.classList.add(d);const m=e.get(t.id)??"idle",u="uploading"===m;g.classList.toggle("notectl-image__overlay--uploading",u),g.classList.toggle("notectl-image__overlay--error","error"===m),g.textContent=u?i.uploading:"error"===m?i.uploadFailed:"",u?s.setAttribute("aria-busy","true"):s.removeAttribute("aria-busy"),function(t){const e=t.attrs?.alt??"",n=t.attrs?.width,r=t.attrs?.height;s.setAttribute("aria-label",i.imageAria(e,n,r))}(t)}v(r);let x=!1;function w(e,n,i,r){let l=0,g=0,p=1,h=I[n];const f=e=>{const n=e.clientX-l,i=(o=g+n*h,Math.max(50,Math.min(t.maxWidth,o)));var o;const a=Math.round(i/p);m(c,{width:`${i}px`,height:`${a}px`}),r.textContent=`${Math.round(i)} × ${a}`},b=t=>{document.removeEventListener("pointermove",f),document.removeEventListener("pointerup",b),s.classList.remove("notectl-image--resizing"),r.classList.remove("notectl-image__size-indicator--visible"),j();const e=Math.round(c.getBoundingClientRect().width);!function(t,e,n){const i=o(),r=i.getBlock(t);if(!r)return;const s=r.attrs?.width,l=r.attrs?.height;if(s===e&&l===n)return;const c=i.getNodePath(t);if(!c)return;const d={...r.attrs??{},width:e,height:n};a(i.transaction("command").setNodeAttr(c,d).build())}(i,e,Math.round(e/p)),t.target?.releasePointerCapture?.(t.pointerId)};e.addEventListener("pointerdown",t=>{t.preventDefault(),t.stopPropagation();const e="rtl"===d(s);h=function(t,e){const n=I[t];return e?-n:n}(n,e),l=t.clientX,g=c.getBoundingClientRect().width;const i=c.getBoundingClientRect().height;p=i>0?g/i:1,s.classList.add("notectl-image--resizing"),r.textContent=`${Math.round(g)} × ${Math.round(i)}`,r.classList.add("notectl-image__size-indicator--visible"),function(t,e){j(),N=document.createElement("style");const n=e?u(e):void 0;n&&N.setAttribute("nonce",n),N.textContent=`*{cursor:${t}!important;user-select:none!important}`,document.head.appendChild(N)}(e?A[n]:S[n],s),t.target.setPointerCapture(t.pointerId),document.addEventListener("pointermove",f),document.addEventListener("pointerup",b)})}function z(){j(),f&&(f.remove(),f=null)}return c.addEventListener("load",()=>{if(x)return;const e=o(),n=e.getBlock(h);if(!n||"image"!==n.type)return;const i=void 0!==n.attrs?.width,r=void 0!==n.attrs?.height;if(i&&r)return void(x=!0);const s=c.naturalWidth,l=c.naturalHeight;if(0===s||0===l)return;const d=Math.min(s,t.maxWidth),g=s>0?l/s:1,m=Math.round(d*g),u=e.getNodePath(h);if(!u)return;const p={...n.attrs??{},width:d,height:m};a(e.transaction("command").setNodeAttr(u,p).build()),x=!0}),{dom:s,contentDOM:null,update:t=>"image"===t.type&&(h=t.id,s.setAttribute("data-block-id",t.id),v(t),!0),selectNode(){s.classList.add("notectl-image--selected"),function(e){if(!t.resizable||f)return;f=document.createElement("div"),f.className="notectl-image__resize-overlay",f.setAttribute("data-notectl-no-print","");const r=document.createElement("div");r.className="notectl-image__size-indicator",f.appendChild(r);const o="rtl"===d(s);for(const t of["nw","ne","sw","se"]){const n=document.createElement("div");n.className=`notectl-image__resize-handle notectl-image__resize-handle--${t}`,n.setAttribute("role","separator"),n.setAttribute("aria-label",C(t,o,i)),w(n,t,e,r),f.appendChild(n)}if(n){const t=function(t,e){const n=t.shrinkWidth??null,i=t.growWidth??null;return n&&i?e.keyboardResizeHint(b(n),b(i)):""}(n,i);if(t){const e=document.createElement("div");e.className="notectl-image__keyboard-hint",e.setAttribute("aria-hidden","true"),e.textContent=t,f.appendChild(e)}}l.appendChild(f)}(h)},deselectNode(){s.classList.remove("notectl-image--selected"),z()},destroy(){z()}}}}var $=new f("image:upload"),R={growWidth:"Mod-Shift-ArrowRight",shrinkWidth:"Mod-Shift-ArrowLeft",growWidthLarge:"Mod-Shift-Alt-ArrowRight",shrinkWidthLarge:"Mod-Shift-Alt-ArrowLeft",resetSize:"Mod-Shift-0"},M={maxWidth:800,maxFileSize:10485760,acceptedTypes:["image/png","image/jpeg","image/gif","image/webp","image/svg+xml"],resizable:!0,resizeStep:10,resizeStepLarge:50},T=class{id="image";name="Image";priority=45;config;resolvedKeymap;uploadStates=/* @__PURE__ */new Map;blobUrls=/* @__PURE__ */new Set;context=null;locale;constructor(t){this.config={...M,...t},this.resolvedKeymap={...R,...t?.keymap}}async init(t){this.locale=await h(t,this.config.locale,w,y),t.registerStyleSheet('\n/* Image */\n.notectl-image {\n\tmargin: 8px 0;\n\tuser-select: none;\n\tline-height: 0;\n}\n\n.notectl-image--center {\n\ttext-align: center;\n}\n\n.notectl-image--start {\n\ttext-align: start;\n}\n\n.notectl-image--end {\n\ttext-align: end;\n}\n\n.notectl-image__container {\n\tdisplay: inline-block;\n\tposition: relative;\n\tline-height: 0;\n}\n\n.notectl-image__img {\n\tdisplay: block;\n\tmax-width: 100%;\n\tborder-radius: 4px;\n}\n\n.notectl-image--selected .notectl-image__container {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 2px;\n\tborder-radius: 6px;\n}\n\n/* Alignment toolbar (appears on image selection) */\n.notectl-image__align-toolbar {\n\tdisplay: flex;\n\tgap: 2px;\n\tposition: absolute;\n\ttop: -36px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tpadding: 2px;\n\tbox-shadow: 0 2px 8px var(--notectl-shadow);\n\tz-index: 10;\n}\n\n.notectl-image__align-btn {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\theight: 28px;\n\tborder: none;\n\tbackground: transparent;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n}\n\n.notectl-image__align-btn:hover {\n\tbackground: var(--notectl-hover-bg);\n}\n\n.notectl-image__align-btn--active {\n\tbackground: var(--notectl-active-bg);\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-image__align-btn svg {\n\twidth: 16px;\n\theight: 16px;\n\tfill: currentColor;\n}\n\n/* Upload overlay */\n.notectl-image__overlay {\n\tposition: absolute;\n\tinset: 0;\n\tdisplay: none;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: rgba(255, 255, 255, 0.8);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg-muted);\n}\n\n.notectl-image__overlay--uploading {\n\tdisplay: flex;\n}\n\n.notectl-image__overlay--error {\n\tdisplay: flex;\n\tbackground: var(--notectl-danger-muted);\n\tcolor: var(--notectl-danger);\n}\n\n/* Resize overlay + handles */\n.notectl-image__resize-overlay {\n\tposition: absolute;\n\tinset: 0;\n\tpointer-events: none;\n}\n\n.notectl-image__resize-handle {\n\tposition: absolute;\n\twidth: 10px;\n\theight: 10px;\n\tbackground: var(--notectl-bg);\n\tborder: 2px solid var(--notectl-primary);\n\tborder-radius: 50%;\n\tpointer-events: all;\n\tz-index: 2;\n\ttransition: transform 0.1s, background 0.1s;\n}\n\n.notectl-image__resize-handle:hover {\n\tbackground: var(--notectl-primary);\n\ttransform: scale(1.3);\n}\n\n.notectl-image--resizing .notectl-image__resize-handle {\n\tbackground: var(--notectl-primary);\n}\n\n.notectl-image__resize-handle--nw {\n\ttop: -5px;\n\tinset-inline-start: -5px;\n\tcursor: nwse-resize;\n}\n\n.notectl-image__resize-handle--ne {\n\ttop: -5px;\n\tinset-inline-end: -5px;\n\tcursor: nesw-resize;\n}\n\n.notectl-image__resize-handle--sw {\n\tbottom: -5px;\n\tinset-inline-start: -5px;\n\tcursor: nesw-resize;\n}\n\n.notectl-image__resize-handle--se {\n\tbottom: -5px;\n\tinset-inline-end: -5px;\n\tcursor: nwse-resize;\n}\n\n/* RTL cursor overrides — flip diagonal cursors when in RTL context */\n[dir="rtl"] .notectl-image__resize-handle--nw {\n\tcursor: nesw-resize;\n}\n\n[dir="rtl"] .notectl-image__resize-handle--ne {\n\tcursor: nwse-resize;\n}\n\n[dir="rtl"] .notectl-image__resize-handle--sw {\n\tcursor: nwse-resize;\n}\n\n[dir="rtl"] .notectl-image__resize-handle--se {\n\tcursor: nesw-resize;\n}\n\n/* Size indicator tooltip */\n.notectl-image__size-indicator {\n\tposition: absolute;\n\tbottom: -28px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tpadding: 2px 8px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\tborder-radius: 4px;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\topacity: 0;\n\ttransition: opacity 0.15s;\n\tz-index: 3;\n}\n\n.notectl-image__size-indicator--visible {\n\topacity: 1;\n}\n\n/* Keyboard resize hint (shown on selection, hidden during drag) */\n.notectl-image__keyboard-hint {\n\tdisplay: none;\n\tposition: absolute;\n\tbottom: -28px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tpadding: 2px 8px;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\twhite-space: nowrap;\n\tpointer-events: none;\n\tz-index: 3;\n}\n\n.notectl-image--selected .notectl-image__keyboard-hint {\n\tdisplay: block;\n}\n\n.notectl-image--resizing .notectl-image__keyboard-hint {\n\tdisplay: none;\n}\n\n/* Resizing feedback */\n.notectl-image--resizing .notectl-image__img {\n\topacity: 0.85;\n}\n'),this.context=t,this.registerNodeSpec(t),this.registerNodeView(t),function(t){t.registerCommand("insertImage",()=>v(t,{src:""})),t.registerCommand("removeImage",()=>function(t){const e=t.getState(),n=e.selection;if(!r(n))return!1;const i=e.getBlock(n.nodeId);if(!i||"image"!==i.type)return!1;const a=e.getNodePath(n.nodeId);if(!a||0===a.length)return!1;const s=c(e,o(n.nodeId,a));return!!s&&(t.dispatch(s),!0)}(t))}(t),this.registerResizeCommands(t),this.registerResizeKeymaps(t),this.registerFileHandler(t),this.registerToolbarItem(t)}destroy(){for(const t of this.blobUrls)URL.revokeObjectURL(t);this.blobUrls.clear(),this.uploadStates.clear(),this.context=null}onStateChange(t,e,n){if(!this.context)return;for(const o of this.uploadStates.keys())e.getBlock(o)||this.uploadStates.delete(o);const i=this.isImageSelected(t),r=this.isImageSelected(e);!i&&r&&this.announceImageSelection(e)}registerNodeSpec(t){const e=this.locale;t.registerNodeSpec({type:"image",group:"block",isVoid:!0,selectable:!0,attrs:{src:{default:""},alt:{default:""},align:{default:"center"}},toDOM(t){const n=s("figure",t.id);n.className="notectl-image",n.setAttribute("data-void","true"),n.setAttribute("data-selectable","true");const i=document.createElement("div");i.className="notectl-image__container";const r=t.attrs?.alt??"",o=t.attrs?.width,a=t.attrs?.height,l=document.createElement("img");l.className="notectl-image__img",l.src=t.attrs?.src??"",l.alt=r,l.draggable=!1,void 0!==o&&p(l,"width",`${o}px`),void 0!==a&&p(l,"height",`${a}px`);const c={start:"notectl-image--start",center:"notectl-image--center",end:"notectl-image--end"}[t.attrs?.align??"center"];return c&&n.classList.add(c),n.setAttribute("aria-label",e.imageAria(r,o,a)),i.appendChild(l),n.appendChild(i),n},toHTML(t){const e=l(t.attrs?.src??""),n=l(t.attrs?.alt??""),i=t.attrs?.width,r=t.attrs?.height;return`<figure><img src="${e}" alt="${n}"${(void 0!==i?` width="${i}"`:"")+(void 0!==r?` height="${r}"`:"")}></figure>`},parseHTML:[{tag:"figure",getAttrs(t){const e=t.querySelector("img");if(!e)return!1;const n={src:e.getAttribute("src")??"",alt:e.getAttribute("alt")??"",align:"center"},i=e.getAttribute("width"),r=e.getAttribute("height");i&&(n.width=Number.parseInt(i,10)),r&&(n.height=Number.parseInt(r,10));const o=t.style?.textAlign??"";return"start"===o||"end"===o||"center"===o?n.align=o:"left"===o?n.align="start":"right"===o?n.align="end":t.classList.contains("notectl-align-start")||t.classList.contains("notectl-align-left")||t.classList.contains("notectl-image--start")||t.classList.contains("notectl-image--left")?n.align="start":t.classList.contains("notectl-align-end")||t.classList.contains("notectl-align-right")||t.classList.contains("notectl-image--end")||t.classList.contains("notectl-image--right")?n.align="end":t.classList.contains("notectl-align-center")&&(n.align="center"),n}},{tag:"img",getAttrs(t){const e={src:t.getAttribute("src")??"",alt:t.getAttribute("alt")??"",align:"center"},n=t.getAttribute("width"),i=t.getAttribute("height");return n&&(e.width=Number.parseInt(n,10)),i&&(e.height=Number.parseInt(i,10)),e}}],sanitize:{tags:["figure","img"],attrs:["src","alt","width","height","class","style"]}})}registerNodeView(t){t.registerNodeView("image",E(this.config,this.uploadStates,this.resolvedKeymap,this.locale))}registerResizeCommands(t){const e=this.config.resizeStep??10,n=this.config.resizeStepLarge??50,i=this.config.maxWidth;t.registerCommand("resizeImageGrow",()=>{const n=x(t,e,i);return n&&this.announceCurrentSize(t),n}),t.registerCommand("resizeImageShrink",()=>{const n=x(t,-e,i);return n&&this.announceCurrentSize(t),n}),t.registerCommand("resizeImageGrowLarge",()=>{const e=x(t,n,i);return e&&this.announceCurrentSize(t),e}),t.registerCommand("resizeImageShrinkLarge",()=>{const e=x(t,-n,i);return e&&this.announceCurrentSize(t),e}),t.registerCommand("resetImageSize",()=>{const e=function(t){const e=t.getState(),n=e.selection;if(!r(n))return!1;const i=e.getBlock(n.nodeId);if(!i||"image"!==i.type)return!1;const o=e.getNodePath(n.nodeId);if(!o)return!1;const a={...i.attrs??{}},s=Object.fromEntries(Object.entries(a).filter(([t])=>"width"!==t&&"height"!==t)),l=e.transaction("command").setNodeAttr(o,s).build();return t.dispatch(l),!0}(t);return e&&t.announce(this.locale.resetToNaturalSize),e})}registerResizeKeymaps(t){const e={};for(const[n,i]of Object.entries({growWidth:"resizeImageGrow",shrinkWidth:"resizeImageShrink",growWidthLarge:"resizeImageGrowLarge",shrinkWidthLarge:"resizeImageShrinkLarge",resetSize:"resetImageSize"})){const r=this.resolvedKeymap[n]??null;r&&(e[r]=()=>t.executeCommand(i))}Object.keys(e).length>0&&t.registerKeymap(e)}registerFileHandler(t){t.registerFileHandler("image/*",async(e,n)=>!!this.isAcceptedType(e.type)&&(this.handleFileInsert(t,e),!0))}handleFileInsert(t,e){if(e.size>this.config.maxFileSize)return;const n=URL.createObjectURL(e);if(this.blobUrls.add(n),!v(t,{src:n}))return URL.revokeObjectURL(n),void this.blobUrls.delete(n);const i=t.getState().selection;if(!r(i))return;const o=i.nodeId;this.uploadStates.set(o,"uploading"),t.getService($)?this.uploadFile(t,e,o,n):this.uploadStates.set(o,"complete")}async uploadFile(t,e,n,i){const r=t.getService($);if(r)try{const o=await r.upload(e);this.uploadStates.set(n,"complete");const a=t.getState(),s=a.getBlock(n);if(!s)return;const l=a.getNodePath(n);if(!l)return;const c={...s.attrs??{},src:o.url,...void 0!==o.width?{width:o.width}:{},...void 0!==o.height?{height:o.height}:{}},d=a.transaction("command").setNodeAttr(l,c).build();t.dispatch(d),URL.revokeObjectURL(i),this.blobUrls.delete(i)}catch{this.uploadStates.set(n,"error"),t.announce(this.locale.uploadFailed)}}registerToolbarItem(t){t.registerToolbarItem({id:"image",group:"insert",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg>',label:this.locale.insertImage,tooltip:this.locale.insertImageTooltip,command:"insertImage",popupType:"custom",renderPopup:(t,e,n)=>{!function(t,e,n){p(t,"padding","8px"),p(t,"minWidth","240px"),function(t,e,n){const i=document.createElement("input");i.type="file",i.accept=n.acceptedTypes.join(","),g(i,"position:absolute;width:0;height:0;overflow:hidden;opacity:0;");const r=document.createElement("button");r.type="button",r.textContent=n.locale.uploadFromComputer,r.setAttribute("aria-label",n.locale.uploadAria),g(r,"display:block;width:100%;padding:8px 12px;cursor:pointer;text-align:center;box-sizing:border-box;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-surface-raised);color:var(--notectl-fg);"),r.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),i.click()}),i.addEventListener("change",()=>{const t=i.files?.[0];t&&(n.onFileInsert(e,t),n.onClose(),e.getContainer().focus())}),t.appendChild(i),t.appendChild(r)}(t,e,n),function(t,e){const n=document.createElement("div");g(n,"display:flex;align-items:center;margin:8px 0;color:var(--notectl-fg-muted);font-size:12px;");const i=document.createElement("span");g(i,"flex:1;height:1px;background:var(--notectl-border);");const r=document.createElement("span");r.textContent=e.separator,g(r,"padding:0 8px;");const o=document.createElement("span");g(o,"flex:1;height:1px;background:var(--notectl-border);"),n.appendChild(i),n.appendChild(r),n.appendChild(o),t.appendChild(n)}(t,n.locale),function(t,e,n){const i=document.createElement("input");i.type="url",i.placeholder=n.locale.urlPlaceholder,i.setAttribute("aria-label",n.locale.urlAria),g(i,"width:100%;padding:6px 8px;box-sizing:border-box;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-bg);color:var(--notectl-fg);");const r=document.createElement("button");r.type="button",r.textContent=n.locale.insertButton,r.setAttribute("aria-label",n.locale.insertAria),g(r,"width:100%;padding:8px 12px;margin-top:4px;cursor:pointer;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-surface-raised);color:var(--notectl-fg);");const o=()=>{const t=i.value.trim();t&&(v(e,{src:t}),n.onClose(),e.getContainer().focus())};r.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),o()}),i.addEventListener("keydown",t=>{"Enter"===t.key&&(t.preventDefault(),o())}),t.appendChild(i),t.appendChild(r),requestAnimationFrame(()=>i.focus())}(t,e,n)}(t,e,{acceptedTypes:this.config.acceptedTypes,locale:this.locale,onFileInsert:(t,e)=>this.handleFileInsert(t,e),onClose:n})}})}isAcceptedType(t){return this.config.acceptedTypes.some(e=>e===t||e.endsWith("/*")&&t.startsWith(e.slice(0,-1)))}isImageSelected(t){const e=t.selection;return!!r(e)&&"image"===t.getBlock(e.nodeId)?.type}announceImageSelection(t){if(!this.context)return;const e=t.selection;if(!r(e))return;const n=t.getBlock(e.nodeId);if(!n||"image"!==n.type)return;const i=n.attrs?.alt??"",o=n.attrs?.width,a=n.attrs?.height,s=[this.locale.imageSelected];i&&s.push(`${this.locale.altTextPrefix}${i}.`),void 0!==o&&void 0!==a&&s.push(this.locale.imageSizeAnnounce(o,a));const l=this.resolvedKeymap.shrinkWidth??null,c=this.resolvedKeymap.growWidth??null;l&&c&&s.push(this.locale.resizeHint(b(l),b(c))),this.context.announce(s.join(" "))}announceCurrentSize(t){const e=t.getState(),n=e.selection;if(!r(n))return;const i=e.getBlock(n.nodeId);if(!i||"image"!==i.type)return;const o=i.attrs?.width,a=i.attrs?.height;void 0!==o&&void 0!==a&&t.announce(this.locale.imageResized(o,a))}};export{y as a,w as i,R as n,$ as r,T as t};
2
- //# sourceMappingURL=ImagePlugin-CrfnT1sD.mjs.map