@notectl/core 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1004) hide show
  1. package/README.md +258 -123
  2. package/dist/chunks/AlignmentPlugin-CIkPaP2h.mjs +2 -0
  3. package/dist/chunks/AlignmentPlugin-CIkPaP2h.mjs.map +1 -0
  4. package/dist/chunks/AttrRegistry-B1iBFcKO.mjs +2 -0
  5. package/dist/chunks/AttrRegistry-B1iBFcKO.mjs.map +1 -0
  6. package/dist/chunks/AttributedMarkCommands-Cmet1IuC.mjs +2 -0
  7. package/dist/chunks/AttributedMarkCommands-Cmet1IuC.mjs.map +1 -0
  8. package/dist/chunks/BlockInsertion-DTIE2BiH.mjs +2 -0
  9. package/dist/chunks/BlockInsertion-DTIE2BiH.mjs.map +1 -0
  10. package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs +2 -0
  11. package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs.map +1 -0
  12. package/dist/chunks/BlockquotePlugin-DmbnFmNj.mjs +2 -0
  13. package/dist/chunks/BlockquotePlugin-DmbnFmNj.mjs.map +1 -0
  14. package/dist/chunks/CaretNavigationPlugin-4EaHvYXR.mjs +2 -0
  15. package/dist/chunks/CaretNavigationPlugin-4EaHvYXR.mjs.map +1 -0
  16. package/dist/chunks/CodeBlockPlugin-BP3XaOGj.mjs +2 -0
  17. package/dist/chunks/CodeBlockPlugin-BP3XaOGj.mjs.map +1 -0
  18. package/dist/chunks/ColorGrid-taTKtdsm.mjs +2 -0
  19. package/dist/chunks/ColorGrid-taTKtdsm.mjs.map +1 -0
  20. package/dist/chunks/ColorPickerPopup-JJQ-gMBN.mjs +2 -0
  21. package/dist/chunks/ColorPickerPopup-JJQ-gMBN.mjs.map +1 -0
  22. package/dist/chunks/ColorValidation-3viVw_tK.mjs +2 -0
  23. package/dist/chunks/ColorValidation-3viVw_tK.mjs.map +1 -0
  24. package/dist/chunks/CommandHelpers-D0LIFM4O.mjs +2 -0
  25. package/dist/chunks/CommandHelpers-D0LIFM4O.mjs.map +1 -0
  26. package/dist/chunks/Commands-DJSVqp7b.mjs +2 -0
  27. package/dist/chunks/Commands-DJSVqp7b.mjs.map +1 -0
  28. package/dist/chunks/Decoration-6dhb8k3b.mjs +2 -0
  29. package/dist/chunks/Decoration-6dhb8k3b.mjs.map +1 -0
  30. package/dist/chunks/Document-CkQLx84k.mjs +2 -0
  31. package/dist/chunks/Document-CkQLx84k.mjs.map +1 -0
  32. package/dist/chunks/DocumentParser-QJUmtPp9.mjs +2 -0
  33. package/dist/chunks/DocumentParser-QJUmtPp9.mjs.map +1 -0
  34. package/dist/chunks/DocumentSerializer-bwcxM9WV.mjs +2 -0
  35. package/dist/chunks/DocumentSerializer-bwcxM9WV.mjs.map +1 -0
  36. package/dist/chunks/DomUtils-BkyCg-OO.mjs +2 -0
  37. package/dist/chunks/DomUtils-BkyCg-OO.mjs.map +1 -0
  38. package/dist/chunks/FontPlugin-Cz4qEYGh.mjs +2 -0
  39. package/dist/chunks/FontPlugin-Cz4qEYGh.mjs.map +1 -0
  40. package/dist/chunks/FontSizePlugin-D1WtDqrH.mjs +2 -0
  41. package/dist/chunks/FontSizePlugin-D1WtDqrH.mjs.map +1 -0
  42. package/dist/chunks/GapCursorNavigation-CKKq42kA.mjs +2 -0
  43. package/dist/chunks/GapCursorNavigation-CKKq42kA.mjs.map +1 -0
  44. package/dist/chunks/GapCursorPlugin-0CyOaciK.mjs +2 -0
  45. package/dist/chunks/GapCursorPlugin-0CyOaciK.mjs.map +1 -0
  46. package/dist/chunks/HTMLUtils-BLwp5G4f.mjs +2 -0
  47. package/dist/chunks/HTMLUtils-BLwp5G4f.mjs.map +1 -0
  48. package/dist/chunks/HardBreakPlugin-BOz-L53p.mjs +2 -0
  49. package/dist/chunks/HardBreakPlugin-BOz-L53p.mjs.map +1 -0
  50. package/dist/chunks/HeadingPlugin-C1F-5Ail.mjs +2 -0
  51. package/dist/chunks/HeadingPlugin-C1F-5Ail.mjs.map +1 -0
  52. package/dist/chunks/HighlightPlugin-LYARYuDC.mjs +2 -0
  53. package/dist/chunks/HighlightPlugin-LYARYuDC.mjs.map +1 -0
  54. package/dist/chunks/HorizontalRulePlugin-fmdbzWDQ.mjs +2 -0
  55. package/dist/chunks/HorizontalRulePlugin-fmdbzWDQ.mjs.map +1 -0
  56. package/dist/chunks/ImagePlugin-CrfnT1sD.mjs +2 -0
  57. package/dist/chunks/ImagePlugin-CrfnT1sD.mjs.map +1 -0
  58. package/dist/chunks/KeyboardNav-BZIHDPDV.mjs +2 -0
  59. package/dist/chunks/KeyboardNav-BZIHDPDV.mjs.map +1 -0
  60. package/dist/chunks/LinkPlugin-DzFJLnfQ.mjs +2 -0
  61. package/dist/chunks/LinkPlugin-DzFJLnfQ.mjs.map +1 -0
  62. package/dist/chunks/ListPlugin-C_Rcz3bV.mjs +2 -0
  63. package/dist/chunks/ListPlugin-C_Rcz3bV.mjs.map +1 -0
  64. package/dist/chunks/NavigationQueries-CgYPG6oY.mjs +2 -0
  65. package/dist/chunks/NavigationQueries-CgYPG6oY.mjs.map +1 -0
  66. package/dist/chunks/NodeResolver-CCA8UVRr.mjs +2 -0
  67. package/dist/chunks/NodeResolver-CCA8UVRr.mjs.map +1 -0
  68. package/dist/chunks/NodeSelectionCommands-CE_73CxF.mjs +2 -0
  69. package/dist/chunks/NodeSelectionCommands-CE_73CxF.mjs.map +1 -0
  70. package/dist/chunks/Platform-D9TRT4Mn.mjs +2 -0
  71. package/dist/chunks/Platform-D9TRT4Mn.mjs.map +1 -0
  72. package/dist/chunks/PluginHelpers-DLKHJWJn.mjs +2 -0
  73. package/dist/chunks/PluginHelpers-DLKHJWJn.mjs.map +1 -0
  74. package/dist/chunks/PopupManager-RWOaksC0.mjs +2 -0
  75. package/dist/chunks/PopupManager-RWOaksC0.mjs.map +1 -0
  76. package/dist/chunks/PopupPositioning-a1ADYSmx.mjs +2 -0
  77. package/dist/chunks/PopupPositioning-a1ADYSmx.mjs.map +1 -0
  78. package/dist/chunks/PrintPlugin-CwbEz3eP.mjs +2 -0
  79. package/dist/chunks/PrintPlugin-CwbEz3eP.mjs.map +1 -0
  80. package/dist/chunks/PrintTypes-B2DXeAEG.mjs +2 -0
  81. package/dist/chunks/PrintTypes-B2DXeAEG.mjs.map +1 -0
  82. package/dist/chunks/Selection-B14e7gd0.mjs +2 -0
  83. package/dist/chunks/Selection-B14e7gd0.mjs.map +1 -0
  84. package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs +2 -0
  85. package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs.map +1 -0
  86. package/dist/chunks/SmartPastePlugin-CXqJ0CPO.mjs +2 -0
  87. package/dist/chunks/SmartPastePlugin-CXqJ0CPO.mjs.map +1 -0
  88. package/dist/chunks/StrikethroughPlugin-CRl69jm3.mjs +2 -0
  89. package/dist/chunks/StrikethroughPlugin-CRl69jm3.mjs.map +1 -0
  90. package/dist/chunks/StyleRuntime-0yPPJK9H.mjs +2 -0
  91. package/dist/chunks/StyleRuntime-0yPPJK9H.mjs.map +1 -0
  92. package/dist/chunks/SuperSubPlugin-CAnaTJVm.mjs +2 -0
  93. package/dist/chunks/SuperSubPlugin-CAnaTJVm.mjs.map +1 -0
  94. package/dist/chunks/TablePlugin-D_7bgrqm.mjs +2 -0
  95. package/dist/chunks/TablePlugin-D_7bgrqm.mjs.map +1 -0
  96. package/dist/chunks/TextColorPlugin-Dfhvl1qG.mjs +2 -0
  97. package/dist/chunks/TextColorPlugin-Dfhvl1qG.mjs.map +1 -0
  98. package/dist/chunks/TextDirectionCorePlugin-CyKw-C8X.mjs +2 -0
  99. package/dist/chunks/TextDirectionCorePlugin-CyKw-C8X.mjs.map +1 -0
  100. package/dist/chunks/TextDirectionLocale-rlU1yNly.mjs +2 -0
  101. package/dist/chunks/TextDirectionLocale-rlU1yNly.mjs.map +1 -0
  102. package/dist/chunks/TextFormattingPlugin-xtQczzCs.mjs +2 -0
  103. package/dist/chunks/TextFormattingPlugin-xtQczzCs.mjs.map +1 -0
  104. package/dist/chunks/ToolbarPlugin-BFEniyH-.mjs +2 -0
  105. package/dist/chunks/ToolbarPlugin-BFEniyH-.mjs.map +1 -0
  106. package/dist/chunks/TypeBrands-BQR8dEYU.mjs +2 -0
  107. package/dist/chunks/TypeBrands-BQR8dEYU.mjs.map +1 -0
  108. package/dist/chunks/WordBoundary-iZXLMFyk.mjs +2 -0
  109. package/dist/chunks/WordBoundary-iZXLMFyk.mjs.map +1 -0
  110. package/dist/chunks/XmlPatterns-Ub8I1jdE.mjs +2 -0
  111. package/dist/chunks/XmlPatterns-Ub8I1jdE.mjs.map +1 -0
  112. package/dist/chunks/ar-3-z4mZhh.mjs +2 -0
  113. package/dist/chunks/ar-3-z4mZhh.mjs.map +1 -0
  114. package/dist/chunks/ar-B-l6wR4D.mjs +2 -0
  115. package/dist/chunks/ar-B-l6wR4D.mjs.map +1 -0
  116. package/dist/chunks/ar-B3NByR5H.mjs +2 -0
  117. package/dist/chunks/ar-B3NByR5H.mjs.map +1 -0
  118. package/dist/chunks/ar-BRvm4F78.mjs +2 -0
  119. package/dist/chunks/ar-BRvm4F78.mjs.map +1 -0
  120. package/dist/chunks/ar-BUMXujtS.mjs +2 -0
  121. package/dist/chunks/ar-BUMXujtS.mjs.map +1 -0
  122. package/dist/chunks/ar-BhVHv8Lx.mjs +2 -0
  123. package/dist/chunks/ar-BhVHv8Lx.mjs.map +1 -0
  124. package/dist/chunks/ar-BhwRD9Cg.mjs +2 -0
  125. package/dist/chunks/ar-BhwRD9Cg.mjs.map +1 -0
  126. package/dist/chunks/ar-Bm8ORJ3H.mjs +2 -0
  127. package/dist/chunks/ar-Bm8ORJ3H.mjs.map +1 -0
  128. package/dist/chunks/ar-BpxuRQB2.mjs +2 -0
  129. package/dist/chunks/ar-BpxuRQB2.mjs.map +1 -0
  130. package/dist/chunks/ar-CA0-ysCj.mjs +2 -0
  131. package/dist/chunks/ar-CA0-ysCj.mjs.map +1 -0
  132. package/dist/chunks/ar-CAkFpIju.mjs +2 -0
  133. package/dist/chunks/ar-CAkFpIju.mjs.map +1 -0
  134. package/dist/chunks/ar-CU6qxyFp.mjs +2 -0
  135. package/dist/chunks/ar-CU6qxyFp.mjs.map +1 -0
  136. package/dist/chunks/ar-CXcTrZVc.mjs +2 -0
  137. package/dist/chunks/ar-CXcTrZVc.mjs.map +1 -0
  138. package/dist/chunks/ar-CeO_osWz.mjs +2 -0
  139. package/dist/chunks/ar-CeO_osWz.mjs.map +1 -0
  140. package/dist/chunks/ar-CxRSPJDE.mjs +2 -0
  141. package/dist/chunks/ar-CxRSPJDE.mjs.map +1 -0
  142. package/dist/chunks/ar-DHes6Igy.mjs +2 -0
  143. package/dist/chunks/ar-DHes6Igy.mjs.map +1 -0
  144. package/dist/chunks/ar-DN1aHdqb.mjs +2 -0
  145. package/dist/chunks/ar-DN1aHdqb.mjs.map +1 -0
  146. package/dist/chunks/ar-DNzmHN3q.mjs +2 -0
  147. package/dist/chunks/ar-DNzmHN3q.mjs.map +1 -0
  148. package/dist/chunks/ar-DVdWier2.mjs +2 -0
  149. package/dist/chunks/ar-DVdWier2.mjs.map +1 -0
  150. package/dist/chunks/ar-G_ADWoCx.mjs +2 -0
  151. package/dist/chunks/ar-G_ADWoCx.mjs.map +1 -0
  152. package/dist/chunks/ar-KAaQxKMo.mjs +2 -0
  153. package/dist/chunks/ar-KAaQxKMo.mjs.map +1 -0
  154. package/dist/chunks/ar-MHdV5PAO.mjs +2 -0
  155. package/dist/chunks/ar-MHdV5PAO.mjs.map +1 -0
  156. package/dist/chunks/ar-S2VfgLMv.mjs +2 -0
  157. package/dist/chunks/ar-S2VfgLMv.mjs.map +1 -0
  158. package/dist/chunks/color-picker-DumtHdqh.mjs +2 -0
  159. package/dist/chunks/color-picker-DumtHdqh.mjs.map +1 -0
  160. package/dist/chunks/de-0x8V-vch.mjs +2 -0
  161. package/dist/chunks/de-0x8V-vch.mjs.map +1 -0
  162. package/dist/chunks/de-B5xIP9en.mjs +2 -0
  163. package/dist/chunks/de-B5xIP9en.mjs.map +1 -0
  164. package/dist/chunks/de-BBohFIqw.mjs +2 -0
  165. package/dist/chunks/de-BBohFIqw.mjs.map +1 -0
  166. package/dist/chunks/de-BWPmC-2S.mjs +2 -0
  167. package/dist/chunks/de-BWPmC-2S.mjs.map +1 -0
  168. package/dist/chunks/de-Bo1kM9rb.mjs +2 -0
  169. package/dist/chunks/de-Bo1kM9rb.mjs.map +1 -0
  170. package/dist/chunks/de-BqzR2XMP.mjs +2 -0
  171. package/dist/chunks/de-BqzR2XMP.mjs.map +1 -0
  172. package/dist/chunks/de-CIZibvOC.mjs +2 -0
  173. package/dist/chunks/de-CIZibvOC.mjs.map +1 -0
  174. package/dist/chunks/de-CLToQn0o.mjs +2 -0
  175. package/dist/chunks/de-CLToQn0o.mjs.map +1 -0
  176. package/dist/chunks/de-CNoAAJul.mjs +2 -0
  177. package/dist/chunks/de-CNoAAJul.mjs.map +1 -0
  178. package/dist/chunks/de-CPb7rgkk.mjs +2 -0
  179. package/dist/chunks/de-CPb7rgkk.mjs.map +1 -0
  180. package/dist/chunks/de-CdmBKVDW.mjs +2 -0
  181. package/dist/chunks/de-CdmBKVDW.mjs.map +1 -0
  182. package/dist/chunks/de-DDgeyWgp.mjs +2 -0
  183. package/dist/chunks/de-DDgeyWgp.mjs.map +1 -0
  184. package/dist/chunks/de-DGXQ4OiR.mjs +2 -0
  185. package/dist/chunks/de-DGXQ4OiR.mjs.map +1 -0
  186. package/dist/chunks/de-DJbvKl4E.mjs +2 -0
  187. package/dist/chunks/de-DJbvKl4E.mjs.map +1 -0
  188. package/dist/chunks/de-DKNvYM_G.mjs +2 -0
  189. package/dist/chunks/de-DKNvYM_G.mjs.map +1 -0
  190. package/dist/chunks/de-DOHm_P4A.mjs +2 -0
  191. package/dist/chunks/de-DOHm_P4A.mjs.map +1 -0
  192. package/dist/chunks/de-DTMX75rn.mjs +2 -0
  193. package/dist/chunks/de-DTMX75rn.mjs.map +1 -0
  194. package/dist/chunks/de-DfkQds5F.mjs +2 -0
  195. package/dist/chunks/de-DfkQds5F.mjs.map +1 -0
  196. package/dist/chunks/de-TEQW-F4t.mjs +2 -0
  197. package/dist/chunks/de-TEQW-F4t.mjs.map +1 -0
  198. package/dist/chunks/de-WzdZ_NJ6.mjs +2 -0
  199. package/dist/chunks/de-WzdZ_NJ6.mjs.map +1 -0
  200. package/dist/chunks/de-_vqVfXeo.mjs +2 -0
  201. package/dist/chunks/de-_vqVfXeo.mjs.map +1 -0
  202. package/dist/chunks/de-gR6jt-sS.mjs +2 -0
  203. package/dist/chunks/de-gR6jt-sS.mjs.map +1 -0
  204. package/dist/chunks/de-qOBFRCGL.mjs +2 -0
  205. package/dist/chunks/de-qOBFRCGL.mjs.map +1 -0
  206. package/dist/chunks/es-1udUsTJd.mjs +2 -0
  207. package/dist/chunks/es-1udUsTJd.mjs.map +1 -0
  208. package/dist/chunks/es-3H7h0_G5.mjs +2 -0
  209. package/dist/chunks/es-3H7h0_G5.mjs.map +1 -0
  210. package/dist/chunks/es-4-5iRK0M.mjs +2 -0
  211. package/dist/chunks/es-4-5iRK0M.mjs.map +1 -0
  212. package/dist/chunks/es-89LD3TlT.mjs +2 -0
  213. package/dist/chunks/es-89LD3TlT.mjs.map +1 -0
  214. package/dist/chunks/es-B2KFVoHa.mjs +2 -0
  215. package/dist/chunks/es-B2KFVoHa.mjs.map +1 -0
  216. package/dist/chunks/es-BUP1scLX.mjs +2 -0
  217. package/dist/chunks/es-BUP1scLX.mjs.map +1 -0
  218. package/dist/chunks/es-Bhhj-yh0.mjs +2 -0
  219. package/dist/chunks/es-Bhhj-yh0.mjs.map +1 -0
  220. package/dist/chunks/es-Bo0NTtQH.mjs +2 -0
  221. package/dist/chunks/es-Bo0NTtQH.mjs.map +1 -0
  222. package/dist/chunks/es-Bovw7l2W.mjs +2 -0
  223. package/dist/chunks/es-Bovw7l2W.mjs.map +1 -0
  224. package/dist/chunks/es-C7xAs1yn.mjs +2 -0
  225. package/dist/chunks/es-C7xAs1yn.mjs.map +1 -0
  226. package/dist/chunks/es-CIdF7MzV.mjs +2 -0
  227. package/dist/chunks/es-CIdF7MzV.mjs.map +1 -0
  228. package/dist/chunks/es-CPit7Z6w.mjs +2 -0
  229. package/dist/chunks/es-CPit7Z6w.mjs.map +1 -0
  230. package/dist/chunks/es-CQzgvQI6.mjs +2 -0
  231. package/dist/chunks/es-CQzgvQI6.mjs.map +1 -0
  232. package/dist/chunks/es-CSteuqi5.mjs +2 -0
  233. package/dist/chunks/es-CSteuqi5.mjs.map +1 -0
  234. package/dist/chunks/es-ClJxqhu_.mjs +2 -0
  235. package/dist/chunks/es-ClJxqhu_.mjs.map +1 -0
  236. package/dist/chunks/es-CrmqYoVh.mjs +2 -0
  237. package/dist/chunks/es-CrmqYoVh.mjs.map +1 -0
  238. package/dist/chunks/es-CwRwLkfr.mjs +2 -0
  239. package/dist/chunks/es-CwRwLkfr.mjs.map +1 -0
  240. package/dist/chunks/es-D7DRGnkZ.mjs +2 -0
  241. package/dist/chunks/es-D7DRGnkZ.mjs.map +1 -0
  242. package/dist/chunks/es-DET1uMu-.mjs +2 -0
  243. package/dist/chunks/es-DET1uMu-.mjs.map +1 -0
  244. package/dist/chunks/es-Dj83hJxy.mjs +2 -0
  245. package/dist/chunks/es-Dj83hJxy.mjs.map +1 -0
  246. package/dist/chunks/es-DwYWucI6.mjs +2 -0
  247. package/dist/chunks/es-DwYWucI6.mjs.map +1 -0
  248. package/dist/chunks/es-DwrcpThR.mjs +2 -0
  249. package/dist/chunks/es-DwrcpThR.mjs.map +1 -0
  250. package/dist/chunks/es-z7xjgDdk.mjs +2 -0
  251. package/dist/chunks/es-z7xjgDdk.mjs.map +1 -0
  252. package/dist/chunks/fonts-CG5ZnGux.mjs +2 -0
  253. package/dist/chunks/fonts-CG5ZnGux.mjs.map +1 -0
  254. package/dist/chunks/fr-B73tOEzO.mjs +2 -0
  255. package/dist/chunks/fr-B73tOEzO.mjs.map +1 -0
  256. package/dist/chunks/fr-BEbsFEkX.mjs +2 -0
  257. package/dist/chunks/fr-BEbsFEkX.mjs.map +1 -0
  258. package/dist/chunks/fr-BFCaEBSV.mjs +2 -0
  259. package/dist/chunks/fr-BFCaEBSV.mjs.map +1 -0
  260. package/dist/chunks/fr-BJ69XrDO.mjs +2 -0
  261. package/dist/chunks/fr-BJ69XrDO.mjs.map +1 -0
  262. package/dist/chunks/fr-BdQ_-Iwg.mjs +2 -0
  263. package/dist/chunks/fr-BdQ_-Iwg.mjs.map +1 -0
  264. package/dist/chunks/fr-BhnuBA0i.mjs +2 -0
  265. package/dist/chunks/fr-BhnuBA0i.mjs.map +1 -0
  266. package/dist/chunks/fr-BiLmpXZ9.mjs +2 -0
  267. package/dist/chunks/fr-BiLmpXZ9.mjs.map +1 -0
  268. package/dist/chunks/fr-C1Pak7kS.mjs +2 -0
  269. package/dist/chunks/fr-C1Pak7kS.mjs.map +1 -0
  270. package/dist/chunks/fr-CFDoFELm.mjs +2 -0
  271. package/dist/chunks/fr-CFDoFELm.mjs.map +1 -0
  272. package/dist/chunks/fr-CmsH8BnY.mjs +2 -0
  273. package/dist/chunks/fr-CmsH8BnY.mjs.map +1 -0
  274. package/dist/chunks/fr-Cz2qWiuV.mjs +2 -0
  275. package/dist/chunks/fr-Cz2qWiuV.mjs.map +1 -0
  276. package/dist/chunks/fr-CzTPuD1P.mjs +2 -0
  277. package/dist/chunks/fr-CzTPuD1P.mjs.map +1 -0
  278. package/dist/chunks/fr-D1LQMsjB.mjs +2 -0
  279. package/dist/chunks/fr-D1LQMsjB.mjs.map +1 -0
  280. package/dist/chunks/fr-D84mXQrZ.mjs +2 -0
  281. package/dist/chunks/fr-D84mXQrZ.mjs.map +1 -0
  282. package/dist/chunks/fr-DX7z_ld0.mjs +2 -0
  283. package/dist/chunks/fr-DX7z_ld0.mjs.map +1 -0
  284. package/dist/chunks/fr-DXkQUerf.mjs +2 -0
  285. package/dist/chunks/fr-DXkQUerf.mjs.map +1 -0
  286. package/dist/chunks/fr-Di5gv5P8.mjs +2 -0
  287. package/dist/chunks/fr-Di5gv5P8.mjs.map +1 -0
  288. package/dist/chunks/fr-Dq5MrVWd.mjs +2 -0
  289. package/dist/chunks/fr-Dq5MrVWd.mjs.map +1 -0
  290. package/dist/chunks/fr-DtfEjLSL.mjs +2 -0
  291. package/dist/chunks/fr-DtfEjLSL.mjs.map +1 -0
  292. package/dist/chunks/fr-DvW-dpp3.mjs +2 -0
  293. package/dist/chunks/fr-DvW-dpp3.mjs.map +1 -0
  294. package/dist/chunks/fr-UJFNrn-V.mjs +2 -0
  295. package/dist/chunks/fr-UJFNrn-V.mjs.map +1 -0
  296. package/dist/chunks/fr-hK8X-sM6.mjs +2 -0
  297. package/dist/chunks/fr-hK8X-sM6.mjs.map +1 -0
  298. package/dist/chunks/fr-uuOSXj4L.mjs +2 -0
  299. package/dist/chunks/fr-uuOSXj4L.mjs.map +1 -0
  300. package/dist/chunks/full-216JgIG1.mjs +2 -0
  301. package/dist/chunks/full-216JgIG1.mjs.map +1 -0
  302. package/dist/chunks/hi-B2kXjElO.mjs +2 -0
  303. package/dist/chunks/hi-B2kXjElO.mjs.map +1 -0
  304. package/dist/chunks/hi-B2mEQ5gX.mjs +2 -0
  305. package/dist/chunks/hi-B2mEQ5gX.mjs.map +1 -0
  306. package/dist/chunks/hi-B61lTO2W.mjs +2 -0
  307. package/dist/chunks/hi-B61lTO2W.mjs.map +1 -0
  308. package/dist/chunks/hi-BD5HrbxU.mjs +2 -0
  309. package/dist/chunks/hi-BD5HrbxU.mjs.map +1 -0
  310. package/dist/chunks/hi-BHTvSWXw.mjs +2 -0
  311. package/dist/chunks/hi-BHTvSWXw.mjs.map +1 -0
  312. package/dist/chunks/hi-BYyaOBqY.mjs +2 -0
  313. package/dist/chunks/hi-BYyaOBqY.mjs.map +1 -0
  314. package/dist/chunks/hi-Bhlbz5gX.mjs +2 -0
  315. package/dist/chunks/hi-Bhlbz5gX.mjs.map +1 -0
  316. package/dist/chunks/hi-BniuSk3L.mjs +2 -0
  317. package/dist/chunks/hi-BniuSk3L.mjs.map +1 -0
  318. package/dist/chunks/hi-CBODdhOq.mjs +2 -0
  319. package/dist/chunks/hi-CBODdhOq.mjs.map +1 -0
  320. package/dist/chunks/hi-CKWQCooT.mjs +2 -0
  321. package/dist/chunks/hi-CKWQCooT.mjs.map +1 -0
  322. package/dist/chunks/hi-CkoruGVs.mjs +2 -0
  323. package/dist/chunks/hi-CkoruGVs.mjs.map +1 -0
  324. package/dist/chunks/hi-D6Ge3Lp5.mjs +2 -0
  325. package/dist/chunks/hi-D6Ge3Lp5.mjs.map +1 -0
  326. package/dist/chunks/hi-DEreeBFj.mjs +2 -0
  327. package/dist/chunks/hi-DEreeBFj.mjs.map +1 -0
  328. package/dist/chunks/hi-Dj4JW-9k.mjs +2 -0
  329. package/dist/chunks/hi-Dj4JW-9k.mjs.map +1 -0
  330. package/dist/chunks/hi-DkP4pHSX.mjs +2 -0
  331. package/dist/chunks/hi-DkP4pHSX.mjs.map +1 -0
  332. package/dist/chunks/hi-DknCX8Nx.mjs +2 -0
  333. package/dist/chunks/hi-DknCX8Nx.mjs.map +1 -0
  334. package/dist/chunks/hi-Dm1KJQQ5.mjs +2 -0
  335. package/dist/chunks/hi-Dm1KJQQ5.mjs.map +1 -0
  336. package/dist/chunks/hi-Dx-LTWg-.mjs +2 -0
  337. package/dist/chunks/hi-Dx-LTWg-.mjs.map +1 -0
  338. package/dist/chunks/hi-RDoZtwMm.mjs +2 -0
  339. package/dist/chunks/hi-RDoZtwMm.mjs.map +1 -0
  340. package/dist/chunks/hi-Tq9eDRk7.mjs +2 -0
  341. package/dist/chunks/hi-Tq9eDRk7.mjs.map +1 -0
  342. package/dist/chunks/hi-_vJ_Eo4p.mjs +2 -0
  343. package/dist/chunks/hi-_vJ_Eo4p.mjs.map +1 -0
  344. package/dist/chunks/hi-l8E-czFm.mjs +2 -0
  345. package/dist/chunks/hi-l8E-czFm.mjs.map +1 -0
  346. package/dist/chunks/hi-ydmPh3HB.mjs +2 -0
  347. package/dist/chunks/hi-ydmPh3HB.mjs.map +1 -0
  348. package/dist/chunks/minimal-D-QxXO1C.mjs +2 -0
  349. package/dist/chunks/minimal-D-QxXO1C.mjs.map +1 -0
  350. package/dist/chunks/pt-B4NUSLW8.mjs +2 -0
  351. package/dist/chunks/pt-B4NUSLW8.mjs.map +1 -0
  352. package/dist/chunks/pt-B8VKEboV.mjs +2 -0
  353. package/dist/chunks/pt-B8VKEboV.mjs.map +1 -0
  354. package/dist/chunks/pt-BMDKykEi.mjs +2 -0
  355. package/dist/chunks/pt-BMDKykEi.mjs.map +1 -0
  356. package/dist/chunks/pt-BmWE3xXF.mjs +2 -0
  357. package/dist/chunks/pt-BmWE3xXF.mjs.map +1 -0
  358. package/dist/chunks/pt-CJWKE1SW.mjs +2 -0
  359. package/dist/chunks/pt-CJWKE1SW.mjs.map +1 -0
  360. package/dist/chunks/pt-CKETXoPa.mjs +2 -0
  361. package/dist/chunks/pt-CKETXoPa.mjs.map +1 -0
  362. package/dist/chunks/pt-CKRs16QH.mjs +2 -0
  363. package/dist/chunks/pt-CKRs16QH.mjs.map +1 -0
  364. package/dist/chunks/pt-Cb-1GHq4.mjs +2 -0
  365. package/dist/chunks/pt-Cb-1GHq4.mjs.map +1 -0
  366. package/dist/chunks/pt-CgpU74p4.mjs +2 -0
  367. package/dist/chunks/pt-CgpU74p4.mjs.map +1 -0
  368. package/dist/chunks/pt-CtOdAphq.mjs +2 -0
  369. package/dist/chunks/pt-CtOdAphq.mjs.map +1 -0
  370. package/dist/chunks/pt-CzaPFMSx.mjs +2 -0
  371. package/dist/chunks/pt-CzaPFMSx.mjs.map +1 -0
  372. package/dist/chunks/pt-DGuLcW0m.mjs +2 -0
  373. package/dist/chunks/pt-DGuLcW0m.mjs.map +1 -0
  374. package/dist/chunks/pt-DHzSXzlf.mjs +2 -0
  375. package/dist/chunks/pt-DHzSXzlf.mjs.map +1 -0
  376. package/dist/chunks/pt-DWDdBfLk.mjs +2 -0
  377. package/dist/chunks/pt-DWDdBfLk.mjs.map +1 -0
  378. package/dist/chunks/pt-DZ6Liq_x.mjs +2 -0
  379. package/dist/chunks/pt-DZ6Liq_x.mjs.map +1 -0
  380. package/dist/chunks/pt-D_MD7MJu.mjs +2 -0
  381. package/dist/chunks/pt-D_MD7MJu.mjs.map +1 -0
  382. package/dist/chunks/pt-DgaY_yNG.mjs +2 -0
  383. package/dist/chunks/pt-DgaY_yNG.mjs.map +1 -0
  384. package/dist/chunks/pt-DgzgCxdH.mjs +2 -0
  385. package/dist/chunks/pt-DgzgCxdH.mjs.map +1 -0
  386. package/dist/chunks/pt-Dh7nUcAM.mjs +2 -0
  387. package/dist/chunks/pt-Dh7nUcAM.mjs.map +1 -0
  388. package/dist/chunks/pt-P914L5AX.mjs +2 -0
  389. package/dist/chunks/pt-P914L5AX.mjs.map +1 -0
  390. package/dist/chunks/pt-XT1vsWZj.mjs +2 -0
  391. package/dist/chunks/pt-XT1vsWZj.mjs.map +1 -0
  392. package/dist/chunks/pt-jJ0XXSVz.mjs +2 -0
  393. package/dist/chunks/pt-jJ0XXSVz.mjs.map +1 -0
  394. package/dist/chunks/pt-tuOLwYkM.mjs +2 -0
  395. package/dist/chunks/pt-tuOLwYkM.mjs.map +1 -0
  396. package/dist/chunks/rolldown-runtime-B8Ku5yk6.mjs +1 -0
  397. package/dist/chunks/ru-7m8CMM17.mjs +2 -0
  398. package/dist/chunks/ru-7m8CMM17.mjs.map +1 -0
  399. package/dist/chunks/ru-9Qh1fR-K.mjs +2 -0
  400. package/dist/chunks/ru-9Qh1fR-K.mjs.map +1 -0
  401. package/dist/chunks/ru-B5gK8OLp.mjs +2 -0
  402. package/dist/chunks/ru-B5gK8OLp.mjs.map +1 -0
  403. package/dist/chunks/ru-BRNN6ldH.mjs +2 -0
  404. package/dist/chunks/ru-BRNN6ldH.mjs.map +1 -0
  405. package/dist/chunks/ru-BiyE9o-D.mjs +2 -0
  406. package/dist/chunks/ru-BiyE9o-D.mjs.map +1 -0
  407. package/dist/chunks/ru-BpGTIPbv.mjs +2 -0
  408. package/dist/chunks/ru-BpGTIPbv.mjs.map +1 -0
  409. package/dist/chunks/ru-CAzMaI4y.mjs +2 -0
  410. package/dist/chunks/ru-CAzMaI4y.mjs.map +1 -0
  411. package/dist/chunks/ru-COo6HpcD.mjs +2 -0
  412. package/dist/chunks/ru-COo6HpcD.mjs.map +1 -0
  413. package/dist/chunks/ru-CgEOZsUs.mjs +2 -0
  414. package/dist/chunks/ru-CgEOZsUs.mjs.map +1 -0
  415. package/dist/chunks/ru-CptzezhV.mjs +2 -0
  416. package/dist/chunks/ru-CptzezhV.mjs.map +1 -0
  417. package/dist/chunks/ru-Ct0qNMLS.mjs +2 -0
  418. package/dist/chunks/ru-Ct0qNMLS.mjs.map +1 -0
  419. package/dist/chunks/ru-Ct2IrzbA.mjs +2 -0
  420. package/dist/chunks/ru-Ct2IrzbA.mjs.map +1 -0
  421. package/dist/chunks/ru-CyHnlWLN.mjs +2 -0
  422. package/dist/chunks/ru-CyHnlWLN.mjs.map +1 -0
  423. package/dist/chunks/ru-DF0vhzeC.mjs +2 -0
  424. package/dist/chunks/ru-DF0vhzeC.mjs.map +1 -0
  425. package/dist/chunks/ru-DH6rsOWL.mjs +2 -0
  426. package/dist/chunks/ru-DH6rsOWL.mjs.map +1 -0
  427. package/dist/chunks/ru-DHH8k6G8.mjs +2 -0
  428. package/dist/chunks/ru-DHH8k6G8.mjs.map +1 -0
  429. package/dist/chunks/ru-GVReqjM4.mjs +2 -0
  430. package/dist/chunks/ru-GVReqjM4.mjs.map +1 -0
  431. package/dist/chunks/ru-IzloX5CY.mjs +2 -0
  432. package/dist/chunks/ru-IzloX5CY.mjs.map +1 -0
  433. package/dist/chunks/ru-ZrzXB0f6.mjs +2 -0
  434. package/dist/chunks/ru-ZrzXB0f6.mjs.map +1 -0
  435. package/dist/chunks/ru-asRKygvE.mjs +2 -0
  436. package/dist/chunks/ru-asRKygvE.mjs.map +1 -0
  437. package/dist/chunks/ru-m19l8nRA.mjs +2 -0
  438. package/dist/chunks/ru-m19l8nRA.mjs.map +1 -0
  439. package/dist/chunks/ru-vfQ5Xaz4.mjs +2 -0
  440. package/dist/chunks/ru-vfQ5Xaz4.mjs.map +1 -0
  441. package/dist/chunks/ru-wVOlNily.mjs +2 -0
  442. package/dist/chunks/ru-wVOlNily.mjs.map +1 -0
  443. package/dist/chunks/shared-DxmfXZH7.mjs +2 -0
  444. package/dist/chunks/shared-DxmfXZH7.mjs.map +1 -0
  445. package/dist/chunks/src-DFXIsulM.mjs +2 -0
  446. package/dist/chunks/src-DFXIsulM.mjs.map +1 -0
  447. package/dist/chunks/text-direction-advanced-B5JuIs0P.mjs +2 -0
  448. package/dist/chunks/text-direction-advanced-B5JuIs0P.mjs.map +1 -0
  449. package/dist/chunks/zh-0uhsRxfq.mjs +2 -0
  450. package/dist/chunks/zh-0uhsRxfq.mjs.map +1 -0
  451. package/dist/chunks/zh-1BrLr5Wk.mjs +2 -0
  452. package/dist/chunks/zh-1BrLr5Wk.mjs.map +1 -0
  453. package/dist/chunks/zh-BNHeXa_M.mjs +2 -0
  454. package/dist/chunks/zh-BNHeXa_M.mjs.map +1 -0
  455. package/dist/chunks/zh-BOpBzSX3.mjs +2 -0
  456. package/dist/chunks/zh-BOpBzSX3.mjs.map +1 -0
  457. package/dist/chunks/zh-BV2uDDGf.mjs +2 -0
  458. package/dist/chunks/zh-BV2uDDGf.mjs.map +1 -0
  459. package/dist/chunks/zh-BkoPteNb.mjs +2 -0
  460. package/dist/chunks/zh-BkoPteNb.mjs.map +1 -0
  461. package/dist/chunks/zh-C2z0g7OC.mjs +2 -0
  462. package/dist/chunks/zh-C2z0g7OC.mjs.map +1 -0
  463. package/dist/chunks/zh-CeJw45yo.mjs +2 -0
  464. package/dist/chunks/zh-CeJw45yo.mjs.map +1 -0
  465. package/dist/chunks/zh-CwVkxL4q.mjs +2 -0
  466. package/dist/chunks/zh-CwVkxL4q.mjs.map +1 -0
  467. package/dist/chunks/zh-Cy7mujpx.mjs +2 -0
  468. package/dist/chunks/zh-Cy7mujpx.mjs.map +1 -0
  469. package/dist/chunks/zh-D-P00ENX.mjs +2 -0
  470. package/dist/chunks/zh-D-P00ENX.mjs.map +1 -0
  471. package/dist/chunks/zh-D5d-NAuv.mjs +2 -0
  472. package/dist/chunks/zh-D5d-NAuv.mjs.map +1 -0
  473. package/dist/chunks/zh-D6gTQA2W.mjs +2 -0
  474. package/dist/chunks/zh-D6gTQA2W.mjs.map +1 -0
  475. package/dist/chunks/zh-DLwq4e4-.mjs +2 -0
  476. package/dist/chunks/zh-DLwq4e4-.mjs.map +1 -0
  477. package/dist/chunks/zh-D_Yb8Eg6.mjs +2 -0
  478. package/dist/chunks/zh-D_Yb8Eg6.mjs.map +1 -0
  479. package/dist/chunks/zh-DaNHqNDY.mjs +2 -0
  480. package/dist/chunks/zh-DaNHqNDY.mjs.map +1 -0
  481. package/dist/chunks/zh-De7-Y4O5.mjs +2 -0
  482. package/dist/chunks/zh-De7-Y4O5.mjs.map +1 -0
  483. package/dist/chunks/zh-Dj7kHEcp.mjs +2 -0
  484. package/dist/chunks/zh-Dj7kHEcp.mjs.map +1 -0
  485. package/dist/chunks/zh-Dl0oVWiK.mjs +2 -0
  486. package/dist/chunks/zh-Dl0oVWiK.mjs.map +1 -0
  487. package/dist/chunks/zh-Do0plBjM.mjs +2 -0
  488. package/dist/chunks/zh-Do0plBjM.mjs.map +1 -0
  489. package/dist/chunks/zh-Q0aDk5UA.mjs +2 -0
  490. package/dist/chunks/zh-Q0aDk5UA.mjs.map +1 -0
  491. package/dist/chunks/zh-eSgs8mzc.mjs +2 -0
  492. package/dist/chunks/zh-eSgs8mzc.mjs.map +1 -0
  493. package/dist/chunks/zh-giWyGMSZ.mjs +2 -0
  494. package/dist/chunks/zh-giWyGMSZ.mjs.map +1 -0
  495. package/dist/fonts.mjs +1 -2
  496. package/dist/full.mjs +1 -2
  497. package/dist/html.mjs +1 -2
  498. package/dist/notectl-core.mjs +1 -2
  499. package/dist/notectl-core.umd.js +2 -2
  500. package/dist/notectl-core.umd.js.map +1 -1
  501. package/dist/plugins/alignment.mjs +1 -2
  502. package/dist/plugins/blockquote.mjs +1 -2
  503. package/dist/plugins/caret-navigation.mjs +1 -2
  504. package/dist/plugins/code-block.mjs +1 -2
  505. package/dist/plugins/font-size.mjs +1 -2
  506. package/dist/plugins/font.mjs +1 -2
  507. package/dist/plugins/gap-cursor.mjs +1 -2
  508. package/dist/plugins/hard-break.mjs +1 -2
  509. package/dist/plugins/heading.mjs +1 -2
  510. package/dist/plugins/highlight.mjs +1 -2
  511. package/dist/plugins/horizontal-rule.mjs +1 -2
  512. package/dist/plugins/image.mjs +1 -2
  513. package/dist/plugins/link.mjs +1 -2
  514. package/dist/plugins/list.mjs +1 -2
  515. package/dist/plugins/print/PrintContentPreparer.d.ts.map +1 -1
  516. package/dist/plugins/print.mjs +1 -2
  517. package/dist/plugins/shared.mjs +1 -2
  518. package/dist/plugins/smart-paste.mjs +1 -2
  519. package/dist/plugins/strikethrough.mjs +1 -2
  520. package/dist/plugins/super-sub.mjs +1 -2
  521. package/dist/plugins/table.mjs +1 -2
  522. package/dist/plugins/text-color.mjs +1 -2
  523. package/dist/plugins/text-direction-advanced.mjs +1 -2
  524. package/dist/plugins/text-direction.mjs +1 -2
  525. package/dist/plugins/text-formatting.mjs +1 -2
  526. package/dist/plugins/toolbar.mjs +1 -2
  527. package/dist/presets/full.mjs +1 -2
  528. package/dist/presets/minimal.mjs +1 -2
  529. package/dist/presets.mjs +1 -2
  530. package/package.json +4 -4
  531. package/dist/chunks/AttrRegistry-iNpjvcSG.mjs +0 -2
  532. package/dist/chunks/AttrRegistry-iNpjvcSG.mjs.map +0 -1
  533. package/dist/chunks/AttributedMarkCommands-BY1BSYWM.mjs +0 -2
  534. package/dist/chunks/AttributedMarkCommands-BY1BSYWM.mjs.map +0 -1
  535. package/dist/chunks/BlockInsertion-BJFhE0jA.mjs +0 -2
  536. package/dist/chunks/BlockInsertion-BJFhE0jA.mjs.map +0 -1
  537. package/dist/chunks/BlockTypePickerRegistry-DcSE6IXB.mjs +0 -2
  538. package/dist/chunks/BlockTypePickerRegistry-DcSE6IXB.mjs.map +0 -1
  539. package/dist/chunks/ColorGrid-CpkbKfXg.mjs +0 -2
  540. package/dist/chunks/ColorGrid-CpkbKfXg.mjs.map +0 -1
  541. package/dist/chunks/ColorPickerPopup-D6XjShhv.mjs +0 -2
  542. package/dist/chunks/ColorPickerPopup-D6XjShhv.mjs.map +0 -1
  543. package/dist/chunks/ColorValidation-DCSKq9B2.mjs +0 -2
  544. package/dist/chunks/ColorValidation-DCSKq9B2.mjs.map +0 -1
  545. package/dist/chunks/CommandHelpers-M6mPS6Ww.mjs +0 -2
  546. package/dist/chunks/CommandHelpers-M6mPS6Ww.mjs.map +0 -1
  547. package/dist/chunks/Commands-D_gMCnVa.mjs +0 -2
  548. package/dist/chunks/Commands-D_gMCnVa.mjs.map +0 -1
  549. package/dist/chunks/Decoration-D49mFXrH.mjs +0 -2
  550. package/dist/chunks/Decoration-D49mFXrH.mjs.map +0 -1
  551. package/dist/chunks/Document-3pNX7ear.mjs +0 -2
  552. package/dist/chunks/Document-3pNX7ear.mjs.map +0 -1
  553. package/dist/chunks/DocumentParser-LvzDQOd1.mjs +0 -2
  554. package/dist/chunks/DocumentParser-LvzDQOd1.mjs.map +0 -1
  555. package/dist/chunks/DomUtils-CznMAZZg.mjs +0 -2
  556. package/dist/chunks/DomUtils-CznMAZZg.mjs.map +0 -1
  557. package/dist/chunks/HTMLUtils-Cxy99Ak2.mjs +0 -2
  558. package/dist/chunks/HTMLUtils-Cxy99Ak2.mjs.map +0 -1
  559. package/dist/chunks/HeadingPlugin-BmkeUXj8.mjs +0 -2
  560. package/dist/chunks/HeadingPlugin-BmkeUXj8.mjs.map +0 -1
  561. package/dist/chunks/KeyboardNav-DsYhKKuV.mjs +0 -2
  562. package/dist/chunks/KeyboardNav-DsYhKKuV.mjs.map +0 -1
  563. package/dist/chunks/MarkCommands-CeCa4WSC.mjs +0 -2
  564. package/dist/chunks/MarkCommands-CeCa4WSC.mjs.map +0 -1
  565. package/dist/chunks/NavigationQueries-11qe4j9x.mjs +0 -2
  566. package/dist/chunks/NavigationQueries-11qe4j9x.mjs.map +0 -1
  567. package/dist/chunks/NodeResolver-z0ReCR34.mjs +0 -2
  568. package/dist/chunks/NodeResolver-z0ReCR34.mjs.map +0 -1
  569. package/dist/chunks/NodeSelectionCommands-CXrOcPtG.mjs +0 -2
  570. package/dist/chunks/NodeSelectionCommands-CXrOcPtG.mjs.map +0 -1
  571. package/dist/chunks/NotectlEditor-BJD7-FFx.mjs +0 -4
  572. package/dist/chunks/NotectlEditor-BJD7-FFx.mjs.map +0 -1
  573. package/dist/chunks/Platform-CU6itXZo.mjs +0 -2
  574. package/dist/chunks/Platform-CU6itXZo.mjs.map +0 -1
  575. package/dist/chunks/PluginHelpers-CdPR0MuT.mjs +0 -2
  576. package/dist/chunks/PluginHelpers-CdPR0MuT.mjs.map +0 -1
  577. package/dist/chunks/PopupManager-0b_Q0m7K.mjs +0 -2
  578. package/dist/chunks/PopupManager-0b_Q0m7K.mjs.map +0 -1
  579. package/dist/chunks/PopupPositioning-DtvqMSop.mjs +0 -2
  580. package/dist/chunks/PopupPositioning-DtvqMSop.mjs.map +0 -1
  581. package/dist/chunks/PrintTypes-DukwDSWS.mjs +0 -2
  582. package/dist/chunks/PrintTypes-DukwDSWS.mjs.map +0 -1
  583. package/dist/chunks/RangeIterator-XFN5FaYf.mjs +0 -2
  584. package/dist/chunks/RangeIterator-XFN5FaYf.mjs.map +0 -1
  585. package/dist/chunks/Selection-DhbizDM4.mjs +0 -2
  586. package/dist/chunks/Selection-DhbizDM4.mjs.map +0 -1
  587. package/dist/chunks/SelectionTransactions-DzIZxcuN.mjs +0 -2
  588. package/dist/chunks/SelectionTransactions-DzIZxcuN.mjs.map +0 -1
  589. package/dist/chunks/ShortcutFormatting-BLKS0Gys.mjs +0 -2
  590. package/dist/chunks/ShortcutFormatting-BLKS0Gys.mjs.map +0 -1
  591. package/dist/chunks/StyleRuntime-BmsLoEa8.mjs +0 -2
  592. package/dist/chunks/StyleRuntime-BmsLoEa8.mjs.map +0 -1
  593. package/dist/chunks/TextDirectionLocale-CKz0ZrH_.mjs +0 -2
  594. package/dist/chunks/TextDirectionLocale-CKz0ZrH_.mjs.map +0 -1
  595. package/dist/chunks/TypeBrands-Bp_Z_o5Y.mjs +0 -2
  596. package/dist/chunks/TypeBrands-Bp_Z_o5Y.mjs.map +0 -1
  597. package/dist/chunks/XmlPatterns-DxQXGjP8.mjs +0 -2
  598. package/dist/chunks/XmlPatterns-DxQXGjP8.mjs.map +0 -1
  599. package/dist/chunks/ar-B93SPJT7.mjs +0 -2
  600. package/dist/chunks/ar-B93SPJT7.mjs.map +0 -1
  601. package/dist/chunks/ar-BAmGa08u.mjs +0 -2
  602. package/dist/chunks/ar-BAmGa08u.mjs.map +0 -1
  603. package/dist/chunks/ar-BYNFEVLc.mjs +0 -2
  604. package/dist/chunks/ar-BYNFEVLc.mjs.map +0 -1
  605. package/dist/chunks/ar-Bnc7y8BP.mjs +0 -2
  606. package/dist/chunks/ar-Bnc7y8BP.mjs.map +0 -1
  607. package/dist/chunks/ar-Bp3rDZky.mjs +0 -2
  608. package/dist/chunks/ar-Bp3rDZky.mjs.map +0 -1
  609. package/dist/chunks/ar-BtOQ7lro.mjs +0 -2
  610. package/dist/chunks/ar-BtOQ7lro.mjs.map +0 -1
  611. package/dist/chunks/ar-C5JEHhw9.mjs +0 -2
  612. package/dist/chunks/ar-C5JEHhw9.mjs.map +0 -1
  613. package/dist/chunks/ar-CL3QL0tw.mjs +0 -2
  614. package/dist/chunks/ar-CL3QL0tw.mjs.map +0 -1
  615. package/dist/chunks/ar-CYtG-XlN.mjs +0 -2
  616. package/dist/chunks/ar-CYtG-XlN.mjs.map +0 -1
  617. package/dist/chunks/ar-CzVj8p__.mjs +0 -2
  618. package/dist/chunks/ar-CzVj8p__.mjs.map +0 -1
  619. package/dist/chunks/ar-D7PS3e2g.mjs +0 -2
  620. package/dist/chunks/ar-D7PS3e2g.mjs.map +0 -1
  621. package/dist/chunks/ar-D8adM2Uy.mjs +0 -2
  622. package/dist/chunks/ar-D8adM2Uy.mjs.map +0 -1
  623. package/dist/chunks/ar-D9jyShaB.mjs +0 -2
  624. package/dist/chunks/ar-D9jyShaB.mjs.map +0 -1
  625. package/dist/chunks/ar-DR6OA3ZO.mjs +0 -2
  626. package/dist/chunks/ar-DR6OA3ZO.mjs.map +0 -1
  627. package/dist/chunks/ar-Deibepjm.mjs +0 -2
  628. package/dist/chunks/ar-Deibepjm.mjs.map +0 -1
  629. package/dist/chunks/ar-Dlb5riUN.mjs +0 -2
  630. package/dist/chunks/ar-Dlb5riUN.mjs.map +0 -1
  631. package/dist/chunks/ar-DmmxE2W7.mjs +0 -2
  632. package/dist/chunks/ar-DmmxE2W7.mjs.map +0 -1
  633. package/dist/chunks/ar-Ds6Z2Gzf.mjs +0 -2
  634. package/dist/chunks/ar-Ds6Z2Gzf.mjs.map +0 -1
  635. package/dist/chunks/ar-DtIHQ8nU.mjs +0 -2
  636. package/dist/chunks/ar-DtIHQ8nU.mjs.map +0 -1
  637. package/dist/chunks/ar-J8B-on-0.mjs +0 -2
  638. package/dist/chunks/ar-J8B-on-0.mjs.map +0 -1
  639. package/dist/chunks/ar-b6VdnxAs.mjs +0 -2
  640. package/dist/chunks/ar-b6VdnxAs.mjs.map +0 -1
  641. package/dist/chunks/ar-iU02mRe5.mjs +0 -2
  642. package/dist/chunks/ar-iU02mRe5.mjs.map +0 -1
  643. package/dist/chunks/ar-mSCYQYnL.mjs +0 -2
  644. package/dist/chunks/ar-mSCYQYnL.mjs.map +0 -1
  645. package/dist/chunks/color-picker-Byjl_xr9.mjs +0 -2
  646. package/dist/chunks/color-picker-Byjl_xr9.mjs.map +0 -1
  647. package/dist/chunks/de-8aCC5jBM.mjs +0 -2
  648. package/dist/chunks/de-8aCC5jBM.mjs.map +0 -1
  649. package/dist/chunks/de-B4y4ndUw.mjs +0 -2
  650. package/dist/chunks/de-B4y4ndUw.mjs.map +0 -1
  651. package/dist/chunks/de-B5fcZ0FQ.mjs +0 -2
  652. package/dist/chunks/de-B5fcZ0FQ.mjs.map +0 -1
  653. package/dist/chunks/de-BT9VmwoJ.mjs +0 -2
  654. package/dist/chunks/de-BT9VmwoJ.mjs.map +0 -1
  655. package/dist/chunks/de-BZWSyJTG.mjs +0 -2
  656. package/dist/chunks/de-BZWSyJTG.mjs.map +0 -1
  657. package/dist/chunks/de-CFD_Wgik.mjs +0 -2
  658. package/dist/chunks/de-CFD_Wgik.mjs.map +0 -1
  659. package/dist/chunks/de-CLYtb6kD.mjs +0 -2
  660. package/dist/chunks/de-CLYtb6kD.mjs.map +0 -1
  661. package/dist/chunks/de-CP5v-98M.mjs +0 -2
  662. package/dist/chunks/de-CP5v-98M.mjs.map +0 -1
  663. package/dist/chunks/de-CYJ6uWno.mjs +0 -2
  664. package/dist/chunks/de-CYJ6uWno.mjs.map +0 -1
  665. package/dist/chunks/de-ChcKkF7A.mjs +0 -2
  666. package/dist/chunks/de-ChcKkF7A.mjs.map +0 -1
  667. package/dist/chunks/de-CicoU066.mjs +0 -2
  668. package/dist/chunks/de-CicoU066.mjs.map +0 -1
  669. package/dist/chunks/de-CjLAdBt2.mjs +0 -2
  670. package/dist/chunks/de-CjLAdBt2.mjs.map +0 -1
  671. package/dist/chunks/de-CtFvAXwF.mjs +0 -2
  672. package/dist/chunks/de-CtFvAXwF.mjs.map +0 -1
  673. package/dist/chunks/de-D1OAXtxJ.mjs +0 -2
  674. package/dist/chunks/de-D1OAXtxJ.mjs.map +0 -1
  675. package/dist/chunks/de-DBbzCQrm.mjs +0 -2
  676. package/dist/chunks/de-DBbzCQrm.mjs.map +0 -1
  677. package/dist/chunks/de-DOLwx_M7.mjs +0 -2
  678. package/dist/chunks/de-DOLwx_M7.mjs.map +0 -1
  679. package/dist/chunks/de-De2miMxo.mjs +0 -2
  680. package/dist/chunks/de-De2miMxo.mjs.map +0 -1
  681. package/dist/chunks/de-OTfhhinm.mjs +0 -2
  682. package/dist/chunks/de-OTfhhinm.mjs.map +0 -1
  683. package/dist/chunks/de-PZ9-LlBp.mjs +0 -2
  684. package/dist/chunks/de-PZ9-LlBp.mjs.map +0 -1
  685. package/dist/chunks/de-UREymH-5.mjs +0 -2
  686. package/dist/chunks/de-UREymH-5.mjs.map +0 -1
  687. package/dist/chunks/de-chYdoK9q.mjs +0 -2
  688. package/dist/chunks/de-chYdoK9q.mjs.map +0 -1
  689. package/dist/chunks/de-fXvs5vQT.mjs +0 -2
  690. package/dist/chunks/de-fXvs5vQT.mjs.map +0 -1
  691. package/dist/chunks/de-xJh5C_pk.mjs +0 -2
  692. package/dist/chunks/de-xJh5C_pk.mjs.map +0 -1
  693. package/dist/chunks/es-B9UhsaEI.mjs +0 -2
  694. package/dist/chunks/es-B9UhsaEI.mjs.map +0 -1
  695. package/dist/chunks/es-BHGwPgrP.mjs +0 -2
  696. package/dist/chunks/es-BHGwPgrP.mjs.map +0 -1
  697. package/dist/chunks/es-BTqy_aQ4.mjs +0 -2
  698. package/dist/chunks/es-BTqy_aQ4.mjs.map +0 -1
  699. package/dist/chunks/es-BbGOZGS_.mjs +0 -2
  700. package/dist/chunks/es-BbGOZGS_.mjs.map +0 -1
  701. package/dist/chunks/es-BjPsub0k.mjs +0 -2
  702. package/dist/chunks/es-BjPsub0k.mjs.map +0 -1
  703. package/dist/chunks/es-Bk0bRDFE.mjs +0 -2
  704. package/dist/chunks/es-Bk0bRDFE.mjs.map +0 -1
  705. package/dist/chunks/es-BkS6DsrM.mjs +0 -2
  706. package/dist/chunks/es-BkS6DsrM.mjs.map +0 -1
  707. package/dist/chunks/es-BzEpr4Bk.mjs +0 -2
  708. package/dist/chunks/es-BzEpr4Bk.mjs.map +0 -1
  709. package/dist/chunks/es-C2lnWyA0.mjs +0 -2
  710. package/dist/chunks/es-C2lnWyA0.mjs.map +0 -1
  711. package/dist/chunks/es-C7e35Muh.mjs +0 -2
  712. package/dist/chunks/es-C7e35Muh.mjs.map +0 -1
  713. package/dist/chunks/es-CBk43isB.mjs +0 -2
  714. package/dist/chunks/es-CBk43isB.mjs.map +0 -1
  715. package/dist/chunks/es-CE8t9fuM.mjs +0 -2
  716. package/dist/chunks/es-CE8t9fuM.mjs.map +0 -1
  717. package/dist/chunks/es-CFjzqIbS.mjs +0 -2
  718. package/dist/chunks/es-CFjzqIbS.mjs.map +0 -1
  719. package/dist/chunks/es-Ce-AEYxc.mjs +0 -2
  720. package/dist/chunks/es-Ce-AEYxc.mjs.map +0 -1
  721. package/dist/chunks/es-Co4AJr8Y.mjs +0 -2
  722. package/dist/chunks/es-Co4AJr8Y.mjs.map +0 -1
  723. package/dist/chunks/es-Cu5_OA4X.mjs +0 -2
  724. package/dist/chunks/es-Cu5_OA4X.mjs.map +0 -1
  725. package/dist/chunks/es-Cud6JXHf.mjs +0 -2
  726. package/dist/chunks/es-Cud6JXHf.mjs.map +0 -1
  727. package/dist/chunks/es-D-II7LZC.mjs +0 -2
  728. package/dist/chunks/es-D-II7LZC.mjs.map +0 -1
  729. package/dist/chunks/es-DBBSeOaD.mjs +0 -2
  730. package/dist/chunks/es-DBBSeOaD.mjs.map +0 -1
  731. package/dist/chunks/es-DCwjeUUu.mjs +0 -2
  732. package/dist/chunks/es-DCwjeUUu.mjs.map +0 -1
  733. package/dist/chunks/es-DvgH3-WZ.mjs +0 -2
  734. package/dist/chunks/es-DvgH3-WZ.mjs.map +0 -1
  735. package/dist/chunks/es-MgguVgIs.mjs +0 -2
  736. package/dist/chunks/es-MgguVgIs.mjs.map +0 -1
  737. package/dist/chunks/es-yXjjcxgb.mjs +0 -2
  738. package/dist/chunks/es-yXjjcxgb.mjs.map +0 -1
  739. package/dist/chunks/fr-B-_yKIAY.mjs +0 -2
  740. package/dist/chunks/fr-B-_yKIAY.mjs.map +0 -1
  741. package/dist/chunks/fr-BGyF2ym0.mjs +0 -2
  742. package/dist/chunks/fr-BGyF2ym0.mjs.map +0 -1
  743. package/dist/chunks/fr-BoRJ3B2-.mjs +0 -2
  744. package/dist/chunks/fr-BoRJ3B2-.mjs.map +0 -1
  745. package/dist/chunks/fr-BrKk4SPg.mjs +0 -2
  746. package/dist/chunks/fr-BrKk4SPg.mjs.map +0 -1
  747. package/dist/chunks/fr-C-y09LKg.mjs +0 -2
  748. package/dist/chunks/fr-C-y09LKg.mjs.map +0 -1
  749. package/dist/chunks/fr-C1W7jyd6.mjs +0 -2
  750. package/dist/chunks/fr-C1W7jyd6.mjs.map +0 -1
  751. package/dist/chunks/fr-C8CtmWBj.mjs +0 -2
  752. package/dist/chunks/fr-C8CtmWBj.mjs.map +0 -1
  753. package/dist/chunks/fr-C9oiPW0k.mjs +0 -2
  754. package/dist/chunks/fr-C9oiPW0k.mjs.map +0 -1
  755. package/dist/chunks/fr-CEkk4UyZ.mjs +0 -2
  756. package/dist/chunks/fr-CEkk4UyZ.mjs.map +0 -1
  757. package/dist/chunks/fr-Ccaetiwi.mjs +0 -2
  758. package/dist/chunks/fr-Ccaetiwi.mjs.map +0 -1
  759. package/dist/chunks/fr-Ccku5KzA.mjs +0 -2
  760. package/dist/chunks/fr-Ccku5KzA.mjs.map +0 -1
  761. package/dist/chunks/fr-CfUg1FxU.mjs +0 -2
  762. package/dist/chunks/fr-CfUg1FxU.mjs.map +0 -1
  763. package/dist/chunks/fr-DDkBcjmO.mjs +0 -2
  764. package/dist/chunks/fr-DDkBcjmO.mjs.map +0 -1
  765. package/dist/chunks/fr-DNwLChcm.mjs +0 -2
  766. package/dist/chunks/fr-DNwLChcm.mjs.map +0 -1
  767. package/dist/chunks/fr-DvneSjCf.mjs +0 -2
  768. package/dist/chunks/fr-DvneSjCf.mjs.map +0 -1
  769. package/dist/chunks/fr-Dx4Qqimj.mjs +0 -2
  770. package/dist/chunks/fr-Dx4Qqimj.mjs.map +0 -1
  771. package/dist/chunks/fr-RHXmueoO.mjs +0 -2
  772. package/dist/chunks/fr-RHXmueoO.mjs.map +0 -1
  773. package/dist/chunks/fr-VdiCNF4J.mjs +0 -2
  774. package/dist/chunks/fr-VdiCNF4J.mjs.map +0 -1
  775. package/dist/chunks/fr-Wiobfk5s.mjs +0 -2
  776. package/dist/chunks/fr-Wiobfk5s.mjs.map +0 -1
  777. package/dist/chunks/fr-YMiDtWuG.mjs +0 -2
  778. package/dist/chunks/fr-YMiDtWuG.mjs.map +0 -1
  779. package/dist/chunks/fr-_Oxf0k66.mjs +0 -2
  780. package/dist/chunks/fr-_Oxf0k66.mjs.map +0 -1
  781. package/dist/chunks/fr-gurfH-7T.mjs +0 -2
  782. package/dist/chunks/fr-gurfH-7T.mjs.map +0 -1
  783. package/dist/chunks/fr-zP7EjxDL.mjs +0 -2
  784. package/dist/chunks/fr-zP7EjxDL.mjs.map +0 -1
  785. package/dist/chunks/hi-B2W8pFqK.mjs +0 -2
  786. package/dist/chunks/hi-B2W8pFqK.mjs.map +0 -1
  787. package/dist/chunks/hi-B2m69ZCq.mjs +0 -2
  788. package/dist/chunks/hi-B2m69ZCq.mjs.map +0 -1
  789. package/dist/chunks/hi-BMIt3y_-.mjs +0 -2
  790. package/dist/chunks/hi-BMIt3y_-.mjs.map +0 -1
  791. package/dist/chunks/hi-BdtVhAzs.mjs +0 -2
  792. package/dist/chunks/hi-BdtVhAzs.mjs.map +0 -1
  793. package/dist/chunks/hi-BmkfaZpg.mjs +0 -2
  794. package/dist/chunks/hi-BmkfaZpg.mjs.map +0 -1
  795. package/dist/chunks/hi-C-l_R2SO.mjs +0 -2
  796. package/dist/chunks/hi-C-l_R2SO.mjs.map +0 -1
  797. package/dist/chunks/hi-C1LhM-oY.mjs +0 -2
  798. package/dist/chunks/hi-C1LhM-oY.mjs.map +0 -1
  799. package/dist/chunks/hi-CGEbGI1l.mjs +0 -2
  800. package/dist/chunks/hi-CGEbGI1l.mjs.map +0 -1
  801. package/dist/chunks/hi-CPuhj7IA.mjs +0 -2
  802. package/dist/chunks/hi-CPuhj7IA.mjs.map +0 -1
  803. package/dist/chunks/hi-CT5WERqi.mjs +0 -2
  804. package/dist/chunks/hi-CT5WERqi.mjs.map +0 -1
  805. package/dist/chunks/hi-CbLPPQ0b.mjs +0 -2
  806. package/dist/chunks/hi-CbLPPQ0b.mjs.map +0 -1
  807. package/dist/chunks/hi-ClvEtEKe.mjs +0 -2
  808. package/dist/chunks/hi-ClvEtEKe.mjs.map +0 -1
  809. package/dist/chunks/hi-CpBWHmYH.mjs +0 -2
  810. package/dist/chunks/hi-CpBWHmYH.mjs.map +0 -1
  811. package/dist/chunks/hi-DAfl8nU_.mjs +0 -2
  812. package/dist/chunks/hi-DAfl8nU_.mjs.map +0 -1
  813. package/dist/chunks/hi-DVof3w0y.mjs +0 -2
  814. package/dist/chunks/hi-DVof3w0y.mjs.map +0 -1
  815. package/dist/chunks/hi-DtlvSQkD.mjs +0 -2
  816. package/dist/chunks/hi-DtlvSQkD.mjs.map +0 -1
  817. package/dist/chunks/hi-FH3CAJuR.mjs +0 -2
  818. package/dist/chunks/hi-FH3CAJuR.mjs.map +0 -1
  819. package/dist/chunks/hi-Ga9h9a_1.mjs +0 -2
  820. package/dist/chunks/hi-Ga9h9a_1.mjs.map +0 -1
  821. package/dist/chunks/hi-Zc17M1T-.mjs +0 -2
  822. package/dist/chunks/hi-Zc17M1T-.mjs.map +0 -1
  823. package/dist/chunks/hi-g7i0bmig.mjs +0 -2
  824. package/dist/chunks/hi-g7i0bmig.mjs.map +0 -1
  825. package/dist/chunks/hi-js2P6byR.mjs +0 -2
  826. package/dist/chunks/hi-js2P6byR.mjs.map +0 -1
  827. package/dist/chunks/hi-ntUsOspQ.mjs +0 -2
  828. package/dist/chunks/hi-ntUsOspQ.mjs.map +0 -1
  829. package/dist/chunks/hi-yxAcR3w6.mjs +0 -2
  830. package/dist/chunks/hi-yxAcR3w6.mjs.map +0 -1
  831. package/dist/chunks/index-C-L4awHz.mjs +0 -2
  832. package/dist/chunks/index-C-L4awHz.mjs.map +0 -1
  833. package/dist/chunks/index-Cs9iqxhF.mjs +0 -2
  834. package/dist/chunks/index-Cs9iqxhF.mjs.map +0 -1
  835. package/dist/chunks/pt--IiroJQw.mjs +0 -2
  836. package/dist/chunks/pt--IiroJQw.mjs.map +0 -1
  837. package/dist/chunks/pt-BF72W8M5.mjs +0 -2
  838. package/dist/chunks/pt-BF72W8M5.mjs.map +0 -1
  839. package/dist/chunks/pt-BX_t4luI.mjs +0 -2
  840. package/dist/chunks/pt-BX_t4luI.mjs.map +0 -1
  841. package/dist/chunks/pt-B_XJ2s9X.mjs +0 -2
  842. package/dist/chunks/pt-B_XJ2s9X.mjs.map +0 -1
  843. package/dist/chunks/pt-C-Vp7Rxj.mjs +0 -2
  844. package/dist/chunks/pt-C-Vp7Rxj.mjs.map +0 -1
  845. package/dist/chunks/pt-CD2aCZXf.mjs +0 -2
  846. package/dist/chunks/pt-CD2aCZXf.mjs.map +0 -1
  847. package/dist/chunks/pt-CFjzqIbS.mjs +0 -2
  848. package/dist/chunks/pt-CFjzqIbS.mjs.map +0 -1
  849. package/dist/chunks/pt-CHjmBegF.mjs +0 -2
  850. package/dist/chunks/pt-CHjmBegF.mjs.map +0 -1
  851. package/dist/chunks/pt-CQRzEocL.mjs +0 -2
  852. package/dist/chunks/pt-CQRzEocL.mjs.map +0 -1
  853. package/dist/chunks/pt-Cem2WxUk.mjs +0 -2
  854. package/dist/chunks/pt-Cem2WxUk.mjs.map +0 -1
  855. package/dist/chunks/pt-D6kdF3fH.mjs +0 -2
  856. package/dist/chunks/pt-D6kdF3fH.mjs.map +0 -1
  857. package/dist/chunks/pt-DJfJVeY8.mjs +0 -2
  858. package/dist/chunks/pt-DJfJVeY8.mjs.map +0 -1
  859. package/dist/chunks/pt-DfB-IaYi.mjs +0 -2
  860. package/dist/chunks/pt-DfB-IaYi.mjs.map +0 -1
  861. package/dist/chunks/pt-DlNdH9pu.mjs +0 -2
  862. package/dist/chunks/pt-DlNdH9pu.mjs.map +0 -1
  863. package/dist/chunks/pt-DrJ0-8Yo.mjs +0 -2
  864. package/dist/chunks/pt-DrJ0-8Yo.mjs.map +0 -1
  865. package/dist/chunks/pt-DsBJpgpe.mjs +0 -2
  866. package/dist/chunks/pt-DsBJpgpe.mjs.map +0 -1
  867. package/dist/chunks/pt-DwdSYJzC.mjs +0 -2
  868. package/dist/chunks/pt-DwdSYJzC.mjs.map +0 -1
  869. package/dist/chunks/pt-Dx9UkZ3j.mjs +0 -2
  870. package/dist/chunks/pt-Dx9UkZ3j.mjs.map +0 -1
  871. package/dist/chunks/pt-K0BUlM9X.mjs +0 -2
  872. package/dist/chunks/pt-K0BUlM9X.mjs.map +0 -1
  873. package/dist/chunks/pt-TuA3_GDM.mjs +0 -2
  874. package/dist/chunks/pt-TuA3_GDM.mjs.map +0 -1
  875. package/dist/chunks/pt-cN6r-f7f.mjs +0 -2
  876. package/dist/chunks/pt-cN6r-f7f.mjs.map +0 -1
  877. package/dist/chunks/pt-uNGpVM3D.mjs +0 -2
  878. package/dist/chunks/pt-uNGpVM3D.mjs.map +0 -1
  879. package/dist/chunks/pt-v1E9u-Jx.mjs +0 -2
  880. package/dist/chunks/pt-v1E9u-Jx.mjs.map +0 -1
  881. package/dist/chunks/ru-0h51zrqE.mjs +0 -2
  882. package/dist/chunks/ru-0h51zrqE.mjs.map +0 -1
  883. package/dist/chunks/ru-4S8w6UN_.mjs +0 -2
  884. package/dist/chunks/ru-4S8w6UN_.mjs.map +0 -1
  885. package/dist/chunks/ru-B0cRw90L.mjs +0 -2
  886. package/dist/chunks/ru-B0cRw90L.mjs.map +0 -1
  887. package/dist/chunks/ru-B3O7WXNM.mjs +0 -2
  888. package/dist/chunks/ru-B3O7WXNM.mjs.map +0 -1
  889. package/dist/chunks/ru-B6zVAzvI.mjs +0 -2
  890. package/dist/chunks/ru-B6zVAzvI.mjs.map +0 -1
  891. package/dist/chunks/ru-B8teJin_.mjs +0 -2
  892. package/dist/chunks/ru-B8teJin_.mjs.map +0 -1
  893. package/dist/chunks/ru-BCriPw-8.mjs +0 -2
  894. package/dist/chunks/ru-BCriPw-8.mjs.map +0 -1
  895. package/dist/chunks/ru-BNOU16E5.mjs +0 -2
  896. package/dist/chunks/ru-BNOU16E5.mjs.map +0 -1
  897. package/dist/chunks/ru-BO6BIS5W.mjs +0 -2
  898. package/dist/chunks/ru-BO6BIS5W.mjs.map +0 -1
  899. package/dist/chunks/ru-Bdy1lLuc.mjs +0 -2
  900. package/dist/chunks/ru-Bdy1lLuc.mjs.map +0 -1
  901. package/dist/chunks/ru-BgBctNVm.mjs +0 -2
  902. package/dist/chunks/ru-BgBctNVm.mjs.map +0 -1
  903. package/dist/chunks/ru-CNLx7T3O.mjs +0 -2
  904. package/dist/chunks/ru-CNLx7T3O.mjs.map +0 -1
  905. package/dist/chunks/ru-CVSCT776.mjs +0 -2
  906. package/dist/chunks/ru-CVSCT776.mjs.map +0 -1
  907. package/dist/chunks/ru-CZvkdGnf.mjs +0 -2
  908. package/dist/chunks/ru-CZvkdGnf.mjs.map +0 -1
  909. package/dist/chunks/ru-CegMPuML.mjs +0 -2
  910. package/dist/chunks/ru-CegMPuML.mjs.map +0 -1
  911. package/dist/chunks/ru-CiLrD2Nz.mjs +0 -2
  912. package/dist/chunks/ru-CiLrD2Nz.mjs.map +0 -1
  913. package/dist/chunks/ru-ClEM6OKY.mjs +0 -2
  914. package/dist/chunks/ru-ClEM6OKY.mjs.map +0 -1
  915. package/dist/chunks/ru-CrbxCeQf.mjs +0 -2
  916. package/dist/chunks/ru-CrbxCeQf.mjs.map +0 -1
  917. package/dist/chunks/ru-D3j2x2xu.mjs +0 -2
  918. package/dist/chunks/ru-D3j2x2xu.mjs.map +0 -1
  919. package/dist/chunks/ru-DdHqb4Mh.mjs +0 -2
  920. package/dist/chunks/ru-DdHqb4Mh.mjs.map +0 -1
  921. package/dist/chunks/ru-DjgNdOdJ.mjs +0 -2
  922. package/dist/chunks/ru-DjgNdOdJ.mjs.map +0 -1
  923. package/dist/chunks/ru-Tzd5N37W.mjs +0 -2
  924. package/dist/chunks/ru-Tzd5N37W.mjs.map +0 -1
  925. package/dist/chunks/ru-XKNCzkR2.mjs +0 -2
  926. package/dist/chunks/ru-XKNCzkR2.mjs.map +0 -1
  927. package/dist/chunks/zh--oNSMazK.mjs +0 -2
  928. package/dist/chunks/zh--oNSMazK.mjs.map +0 -1
  929. package/dist/chunks/zh-BfeWdPIz.mjs +0 -2
  930. package/dist/chunks/zh-BfeWdPIz.mjs.map +0 -1
  931. package/dist/chunks/zh-BnOxGKxF.mjs +0 -2
  932. package/dist/chunks/zh-BnOxGKxF.mjs.map +0 -1
  933. package/dist/chunks/zh-BqMtE-jN.mjs +0 -2
  934. package/dist/chunks/zh-BqMtE-jN.mjs.map +0 -1
  935. package/dist/chunks/zh-C3aI7A2o.mjs +0 -2
  936. package/dist/chunks/zh-C3aI7A2o.mjs.map +0 -1
  937. package/dist/chunks/zh-C6YALJZt.mjs +0 -2
  938. package/dist/chunks/zh-C6YALJZt.mjs.map +0 -1
  939. package/dist/chunks/zh-CWdTbUOP.mjs +0 -2
  940. package/dist/chunks/zh-CWdTbUOP.mjs.map +0 -1
  941. package/dist/chunks/zh-CY01pMD4.mjs +0 -2
  942. package/dist/chunks/zh-CY01pMD4.mjs.map +0 -1
  943. package/dist/chunks/zh-Cmt7n9FY.mjs +0 -2
  944. package/dist/chunks/zh-Cmt7n9FY.mjs.map +0 -1
  945. package/dist/chunks/zh-CpP2kee3.mjs +0 -2
  946. package/dist/chunks/zh-CpP2kee3.mjs.map +0 -1
  947. package/dist/chunks/zh-Cpbg4evx.mjs +0 -2
  948. package/dist/chunks/zh-Cpbg4evx.mjs.map +0 -1
  949. package/dist/chunks/zh-Cqb55JWa.mjs +0 -2
  950. package/dist/chunks/zh-Cqb55JWa.mjs.map +0 -1
  951. package/dist/chunks/zh-DCQZ6gss.mjs +0 -2
  952. package/dist/chunks/zh-DCQZ6gss.mjs.map +0 -1
  953. package/dist/chunks/zh-DG2CNTUU.mjs +0 -2
  954. package/dist/chunks/zh-DG2CNTUU.mjs.map +0 -1
  955. package/dist/chunks/zh-DTiTJbzz.mjs +0 -2
  956. package/dist/chunks/zh-DTiTJbzz.mjs.map +0 -1
  957. package/dist/chunks/zh-Da1z6qbB.mjs +0 -2
  958. package/dist/chunks/zh-Da1z6qbB.mjs.map +0 -1
  959. package/dist/chunks/zh-Di3WqY4_.mjs +0 -2
  960. package/dist/chunks/zh-Di3WqY4_.mjs.map +0 -1
  961. package/dist/chunks/zh-DlBt06Pr.mjs +0 -2
  962. package/dist/chunks/zh-DlBt06Pr.mjs.map +0 -1
  963. package/dist/chunks/zh-Dt-wVrNr.mjs +0 -2
  964. package/dist/chunks/zh-Dt-wVrNr.mjs.map +0 -1
  965. package/dist/chunks/zh-ND6vW2M-.mjs +0 -2
  966. package/dist/chunks/zh-ND6vW2M-.mjs.map +0 -1
  967. package/dist/chunks/zh-Yd3GNsa0.mjs +0 -2
  968. package/dist/chunks/zh-Yd3GNsa0.mjs.map +0 -1
  969. package/dist/chunks/zh-lhynyH6Q.mjs +0 -2
  970. package/dist/chunks/zh-lhynyH6Q.mjs.map +0 -1
  971. package/dist/chunks/zh-v9NmlEIN.mjs +0 -2
  972. package/dist/chunks/zh-v9NmlEIN.mjs.map +0 -1
  973. package/dist/fonts.mjs.map +0 -1
  974. package/dist/full.mjs.map +0 -1
  975. package/dist/html.mjs.map +0 -1
  976. package/dist/notectl-core.mjs.map +0 -1
  977. package/dist/plugins/alignment.mjs.map +0 -1
  978. package/dist/plugins/blockquote.mjs.map +0 -1
  979. package/dist/plugins/caret-navigation.mjs.map +0 -1
  980. package/dist/plugins/code-block.mjs.map +0 -1
  981. package/dist/plugins/font-size.mjs.map +0 -1
  982. package/dist/plugins/font.mjs.map +0 -1
  983. package/dist/plugins/gap-cursor.mjs.map +0 -1
  984. package/dist/plugins/hard-break.mjs.map +0 -1
  985. package/dist/plugins/heading.mjs.map +0 -1
  986. package/dist/plugins/highlight.mjs.map +0 -1
  987. package/dist/plugins/horizontal-rule.mjs.map +0 -1
  988. package/dist/plugins/image.mjs.map +0 -1
  989. package/dist/plugins/link.mjs.map +0 -1
  990. package/dist/plugins/list.mjs.map +0 -1
  991. package/dist/plugins/print.mjs.map +0 -1
  992. package/dist/plugins/shared.mjs.map +0 -1
  993. package/dist/plugins/smart-paste.mjs.map +0 -1
  994. package/dist/plugins/strikethrough.mjs.map +0 -1
  995. package/dist/plugins/super-sub.mjs.map +0 -1
  996. package/dist/plugins/table.mjs.map +0 -1
  997. package/dist/plugins/text-color.mjs.map +0 -1
  998. package/dist/plugins/text-direction-advanced.mjs.map +0 -1
  999. package/dist/plugins/text-direction.mjs.map +0 -1
  1000. package/dist/plugins/text-formatting.mjs.map +0 -1
  1001. package/dist/plugins/toolbar.mjs.map +0 -1
  1002. package/dist/presets/full.mjs.map +0 -1
  1003. package/dist/presets/minimal.mjs.map +0 -1
  1004. package/dist/presets.mjs.map +0 -1
package/README.md CHANGED
@@ -4,12 +4,9 @@
4
4
 
5
5
  # notectl
6
6
 
7
- ### Drop one tag. Get a full editor.
7
+ ### Rich text editing as a Web Component
8
8
 
9
- `<notectl-editor>` the rich text editor that works everywhere.<br />
10
- React, Vue, Angular, Svelte, or plain HTML. Zero config, full power.
11
-
12
- <br />
9
+ Build a real editor in plain HTML, React, Vue, Svelte, or Angular without locking yourself into a framework-specific editor runtime.
13
10
 
14
11
  [![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
15
12
  [![Web Component](https://img.shields.io/badge/Web_Component-%3Cnotectl--editor%3E-purple)](https://developer.mozilla.org/en-US/docs/Web/API/Web_components)
@@ -23,187 +20,325 @@ React, Vue, Angular, Svelte, or plain HTML. Zero config, full power.
23
20
 
24
21
  <br />
25
22
 
26
- [**Try the Playground**](https://samyssmile.github.io/notectl/playground/) &nbsp;&middot;&nbsp; [Documentation](https://samyssmile.github.io/notectl/) &nbsp;&middot;&nbsp; [npm](https://www.npmjs.com/package/@notectl/core)
23
+ [Documentation](https://samyssmile.github.io/notectl/) &nbsp;&middot;&nbsp;
24
+ [Playground](https://samyssmile.github.io/notectl/playground/) &nbsp;&middot;&nbsp;
25
+ [npm: @notectl/core](https://www.npmjs.com/package/@notectl/core) &nbsp;&middot;&nbsp;
26
+ [npm: @notectl/angular](https://www.npmjs.com/package/@notectl/angular)
27
27
 
28
28
  </div>
29
29
 
30
- <br />
30
+ ## What you get
31
31
 
32
- ## Quick Start
32
+ - A framework-agnostic editor shipped as the `notectl-editor` custom element
33
+ - Immutable editor state and transaction-based updates
34
+ - A plugin system for headings, lists, links, tables, code blocks, images, fonts, and more
35
+ - CSP-safe styling with `adoptedStyleSheets`
36
+ - A fast path for "just give me a full editor" and a granular path for "I only want these plugins"
37
+
38
+ ## Install
33
39
 
34
40
  ```bash
35
41
  npm install @notectl/core
36
42
  ```
37
43
 
38
- ### Preset — full editor in 5 lines
44
+ Requirements:
45
+
46
+ - Modern browser with Custom Elements support
47
+ - Node.js 18+ for build tooling
48
+ - Angular 21+ if you use `@notectl/angular`
49
+
50
+ ## Quick start
51
+
52
+ The normal way to embed notectl is to create the Web Component with `createEditor(...)` and mount it into your app.
53
+
54
+ ### 1. Add a host element
55
+
56
+ ```html
57
+ <div id="app"></div>
58
+ ```
59
+
60
+ ### 2. Create the editor
61
+
62
+ Start with one of the shipped presets:
63
+
64
+ Minimal preset:
39
65
 
40
66
  ```ts
41
- import { createEditor, ThemePreset } from '@notectl/core';
42
- import { STARTER_FONTS } from '@notectl/core/fonts';
43
- import { createFullPreset } from '@notectl/core/presets';
67
+ import { createEditor } from '@notectl/core';
68
+ import { createMinimalPreset } from '@notectl/core/presets/minimal';
44
69
 
45
70
  const editor = await createEditor({
46
- ...createFullPreset({ font: { fonts: STARTER_FONTS } }),
47
- theme: ThemePreset.Light,
71
+ ...createMinimalPreset(),
48
72
  placeholder: 'Start typing...',
73
+ autofocus: true,
49
74
  });
50
75
 
51
- document.body.appendChild(editor);
76
+ document.getElementById('app')!.appendChild(editor);
52
77
  ```
53
78
 
54
- All standard plugins, toolbar groups, and keyboard shortcuts ready to go.
55
-
56
- ### Custom — pick exactly what you need
79
+ Full preset (toolbar, headings, lists, links, tables, code blocks, images, fonts, and more):
57
80
 
58
81
  ```ts
59
- import {
60
- createEditor,
61
- ThemePreset,
62
- } from '@notectl/core';
63
- import { HeadingPlugin } from '@notectl/core/plugins/heading';
64
- import { LinkPlugin } from '@notectl/core/plugins/link';
65
- import { ListPlugin } from '@notectl/core/plugins/list';
66
- import { TablePlugin } from '@notectl/core/plugins/table';
67
- import { TextFormattingPlugin } from '@notectl/core/plugins/text-formatting';
82
+ import { ThemePreset, createEditor } from '@notectl/core';
83
+ import { STARTER_FONTS } from '@notectl/core/fonts';
84
+ import { ToolbarOverflowBehavior } from '@notectl/core/plugins/toolbar';
85
+ import { createFullPreset } from '@notectl/core/presets/full';
86
+
87
+ const preset = createFullPreset({
88
+ font: { fonts: STARTER_FONTS },
89
+ });
68
90
 
69
91
  const editor = await createEditor({
92
+ ...preset,
93
+ toolbar: {
94
+ groups: preset.toolbar,
95
+ overflow: ToolbarOverflowBehavior.Flow,
96
+ },
70
97
  theme: ThemePreset.Light,
71
- toolbar: [
72
- [new TextFormattingPlugin({ bold: true, italic: true, underline: true })],
73
- [new HeadingPlugin()],
74
- [new ListPlugin()],
75
- [new LinkPlugin(), new TablePlugin()],
76
- ],
77
98
  placeholder: 'Start typing...',
78
99
  autofocus: true,
79
100
  });
80
101
 
81
- document.body.appendChild(editor);
102
+ document.getElementById('app')!.appendChild(editor);
82
103
  ```
83
104
 
84
- <br />
105
+ Use `createMinimalPreset()` when you want a lean starting point. Use `createFullPreset()` when you want the standard toolbar and plugin set immediately, including responsive toolbar overflow.
106
+
107
+ ## Add notectl to your app
108
+
109
+ ### Plain HTML / Vite / Vanilla JS
110
+
111
+ ```html
112
+ <!doctype html>
113
+ <html lang="en">
114
+ <head>
115
+ <meta charset="UTF-8" />
116
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
117
+ <title>My editor</title>
118
+ <style>
119
+ #app {
120
+ max-width: 800px;
121
+ margin: 2rem auto;
122
+ }
123
+
124
+ notectl-editor {
125
+ --notectl-content-min-height: 320px;
126
+ }
127
+ </style>
128
+ </head>
129
+ <body>
130
+ <div id="app"></div>
131
+
132
+ <script type="module">
133
+ import { createEditor } from '@notectl/core';
134
+ import { createMinimalPreset } from '@notectl/core/presets/minimal';
135
+
136
+ const editor = await createEditor({
137
+ ...createMinimalPreset(),
138
+ placeholder: 'Write something...',
139
+ autofocus: true,
140
+ });
141
+
142
+ document.getElementById('app').appendChild(editor);
143
+ </script>
144
+ </body>
145
+ </html>
146
+ ```
147
+
148
+ ### React
85
149
 
86
- ## Why notectl
150
+ ```tsx
151
+ import { useEffect, useRef } from 'react';
152
+ import { createEditor, type NotectlEditor } from '@notectl/core';
87
153
 
88
- <table>
89
- <tr>
90
- <td width="50%">
154
+ export function Editor() {
155
+ const containerRef = useRef<HTMLDivElement>(null);
156
+ const editorRef = useRef<NotectlEditor | null>(null);
91
157
 
92
- **CSP-compliant zero inline styles**
158
+ useEffect(() => {
159
+ let mounted = true;
93
160
 
94
- The only editor with a built-in CSP-safe rendering pipeline. All styles go through `adoptedStyleSheets` with reference-counted token management. Works with `style-src 'self'` — no `unsafe-inline` needed. ProseMirror, TipTap, Slate, Lexical, Quill all write inline styles.
161
+ createEditor({
162
+ placeholder: 'Start typing...',
163
+ autofocus: true,
164
+ }).then((editor) => {
165
+ if (!mounted || !containerRef.current) return;
166
+ containerRef.current.appendChild(editor);
167
+ editorRef.current = editor;
168
+ });
95
169
 
96
- </td>
97
- <td width="50%">
170
+ return () => {
171
+ mounted = false;
172
+ void editorRef.current?.destroy();
173
+ };
174
+ }, []);
175
+
176
+ return <div ref={containerRef} />;
177
+ }
178
+ ```
98
179
 
99
- **One dependency**
180
+ Vue and Svelte use the same pattern: create the editor on mount, append it to a host element, and call `destroy()` on unmount.
100
181
 
101
- The entire editor — state engine, reconciler, plugin system, toolbar, undo/redo, selection sync — is built from scratch with a single production dependency (DOMPurify for HTML sanitization). Tree-shakeable plugin architecture: bundle only what you use.
182
+ ### Angular
102
183
 
103
- </td>
104
- </tr>
105
- <tr>
106
- <td>
184
+ Use the Angular wrapper if you want template bindings, forms integration, and DI-based defaults.
107
185
 
108
- **True Web Component**
186
+ ```bash
187
+ npm install @notectl/core @notectl/angular
188
+ ```
109
189
 
110
- Shadow DOM encapsulation, reactive attributes, framework-agnostic by design. One `<notectl-editor>` tag works in React, Vue, Angular, Svelte, or plain HTML. No wrappers, no adapters, no version lock-in.
190
+ ```ts
191
+ // app.config.ts
192
+ import { type ApplicationConfig } from '@angular/core';
193
+ import { provideNotectl } from '@notectl/angular';
111
194
 
112
- </td>
113
- <td>
195
+ export const appConfig: ApplicationConfig = {
196
+ providers: [provideNotectl()],
197
+ };
198
+ ```
114
199
 
115
- **Plugin system with full lifecycle**
200
+ ```ts
201
+ // editor.component.ts
202
+ import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
203
+ import {
204
+ NotectlEditorComponent,
205
+ type Plugin,
206
+ HeadingPlugin,
207
+ LinkPlugin,
208
+ ListPlugin,
209
+ TextFormattingPlugin,
210
+ ThemePreset,
211
+ } from '@notectl/angular';
212
+
213
+ @Component({
214
+ selector: 'app-editor',
215
+ standalone: true,
216
+ imports: [NotectlEditorComponent],
217
+ template: `
218
+ <ntl-editor
219
+ [toolbar]="toolbar"
220
+ [theme]="theme()"
221
+ [autofocus]="true"
222
+ />
223
+ `,
224
+ changeDetection: ChangeDetectionStrategy.OnPush,
225
+ })
226
+ export class EditorComponent {
227
+ protected readonly theme = signal<ThemePreset>(ThemePreset.Light);
228
+
229
+ protected readonly toolbar: ReadonlyArray<ReadonlyArray<Plugin>> = [
230
+ [new TextFormattingPlugin({ bold: true, italic: true, underline: true })],
231
+ [new HeadingPlugin()],
232
+ [new ListPlugin()],
233
+ [new LinkPlugin()],
234
+ ];
235
+ }
236
+ ```
116
237
 
117
- Dependency-resolved initialization (topological sort), per-plugin teardown tracking, type-safe inter-plugin services via `ServiceKey<T>`, priority-ordered middleware, error isolation. Plugins can't crash the editor or leak memory.
238
+ Full Angular guide: https://samyssmile.github.io/notectl/guides/angular/
118
239
 
119
- </td>
120
- </tr>
121
- </table>
240
+ ## Build your own toolbar
122
241
 
123
- <br />
242
+ If you only want a small editor, import the plugins you need and group them in the toolbar:
124
243
 
125
- ## Plugin Ecosystem
126
-
127
- Every capability is a plugin. Compose exactly the editor you need.
128
-
129
- | Plugin | What you get |
130
- |---|---|
131
- | **TextFormattingPlugin** | Bold, italic, underline |
132
- | **StrikethroughPlugin** | ~~Strikethrough~~ text |
133
- | **SuperSubPlugin** | Superscript and subscript |
134
- | **HeadingPlugin** | H1 – H6 headings with block type picker |
135
- | **BlockquotePlugin** | Block quotes |
136
- | **ListPlugin** | Bullet, ordered, and checklists |
137
- | **LinkPlugin** | Hyperlink insertion and editing |
138
- | **TablePlugin** | Full table support with row/column controls |
139
- | **CodeBlockPlugin** | Code blocks with syntax highlighting |
140
- | **ImagePlugin** | Image upload, resize, and drag-and-drop |
141
- | **TextColorPlugin** | Text color picker |
142
- | **HighlightPlugin** | Text highlighting / background color |
143
- | **AlignmentPlugin** | Left, center, right, justify |
144
- | **FontPlugin** | Font family selection with custom web fonts |
145
- | **FontSizePlugin** | Configurable font sizes |
146
- | **HorizontalRulePlugin** | Horizontal dividers |
147
- | **PrintPlugin** | Print editor content with configurable paper sizes |
148
-
149
- See the [plugin documentation](https://samyssmile.github.io/notectl/plugins/overview/) for configuration and examples.
244
+ ```ts
245
+ import { ThemePreset, createEditor } from '@notectl/core';
246
+ import { HeadingPlugin } from '@notectl/core/plugins/heading';
247
+ import { LinkPlugin } from '@notectl/core/plugins/link';
248
+ import { ListPlugin } from '@notectl/core/plugins/list';
249
+ import { TablePlugin } from '@notectl/core/plugins/table';
250
+ import { TextFormattingPlugin } from '@notectl/core/plugins/text-formatting';
150
251
 
151
- <br />
252
+ const editor = await createEditor({
253
+ theme: ThemePreset.Light,
254
+ toolbar: [
255
+ [new TextFormattingPlugin({ bold: true, italic: true, underline: true })],
256
+ [new HeadingPlugin()],
257
+ [new ListPlugin()],
258
+ [new LinkPlugin(), new TablePlugin()],
259
+ ],
260
+ placeholder: 'Start typing...',
261
+ autofocus: true,
262
+ });
263
+ ```
152
264
 
153
- ## Built-in Features
265
+ Each inner array is one visible toolbar group.
154
266
 
155
- - **Themes** — Dark and Light presets, or create fully custom themes
156
- - **i18n** — 9 languages: English, German, Spanish, French, Chinese, Russian, Arabic, Hindi, Portuguese + auto-detect via `Locale.BROWSER`
157
- - **Paper sizes** — DIN A4, DIN A5, US Letter, US Legal for WYSIWYG page layout
158
- - **CSP-compliant** — Style delivery via `adoptedStyleSheets`, no inline styles required
159
- - **Markdown shortcuts** — `#` → H1, `##` → H2, `-` → bullet list, `1.` → ordered list, `>` → blockquote
160
- - **Syntax highlighting** — Pluggable highlighter for code blocks
267
+ ## Read and write content
161
268
 
162
- <br />
269
+ ```ts
270
+ await editor.setContentHTML('<p>Hello <strong>world</strong></p>');
163
271
 
164
- ## Content API
272
+ const html = await editor.getContentHTML();
273
+ const json = editor.getJSON();
274
+ const text = editor.getText();
275
+ const empty = editor.isEmpty();
276
+ ```
165
277
 
166
- Read and write content in any format:
278
+ You can also react to lifecycle and state events:
167
279
 
168
280
  ```ts
169
- await editor.getContentHTML(); // export as HTML
170
- await editor.setContentHTML('<p>Hello <strong>world</strong></p>'); // import HTML
171
- editor.getJSON(); // structured JSON
172
- editor.setJSON(doc); // import JSON
173
- editor.getText(); // plain text
174
- editor.isEmpty(); // check if empty
281
+ editor.on('ready', () => {
282
+ console.log('Editor is ready');
283
+ });
284
+
285
+ editor.on('stateChange', ({ newState }) => {
286
+ console.log('Document changed:', newState.doc);
287
+ });
175
288
  ```
176
289
 
177
- <br />
290
+ ## Built-in plugins
178
291
 
179
- ## Works with your stack
292
+ notectl ships plugins for:
180
293
 
181
- | | Framework | How |
182
- |---|---|---|
183
- | **Any** | Vanilla JS, React, Vue, Svelte | `<notectl-editor>` Web Component |
184
- | **Angular** | Angular 21+ | [`@notectl/angular`](https://www.npmjs.com/package/@notectl/angular) native integration |
294
+ - Text formatting
295
+ - Headings
296
+ - Blockquotes
297
+ - Bullet, ordered, and checklist lists
298
+ - Links
299
+ - Tables
300
+ - Code blocks
301
+ - Images
302
+ - Text color and highlight
303
+ - Alignment and text direction
304
+ - Fonts and font sizes
305
+ - Horizontal rules
306
+ - Print layouts
185
307
 
186
- See [`examples/vanillajs`](examples/vanillajs) and [`examples/angular`](examples/angular) for full working demos.
308
+ Full plugin reference: https://samyssmile.github.io/notectl/plugins/overview/
187
309
 
188
- <br />
310
+ ## Why teams pick notectl
189
311
 
190
- ## Contributing
312
+ - Works across frameworks because the editor is a Web Component at the core
313
+ - Strong default path for quick setup, without giving up fine-grained plugin control later
314
+ - CSP-friendly by design, without relying on inline styles
315
+ - Single production dependency: `dompurify`
316
+ - Immutable state and transaction-based updates make behavior predictable and testable
191
317
 
192
- ```bash
193
- git clone https://github.com/Samyssmile/notectl.git
194
- cd notectl && pnpm install
195
- pnpm build # build all packages
196
- pnpm test # run unit tests
197
- pnpm test:e2e # run e2e tests
198
- pnpm lint # lint
199
- ```
318
+ ## Examples
200
319
 
201
- <br />
320
+ - Vanilla example: https://github.com/Samyssmile/notectl/tree/main/examples/vanillajs
321
+ - Angular example: https://github.com/Samyssmile/notectl/tree/main/examples/angular
202
322
 
203
- <div align="center">
323
+ ## Documentation
204
324
 
205
- **[Get started](https://samyssmile.github.io/notectl/)** &nbsp;&middot;&nbsp; **[Open the playground](https://samyssmile.github.io/notectl/playground/)** &nbsp;&middot;&nbsp; **[View on npm](https://www.npmjs.com/package/@notectl/core)**
325
+ - Getting started: https://samyssmile.github.io/notectl/getting-started/installation/
326
+ - Quick start: https://samyssmile.github.io/notectl/getting-started/quick-start/
327
+ - Angular guide: https://samyssmile.github.io/notectl/guides/angular/
328
+ - Plugin docs: https://samyssmile.github.io/notectl/plugins/overview/
329
+ - Architecture overview: https://samyssmile.github.io/notectl/architecture/overview/
206
330
 
207
- MIT License
331
+ ## Development
208
332
 
209
- </div>
333
+ ```bash
334
+ pnpm install
335
+ pnpm build
336
+ pnpm test
337
+ pnpm test:e2e
338
+ pnpm lint
339
+ pnpm typecheck
340
+ ```
341
+
342
+ ## License
343
+
344
+ MIT
@@ -0,0 +1,2 @@
1
+ import{s as t}from"./StyleRuntime-0yPPJK9H.mjs";import{i as e,n as s,r as i,t as n}from"./PluginHelpers-DLKHJWJn.mjs";var a={alignStart:"Align Start",alignCenter:"Align Center",alignEnd:"Align End",justify:"Justify",toolbarLabel:"Alignment",toolbarTooltip:"Alignment"},l=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-Bm8ORJ3H.mjs"),"./locales/de.ts":()=>import("./de-Bo1kM9rb.mjs"),"./locales/es.ts":()=>import("./es-Bo0NTtQH.mjs"),"./locales/fr.ts":()=>import("./fr-Di5gv5P8.mjs"),"./locales/hi.ts":()=>import("./hi-BD5HrbxU.mjs"),"./locales/pt.ts":()=>import("./pt-Cb-1GHq4.mjs"),"./locales/ru.ts":()=>import("./ru-vfQ5Xaz4.mjs"),"./locales/zh.ts":()=>import("./zh-D5d-NAuv.mjs")});async function r(t){if("en"===t)return a;const e=l[`./locales/${t}.ts`];if(!e)return a;try{return(await e()).default}catch{return a}}var o={alignments:["start","center","end","justify"],alignableTypes:["paragraph","heading","title","subtitle","table_cell","image"],defaults:{image:"center"}},g={start:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z"/></svg>',center:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z"/></svg>',end:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z"/></svg>',justify:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zM3 3v2h18V3H3z"/></svg>'},c=class{id="alignment";name="Alignment";priority=90;config;locale;alignableTypes;constructor(t){this.config={...o,...t,defaults:{...o.defaults,...t?.defaults}}}async init(t){this.locale=await e(t,this.config.locale,a,r),this.alignableTypes=new Set(this.config.alignableTypes),this.patchNodeSpecs(t),this.registerCommands(t),this.registerKeymaps(t),this.registerToolbarItem(t),this.registerMiddleware(t)}patchNodeSpecs(t){const e=t.getSchemaRegistry();for(const s of this.config.alignableTypes){const t=e.getNodeSpec(s);if(!t)continue;if(t.attrs?.align)continue;const i=t.toDOM,n=this.config.defaults[s]??"start";e.removeNodeSpec(s),e.registerNodeSpec({...t,attrs:{...t.attrs,align:{default:n}},toDOM(e){const s=i.call(t,e);return m(s,e),s}})}}registerCommands(t){for(const e of this.config.alignments)t.registerCommand(`align${n(e)}`,()=>this.setAlignment(t,e))}registerKeymaps(t){const e={};this.config.alignments.includes("start")&&(e["Mod-Shift-L"]=()=>t.executeCommand("alignStart")),this.config.alignments.includes("center")&&(e["Mod-Shift-E"]=()=>t.executeCommand("alignCenter")),this.config.alignments.includes("end")&&(e["Mod-Shift-R"]=()=>t.executeCommand("alignEnd")),this.config.alignments.includes("justify")&&(e["Mod-Shift-J"]=()=>t.executeCommand("alignJustify")),Object.keys(e).length>0&&t.registerKeymap(e)}registerToolbarItem(t){const e=this.config.alignments.map(t=>({label:this.getAlignmentLabel(t),command:`align${n(t)}`,icon:g[t]}));t.registerToolbarItem({id:"alignment",group:"block",icon:g.start,label:this.locale.toolbarLabel,tooltip:this.locale.toolbarTooltip,command:"alignStart",popupType:"dropdown",popupConfig:{items:e},isActive:t=>this.isNonDefaultAlignment(t),isEnabled:t=>this.isAlignable(t)})}getAlignmentLabel(t){return{start:this.locale.alignStart,center:this.locale.alignCenter,end:this.locale.alignEnd,justify:this.locale.justify}[t]}registerMiddleware(t){t.registerMiddleware((t,e,s)=>{let i=!1;const n=t.steps.map(t=>{if("setBlockType"!==t.type)return t;if(!this.alignableTypes.has(t.nodeType))return t;const e=t.previousAttrs?.align;return e&&"start"!==e?(i=!0,{...t,attrs:{...t.attrs,align:e}}):t});s(i?{...t,steps:n}:t)},{name:"alignment:preserve-align"})}setAlignment(t,e){const n=t.getState(),a=s(n);if(!a||!this.alignableTypes.has(a.type))return!1;const l=i(n);if(!l)return!1;const r=n.getNodePath(l);if(!r)return!1;const o={...a.attrs,align:e},g=n.transaction("command").setNodeAttr(r,o).setSelection(n.selection).build();return t.dispatch(g),!0}isNonDefaultAlignment(t){const e=s(t);if(!e||!this.alignableTypes.has(e.type))return!1;const i=e.attrs?.align,n=this.config.defaults[e.type]??"start";return null!=i&&i!==n}isAlignable(t){const e=s(t);return null!=e&&this.alignableTypes.has(e.type)}};function m(e,s){const i=s.attrs?.align;"string"==typeof i&&"start"!==i&&t(e,"textAlign",i)}export{r as i,c as n,a as r,g as t};
2
+ //# sourceMappingURL=AlignmentPlugin-CIkPaP2h.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlignmentPlugin-CIkPaP2h.mjs","names":[],"sources":["../../src/plugins/alignment/AlignmentLocale.ts","../../src/plugins/alignment/AlignmentPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the AlignmentPlugin. */\n\nexport interface AlignmentLocale {\n\treadonly alignStart: string;\n\treadonly alignCenter: string;\n\treadonly alignEnd: string;\n\treadonly justify: string;\n\treadonly toolbarLabel: string;\n\treadonly toolbarTooltip: string;\n}\n\n// --- Default English Locale ---\n\nexport const ALIGNMENT_LOCALE_EN: AlignmentLocale = {\n\talignStart: 'Align Start',\n\talignCenter: 'Align Center',\n\talignEnd: 'Align End',\n\tjustify: 'Justify',\n\ttoolbarLabel: 'Alignment',\n\ttoolbarTooltip: 'Alignment',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: AlignmentLocale }>> =\n\timport.meta.glob<{ default: AlignmentLocale }>('./locales/*.ts', { eager: false });\n\nexport async function loadAlignmentLocale(lang: string): Promise<AlignmentLocale> {\n\tif (lang === 'en') return ALIGNMENT_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return ALIGNMENT_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn ALIGNMENT_LOCALE_EN;\n\t}\n}\n","/**\n * AlignmentPlugin: adds start/center/end/justify alignment as a block\n * attribute on paragraphs, headings, images, and other alignable types.\n * Uses logical values (`start`/`end`) instead of physical (`left`/`right`)\n * for correct behavior with RTL text direction. Patches NodeSpecs to render\n * the `align` attribute via inline `text-align` style and provides toggle\n * commands, keyboard shortcuts, and a toolbar dropdown.\n */\n\nimport type { BlockAlignment } from '../../model/BlockAlignment.js';\nimport type { BlockNode } from '../../model/Document.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport {\n\tcapitalize,\n\tgetSelectedBlock,\n\tgetSelectedBlockId,\n\tresolveLocale,\n} from '../shared/PluginHelpers.js';\nimport {\n\tALIGNMENT_LOCALE_EN,\n\ttype AlignmentLocale,\n\tloadAlignmentLocale,\n} from './AlignmentLocale.js';\n\n// --- Public Types ---\n\nexport interface AlignmentConfig {\n\t/** Which alignments to expose. Defaults to all four. */\n\treadonly alignments: readonly BlockAlignment[];\n\t/** Block types that support alignment. Defaults to paragraph + heading + title + subtitle + table_cell + image. */\n\treadonly alignableTypes: readonly string[];\n\t/** Per-type default alignment (e.g. `{ image: 'center' }`). Falls back to `'start'`. */\n\treadonly defaults: Readonly<Record<string, BlockAlignment>>;\n\treadonly locale?: AlignmentLocale;\n}\n\n// --- Constants ---\n\nconst DEFAULT_CONFIG: AlignmentConfig = {\n\talignments: ['start', 'center', 'end', 'justify'],\n\talignableTypes: ['paragraph', 'heading', 'title', 'subtitle', 'table_cell', 'image'],\n\tdefaults: { image: 'center' },\n};\n\nexport const ALIGNMENT_ICONS: Readonly<Record<BlockAlignment, string>> = {\n\tstart:\n\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"/></svg>',\n\tcenter:\n\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"/></svg>',\n\tend: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"/></svg>',\n\tjustify:\n\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zM3 3v2h18V3H3z\"/></svg>',\n};\n\n// --- Plugin ---\n\nexport class AlignmentPlugin implements Plugin {\n\treadonly id = 'alignment';\n\treadonly name = 'Alignment';\n\treadonly priority = 90;\n\n\tprivate readonly config: AlignmentConfig;\n\tprivate locale!: AlignmentLocale;\n\tprivate alignableTypes!: ReadonlySet<string>;\n\n\tconstructor(config?: Partial<AlignmentConfig>) {\n\t\tthis.config = {\n\t\t\t...DEFAULT_CONFIG,\n\t\t\t...config,\n\t\t\tdefaults: { ...DEFAULT_CONFIG.defaults, ...config?.defaults },\n\t\t};\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tALIGNMENT_LOCALE_EN,\n\t\t\tloadAlignmentLocale,\n\t\t);\n\n\t\tthis.alignableTypes = new Set(this.config.alignableTypes);\n\t\tthis.patchNodeSpecs(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymaps(context);\n\t\tthis.registerToolbarItem(context);\n\t\tthis.registerMiddleware(context);\n\t}\n\n\t// --- NodeSpec Patching ---\n\n\t/**\n\t * Patches existing NodeSpecs for alignable block types to support the\n\t * `align` attribute and render it as an inline style. Skips types\n\t * that already define an `align` attribute in their spec.\n\t */\n\tprivate patchNodeSpecs(context: PluginContext): void {\n\t\tconst registry = context.getSchemaRegistry();\n\n\t\tfor (const type of this.config.alignableTypes) {\n\t\t\tconst spec = registry.getNodeSpec(type);\n\t\t\tif (!spec) continue;\n\n\t\t\t// Skip types that already declare an `align` attr (e.g. image)\n\t\t\tif (spec.attrs?.align) continue;\n\n\t\t\tconst originalToDOM = spec.toDOM;\n\t\t\tconst defaultAlign: BlockAlignment = this.config.defaults[type] ?? 'start';\n\n\t\t\tregistry.removeNodeSpec(type);\n\t\t\tregistry.registerNodeSpec({\n\t\t\t\t...spec,\n\t\t\t\tattrs: {\n\t\t\t\t\t...spec.attrs,\n\t\t\t\t\talign: { default: defaultAlign },\n\t\t\t\t},\n\t\t\t\ttoDOM(node) {\n\t\t\t\t\tconst el = originalToDOM.call(spec, node);\n\t\t\t\t\tapplyAlignment(el, node);\n\t\t\t\t\treturn el;\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- Commands ---\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tfor (const alignment of this.config.alignments) {\n\t\t\tcontext.registerCommand(`align${capitalize(alignment)}`, () => {\n\t\t\t\treturn this.setAlignment(context, alignment);\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- Keymaps ---\n\n\tprivate registerKeymaps(context: PluginContext): void {\n\t\tconst bindings: Record<string, () => boolean> = {};\n\n\t\tif (this.config.alignments.includes('start')) {\n\t\t\tbindings['Mod-Shift-L'] = () => context.executeCommand('alignStart');\n\t\t}\n\t\tif (this.config.alignments.includes('center')) {\n\t\t\tbindings['Mod-Shift-E'] = () => context.executeCommand('alignCenter');\n\t\t}\n\t\tif (this.config.alignments.includes('end')) {\n\t\t\tbindings['Mod-Shift-R'] = () => context.executeCommand('alignEnd');\n\t\t}\n\t\tif (this.config.alignments.includes('justify')) {\n\t\t\tbindings['Mod-Shift-J'] = () => context.executeCommand('alignJustify');\n\t\t}\n\n\t\tif (Object.keys(bindings).length > 0) {\n\t\t\tcontext.registerKeymap(bindings);\n\t\t}\n\t}\n\n\t// --- Toolbar ---\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst dropdownItems = this.config.alignments.map((alignment) => ({\n\t\t\tlabel: this.getAlignmentLabel(alignment),\n\t\t\tcommand: `align${capitalize(alignment)}`,\n\t\t\ticon: ALIGNMENT_ICONS[alignment],\n\t\t}));\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'alignment',\n\t\t\tgroup: 'block',\n\t\t\ticon: ALIGNMENT_ICONS.start,\n\t\t\tlabel: this.locale.toolbarLabel,\n\t\t\ttooltip: this.locale.toolbarTooltip,\n\t\t\tcommand: 'alignStart',\n\t\t\tpopupType: 'dropdown',\n\t\t\tpopupConfig: { items: dropdownItems },\n\t\t\tisActive: (state) => this.isNonDefaultAlignment(state),\n\t\t\tisEnabled: (state) => this.isAlignable(state),\n\t\t});\n\t}\n\n\tprivate getAlignmentLabel(alignment: BlockAlignment): string {\n\t\tconst labels: Record<BlockAlignment, string> = {\n\t\t\tstart: this.locale.alignStart,\n\t\t\tcenter: this.locale.alignCenter,\n\t\t\tend: this.locale.alignEnd,\n\t\t\tjustify: this.locale.justify,\n\t\t};\n\t\treturn labels[alignment];\n\t}\n\n\t// --- Middleware ---\n\n\t/**\n\t * Preserves the `align` attribute when other plugins change the block\n\t * type (e.g. paragraph → heading) via `setBlockType`, which replaces attrs.\n\t */\n\tprivate registerMiddleware(context: PluginContext): void {\n\t\tcontext.registerMiddleware(\n\t\t\t(tr, _state, next) => {\n\t\t\t\tlet patched = false;\n\n\t\t\t\tconst patchedSteps = tr.steps.map((step) => {\n\t\t\t\t\tif (step.type !== 'setBlockType') return step;\n\t\t\t\t\tif (!this.alignableTypes.has(step.nodeType)) return step;\n\n\t\t\t\t\tconst prevAlign = step.previousAttrs?.align;\n\t\t\t\t\tif (!prevAlign || prevAlign === 'start') return step;\n\n\t\t\t\t\t// Carry forward align into new attrs\n\t\t\t\t\tpatched = true;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...step,\n\t\t\t\t\t\tattrs: { ...step.attrs, align: prevAlign },\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tnext(patched ? { ...tr, steps: patchedSteps } : tr);\n\t\t\t},\n\t\t\t{ name: 'alignment:preserve-align' },\n\t\t);\n\t}\n\n\t// --- Alignment Logic ---\n\n\tprivate setAlignment(context: PluginContext, alignment: BlockAlignment): boolean {\n\t\tconst state = context.getState();\n\t\tconst block = getSelectedBlock(state);\n\t\tif (!block || !this.alignableTypes.has(block.type)) return false;\n\n\t\tconst id = getSelectedBlockId(state);\n\t\tif (!id) return false;\n\n\t\tconst path = state.getNodePath(id);\n\t\tif (!path) return false;\n\n\t\tconst newAttrs = { ...block.attrs, align: alignment };\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setNodeAttr(path as BlockId[], newAttrs)\n\t\t\t.setSelection(state.selection)\n\t\t\t.build();\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\tprivate isNonDefaultAlignment(state: EditorState): boolean {\n\t\tconst block = getSelectedBlock(state);\n\t\tif (!block || !this.alignableTypes.has(block.type)) return false;\n\t\tconst align = block.attrs?.align;\n\t\tconst defaultAlign: BlockAlignment = this.config.defaults[block.type] ?? 'start';\n\t\treturn align != null && align !== defaultAlign;\n\t}\n\n\tprivate isAlignable(state: EditorState): boolean {\n\t\tconst block = getSelectedBlock(state);\n\t\treturn block != null && this.alignableTypes.has(block.type);\n\t}\n}\n\n// --- Helpers ---\n\nfunction applyAlignment(el: HTMLElement, node: BlockNode): void {\n\tconst align = node.attrs?.align;\n\tif (typeof align === 'string' && align !== 'start') {\n\t\tsetStyleProperty(el, 'textAlign', align);\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{y as n}from"./Document-CkQLx84k.mjs";function t(n,t){return n.type===t}function r(n,t){return n.type===t}function e(t,r){return n(t)&&t.inlineType===r}export{r as n,t as r,e as t};
2
+ //# sourceMappingURL=AttrRegistry-B1iBFcKO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttrRegistry-B1iBFcKO.mjs","names":[],"sources":["../../src/model/AttrRegistry.ts"],"sourcesContent":["/**\n * Module-augmentable attribute registries for type-safe node/mark attributes.\n *\n * Plugins extend these interfaces via `declare module`:\n * @example\n * declare module '../../model/AttrRegistry.js' {\n * interface NodeAttrRegistry {\n * heading: { level: HeadingLevel; align?: BlockAlignment };\n * }\n * }\n */\n\nimport type { BlockAlignment } from './BlockAlignment.js';\nimport type { BlockNode, InlineNode, Mark } from './Document.js';\nimport { isInlineNode } from './Document.js';\n\n/** Plugins augment this interface to register typed node attributes. */\nexport interface NodeAttrRegistry {\n\tparagraph: { align?: BlockAlignment };\n}\n\n/** Plugins augment this interface to register typed mark attributes. */\nexport interface MarkAttrRegistry {\n\tbold: Record<string, never>;\n\titalic: Record<string, never>;\n\tunderline: Record<string, never>;\n}\n\n/** Resolves typed attributes for known node types, falls back for unknown. */\nexport type NodeAttrsFor<T extends string> = T extends keyof NodeAttrRegistry\n\t? NodeAttrRegistry[T]\n\t: Record<string, string | number | boolean>;\n\n/** Resolves typed attributes for known mark types, falls back for unknown. */\nexport type MarkAttrsFor<T extends string> = T extends keyof MarkAttrRegistry\n\t? MarkAttrRegistry[T]\n\t: Record<string, string | number | boolean>;\n\n/** Narrows a BlockNode to a typed variant with known attributes. */\nexport function isNodeOfType<T extends keyof NodeAttrRegistry>(\n\tnode: BlockNode,\n\ttype: T,\n): node is BlockNode & { readonly type: T; readonly attrs: NodeAttrRegistry[T] } {\n\treturn (node.type as string) === type;\n}\n\n/** Narrows a Mark to a typed variant with known attributes. */\nexport function isMarkOfType<T extends keyof MarkAttrRegistry>(\n\tmark: Mark,\n\ttype: T,\n): mark is Mark & { readonly type: T; readonly attrs: MarkAttrRegistry[T] } {\n\treturn (mark.type as string) === type;\n}\n\n// --- InlineNode Attribute Registry ---\n\n/** Plugins augment this interface to register typed inline node attributes. */\n// biome-ignore lint/suspicious/noEmptyInterface: module augmentation requires interface\nexport interface InlineNodeAttrRegistry {}\n\n/** Resolves typed attributes for known inline node types, falls back for unknown. */\nexport type InlineNodeAttrsFor<T extends string> = T extends keyof InlineNodeAttrRegistry\n\t? InlineNodeAttrRegistry[T]\n\t: Record<string, string | number | boolean>;\n\n/** Narrows an InlineNode to a typed variant with known attributes. */\nexport function isInlineNodeOfType<T extends keyof InlineNodeAttrRegistry>(\n\tnode: InlineNode,\n\tinlineNodeType: T,\n): node is InlineNode & {\n\treadonly inlineType: T;\n\treadonly attrs: InlineNodeAttrRegistry[T];\n} {\n\treturn isInlineNode(node) && (node.inlineType as string) === inlineNodeType;\n}\n"],"mappings":"4CAuCA,SAAgB,EACf,EACA,GAEA,OAAQ,EAAK,OAAoB,EAIlC,SAAgB,EACf,EACA,GAEA,OAAQ,EAAK,OAAoB,EAelC,SAAgB,EACf,EACA,GAKA,OAAO,EAAa,IAAU,EAAK,aAA0B"}
@@ -0,0 +1,2 @@
1
+ import{_ as t,d as n,h as o,u as e,x as r}from"./Document-CkQLx84k.mjs";import{d as s,o as c,u as i}from"./Selection-B14e7gd0.mjs";import{i as l}from"./TypeBrands-BQR8dEYU.mjs";import{n as a}from"./AttrRegistry-B1iBFcKO.mjs";function f(t,n,o){const r=t.getBlockOrder(),s=r.indexOf(n.from.blockId),c=r.indexOf(n.to.blockId);for(let i=s;i<=c;i++){const l=r[i];if(!l)continue;const a=t.getBlock(l);if(!a)continue;const f=i===s?n.from.offset:0,u=i===c?n.to.offset:e(a);f!==u&&o(l,f,u)}}function u(t,o){const e=t.selection;if(!i(e))return null;const r=l(o.type);if(c(e)){const s=t.getBlock(e.anchor.blockId);if(!s)return null;const c=[...(t.storedMarks??n(s,e.anchor.offset)).filter(t=>t.type!==r),o];return t.transaction("command").setStoredMarks(c,t.storedMarks).setSelection(e).build()}const a=s(e,t.getBlockOrder()),u=t.transaction("command");return f(t,a,(n,e,s)=>{const c=t.getBlock(n);if(c){const t=p(c,r,e,s);t&&u.removeMark(n,e,s,t)}u.addMark(n,e,s,o)}),u.setSelection(e),u.build()}function d(o,e){const r=o.selection;if(!i(r))return null;if(c(r)){const s=o.getBlock(r.anchor.blockId);if(!s)return null;const c=o.storedMarks??n(s,r.anchor.offset);if(!t(c,e))return null;const i=c.filter(t=>t.type!==e);return o.transaction("command").setStoredMarks(i,o.storedMarks).setSelection(r).build()}const l=s(r,o.getBlockOrder()),a=o.transaction("command");return f(o,l,(t,n,r)=>{const s=o.getBlock(t),c=s?p(s,e,n,r):void 0;a.removeMark(t,n,r,c??{type:e})}),a.setSelection(r),a.build()}function k(t,o,e){const r=t.selection;if(!i(r))return null;if(c(r)&&t.storedMarks){const n=t.storedMarks.find(t=>t.type===o);return n&&a(n,o)?e(n):null}const s=t.getBlock(r.anchor.blockId);if(!s)return null;const l=n(s,r.anchor.offset).find(t=>t.type===o);return l&&a(l,o)?e(l):null}function m(t,n){return null!==k(t,n,()=>!0)}function p(t,n,e,s){const c=o(t);let i=0;for(const o of c){if(!r(o)){i+=1;continue}const t=i+o.text.length;if(t>e&&i<s){const t=o.marks.find(t=>t.type===n);if(t)return t}i=t}}export{f as a,d as i,k as n,m as r,u as t};
2
+ //# sourceMappingURL=AttributedMarkCommands-Cmet1IuC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttributedMarkCommands-Cmet1IuC.mjs","names":[],"sources":["../../src/commands/RangeIterator.ts","../../src/commands/AttributedMarkCommands.ts"],"sourcesContent":["/**\n * Utility for iterating over blocks within a selection range.\n *\n * Extracted from Commands.ts to break circular dependencies:\n * Commands.ts re-exports from MarkCommands.ts / AttributedMarkCommands.ts,\n * which in turn import forEachBlockInRange from Commands.ts.\n */\n\nimport { getBlockLength } from '../model/Document.js';\nimport type { SelectionRange } from '../model/Selection.js';\nimport type { BlockId } from '../model/TypeBrands.js';\nimport type { EditorState } from '../state/EditorState.js';\n\n/**\n * Iterates over each block in the given selection range, invoking the callback\n * with the block ID, per-block start offset, and per-block end offset.\n * Blocks where `from === to` are skipped automatically.\n */\nexport function forEachBlockInRange(\n\tstate: EditorState,\n\trange: SelectionRange,\n\tcallback: (blockId: BlockId, from: number, to: number) => void,\n): void {\n\tconst blockOrder: readonly BlockId[] = state.getBlockOrder();\n\tconst fromIdx: number = blockOrder.indexOf(range.from.blockId);\n\tconst toIdx: number = blockOrder.indexOf(range.to.blockId);\n\n\tfor (let i: number = fromIdx; i <= toIdx; i++) {\n\t\tconst blockId: BlockId | undefined = blockOrder[i];\n\t\tif (!blockId) continue;\n\t\tconst block = state.getBlock(blockId);\n\t\tif (!block) continue;\n\n\t\tconst from: number = i === fromIdx ? range.from.offset : 0;\n\t\tconst to: number = i === toIdx ? range.to.offset : getBlockLength(block);\n\n\t\tif (from === to) continue;\n\t\tcallback(blockId, from, to);\n\t}\n}\n","/**\n * Generic helpers for attributed marks (marks with key/value attrs).\n *\n * Unlike boolean marks (`bold`, `italic`) that toggle on/off, attributed\n * marks (`font`, `fontSize`, `textColor`, `highlight`) carry data and use\n * **replace** semantics: applying a new value removes the old one first.\n *\n * These helpers extract the duplicated collapsed-vs-range branching that\n * was previously copy-pasted across ColorMarkOperations, FontSizeOperations,\n * and FontPlugin.\n */\n\nimport { isMarkOfType } from '../model/AttrRegistry.js';\nimport type { MarkAttrRegistry } from '../model/AttrRegistry.js';\nimport type { BlockNode, Mark, TextNode } from '../model/Document.js';\nimport {\n\tgetBlockMarksAtOffset,\n\tgetInlineChildren,\n\thasMark,\n\tisTextNode,\n} from '../model/Document.js';\nimport type { InlineNode } from '../model/Document.js';\nimport { isCollapsed, isTextSelection, selectionRange } from '../model/Selection.js';\nimport { markType } from '../model/TypeBrands.js';\nimport type { MarkTypeName } from '../model/TypeBrands.js';\nimport type { EditorState } from '../state/EditorState.js';\nimport type { Transaction } from '../state/Transaction.js';\nimport { forEachBlockInRange } from './RangeIterator.js';\n\n/**\n * Applies an attributed mark to the current selection.\n *\n * - **Collapsed cursor**: replaces stored marks (filters out old mark of the\n * same type, appends the new one).\n * - **Range selection**: removes then re-adds the mark in every block span.\n *\n * Returns the built `Transaction`, or `null` when the selection is\n * unsupported (node-selection / gap-cursor) or the anchor block is missing.\n */\nexport function applyAttributedMark(state: EditorState, mark: Mark): Transaction | null {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return null;\n\n\tconst typeName: MarkTypeName = markType(mark.type as string);\n\n\tif (isCollapsed(sel)) {\n\t\tconst anchorBlock = state.getBlock(sel.anchor.blockId);\n\t\tif (!anchorBlock) return null;\n\t\tconst currentMarks: readonly Mark[] =\n\t\t\tstate.storedMarks ?? getBlockMarksAtOffset(anchorBlock, sel.anchor.offset);\n\t\tconst withoutMark: readonly Mark[] = currentMarks.filter((m) => m.type !== typeName);\n\t\tconst newMarks: readonly Mark[] = [...withoutMark, mark];\n\n\t\treturn state\n\t\t\t.transaction('command')\n\t\t\t.setStoredMarks(newMarks, state.storedMarks)\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t}\n\n\tconst range = selectionRange(sel, state.getBlockOrder());\n\tconst builder = state.transaction('command');\n\n\tforEachBlockInRange(state, range, (blockId, from, to) => {\n\t\tconst block: BlockNode | undefined = state.getBlock(blockId);\n\t\tif (block) {\n\t\t\tconst existing: Mark | undefined = findMarkInRange(block, typeName, from, to);\n\t\t\tif (existing) {\n\t\t\t\tbuilder.removeMark(blockId, from, to, existing);\n\t\t\t}\n\t\t}\n\t\tbuilder.addMark(blockId, from, to, mark);\n\t});\n\n\tbuilder.setSelection(sel);\n\treturn builder.build();\n}\n\n/**\n * Removes an attributed mark from the current selection.\n *\n * - **Collapsed cursor**: filters the mark out of stored marks.\n * Returns `null` when the mark was not present.\n * - **Range selection**: removes the mark across all block spans.\n *\n * Returns the built `Transaction`, or `null` when the selection is\n * unsupported or the mark is absent at a collapsed cursor.\n */\nexport function removeAttributedMark(\n\tstate: EditorState,\n\tmarkTypeName: MarkTypeName,\n): Transaction | null {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return null;\n\n\tif (isCollapsed(sel)) {\n\t\tconst anchorBlock = state.getBlock(sel.anchor.blockId);\n\t\tif (!anchorBlock) return null;\n\t\tconst currentMarks: readonly Mark[] =\n\t\t\tstate.storedMarks ?? getBlockMarksAtOffset(anchorBlock, sel.anchor.offset);\n\t\tif (!hasMark(currentMarks, markTypeName)) return null;\n\n\t\tconst newMarks: readonly Mark[] = currentMarks.filter((m) => m.type !== markTypeName);\n\t\treturn state\n\t\t\t.transaction('command')\n\t\t\t.setStoredMarks(newMarks, state.storedMarks)\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t}\n\n\tconst range = selectionRange(sel, state.getBlockOrder());\n\tconst builder = state.transaction('command');\n\n\tforEachBlockInRange(state, range, (blockId, from, to) => {\n\t\tconst block: BlockNode | undefined = state.getBlock(blockId);\n\t\tconst existing: Mark | undefined = block\n\t\t\t? findMarkInRange(block, markTypeName, from, to)\n\t\t\t: undefined;\n\t\tbuilder.removeMark(blockId, from, to, existing ?? { type: markTypeName });\n\t});\n\n\tbuilder.setSelection(sel);\n\treturn builder.build();\n}\n\n/**\n * Extracts a typed attribute value from the mark at the current selection.\n *\n * Looks at stored marks (collapsed w/ stored), block marks at cursor offset\n * (collapsed w/o stored), or anchor-block marks (range).\n *\n * @param extractFn — Narrows the found mark and returns the desired value,\n * or `null` when the mark's attrs don't match expectations.\n */\nexport function getMarkAttrAtSelection<K extends keyof MarkAttrRegistry, V>(\n\tstate: EditorState,\n\tmarkTypeName: K,\n\textractFn: (mark: Mark & { readonly type: K; readonly attrs: MarkAttrRegistry[K] }) => V | null,\n): V | null {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel)) return null;\n\n\tif (isCollapsed(sel) && state.storedMarks) {\n\t\tconst found = state.storedMarks.find((m) => (m.type as string) === markTypeName);\n\t\treturn found && isMarkOfType(found, markTypeName) ? extractFn(found) : null;\n\t}\n\n\tconst block = state.getBlock(sel.anchor.blockId);\n\tif (!block) return null;\n\tconst marks: readonly Mark[] = getBlockMarksAtOffset(block, sel.anchor.offset);\n\tconst found = marks.find((m) => (m.type as string) === markTypeName);\n\treturn found && isMarkOfType(found, markTypeName) ? extractFn(found) : null;\n}\n\n/**\n * Returns `true` when the given attributed mark type is present at the\n * current selection (collapsed or range).\n */\nexport function isAttributedMarkActive<K extends keyof MarkAttrRegistry>(\n\tstate: EditorState,\n\tmarkTypeName: K,\n): boolean {\n\treturn getMarkAttrAtSelection(state, markTypeName, () => true as const) !== null;\n}\n\n/**\n * Finds the first mark of the given type within an offset range of a block.\n *\n * Returns the full mark (including attrs) so callers can pass it to\n * `removeMark` for correct undo inversion, or `undefined` when absent.\n */\nfunction findMarkInRange(\n\tblock: BlockNode,\n\ttypeName: MarkTypeName,\n\tfrom: number,\n\tto: number,\n): Mark | undefined {\n\tconst children: readonly (TextNode | InlineNode)[] = getInlineChildren(block);\n\tlet pos = 0;\n\n\tfor (const child of children) {\n\t\tif (!isTextNode(child)) {\n\t\t\tpos += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tconst nodeEnd: number = pos + child.text.length;\n\t\tif (nodeEnd > from && pos < to) {\n\t\t\tconst found: Mark | undefined = child.marks.find((m) => m.type === typeName);\n\t\t\tif (found) return found;\n\t\t}\n\t\tpos = nodeEnd;\n\t}\n\treturn undefined;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as t,o as n,p as e,r as o,s as r,v as s}from"./Document-CkQLx84k.mjs";import{c as i,l as c}from"./Selection-B14e7gd0.mjs";import{a,r as f}from"./TypeBrands-BQR8dEYU.mjs";import{n as u}from"./NodeResolver-CCA8UVRr.mjs";import{o as d,r as p,s as m}from"./CommandHelpers-D0LIFM4O.mjs";function l(t,n,e){const o=p(u(t.doc,n)),r=d(m(t,o),n);if(!(r<0))return{parentPath:o,anchorIndex:r,isAnchorEmpty:b(t,n,e)}}function h(t,n,e,o){const r=u(t.doc,e);if(!r)return;const i=t.getBlock(e);return i?{parentPath:r,anchorIndex:i.children.findIndex(t=>s(t)&&t.id===n),isAnchorEmpty:b(t,n,o)}:void 0}function y(t,n){if("table_cell"===t.getBlock(n)?.type)return n;const e=u(t.doc,n);if(e)for(const o of e)if("table_cell"===t.getBlock(o)?.type)return o}function g(t){return c(t)?t.nodeId:i(t)?t.blockId:t.anchor.blockId}function x(t,n,e,o,r,s){const c=y(t,e);if(c){const r=h(t,e,c,s);if(!r)return!1;const i=r.anchorIndex+1;n.insertNode(r.parentPath,i,o),r.isAnchorEmpty&&r.anchorIndex>=0&&n.removeNode(r.parentPath,r.anchorIndex)}else{const c=l(t,e,s);if(!c)return!1;const a=i(r)&&"before"===r.side?0:1;n.insertNode(c.parentPath,c.anchorIndex+a,o),c.isAnchorEmpty&&!i(r)&&n.removeNode(c.parentPath,c.anchorIndex)}return!0}function I(t,n){const e=t.children.map(t=>s(t)?I(t,r()):t);return o(t.type,e,n,t.attrs)}function k(t,n){if(t.id===n)return t;for(const e of t.children){if(!s(e))continue;const t=k(e,n);if(t)return t}}function v(t,n){if(!n)return;const e={};let o=!1;for(const r of Object.keys(n)){const s=n[r],i=t?.[r];"string"==typeof i||"number"==typeof i||"boolean"==typeof i?e[r]=i:void 0!==s.default&&(e[r]=s.default),r in e&&(o=!0)}return o?e:void 0}function b(t,n,o){const r=t.getBlock(n);return!!r&&!(o?.getNodeSpec(r.type))?.isVoid&&""===e(r)}function N(t,n){if(!t.type)return;if(!n)return t;const e=n.getNodeSpec(t.type);if(!e)return;const o=v(t.attrs,e.attrs),r=t.segments?function(t,n){const e=[];for(const o of t){if("inline"===o.kind){const t=n.getInlineNodeSpec(o.inlineType);if(!t)continue;const r=v(o.attrs,t.attrs);e.push({kind:"inline",inlineType:o.inlineType,...r?{attrs:r}:{}});continue}e.push(o)}return e}(t.segments,n):void 0;return{...t,...o?{attrs:o}:{},...r?{segments:r}:t.segments?{segments:[]}:{}}}function j(e){const s=r(),i=function(e,o){return e.segments&&e.segments.length>0?function(e){const o=[];for(const r of e){if("inline"===r.kind){o.push(t(f(r.inlineType),r.attrs));continue}if(0===r.text.length)continue;const e=r.marks.map(t=>({type:t.type,...t.attrs?{attrs:t.attrs}:{}}));o.push(n(r.text,e))}return o}(e.segments):o?[n(o)]:void 0}(e,e.text??""),c=e.attrs?e.attrs:void 0;return o(a(e.type),i,s,c)}export{x as a,l as c,y as i,v as l,j as n,g as o,k as r,h as s,I as t,N as u};
2
+ //# sourceMappingURL=BlockInsertion-DTIE2BiH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockInsertion-DTIE2BiH.mjs","names":[],"sources":["../../src/commands/BlockInsertion.ts"],"sourcesContent":["/**\n * Block insertion utilities for paste and clipboard operations.\n *\n * Provides context resolution (parent path, anchor index, empty detection)\n * for inserting blocks into the document tree — both at root level and\n * inside table cells. Also contains pure helpers for block cloning,\n * recursive lookup, and attribute sanitization against a NodeSpec.\n */\n\nimport {\n\ttype BlockAttrs,\n\ttype BlockNode,\n\ttype ChildNode,\n\ttype InlineNode,\n\ttype Mark,\n\ttype TextNode,\n\tcreateBlockNode,\n\tcreateInlineNode,\n\tcreateTextNode,\n\tgenerateBlockId,\n\tgetBlockText,\n\tisBlockNode,\n} from '../model/Document.js';\nimport { findNodePath } from '../model/NodeResolver.js';\nimport type { AttrSpec } from '../model/NodeSpec.js';\nimport type { RichBlockData, RichSegment } from '../model/RichBlockData.js';\nimport type { SchemaRegistry } from '../model/SchemaRegistry.js';\nimport type { EditorSelection } from '../model/Selection.js';\nimport { isGapCursor, isNodeSelection } from '../model/Selection.js';\nimport type { BlockId, NodeTypeName } from '../model/TypeBrands.js';\nimport { inlineType, nodeType } from '../model/TypeBrands.js';\nimport type { EditorState } from '../state/EditorState.js';\nimport type { TransactionBuilder } from '../state/Transaction.js';\nimport { extractParentPath, findSiblingIndex, getSiblings } from './CommandHelpers.js';\n\n/**\n * Resolved insertion target within the document tree.\n * Contains everything needed to insert blocks at a specific anchor position.\n */\nexport interface InsertionContext {\n\treadonly parentPath: readonly BlockId[];\n\treadonly anchorIndex: number;\n\treadonly isAnchorEmpty: boolean;\n}\n\n/**\n * Resolves an insertion context for root-level (or nested-parent-level) insertion.\n * Computes the parent path, anchor index among siblings, and whether the anchor is empty.\n */\nexport function resolveRootInsertionContext(\n\tstate: EditorState,\n\tanchorBlockId: BlockId,\n\tschemaRegistry?: SchemaRegistry,\n): InsertionContext | undefined {\n\tconst path: readonly string[] | undefined = findNodePath(state.doc, anchorBlockId);\n\tconst parentPath: BlockId[] = extractParentPath(path);\n\n\tconst siblings: readonly ChildNode[] = getSiblings(state, parentPath);\n\tconst anchorIndex: number = findSiblingIndex(siblings, anchorBlockId);\n\tif (anchorIndex < 0) return undefined;\n\n\tconst isAnchorEmpty: boolean = isBlockEmpty(state, anchorBlockId, schemaRegistry);\n\treturn { parentPath, anchorIndex, isAnchorEmpty };\n}\n\n/**\n * Resolves an insertion context within a table cell.\n * The parent path points to the cell itself; siblings are the cell's children.\n */\nexport function resolveCellInsertionContext(\n\tstate: EditorState,\n\tanchorBlockId: BlockId,\n\tcellId: BlockId,\n\tschemaRegistry?: SchemaRegistry,\n): InsertionContext | undefined {\n\tconst cellPath: BlockId[] | undefined = findNodePath(state.doc, cellId) as BlockId[] | undefined;\n\tif (!cellPath) return undefined;\n\n\tconst cell: BlockNode | undefined = state.getBlock(cellId);\n\tif (!cell) return undefined;\n\n\tconst anchorIndex: number = cell.children.findIndex(\n\t\t(c) => isBlockNode(c) && c.id === anchorBlockId,\n\t);\n\n\tconst isAnchorEmpty: boolean = isBlockEmpty(state, anchorBlockId, schemaRegistry);\n\treturn { parentPath: cellPath, anchorIndex, isAnchorEmpty };\n}\n\n/**\n * Finds a table_cell ancestor for the given block.\n * Walks the node path upward, returning the first table_cell BlockId found.\n */\nexport function findTableCellAncestor(state: EditorState, blockId: BlockId): BlockId | undefined {\n\tconst block: BlockNode | undefined = state.getBlock(blockId);\n\tif (block?.type === 'table_cell') return blockId;\n\n\tconst path: BlockId[] | undefined = findNodePath(state.doc, blockId) as BlockId[] | undefined;\n\tif (!path) return undefined;\n\n\tfor (const id of path) {\n\t\tconst node: BlockNode | undefined = state.getBlock(id as BlockId);\n\t\tif (node?.type === 'table_cell') return id as BlockId;\n\t}\n\treturn undefined;\n}\n\n/**\n * Resolves the anchor block ID from the current editor selection.\n * Handles text selection, node selection, and gap cursor uniformly.\n */\nexport function resolveAnchorBlockId(selection: EditorSelection): BlockId {\n\tif (isNodeSelection(selection)) return selection.nodeId;\n\tif (isGapCursor(selection)) return selection.blockId;\n\treturn selection.anchor.blockId;\n}\n\n/**\n * Inserts a block node after the anchor position, resolving cell vs root context.\n * Removes the anchor block if it is empty (matching standard paste behavior).\n * Returns true on success, false if context resolution fails.\n */\nexport function insertBlockAfterAnchor(\n\tstate: EditorState,\n\tbuilder: TransactionBuilder,\n\tanchorBlockId: BlockId,\n\tblock: BlockNode,\n\tselection: EditorSelection,\n\tschemaRegistry?: SchemaRegistry,\n): boolean {\n\tconst cellId: BlockId | undefined = findTableCellAncestor(state, anchorBlockId);\n\n\tif (cellId) {\n\t\tconst ctx: InsertionContext | undefined = resolveCellInsertionContext(\n\t\t\tstate,\n\t\t\tanchorBlockId,\n\t\t\tcellId,\n\t\t\tschemaRegistry,\n\t\t);\n\t\tif (!ctx) return false;\n\n\t\tconst insertIndex: number = ctx.anchorIndex + 1;\n\t\tbuilder.insertNode(ctx.parentPath, insertIndex, block);\n\n\t\tif (ctx.isAnchorEmpty && ctx.anchorIndex >= 0) {\n\t\t\tbuilder.removeNode(ctx.parentPath, ctx.anchorIndex);\n\t\t}\n\t} else {\n\t\tconst ctx: InsertionContext | undefined = resolveRootInsertionContext(\n\t\t\tstate,\n\t\t\tanchorBlockId,\n\t\t\tschemaRegistry,\n\t\t);\n\t\tif (!ctx) return false;\n\n\t\tconst insertOffset: number = isGapCursor(selection) && selection.side === 'before' ? 0 : 1;\n\t\tbuilder.insertNode(ctx.parentPath, ctx.anchorIndex + insertOffset, block);\n\n\t\tif (ctx.isAnchorEmpty && !isGapCursor(selection)) {\n\t\t\tbuilder.removeNode(ctx.parentPath, ctx.anchorIndex);\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/** Recursively clones a block tree, assigning new IDs to all block nodes. */\nexport function cloneBlockWithNewIds(block: BlockNode, newId: BlockId): BlockNode {\n\tconst children = block.children.map((child) => {\n\t\tif (isBlockNode(child)) {\n\t\t\treturn cloneBlockWithNewIds(child, generateBlockId());\n\t\t}\n\t\treturn child;\n\t});\n\treturn createBlockNode(block.type, children, newId, block.attrs);\n}\n\n/** Recursively searches a block tree for a block with the given ID (DFS). */\nexport function findBlockRecursive(block: BlockNode, blockId: BlockId): BlockNode | undefined {\n\tif (block.id === blockId) return block;\n\tfor (const child of block.children) {\n\t\tif (!isBlockNode(child)) continue;\n\t\tconst found: BlockNode | undefined = findBlockRecursive(child, blockId);\n\t\tif (found) return found;\n\t}\n\treturn undefined;\n}\n\n/**\n * Validates incoming attributes against the declared AttrSpec.\n * Only keys declared in the spec are kept; non-primitive values fall back to defaults.\n */\nexport function sanitizeAttrs(\n\tincoming: Record<string, unknown> | undefined,\n\tspecAttrs: Readonly<Record<string, AttrSpec>> | undefined,\n): Record<string, string | number | boolean> | undefined {\n\tif (!specAttrs) return undefined;\n\n\tconst result: Record<string, string | number | boolean> = {};\n\tlet hasKeys = false;\n\n\tfor (const key of Object.keys(specAttrs)) {\n\t\tconst spec: AttrSpec = specAttrs[key] as AttrSpec;\n\t\tconst raw: unknown = incoming?.[key];\n\n\t\tif (typeof raw === 'string' || typeof raw === 'number' || typeof raw === 'boolean') {\n\t\t\tresult[key] = raw;\n\t\t} else if (spec.default !== undefined) {\n\t\t\tresult[key] = spec.default;\n\t\t}\n\t\tif (key in result) hasKeys = true;\n\t}\n\n\treturn hasKeys ? result : undefined;\n}\n\n/** Checks whether a block is empty (has no text and is not a void block). */\nfunction isBlockEmpty(\n\tstate: EditorState,\n\tblockId: BlockId,\n\tschemaRegistry?: SchemaRegistry,\n): boolean {\n\tconst block: BlockNode | undefined = state.getBlock(blockId);\n\tif (!block) return false;\n\n\tconst spec = schemaRegistry?.getNodeSpec(block.type);\n\treturn !spec?.isVoid && getBlockText(block) === '';\n}\n\n// --- Rich block creation ---\n\n/**\n * Validates a rich block against the schema registry.\n * Returns undefined for blocks with unknown types; sanitizes attributes\n * against the declared spec.\n */\nexport function validateRichBlockData(\n\traw: RichBlockData,\n\tschemaRegistry?: SchemaRegistry,\n): RichBlockData | undefined {\n\tif (!raw.type) return undefined;\n\tif (!schemaRegistry) return raw;\n\n\tconst spec = schemaRegistry.getNodeSpec(raw.type);\n\tif (!spec) return undefined;\n\n\tconst attrs: Record<string, string | number | boolean> | undefined = sanitizeAttrs(\n\t\traw.attrs,\n\t\tspec.attrs,\n\t);\n\tconst segments: RichSegment[] | undefined = raw.segments\n\t\t? sanitizeRichSegments(raw.segments, schemaRegistry)\n\t\t: undefined;\n\treturn {\n\t\t...raw,\n\t\t...(attrs ? { attrs } : {}),\n\t\t...(segments ? { segments } : raw.segments ? { segments: [] } : {}),\n\t};\n}\n\n/**\n * Creates a BlockNode from validated rich block data.\n * Converts segments or plain text into inline children.\n */\nexport function createBlockFromRichData(blockData: RichBlockData): BlockNode {\n\tconst newId: BlockId = generateBlockId();\n\tconst text: string = blockData.text ?? '';\n\tconst children: readonly (TextNode | InlineNode)[] | undefined = createChildrenFromRichBlock(\n\t\tblockData,\n\t\ttext,\n\t);\n\tconst attrs: BlockAttrs | undefined = blockData.attrs\n\t\t? (blockData.attrs as BlockAttrs)\n\t\t: undefined;\n\n\treturn createBlockNode(nodeType(blockData.type) as NodeTypeName, children, newId, attrs);\n}\n\n/**\n * Creates inline children from rich block data.\n * Uses mark-preserving segments when available, falls back to plain text.\n */\nfunction createChildrenFromRichBlock(\n\tblockData: RichBlockData,\n\ttext: string,\n): readonly (TextNode | InlineNode)[] | undefined {\n\tif (blockData.segments && blockData.segments.length > 0) {\n\t\treturn createChildrenFromSegments(blockData.segments);\n\t}\n\treturn text ? [createTextNode(text)] : undefined;\n}\n\n/** Converts rich segments into TextNode children with marks. */\nfunction createChildrenFromSegments(\n\tsegments: readonly RichSegment[],\n): readonly (TextNode | InlineNode)[] {\n\tconst children: (TextNode | InlineNode)[] = [];\n\tfor (const seg of segments) {\n\t\tif (seg.kind === 'inline') {\n\t\t\tchildren.push(\n\t\t\t\tcreateInlineNode(\n\t\t\t\t\tinlineType(seg.inlineType),\n\t\t\t\t\tseg.attrs as Readonly<Record<string, string | number | boolean>> | undefined,\n\t\t\t\t),\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tif (seg.text.length === 0) continue;\n\t\tconst marks: readonly Mark[] = seg.marks.map((m) => ({\n\t\t\ttype: m.type as Mark['type'],\n\t\t\t...(m.attrs ? { attrs: m.attrs as Mark['attrs'] } : {}),\n\t\t}));\n\t\tchildren.push(createTextNode(seg.text, marks));\n\t}\n\treturn children;\n}\n\nfunction sanitizeRichSegments(\n\tsegments: readonly RichSegment[],\n\tschemaRegistry: SchemaRegistry,\n): RichSegment[] {\n\tconst sanitized: RichSegment[] = [];\n\tfor (const segment of segments) {\n\t\tif (segment.kind === 'inline') {\n\t\t\tconst spec = schemaRegistry.getInlineNodeSpec(segment.inlineType);\n\t\t\tif (!spec) continue;\n\t\t\tconst attrs = sanitizeAttrs(segment.attrs, spec.attrs);\n\t\t\tsanitized.push({\n\t\t\t\tkind: 'inline',\n\t\t\t\tinlineType: segment.inlineType,\n\t\t\t\t...(attrs ? { attrs } : {}),\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tsanitized.push(segment);\n\t}\n\treturn sanitized;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e=class{_entries=/* @__PURE__ */new Map;registerBlockTypePickerEntry(e){if(this._entries.has(e.id))throw new Error(`BlockTypePickerEntry with id "${e.id}" is already registered.`);this._entries.set(e.id,e)}getBlockTypePickerEntries(){return[...this._entries.values()].sort((e,r)=>e.priority-r.priority)}removeBlockTypePickerEntry(e){this._entries.delete(e)}clear(){this._entries.clear()}};export{e as t};
2
+ //# sourceMappingURL=BlockTypePickerRegistry-U4uY7-lN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockTypePickerRegistry-U4uY7-lN.mjs","names":[],"sources":["../../src/plugins/heading/BlockTypePickerRegistry.ts"],"sourcesContent":["/**\n * BlockTypePickerRegistry: manages plugin-registered block type picker entries\n * displayed in the heading/block type dropdown, sorted by priority.\n */\n\nimport type { BlockTypePickerEntry } from './BlockTypePickerEntry.js';\n\nexport class BlockTypePickerRegistry {\n\tprivate readonly _entries = new Map<string, BlockTypePickerEntry>();\n\n\tregisterBlockTypePickerEntry(entry: BlockTypePickerEntry): void {\n\t\tif (this._entries.has(entry.id)) {\n\t\t\tthrow new Error(`BlockTypePickerEntry with id \"${entry.id}\" is already registered.`);\n\t\t}\n\t\tthis._entries.set(entry.id, entry);\n\t}\n\n\tgetBlockTypePickerEntries(): readonly BlockTypePickerEntry[] {\n\t\treturn [...this._entries.values()].sort((a, b) => a.priority - b.priority);\n\t}\n\n\tremoveBlockTypePickerEntry(id: string): void {\n\t\tthis._entries.delete(id);\n\t}\n\n\tclear(): void {\n\t\tthis._entries.clear();\n\t}\n}\n"],"mappings":"AAOA,IAAa,EAAb,MACC,wBAA4B,IAAI,IAEhC,4BAAA,CAA6B,GAC5B,GAAI,KAAK,SAAS,IAAI,EAAM,IAC3B,MAAM,IAAI,MAAM,iCAAiC,EAAM,8BAExD,KAAK,SAAS,IAAI,EAAM,GAAI,GAG7B,yBAAA,GACC,MAAO,IAAI,KAAK,SAAS,UAAU,KAAA,CAAM,EAAG,IAAM,EAAE,SAAW,EAAE,UAGlE,0BAAA,CAA2B,GAC1B,KAAK,SAAS,OAAO,GAGtB,KAAA,GACC,KAAK,SAAS"}
@@ -0,0 +1,2 @@
1
+ import{s as t,u as e}from"./Document-CkQLx84k.mjs";import{o,t as r,u as s}from"./Selection-B14e7gd0.mjs";import{a as c}from"./TypeBrands-BQR8dEYU.mjs";import{n}from"./DomUtils-BkyCg-OO.mjs";import{i as l}from"./PluginHelpers-DLKHJWJn.mjs";import{t as i}from"./ShortcutFormatting-DQPMvupx.mjs";function a(t,e){const r=t.getState();if(!s(r.selection))return!1;const c=r.selection;if(!o(c))return!1;const n=r.getBlock(c.anchor.blockId);return!(!n||"blockquote"!==n.type)&&e({state:r,block:n,blockId:c.anchor.blockId,offset:c.anchor.offset})}var u={label:"Blockquote",tooltip:t=>`Blockquote (${t})`},p=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-CXcTrZVc.mjs"),"./locales/de.ts":()=>import("./de-CdmBKVDW.mjs"),"./locales/es.ts":()=>import("./es-B2KFVoHa.mjs"),"./locales/fr.ts":()=>import("./fr-BdQ_-Iwg.mjs"),"./locales/hi.ts":()=>import("./hi-DEreeBFj.mjs"),"./locales/pt.ts":()=>import("./pt-B4NUSLW8.mjs"),"./locales/ru.ts":()=>import("./ru-BiyE9o-D.mjs"),"./locales/zh.ts":()=>import("./zh-Do0plBjM.mjs")});async function m(t){if("en"===t)return u;const e=p[`./locales/${t}.ts`];if(!e)return u;try{return(await e()).default}catch{return u}}var g={},d=class{id="blockquote";name="Blockquote";priority=35;config;locale;constructor(t){this.config={...g,...t}}async init(t){this.locale=await l(t,this.config.locale,u,m),t.registerStyleSheet("\n.notectl-content blockquote {\n\tmargin: 0;\n\tpadding: 2px 0;\n\tpadding-inline-start: 16px;\n\tborder-inline-start: 3px solid var(--notectl-border);\n\tmin-height: 1.6em;\n}\n"),this.registerNodeSpec(t),this.registerCommands(t),this.registerKeymap(t),this.registerInputRule(t),this.registerToolbarItem(t)}registerNodeSpec(t){t.registerNodeSpec({type:"blockquote",group:"block",content:{allow:["text"]},toDOM:t=>n("blockquote",t.id),toHTML:(t,e)=>`<blockquote>${e||"<br>"}</blockquote>`,parseHTML:[{tag:"blockquote"}],sanitize:{tags:["blockquote"]}})}registerCommands(t){t.registerCommand("toggleBlockquote",()=>this.toggleBlockquote(t)),t.registerCommand("setBlockquote",()=>this.setBlockType(t,c("blockquote")))}registerKeymap(o){o.registerKeymap({"Mod-Shift->":()=>o.executeCommand("toggleBlockquote")}),function(o){o.registerKeymap({ArrowDown:()=>function(o){return a(o,({state:s,block:n,blockId:l,offset:i})=>{if(i!==e(n))return!1;const a=s.getBlockOrder(),u=a.indexOf(l);if(u<a.length-1){const t=a[u+1],e=s.transaction("command").setSelection(r(t,0)).build();o.dispatch(e)}else!function(o,s){const n=o.getState(),l=n.getBlock(s);if(!l)return;const i=e(l),a=t(),u=n.transaction("command").splitBlock(s,i,a).setBlockType(a,c("paragraph")).setSelection(r(a,0)).build();o.dispatch(u)}(o,l);return!0})}(o),ArrowUp:()=>function(t){return a(t,({state:o,blockId:s,offset:c})=>{if(0!==c)return!1;const n=o.getBlockOrder(),l=n.indexOf(s);if(l>0){const s=n[l-1],c=o.getBlock(s),i=c?e(c):0,a=o.transaction("command").setSelection(r(s,i)).build();return t.dispatch(a),!0}return!1})}(o),Enter:()=>function(t){return a(t,({state:o,block:s,blockId:n})=>{if(e(s)>0)return!1;const l=o.transaction("command").setBlockType(n,c("paragraph")).setSelection(r(n,0)).build();return t.dispatch(l),!0})}(o),Backspace:()=>function(t){return a(t,({state:e,blockId:o,offset:r})=>{if(0!==r)return!1;const s=e.transaction("input").setBlockType(o,c("paragraph")).setSelection(e.selection).build();return t.dispatch(s),!0})}(o)},{priority:"context"})}(o)}registerInputRule(t){t.registerInputRule({pattern:/^> $/,handler(t,e,r,n){const l=t.selection;if(!s(l))return null;if(!o(l))return null;const i=t.getBlock(l.anchor.blockId);return i&&"paragraph"===i.type?t.transaction("input").deleteTextAt(l.anchor.blockId,r,r+2).setBlockType(l.anchor.blockId,c("blockquote")).setSelection(l).build():null}})}registerToolbarItem(t){t.registerToolbarItem({id:"blockquote",group:"block",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z"/></svg>',label:this.locale.label,tooltip:this.locale.tooltip(i("Mod-Shift->")),command:"toggleBlockquote",isActive:t=>!!s(t.selection)&&"blockquote"===t.getBlock(t.selection.anchor.blockId)?.type})}toggleBlockquote(t){const e=t.getState();if(!s(e.selection))return!1;const o=e.getBlock(e.selection.anchor.blockId);return!!o&&("blockquote"===o.type?this.setBlockType(t,c("paragraph")):this.setBlockType(t,c("blockquote")))}setBlockType(t,e,o){const r=t.getState(),c=r.selection;if(!s(c))return!1;const n=r.transaction("command").setBlockType(c.anchor.blockId,e,o).setSelection(c).build();return t.dispatch(n),!0}};export{u as n,m as r,d as t};
2
+ //# sourceMappingURL=BlockquotePlugin-DmbnFmNj.mjs.map