@notectl/core 1.0.4 → 1.0.6

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 (334) hide show
  1. package/README.md +52 -148
  2. package/dist/chunks/AttrRegistry-DTsHyDVA.mjs +16 -0
  3. package/dist/chunks/AttrRegistry-DTsHyDVA.mjs.map +1 -0
  4. package/dist/chunks/Commands-DLP85Mp5.mjs +461 -0
  5. package/dist/chunks/Commands-DLP85Mp5.mjs.map +1 -0
  6. package/dist/chunks/Document-CI3iCwEP.mjs +177 -0
  7. package/dist/chunks/Document-CI3iCwEP.mjs.map +1 -0
  8. package/dist/chunks/HTMLUtils-0wvCRvJc.mjs +7 -0
  9. package/dist/chunks/HTMLUtils-0wvCRvJc.mjs.map +1 -0
  10. package/dist/chunks/NodeResolver-D68ZLXti.mjs +81 -0
  11. package/dist/chunks/NodeResolver-D68ZLXti.mjs.map +1 -0
  12. package/dist/chunks/NodeSpec-NZVvcCuH.mjs +8 -0
  13. package/dist/chunks/NodeSpec-NZVvcCuH.mjs.map +1 -0
  14. package/dist/chunks/Plugin-B9OZ6Y4c.mjs +15 -0
  15. package/dist/chunks/Plugin-B9OZ6Y4c.mjs.map +1 -0
  16. package/dist/chunks/Selection-D5ZjXoB7.mjs +44 -0
  17. package/dist/chunks/Selection-D5ZjXoB7.mjs.map +1 -0
  18. package/dist/chunks/ToolbarItem-ugDymuXi.mjs +7 -0
  19. package/dist/chunks/ToolbarItem-ugDymuXi.mjs.map +1 -0
  20. package/dist/chunks/ToolbarPlugin-sJTiZr-S.mjs +398 -0
  21. package/dist/chunks/ToolbarPlugin-sJTiZr-S.mjs.map +1 -0
  22. package/dist/chunks/TypeBrands-C09nE2qO.mjs +27 -0
  23. package/dist/chunks/TypeBrands-C09nE2qO.mjs.map +1 -0
  24. package/dist/chunks/color-picker-Csf0wx5a.mjs +5 -0
  25. package/dist/chunks/color-picker-Csf0wx5a.mjs.map +1 -0
  26. package/dist/chunks/index-QvKiO9_4.mjs +538 -0
  27. package/dist/chunks/index-QvKiO9_4.mjs.map +1 -0
  28. package/dist/commands/Commands.d.ts +71 -0
  29. package/dist/commands/Commands.d.ts.map +1 -0
  30. package/dist/commands/PasteCommand.d.ts +9 -0
  31. package/dist/commands/PasteCommand.d.ts.map +1 -0
  32. package/dist/decorations/Decoration.d.ts +76 -0
  33. package/dist/decorations/Decoration.d.ts.map +1 -0
  34. package/dist/decorations/PositionMapping.d.ts +9 -0
  35. package/dist/decorations/PositionMapping.d.ts.map +1 -0
  36. package/dist/editor/Announcer.d.ts +12 -0
  37. package/dist/editor/Announcer.d.ts.map +1 -0
  38. package/dist/editor/DocumentParser.d.ts +5 -0
  39. package/dist/editor/DocumentParser.d.ts.map +1 -0
  40. package/dist/editor/DocumentSerializer.d.ts +5 -0
  41. package/dist/editor/DocumentSerializer.d.ts.map +1 -0
  42. package/dist/editor/EditorDOM.d.ts +18 -0
  43. package/dist/editor/EditorDOM.d.ts.map +1 -0
  44. package/dist/editor/EditorThemeController.d.ts +21 -0
  45. package/dist/editor/EditorThemeController.d.ts.map +1 -0
  46. package/dist/editor/NotectlEditor.d.ts +135 -0
  47. package/dist/editor/NotectlEditor.d.ts.map +1 -0
  48. package/dist/editor/styles/base.d.ts +3 -0
  49. package/dist/editor/styles/base.d.ts.map +1 -0
  50. package/dist/editor/styles/code-block.d.ts +3 -0
  51. package/dist/editor/styles/code-block.d.ts.map +1 -0
  52. package/dist/editor/styles/color-picker.d.ts +3 -0
  53. package/dist/editor/styles/color-picker.d.ts.map +1 -0
  54. package/dist/editor/styles/font-select.d.ts +3 -0
  55. package/dist/editor/styles/font-select.d.ts.map +1 -0
  56. package/dist/editor/styles/font-size-select.d.ts +3 -0
  57. package/dist/editor/styles/font-size-select.d.ts.map +1 -0
  58. package/dist/editor/styles/heading-select.d.ts +3 -0
  59. package/dist/editor/styles/heading-select.d.ts.map +1 -0
  60. package/dist/editor/styles/image.d.ts +3 -0
  61. package/dist/editor/styles/image.d.ts.map +1 -0
  62. package/dist/editor/styles/list.d.ts +3 -0
  63. package/dist/editor/styles/list.d.ts.map +1 -0
  64. package/dist/editor/styles/reduced-motion.d.ts +3 -0
  65. package/dist/editor/styles/reduced-motion.d.ts.map +1 -0
  66. package/dist/editor/styles/table.d.ts +3 -0
  67. package/dist/editor/styles/table.d.ts.map +1 -0
  68. package/dist/editor/styles/toolbar.d.ts +3 -0
  69. package/dist/editor/styles/toolbar.d.ts.map +1 -0
  70. package/dist/editor/styles.d.ts +12 -0
  71. package/dist/editor/styles.d.ts.map +1 -0
  72. package/dist/editor/theme/ThemeEngine.d.ts +6 -0
  73. package/dist/editor/theme/ThemeEngine.d.ts.map +1 -0
  74. package/dist/editor/theme/ThemeTokens.d.ts +73 -0
  75. package/dist/editor/theme/ThemeTokens.d.ts.map +1 -0
  76. package/dist/fonts.d.ts +17 -0
  77. package/dist/fonts.d.ts.map +1 -0
  78. package/dist/fonts.mjs +7 -0
  79. package/dist/fonts.mjs.map +1 -0
  80. package/dist/index.d.ts +83 -2360
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/input/ClipboardHandler.d.ts +29 -0
  83. package/dist/input/ClipboardHandler.d.ts.map +1 -0
  84. package/dist/input/InputHandler.d.ts +32 -0
  85. package/dist/input/InputHandler.d.ts.map +1 -0
  86. package/dist/input/InputRule.d.ts +9 -0
  87. package/dist/input/InputRule.d.ts.map +1 -0
  88. package/dist/input/InternalClipboard.d.ts +23 -0
  89. package/dist/input/InternalClipboard.d.ts.map +1 -0
  90. package/dist/input/KeyboardHandler.d.ts +42 -0
  91. package/dist/input/KeyboardHandler.d.ts.map +1 -0
  92. package/dist/input/Keymap.d.ts +11 -0
  93. package/dist/input/Keymap.d.ts.map +1 -0
  94. package/dist/input/PasteHandler.d.ts +38 -0
  95. package/dist/input/PasteHandler.d.ts.map +1 -0
  96. package/dist/input/SourceNormalizer.d.ts +7 -0
  97. package/dist/input/SourceNormalizer.d.ts.map +1 -0
  98. package/dist/model/AttrRegistry.d.ts +39 -0
  99. package/dist/model/AttrRegistry.d.ts.map +1 -0
  100. package/dist/model/BuiltinSpecs.d.ts +4 -0
  101. package/dist/model/BuiltinSpecs.d.ts.map +1 -0
  102. package/dist/model/ContentModel.d.ts +12 -0
  103. package/dist/model/ContentModel.d.ts.map +1 -0
  104. package/dist/model/ContentSlice.d.ts +17 -0
  105. package/dist/model/ContentSlice.d.ts.map +1 -0
  106. package/dist/model/Document.d.ts +127 -0
  107. package/dist/model/Document.d.ts.map +1 -0
  108. package/dist/model/HTMLParser.d.ts +36 -0
  109. package/dist/model/HTMLParser.d.ts.map +1 -0
  110. package/dist/model/HTMLUtils.d.ts +6 -0
  111. package/dist/model/HTMLUtils.d.ts.map +1 -0
  112. package/dist/model/InlineNodeSpec.d.ts +20 -0
  113. package/dist/model/InlineNodeSpec.d.ts.map +1 -0
  114. package/dist/model/MarkSpec.d.ts +22 -0
  115. package/dist/model/MarkSpec.d.ts.map +1 -0
  116. package/dist/model/NodeResolver.d.ts +36 -0
  117. package/dist/model/NodeResolver.d.ts.map +1 -0
  118. package/dist/model/NodeSpec.d.ts +67 -0
  119. package/dist/model/NodeSpec.d.ts.map +1 -0
  120. package/dist/model/ParseRule.d.ts +11 -0
  121. package/dist/model/ParseRule.d.ts.map +1 -0
  122. package/dist/model/SanitizeConfig.d.ts +9 -0
  123. package/dist/model/SanitizeConfig.d.ts.map +1 -0
  124. package/dist/model/Schema.d.ts +17 -0
  125. package/dist/model/Schema.d.ts.map +1 -0
  126. package/dist/model/SchemaRegistry.d.ts +81 -0
  127. package/dist/model/SchemaRegistry.d.ts.map +1 -0
  128. package/dist/model/Selection.d.ts +52 -0
  129. package/dist/model/Selection.d.ts.map +1 -0
  130. package/dist/model/TypeBrands.d.ts +28 -0
  131. package/dist/model/TypeBrands.d.ts.map +1 -0
  132. package/dist/notectl-core.mjs +2715 -11109
  133. package/dist/notectl-core.mjs.map +1 -1
  134. package/dist/notectl-core.umd.js +6894 -0
  135. package/dist/notectl-core.umd.js.map +1 -0
  136. package/dist/plugins/EventBus.d.ts +13 -0
  137. package/dist/plugins/EventBus.d.ts.map +1 -0
  138. package/dist/plugins/Plugin.d.ts +85 -0
  139. package/dist/plugins/Plugin.d.ts.map +1 -0
  140. package/dist/plugins/PluginManager.d.ts +68 -0
  141. package/dist/plugins/PluginManager.d.ts.map +1 -0
  142. package/dist/plugins/alignment/AlignmentPlugin.d.ts +48 -0
  143. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -0
  144. package/dist/plugins/alignment/index.d.ts +2 -0
  145. package/dist/plugins/alignment/index.d.ts.map +1 -0
  146. package/dist/plugins/alignment.mjs +92 -0
  147. package/dist/plugins/alignment.mjs.map +1 -0
  148. package/dist/plugins/blockquote/BlockquotePlugin.d.ts +30 -0
  149. package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -0
  150. package/dist/plugins/blockquote/index.d.ts +2 -0
  151. package/dist/plugins/blockquote/index.d.ts.map +1 -0
  152. package/dist/plugins/blockquote.mjs +58 -0
  153. package/dist/plugins/blockquote.mjs.map +1 -0
  154. package/dist/plugins/code-block/CodeBlockCommands.d.ts +5 -0
  155. package/dist/plugins/code-block/CodeBlockCommands.d.ts.map +1 -0
  156. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts +10 -0
  157. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -0
  158. package/dist/plugins/code-block/CodeBlockNodeView.d.ts +5 -0
  159. package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -0
  160. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +27 -0
  161. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -0
  162. package/dist/plugins/code-block/CodeBlockService.d.ts +5 -0
  163. package/dist/plugins/code-block/CodeBlockService.d.ts.map +1 -0
  164. package/dist/plugins/code-block/CodeBlockTypes.d.ts +69 -0
  165. package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -0
  166. package/dist/plugins/code-block/index.d.ts +2 -0
  167. package/dist/plugins/code-block/index.d.ts.map +1 -0
  168. package/dist/plugins/code-block.mjs +6 -0
  169. package/dist/plugins/code-block.mjs.map +1 -0
  170. package/dist/plugins/font/FontPlugin.d.ts +85 -0
  171. package/dist/plugins/font/FontPlugin.d.ts.map +1 -0
  172. package/dist/plugins/font/StarterFonts.d.ts +10 -0
  173. package/dist/plugins/font/StarterFonts.d.ts.map +1 -0
  174. package/dist/plugins/font/index.d.ts +2 -0
  175. package/dist/plugins/font/index.d.ts.map +1 -0
  176. package/dist/plugins/font-size/FontSizeOperations.d.ts +22 -0
  177. package/dist/plugins/font-size/FontSizeOperations.d.ts.map +1 -0
  178. package/dist/plugins/font-size/FontSizePlugin.d.ts +56 -0
  179. package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -0
  180. package/dist/plugins/font-size/FontSizePopup.d.ts +9 -0
  181. package/dist/plugins/font-size/FontSizePopup.d.ts.map +1 -0
  182. package/dist/plugins/font-size/index.d.ts +2 -0
  183. package/dist/plugins/font-size/index.d.ts.map +1 -0
  184. package/dist/plugins/font-size.mjs +204 -0
  185. package/dist/plugins/font-size.mjs.map +1 -0
  186. package/dist/plugins/font.mjs +186 -0
  187. package/dist/plugins/font.mjs.map +1 -0
  188. package/dist/plugins/hard-break/HardBreakPlugin.d.ts +16 -0
  189. package/dist/plugins/hard-break/HardBreakPlugin.d.ts.map +1 -0
  190. package/dist/plugins/hard-break/index.d.ts +2 -0
  191. package/dist/plugins/hard-break/index.d.ts.map +1 -0
  192. package/dist/plugins/hard-break.mjs +28 -0
  193. package/dist/plugins/hard-break.mjs.map +1 -0
  194. package/dist/plugins/heading/BlockTypePickerEntry.d.ts +20 -0
  195. package/dist/plugins/heading/BlockTypePickerEntry.d.ts.map +1 -0
  196. package/dist/plugins/heading/HeadingPlugin.d.ts +78 -0
  197. package/dist/plugins/heading/HeadingPlugin.d.ts.map +1 -0
  198. package/dist/plugins/heading/index.d.ts +3 -0
  199. package/dist/plugins/heading/index.d.ts.map +1 -0
  200. package/dist/plugins/heading.mjs +188 -0
  201. package/dist/plugins/heading.mjs.map +1 -0
  202. package/dist/plugins/highlight/HighlightPlugin.d.ts +37 -0
  203. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -0
  204. package/dist/plugins/highlight/index.d.ts +2 -0
  205. package/dist/plugins/highlight/index.d.ts.map +1 -0
  206. package/dist/plugins/highlight.mjs +126 -0
  207. package/dist/plugins/highlight.mjs.map +1 -0
  208. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts +29 -0
  209. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -0
  210. package/dist/plugins/horizontal-rule/index.d.ts +2 -0
  211. package/dist/plugins/horizontal-rule/index.d.ts.map +1 -0
  212. package/dist/plugins/horizontal-rule.mjs +59 -0
  213. package/dist/plugins/horizontal-rule.mjs.map +1 -0
  214. package/dist/plugins/image/ImageCommands.d.ts +26 -0
  215. package/dist/plugins/image/ImageCommands.d.ts.map +1 -0
  216. package/dist/plugins/image/ImageNodeView.d.ts +6 -0
  217. package/dist/plugins/image/ImageNodeView.d.ts.map +1 -0
  218. package/dist/plugins/image/ImagePlugin.d.ts +43 -0
  219. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -0
  220. package/dist/plugins/image/ImageUpload.d.ts +48 -0
  221. package/dist/plugins/image/ImageUpload.d.ts.map +1 -0
  222. package/dist/plugins/image/index.d.ts +3 -0
  223. package/dist/plugins/image/index.d.ts.map +1 -0
  224. package/dist/plugins/image.mjs +381 -0
  225. package/dist/plugins/image.mjs.map +1 -0
  226. package/dist/plugins/link/LinkPlugin.d.ts +32 -0
  227. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -0
  228. package/dist/plugins/link/index.d.ts +2 -0
  229. package/dist/plugins/link/index.d.ts.map +1 -0
  230. package/dist/plugins/link.mjs +127 -0
  231. package/dist/plugins/link.mjs.map +1 -0
  232. package/dist/plugins/list/ListPlugin.d.ts +51 -0
  233. package/dist/plugins/list/ListPlugin.d.ts.map +1 -0
  234. package/dist/plugins/list/index.d.ts +2 -0
  235. package/dist/plugins/list/index.d.ts.map +1 -0
  236. package/dist/plugins/list.mjs +193 -0
  237. package/dist/plugins/list.mjs.map +1 -0
  238. package/dist/plugins/print/PrintContentPreparer.d.ts +12 -0
  239. package/dist/plugins/print/PrintContentPreparer.d.ts.map +1 -0
  240. package/dist/plugins/print/PrintPlugin.d.ts +12 -0
  241. package/dist/plugins/print/PrintPlugin.d.ts.map +1 -0
  242. package/dist/plugins/print/PrintServiceImpl.d.ts +7 -0
  243. package/dist/plugins/print/PrintServiceImpl.d.ts.map +1 -0
  244. package/dist/plugins/print/PrintStyleCollector.d.ts +10 -0
  245. package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -0
  246. package/dist/plugins/print/PrintTypes.d.ts +56 -0
  247. package/dist/plugins/print/PrintTypes.d.ts.map +1 -0
  248. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts +23 -0
  249. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -0
  250. package/dist/plugins/strikethrough/index.d.ts +2 -0
  251. package/dist/plugins/strikethrough/index.d.ts.map +1 -0
  252. package/dist/plugins/strikethrough.mjs +35 -0
  253. package/dist/plugins/strikethrough.mjs.map +1 -0
  254. package/dist/plugins/super-sub/SuperSubPlugin.d.ts +44 -0
  255. package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -0
  256. package/dist/plugins/super-sub/index.d.ts +2 -0
  257. package/dist/plugins/super-sub/index.d.ts.map +1 -0
  258. package/dist/plugins/super-sub.mjs +81 -0
  259. package/dist/plugins/super-sub.mjs.map +1 -0
  260. package/dist/plugins/table/TableCommands.d.ts +50 -0
  261. package/dist/plugins/table/TableCommands.d.ts.map +1 -0
  262. package/dist/plugins/table/TableControls.d.ts +10 -0
  263. package/dist/plugins/table/TableControls.d.ts.map +1 -0
  264. package/dist/plugins/table/TableControlsDOM.d.ts +18 -0
  265. package/dist/plugins/table/TableControlsDOM.d.ts.map +1 -0
  266. package/dist/plugins/table/TableControlsLayout.d.ts +34 -0
  267. package/dist/plugins/table/TableControlsLayout.d.ts.map +1 -0
  268. package/dist/plugins/table/TableHelpers.d.ts +39 -0
  269. package/dist/plugins/table/TableHelpers.d.ts.map +1 -0
  270. package/dist/plugins/table/TableNavigation.d.ts +4 -0
  271. package/dist/plugins/table/TableNavigation.d.ts.map +1 -0
  272. package/dist/plugins/table/TableNodeViews.d.ts +18 -0
  273. package/dist/plugins/table/TableNodeViews.d.ts.map +1 -0
  274. package/dist/plugins/table/TablePlugin.d.ts +39 -0
  275. package/dist/plugins/table/TablePlugin.d.ts.map +1 -0
  276. package/dist/plugins/table/TableSelection.d.ts +26 -0
  277. package/dist/plugins/table/TableSelection.d.ts.map +1 -0
  278. package/dist/plugins/table/TableTestUtils.d.ts +45 -0
  279. package/dist/plugins/table/TableTestUtils.d.ts.map +1 -0
  280. package/dist/plugins/table/index.d.ts +4 -0
  281. package/dist/plugins/table/index.d.ts.map +1 -0
  282. package/dist/plugins/table.mjs +663 -0
  283. package/dist/plugins/table.mjs.map +1 -0
  284. package/dist/plugins/text-color/TextColorPlugin.d.ts +37 -0
  285. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -0
  286. package/dist/plugins/text-color/index.d.ts +2 -0
  287. package/dist/plugins/text-color/index.d.ts.map +1 -0
  288. package/dist/plugins/text-color.mjs +126 -0
  289. package/dist/plugins/text-color.mjs.map +1 -0
  290. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts +34 -0
  291. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -0
  292. package/dist/plugins/text-formatting/index.d.ts +2 -0
  293. package/dist/plugins/text-formatting/index.d.ts.map +1 -0
  294. package/dist/plugins/text-formatting.mjs +52 -0
  295. package/dist/plugins/text-formatting.mjs.map +1 -0
  296. package/dist/plugins/toolbar/ToolbarItem.d.ts +66 -0
  297. package/dist/plugins/toolbar/ToolbarItem.d.ts.map +1 -0
  298. package/dist/plugins/toolbar/ToolbarKeyboardNav.d.ts +25 -0
  299. package/dist/plugins/toolbar/ToolbarKeyboardNav.d.ts.map +1 -0
  300. package/dist/plugins/toolbar/ToolbarPlugin.d.ts +47 -0
  301. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -0
  302. package/dist/plugins/toolbar/ToolbarPopupController.d.ts +25 -0
  303. package/dist/plugins/toolbar/ToolbarPopupController.d.ts.map +1 -0
  304. package/dist/plugins/toolbar/ToolbarRenderers.d.ts +19 -0
  305. package/dist/plugins/toolbar/ToolbarRenderers.d.ts.map +1 -0
  306. package/dist/plugins/toolbar/ToolbarTooltip.d.ts +17 -0
  307. package/dist/plugins/toolbar/ToolbarTooltip.d.ts.map +1 -0
  308. package/dist/plugins/toolbar/index.d.ts +4 -0
  309. package/dist/plugins/toolbar/index.d.ts.map +1 -0
  310. package/dist/plugins/toolbar.mjs +8 -0
  311. package/dist/plugins/toolbar.mjs.map +1 -0
  312. package/dist/state/EditorState.d.ts +40 -0
  313. package/dist/state/EditorState.d.ts.map +1 -0
  314. package/dist/state/History.d.ts +38 -0
  315. package/dist/state/History.d.ts.map +1 -0
  316. package/dist/state/StepApplication.d.ts +5 -0
  317. package/dist/state/StepApplication.d.ts.map +1 -0
  318. package/dist/state/Transaction.d.ts +185 -0
  319. package/dist/state/Transaction.d.ts.map +1 -0
  320. package/dist/test/PluginTestUtils.d.ts +127 -0
  321. package/dist/test/PluginTestUtils.d.ts.map +1 -0
  322. package/dist/test/TestUtils.d.ts +153 -0
  323. package/dist/test/TestUtils.d.ts.map +1 -0
  324. package/dist/view/EditorView.d.ts +74 -0
  325. package/dist/view/EditorView.d.ts.map +1 -0
  326. package/dist/view/NodeView.d.ts +18 -0
  327. package/dist/view/NodeView.d.ts.map +1 -0
  328. package/dist/view/Reconciler.d.ts +23 -0
  329. package/dist/view/Reconciler.d.ts.map +1 -0
  330. package/dist/view/SelectionSync.d.ts +8 -0
  331. package/dist/view/SelectionSync.d.ts.map +1 -0
  332. package/package.json +112 -11
  333. package/dist/notectl-core.js +0 -1463
  334. package/dist/notectl-core.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ import { EventKey, PluginEventCallback } from './Plugin.js';
2
+ export declare class EventBus {
3
+ private readonly listeners;
4
+ /** Emits an event to all registered listeners. Errors are caught per listener. */
5
+ emit<T>(key: EventKey<T>, payload: T): void;
6
+ /** Subscribes to an event. Returns an unsubscribe function. */
7
+ on<T>(key: EventKey<T>, callback: PluginEventCallback<T>): () => void;
8
+ /** Removes a specific listener from an event. */
9
+ off<T>(key: EventKey<T>, callback: PluginEventCallback<T>): void;
10
+ /** Removes all listeners for all events. */
11
+ clear(): void;
12
+ }
13
+ //# sourceMappingURL=EventBus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventBus.d.ts","sourceRoot":"","sources":["../../src/plugins/EventBus.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEjE,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+C;IAEzE,kFAAkF;IAClF,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAa3C,+DAA+D;IAC/D,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAcrE,iDAAiD;IACjD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IAOhE,4CAA4C;IAC5C,KAAK,IAAI,IAAI;CAGb"}
@@ -0,0 +1,85 @@
1
+ import { DecorationSet } from '../decorations/Decoration.js';
2
+ import { InputRule } from '../input/InputRule.js';
3
+ import { Keymap } from '../input/Keymap.js';
4
+ import { InlineNodeSpec } from '../model/InlineNodeSpec.js';
5
+ import { MarkSpec } from '../model/MarkSpec.js';
6
+ import { NodeSpec } from '../model/NodeSpec.js';
7
+ import { FileHandler, SchemaRegistry } from '../model/SchemaRegistry.js';
8
+ import { EditorState } from '../state/EditorState.js';
9
+ import { Transaction } from '../state/Transaction.js';
10
+ import { NodeViewFactory } from '../view/NodeView.js';
11
+ import { BlockTypePickerEntry } from './heading/BlockTypePickerEntry.js';
12
+ import { ToolbarItem } from './toolbar/ToolbarItem.js';
13
+ /** Type-safe event key for compile-time payload checking. */
14
+ export declare class EventKey<T> {
15
+ readonly id: string;
16
+ readonly _type: T;
17
+ constructor(id: string);
18
+ }
19
+ /** Type-safe service key for compile-time type checking. */
20
+ export declare class ServiceKey<T> {
21
+ readonly id: string;
22
+ readonly _type: T;
23
+ constructor(id: string);
24
+ }
25
+ export type CommandHandler = () => boolean;
26
+ export interface CommandEntry {
27
+ readonly name: string;
28
+ readonly handler: CommandHandler;
29
+ readonly pluginId: string;
30
+ }
31
+ export type PluginEventCallback<T = unknown> = (payload: T) => void;
32
+ export interface PluginEventBus {
33
+ emit<T>(key: EventKey<T>, payload: T): void;
34
+ on<T>(key: EventKey<T>, callback: PluginEventCallback<T>): () => void;
35
+ off<T>(key: EventKey<T>, callback: PluginEventCallback<T>): void;
36
+ }
37
+ export type PluginConfig = Record<string, unknown>;
38
+ export type MiddlewareNext = (tr: Transaction) => void;
39
+ export type TransactionMiddleware = (tr: Transaction, state: EditorState, next: MiddlewareNext) => void;
40
+ export interface PluginContext {
41
+ getState(): EditorState;
42
+ dispatch(transaction: Transaction): void;
43
+ getContainer(): HTMLElement;
44
+ getPluginContainer(position: 'top' | 'bottom'): HTMLElement;
45
+ registerCommand(name: string, handler: CommandHandler): void;
46
+ executeCommand(name: string): boolean;
47
+ getEventBus(): PluginEventBus;
48
+ registerMiddleware(middleware: TransactionMiddleware, priority?: number): void;
49
+ registerService<T>(key: ServiceKey<T>, service: T): void;
50
+ getService<T>(key: ServiceKey<T>): T | undefined;
51
+ updateConfig(config: PluginConfig): void;
52
+ registerNodeSpec<T extends string>(spec: NodeSpec<T>): void;
53
+ registerMarkSpec<T extends string>(spec: MarkSpec<T>): void;
54
+ registerNodeView(type: string, factory: NodeViewFactory): void;
55
+ registerKeymap(keymap: Keymap): void;
56
+ registerInputRule(rule: InputRule): void;
57
+ registerToolbarItem(item: ToolbarItem): void;
58
+ registerInlineNodeSpec<T extends string>(spec: InlineNodeSpec<T>): void;
59
+ registerFileHandler(pattern: string, handler: FileHandler): void;
60
+ registerBlockTypePickerEntry(entry: BlockTypePickerEntry): void;
61
+ getSchemaRegistry(): SchemaRegistry;
62
+ /** Registers a CSS string to be added to the editor's adopted stylesheets. */
63
+ registerStyleSheet(css: string): void;
64
+ /** Pushes a screen reader announcement via the editor's aria-live region. */
65
+ announce(text: string): void;
66
+ }
67
+ export interface Plugin<TConfig extends Record<string, unknown> = Record<string, unknown>> {
68
+ readonly id: string;
69
+ readonly name: string;
70
+ readonly priority?: number;
71
+ readonly dependencies?: readonly string[];
72
+ init(context: PluginContext): void | Promise<void>;
73
+ destroy?(): void | Promise<void>;
74
+ onStateChange?(oldState: EditorState, newState: EditorState, tr: Transaction): void;
75
+ onConfigure?(config: TConfig): void;
76
+ /** Called after ALL plugins have been initialized. */
77
+ onReady?(): void | Promise<void>;
78
+ /**
79
+ * Returns decorations for the given state.
80
+ * Called after state.apply() but BEFORE reconciliation.
81
+ * Plugins should cache and only recompute when needed.
82
+ */
83
+ decorations?(state: EditorState, tr?: Transaction): DecorationSet;
84
+ }
85
+ //# sourceMappingURL=Plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/plugins/Plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { DecorationSet } from '../decorations/Decoration.js';
2
+ import { SchemaRegistry } from '../model/SchemaRegistry.js';
3
+ import { EditorState } from '../state/EditorState.js';
4
+ import { Transaction } from '../state/Transaction.js';
5
+ import { EventKey, Plugin, PluginConfig, PluginEventCallback, ServiceKey } from './Plugin.js';
6
+ export interface PluginManagerInitOptions {
7
+ getState(): EditorState;
8
+ dispatch(transaction: Transaction): void;
9
+ getContainer(): HTMLElement;
10
+ getPluginContainer(position: 'top' | 'bottom'): HTMLElement;
11
+ /** Pushes a screen reader announcement via the editor's aria-live region. */
12
+ announce?(text: string): void;
13
+ /** Called after all plugin init() calls complete, before onReady(). */
14
+ onBeforeReady?(): void | Promise<void>;
15
+ }
16
+ export declare class PluginManager {
17
+ private readonly plugins;
18
+ private readonly commands;
19
+ private readonly services;
20
+ private readonly middlewares;
21
+ private readonly registrations;
22
+ private readonly eventBus;
23
+ private readonly pluginStyleSheets;
24
+ readonly schemaRegistry: SchemaRegistry;
25
+ private middlewareSorted;
26
+ private initOrder;
27
+ private initialized;
28
+ private initializing;
29
+ /** Registers a plugin. Must be called before init(). */
30
+ register(plugin: Plugin): void;
31
+ /** Initializes all registered plugins in dependency/priority order. */
32
+ init(options: PluginManagerInitOptions): Promise<void>;
33
+ /** Notifies all plugins of a state change, in init order. */
34
+ notifyStateChange(oldState: EditorState, newState: EditorState, tr: Transaction): void;
35
+ /** Collects and merges decorations from all plugins. */
36
+ collectDecorations(state: EditorState, tr?: Transaction): DecorationSet;
37
+ /**
38
+ * Dispatches a transaction through the middleware chain, then calls the final dispatch.
39
+ * If no middleware is registered, calls finalDispatch directly.
40
+ */
41
+ dispatchWithMiddleware(tr: Transaction, state: EditorState, finalDispatch: (tr: Transaction) => void): void;
42
+ /** Executes a named command. Returns false if command not found. */
43
+ executeCommand(name: string): boolean;
44
+ /** Configures a plugin at runtime via onConfigure(). */
45
+ configurePlugin(pluginId: string, config: PluginConfig): void;
46
+ /** Returns all registered plugin IDs. */
47
+ getPluginIds(): string[];
48
+ /** Gets a plugin by ID. */
49
+ get(id: string): Plugin | undefined;
50
+ /** Gets a registered service by typed key. */
51
+ getService<T>(key: ServiceKey<T>): T | undefined;
52
+ /** Subscribes to a plugin event from outside the plugin system. Returns an unsubscribe function. */
53
+ onEvent<T>(key: EventKey<T>, callback: PluginEventCallback<T>): () => void;
54
+ /** Returns all plugin-registered stylesheets. */
55
+ getPluginStyleSheets(): readonly CSSStyleSheet[];
56
+ /** Destroys all plugins in reverse init order. */
57
+ destroy(): Promise<void>;
58
+ private destroyPlugin;
59
+ private cleanupRegistrations;
60
+ private getSortedMiddleware;
61
+ private createContext;
62
+ /**
63
+ * Resolves plugin initialization order via topological sort + priority.
64
+ * Throws on dependency cycles or missing dependencies.
65
+ */
66
+ private resolveOrder;
67
+ }
68
+ //# sourceMappingURL=PluginManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../../src/plugins/PluginManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { Plugin, PluginContext } from '../Plugin.js';
2
+ export type BlockAlignment = 'left' | 'center' | 'right' | 'justify';
3
+ export interface AlignmentConfig {
4
+ /** Which alignments to expose. Defaults to all four. */
5
+ readonly alignments: readonly BlockAlignment[];
6
+ /** Block types that support alignment. Defaults to paragraph + heading + title + subtitle + table_cell + image. */
7
+ readonly alignableTypes: readonly string[];
8
+ /** Per-type default alignment (e.g. `{ image: 'center' }`). Falls back to `'left'`. */
9
+ readonly defaults: Readonly<Record<string, BlockAlignment>>;
10
+ /** When true, a separator is rendered after the toolbar item. */
11
+ readonly separatorAfter?: boolean;
12
+ }
13
+ export declare const ALIGNMENT_ICONS: Readonly<Record<BlockAlignment, string>>;
14
+ export declare class AlignmentPlugin implements Plugin {
15
+ readonly id = "alignment";
16
+ readonly name = "Alignment";
17
+ readonly priority = 90;
18
+ private readonly config;
19
+ private alignableTypes;
20
+ constructor(config?: Partial<AlignmentConfig>);
21
+ init(context: PluginContext): void;
22
+ /**
23
+ * Patches existing NodeSpecs for alignable block types to support the
24
+ * `align` attribute and render it as an inline style. Skips types
25
+ * that already define an `align` attribute in their spec.
26
+ */
27
+ private patchNodeSpecs;
28
+ private registerCommands;
29
+ private registerKeymaps;
30
+ private registerToolbarItem;
31
+ /**
32
+ * Preserves the `align` attribute when other plugins change the block
33
+ * type (e.g. paragraph → heading) via `setBlockType`, which replaces attrs.
34
+ */
35
+ private registerMiddleware;
36
+ /**
37
+ * Gets the selected block, handling both TextSelection and NodeSelection.
38
+ */
39
+ private getSelectedBlock;
40
+ /**
41
+ * Gets the block ID of the selected block, handling both selection types.
42
+ */
43
+ private getSelectedBlockId;
44
+ private setAlignment;
45
+ private isNonDefaultAlignment;
46
+ private isAlignable;
47
+ }
48
+ //# sourceMappingURL=AlignmentPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlignmentPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/alignment/AlignmentPlugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI1D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,eAAe;IAC/B,wDAAwD;IACxD,QAAQ,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,CAAC;IAC/C,mHAAmH;IACnH,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC5D,iEAAiE;IACjE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CAClC;AAiBD,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAQpE,CAAC;AAIF,qBAAa,eAAgB,YAAW,MAAM;IAC7C,QAAQ,CAAC,EAAE,eAAe;IAC1B,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,cAAc,CAAuB;gBAEjC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAQ7C,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAWlC;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,mBAAmB;IAyB3B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAyB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,WAAW;CAInB"}
@@ -0,0 +1,2 @@
1
+ export { AlignmentPlugin, ALIGNMENT_ICONS, type AlignmentConfig, type BlockAlignment, } from './AlignmentPlugin.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/alignment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,eAAe,EACf,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,cAAc,GACnB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,92 @@
1
+ import { f as t } from "../chunks/NodeResolver-D68ZLXti.mjs";
2
+ import { i as e, f as i } from "../chunks/Selection-D5ZjXoB7.mjs";
3
+ const n = { alignments: ["left", "center", "right", "justify"], alignableTypes: ["paragraph", "heading", "title", "subtitle", "table_cell", "image"], defaults: { image: "center" } }, s = { left: "Align Left", center: "Align Center", right: "Align Right", justify: "Justify" }, l = { left: '<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>', right: '<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>' };
4
+ class o {
5
+ id = "alignment";
6
+ name = "Alignment";
7
+ priority = 90;
8
+ config;
9
+ alignableTypes;
10
+ constructor(t2) {
11
+ this.config = { ...n, ...t2, defaults: { ...n.defaults, ...t2?.defaults } };
12
+ }
13
+ init(t2) {
14
+ this.alignableTypes = new Set(this.config.alignableTypes), this.patchNodeSpecs(t2), this.registerCommands(t2), this.registerKeymaps(t2), this.registerToolbarItem(t2), this.registerMiddleware(t2);
15
+ }
16
+ patchNodeSpecs(t2) {
17
+ const e2 = t2.getSchemaRegistry();
18
+ for (const t3 of this.config.alignableTypes) {
19
+ const i2 = e2.getNodeSpec(t3);
20
+ if (!i2) continue;
21
+ if (i2.attrs?.align) continue;
22
+ const n2 = i2.toDOM, s2 = this.config.defaults[t3] ?? "left";
23
+ e2.removeNodeSpec(t3), e2.registerNodeSpec({ ...i2, attrs: { ...i2.attrs, align: { default: s2 } }, toDOM(t4) {
24
+ const e3 = n2.call(i2, t4);
25
+ return a(e3, t4), e3;
26
+ } });
27
+ }
28
+ }
29
+ registerCommands(t2) {
30
+ for (const e2 of this.config.alignments) t2.registerCommand(`align${r(e2)}`, () => this.setAlignment(t2, e2));
31
+ }
32
+ registerKeymaps(t2) {
33
+ const e2 = {};
34
+ this.config.alignments.includes("left") && (e2["Mod-Shift-L"] = () => t2.executeCommand("alignLeft")), this.config.alignments.includes("center") && (e2["Mod-Shift-E"] = () => t2.executeCommand("alignCenter")), this.config.alignments.includes("right") && (e2["Mod-Shift-R"] = () => t2.executeCommand("alignRight")), this.config.alignments.includes("justify") && (e2["Mod-Shift-J"] = () => t2.executeCommand("alignJustify")), Object.keys(e2).length > 0 && t2.registerKeymap(e2);
35
+ }
36
+ registerToolbarItem(t2) {
37
+ const e2 = this.config.alignments.map((t3) => ({ label: s[t3], command: `align${r(t3)}`, icon: l[t3] }));
38
+ t2.registerToolbarItem({ id: "alignment", group: "block", icon: l.left, label: "Alignment", tooltip: "Alignment", command: "alignLeft", priority: 60, popupType: "dropdown", popupConfig: { items: e2 }, separatorAfter: this.config.separatorAfter, isActive: (t3) => this.isNonDefaultAlignment(t3), isEnabled: (t3) => this.isAlignable(t3) });
39
+ }
40
+ registerMiddleware(t2) {
41
+ t2.registerMiddleware((t3, e2, i2) => {
42
+ let n2 = false;
43
+ const s2 = t3.steps.map((t4) => {
44
+ if ("setBlockType" !== t4.type) return t4;
45
+ if (!this.alignableTypes.has(t4.nodeType)) return t4;
46
+ const e3 = t4.previousAttrs?.align;
47
+ return e3 && "left" !== e3 ? (n2 = true, { ...t4, attrs: { ...t4.attrs, align: e3 } }) : t4;
48
+ });
49
+ i2(n2 ? { ...t3, steps: s2 } : t3);
50
+ });
51
+ }
52
+ getSelectedBlock(t2) {
53
+ const n2 = t2.selection;
54
+ return e(n2) ? t2.getBlock(n2.nodeId) : i(n2) ? t2.getBlock(n2.anchor.blockId) : void 0;
55
+ }
56
+ getSelectedBlockId(t2) {
57
+ const n2 = t2.selection;
58
+ return e(n2) ? n2.nodeId : i(n2) ? n2.anchor.blockId : void 0;
59
+ }
60
+ setAlignment(e2, i2) {
61
+ const n2 = e2.getState(), s2 = this.getSelectedBlock(n2);
62
+ if (!s2 || !this.alignableTypes.has(s2.type)) return false;
63
+ const l2 = this.getSelectedBlockId(n2);
64
+ if (!l2) return false;
65
+ const o2 = t(n2.doc, l2);
66
+ if (!o2) return false;
67
+ const a2 = { ...s2.attrs, align: i2 }, r2 = n2.transaction("command").setNodeAttr(o2, a2).setSelection(n2.selection).build();
68
+ return e2.dispatch(r2), true;
69
+ }
70
+ isNonDefaultAlignment(t2) {
71
+ const e2 = this.getSelectedBlock(t2);
72
+ if (!e2 || !this.alignableTypes.has(e2.type)) return false;
73
+ const i2 = e2.attrs?.align, n2 = this.config.defaults[e2.type] ?? "left";
74
+ return null != i2 && i2 !== n2;
75
+ }
76
+ isAlignable(t2) {
77
+ const e2 = this.getSelectedBlock(t2);
78
+ return null != e2 && this.alignableTypes.has(e2.type);
79
+ }
80
+ }
81
+ function a(t2, e2) {
82
+ const i2 = e2.attrs?.align;
83
+ "string" == typeof i2 && "left" !== i2 && (t2.style.textAlign = i2);
84
+ }
85
+ function r(t2) {
86
+ return t2.charAt(0).toUpperCase() + t2.slice(1);
87
+ }
88
+ export {
89
+ l as ALIGNMENT_ICONS,
90
+ o as AlignmentPlugin
91
+ };
92
+ //# sourceMappingURL=alignment.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alignment.mjs","sources":["../../src/plugins/alignment/AlignmentPlugin.ts"],"sourcesContent":["/**\n * AlignmentPlugin: adds left/center/right/justify alignment as a block\n * attribute on paragraphs, headings, images, and other alignable types.\n * Patches their NodeSpecs to render the `align` attribute via inline\n * `text-align` style and provides toggle commands, keyboard shortcuts,\n * and a toolbar dropdown. Handles both TextSelection and NodeSelection.\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport { findNodePath } from '../../model/NodeResolver.js';\nimport { isNodeSelection, isTextSelection } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\n\n// --- Public Types ---\n\nexport type BlockAlignment = 'left' | 'center' | 'right' | 'justify';\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 `'left'`. */\n\treadonly defaults: Readonly<Record<string, BlockAlignment>>;\n\t/** When true, a separator is rendered after the toolbar item. */\n\treadonly separatorAfter?: boolean;\n}\n\n// --- Constants ---\n\nconst DEFAULT_CONFIG: AlignmentConfig = {\n\talignments: ['left', 'center', 'right', 'justify'],\n\talignableTypes: ['paragraph', 'heading', 'title', 'subtitle', 'table_cell', 'image'],\n\tdefaults: { image: 'center' },\n};\n\nconst ALIGNMENT_LABELS: Readonly<Record<BlockAlignment, string>> = {\n\tleft: 'Align Left',\n\tcenter: 'Align Center',\n\tright: 'Align Right',\n\tjustify: 'Justify',\n};\n\nexport const ALIGNMENT_ICONS: Readonly<Record<BlockAlignment, string>> = {\n\tleft: '<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\tright:\n\t\t'<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 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\tinit(context: PluginContext): void {\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] ?? 'left';\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('left')) {\n\t\t\tbindings['Mod-Shift-L'] = () => context.executeCommand('alignLeft');\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('right')) {\n\t\t\tbindings['Mod-Shift-R'] = () => context.executeCommand('alignRight');\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: ALIGNMENT_LABELS[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.left,\n\t\t\tlabel: 'Alignment',\n\t\t\ttooltip: 'Alignment',\n\t\t\tcommand: 'alignLeft',\n\t\t\tpriority: 60,\n\t\t\tpopupType: 'dropdown',\n\t\t\tpopupConfig: { items: dropdownItems },\n\t\t\tseparatorAfter: this.config.separatorAfter,\n\t\t\tisActive: (state) => this.isNonDefaultAlignment(state),\n\t\t\tisEnabled: (state) => this.isAlignable(state),\n\t\t});\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((tr, _state, next) => {\n\t\t\tlet patched = false;\n\n\t\t\tconst patchedSteps = tr.steps.map((step) => {\n\t\t\t\tif (step.type !== 'setBlockType') return step;\n\t\t\t\tif (!this.alignableTypes.has(step.nodeType)) return step;\n\n\t\t\t\tconst prevAlign = step.previousAttrs?.align;\n\t\t\t\tif (!prevAlign || prevAlign === 'left') return step;\n\n\t\t\t\t// Carry forward align into new attrs\n\t\t\t\tpatched = true;\n\t\t\t\treturn {\n\t\t\t\t\t...step,\n\t\t\t\t\tattrs: { ...step.attrs, align: prevAlign },\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tnext(patched ? { ...tr, steps: patchedSteps } : tr);\n\t\t});\n\t}\n\n\t// --- Alignment Logic ---\n\n\t/**\n\t * Gets the selected block, handling both TextSelection and NodeSelection.\n\t */\n\tprivate getSelectedBlock(state: EditorState): BlockNode | undefined {\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel)) {\n\t\t\treturn state.getBlock(sel.nodeId);\n\t\t}\n\t\tif (isTextSelection(sel)) {\n\t\t\treturn state.getBlock(sel.anchor.blockId);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Gets the block ID of the selected block, handling both selection types.\n\t */\n\tprivate getSelectedBlockId(state: EditorState): BlockId | undefined {\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel)) return sel.nodeId;\n\t\tif (isTextSelection(sel)) return sel.anchor.blockId;\n\t\treturn undefined;\n\t}\n\n\tprivate setAlignment(context: PluginContext, alignment: BlockAlignment): boolean {\n\t\tconst state = context.getState();\n\t\tconst block = this.getSelectedBlock(state);\n\t\tif (!block || !this.alignableTypes.has(block.type)) return false;\n\n\t\tconst blockId = this.getSelectedBlockId(state);\n\t\tif (!blockId) return false;\n\n\t\tconst path = findNodePath(state.doc, blockId);\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 = this.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] ?? 'left';\n\t\treturn align != null && align !== defaultAlign;\n\t}\n\n\tprivate isAlignable(state: EditorState): boolean {\n\t\tconst block = this.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 !== 'left') {\n\t\tel.style.textAlign = align;\n\t}\n}\n\nfunction capitalize(s: string): string {\n\treturn s.charAt(0).toUpperCase() + s.slice(1);\n}\n"],"names":["DEFAULT_CONFIG","alignments","alignableTypes","defaults","image","ALIGNMENT_LABELS","left","center","right","justify","ALIGNMENT_ICONS","AlignmentPlugin","id","name","priority","config","this","context","Set","patchNodeSpecs","registerCommands","registerKeymaps","registerToolbarItem","registerMiddleware","registry","getSchemaRegistry","type","spec","getNodeSpec","attrs","align","originalToDOM","toDOM","defaultAlign","removeNodeSpec","registerNodeSpec","default","node","el","call","applyAlignment","alignment","registerCommand","capitalize","setAlignment","bindings","includes","executeCommand","Object","keys","length","registerKeymap","dropdownItems","map","label","command","icon","group","tooltip","popupType","popupConfig","items","separatorAfter","isActive","state","isNonDefaultAlignment","isEnabled","isAlignable","tr","_state","next","patched","patchedSteps","steps","step","has","nodeType","prevAlign","previousAttrs","sel","selection","isNodeSelection","getBlock","nodeId","isTextSelection","anchor","blockId","getState","block","getSelectedBlock","getSelectedBlockId","path","findNodePath","doc","newAttrs","transaction","setNodeAttr","setSelection","build","dispatch","style","textAlign","s","charAt","toUpperCase","slice"],"mappings":";;AAgCA,MAAMA,IAAkC,EACvCC,YAAY,CAAC,QAAQ,UAAU,SAAS,YACxCC,gBAAgB,CAAC,aAAa,WAAW,SAAS,YAAY,cAAc,OAAA,GAC5EC,UAAU,EAAEC,OAAO,SAAA,EAAA,GAGdC,IAA6D,EAClEC,MAAM,cACNC,QAAQ,gBACRC,OAAO,eACPC,SAAS,UAAA,GAGGC,IAA4D,EACxEJ,MAAM,8JACNC,QACC,6JACDC,OACC,6JACDC,SACC,2JAAA;AAKK,MAAME;EACHC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,WAAW;AAAA,EAEHC;AAAAA,EACTb;AAAAA,EAER,YAAYa,IAAAA;AACXC,SAAKD,SAAS,EAAA,GACVf,GAAAA,GACAe,IACHZ,UAAU,KAAKH,EAAeG,UAAAA,GAAaY,IAAQZ,SAAAA,EAAAA;AAAAA,EAErD;AAAA,EAEA,KAAKc,IAAAA;AACJD,SAAKd,iBAAiB,IAAIgB,IAAIF,KAAKD,OAAOb,cAAAA,GAC1Cc,KAAKG,eAAeF,EAAAA,GACpBD,KAAKI,iBAAiBH,EAAAA,GACtBD,KAAKK,gBAAgBJ,EAAAA,GACrBD,KAAKM,oBAAoBL,EAAAA,GACzBD,KAAKO,mBAAmBN,EAAAA;AAAAA,EACzB;AAAA,EASQ,eAAeA,IAAAA;AACtB,UAAMO,KAAWP,GAAQQ,kBAAAA;AAEzB,eAAWC,MAAQV,KAAKD,OAAOb,gBAAgB;AAC9C,YAAMyB,KAAOH,GAASI,YAAYF,EAAAA;AAClC,UAAA,CAAKC,GAAM;AAGX,UAAIA,GAAKE,OAAOC,MAAO;AAEvB,YAAMC,KAAgBJ,GAAKK,OACrBC,KAA+BjB,KAAKD,OAAOZ,SAASuB,EAAAA,KAAS;AAEnEF,MAAAA,GAASU,eAAeR,EAAAA,GACxBF,GAASW,iBAAiB,EAAA,GACtBR,IACHE,OAAO,EAAA,GACHF,GAAKE,OACRC,OAAO,EAAEM,SAASH,GAAAA,EAAAA,GAEnB,MAAMI,IAAAA;AACL,cAAMC,KAAKP,GAAcQ,KAAKZ,IAAMU,EAAAA;AAEpC,eADAG,EAAeF,IAAID,EAAAA,GACZC;AAAAA,MACR,EAAA,CAAA;AAAA,IAEF;AAAA,EACD;AAAA,EAIQ,iBAAiBrB,IAAAA;AACxB,eAAWwB,MAAazB,KAAKD,OAAOd,WACnCgB,CAAAA,GAAQyB,gBAAgB,QAAQC,EAAWF,EAAAA,CAAAA,IAAc,MACjDzB,KAAK4B,aAAa3B,IAASwB,EAAAA,CAAAA;AAAAA,EAGrC;AAAA,EAIQ,gBAAgBxB,IAAAA;AACvB,UAAM4B,KAA0C,CAAA;AAE5C7B,SAAKD,OAAOd,WAAW6C,SAAS,MAAA,MACnCD,GAAS,aAAA,IAAiB,MAAM5B,GAAQ8B,eAAe,WAAA,IAEpD/B,KAAKD,OAAOd,WAAW6C,SAAS,QAAA,MACnCD,GAAS,aAAA,IAAiB,MAAM5B,GAAQ8B,eAAe,aAAA,IAEpD/B,KAAKD,OAAOd,WAAW6C,SAAS,OAAA,MACnCD,GAAS,iBAAiB,MAAM5B,GAAQ8B,eAAe,YAAA,IAEpD/B,KAAKD,OAAOd,WAAW6C,SAAS,eACnCD,GAAS,aAAA,IAAiB,MAAM5B,GAAQ8B,eAAe,cAAA,IAGpDC,OAAOC,KAAKJ,IAAUK,SAAS,KAClCjC,GAAQkC,eAAeN,EAAAA;AAAAA,EAEzB;AAAA,EAIQ,oBAAoB5B,IAAAA;AAC3B,UAAMmC,KAAgBpC,KAAKD,OAAOd,WAAWoD,IAAKZ,CAAAA,QAAA,EACjDa,OAAOjD,EAAiBoC,EAAAA,GACxBc,SAAS,QAAQZ,EAAWF,EAAAA,CAAAA,IAC5Be,MAAM9C,EAAgB+B,EAAAA,EAAAA,EAAAA;AAGvBxB,IAAAA,GAAQK,oBAAoB,EAC3BV,IAAI,aACJ6C,OAAO,SACPD,MAAM9C,EAAgBJ,MACtBgD,OAAO,aACPI,SAAS,aACTH,SAAS,aACTzC,UAAU,IACV6C,WAAW,YACXC,aAAa,EAAEC,OAAOT,GAAAA,GACtBU,gBAAgB9C,KAAKD,OAAO+C,gBAC5BC,UAAWC,CAAAA,OAAUhD,KAAKiD,sBAAsBD,EAAAA,GAChDE,WAAYF,CAAAA,OAAUhD,KAAKmD,YAAYH,EAAAA,EAAAA,CAAAA;AAAAA,EAEzC;AAAA,EAQQ,mBAAmB/C;AAC1BA,IAAAA,GAAQM,mBAAmB,CAAC6C,IAAIC,IAAQC,OAAAA;AACvC,UAAIC,KAAAA;AAEJ,YAAMC,KAAeJ,GAAGK,MAAMpB,IAAKqB,CAAAA,OAAAA;AAClC,YAAkB,mBAAdA,GAAKhD,KAAyB,QAAOgD;AACzC,YAAA,CAAK1D,KAAKd,eAAeyE,IAAID,GAAKE,QAAAA,EAAW,QAAOF;AAEpD,cAAMG,KAAYH,GAAKI,eAAehD;AACtC,eAAK+C,MAA2B,WAAdA,MAGlBN,KAAAA,MACO,EAAA,GACHG,IACH7C,OAAO,EAAA,GAAK6C,GAAK7C,OAAOC,OAAO+C,GAAAA,EAAAA,KANeH;AAAAA,MAAAA,CAAAA;AAUhDJ,MAAAA,GAAKC,KAAU,KAAKH,IAAIK,OAAOD,GAAAA,IAAiBJ,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAElD;AAAA,EAOQ,iBAAiBJ,IAAAA;AACxB,UAAMe,KAAMf,GAAMgB;AAClB,WAAIC,EAAgBF,EAAAA,IACZf,GAAMkB,SAASH,GAAII,MAAAA,IAEvBC,EAAgBL,EAAAA,IACZf,GAAMkB,SAASH,GAAIM,OAAOC,OAAAA,IAAAA;AAAAA,EAGnC;AAAA,EAKQ,mBAAmBtB,IAAAA;AAC1B,UAAMe,KAAMf,GAAMgB;AAClB,WAAIC,EAAgBF,EAAAA,IAAaA,GAAII,SACjCC,EAAgBL,EAAAA,IAAaA,GAAIM,OAAOC,UAAAA;AAAAA,EAE7C;AAAA,EAEQ,aAAarE,IAAwBwB,IAAAA;AAC5C,UAAMuB,KAAQ/C,GAAQsE,SAAAA,GAChBC,KAAQxE,KAAKyE,iBAAiBzB,EAAAA;AACpC,QAAA,CAAKwB,MAAAA,CAAUxE,KAAKd,eAAeyE,IAAIa,GAAM9D,IAAAA,EAAO,QAAA;AAEpD,UAAM4D,KAAUtE,KAAK0E,mBAAmB1B,EAAAA;AACxC,QAAA,CAAKsB,GAAS,QAAA;AAEd,UAAMK,KAAOC,EAAa5B,GAAM6B,KAAKP,EAAAA;AACrC,QAAA,CAAKK,GAAM,QAAA;AAEX,UAAMG,KAAW,EAAA,GAAKN,GAAM3D,OAAOC,OAAOW,GAAAA,GAEpC2B,KAAKJ,GACT+B,YAAY,SAAA,EACZC,YAAYL,IAAmBG,EAAAA,EAC/BG,aAAajC,GAAMgB,SAAAA,EACnBkB;AAGF,WADAjF,GAAQkF,SAAS/B,EAAAA,GAAAA;AAAAA,EAElB;AAAA,EAEQ,sBAAsBJ;AAC7B,UAAMwB,KAAQxE,KAAKyE,iBAAiBzB,EAAAA;AACpC,QAAA,CAAKwB,MAAAA,CAAUxE,KAAKd,eAAeyE,IAAIa,GAAM9D,IAAAA,EAAO,QAAA;AACpD,UAAMI,KAAQ0D,GAAM3D,OAAOC,OACrBG,KAA+BjB,KAAKD,OAAOZ,SAASqF,GAAM9D,IAAAA,KAAS;AACzE,WAAgB,QAATI,MAAiBA,OAAUG;AAAAA,EACnC;AAAA,EAEQ,YAAY+B;AACnB,UAAMwB,KAAQxE,KAAKyE,iBAAiBzB,EAAAA;AACpC,WAAgB,QAATwB,MAAiBxE,KAAKd,eAAeyE,IAAIa,GAAM9D,IAAAA;AAAAA,EACvD;AAAA;AAKD,SAASc,EAAeF,IAAiBD,IAAAA;AACxC,QAAMP,KAAQO,GAAKR,OAAOC;AACL,cAAA,OAAVA,MAAgC,WAAVA,OAChCQ,GAAG8D,MAAMC,YAAYvE;AAEvB;AAEA,SAASa,EAAW2D;AACnB,SAAOA,GAAEC,OAAO,CAAA,EAAGC,YAAAA,IAAgBF,GAAEG,MAAM,CAAA;AAC5C;"}
@@ -0,0 +1,30 @@
1
+ import { Plugin, PluginContext } from '../Plugin.js';
2
+ declare module '../../model/AttrRegistry.js' {
3
+ interface NodeAttrRegistry {
4
+ blockquote: Record<string, never>;
5
+ }
6
+ }
7
+ export interface BlockquoteConfig {
8
+ /** When true, a separator is rendered after the blockquote toolbar item. */
9
+ readonly separatorAfter?: boolean;
10
+ }
11
+ export declare class BlockquotePlugin implements Plugin {
12
+ readonly id = "blockquote";
13
+ readonly name = "Blockquote";
14
+ readonly priority = 35;
15
+ private readonly config;
16
+ constructor(config?: Partial<BlockquoteConfig>);
17
+ init(context: PluginContext): void;
18
+ private registerNodeSpec;
19
+ private registerCommands;
20
+ private registerKeymap;
21
+ private registerInputRule;
22
+ private registerToolbarItem;
23
+ /**
24
+ * Toggles between blockquote and paragraph.
25
+ * If the block is already a blockquote, resets to paragraph.
26
+ */
27
+ private toggleBlockquote;
28
+ private setBlockType;
29
+ }
30
+ //# sourceMappingURL=BlockquotePlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockquotePlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/blockquote/BlockquotePlugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAK1D,OAAO,QAAQ,6BAA6B,CAAC;IAC5C,UAAU,gBAAgB;QACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KAClC;CACD;AAID,MAAM,WAAW,gBAAgB;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CAClC;AAMD,qBAAa,gBAAiB,YAAW,MAAM;IAC9C,QAAQ,CAAC,EAAE,gBAAgB;IAC3B,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAE9B,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAI9C,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAQlC,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,mBAAmB;IAqB3B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,YAAY;CAkBpB"}
@@ -0,0 +1,2 @@
1
+ export { BlockquotePlugin, type BlockquoteConfig, } from './BlockquotePlugin.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/blockquote/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,EAChB,KAAK,gBAAgB,GACrB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { c as e } from "../chunks/NodeSpec-NZVvcCuH.mjs";
2
+ import { i as t, a as o } from "../chunks/Selection-D5ZjXoB7.mjs";
3
+ import { n as r } from "../chunks/TypeBrands-C09nE2qO.mjs";
4
+ import { f as c } from "../chunks/ToolbarItem-ugDymuXi.mjs";
5
+ const s = {};
6
+ class l {
7
+ id = "blockquote";
8
+ name = "Blockquote";
9
+ priority = 35;
10
+ config;
11
+ constructor(e2) {
12
+ this.config = { ...s, ...e2 };
13
+ }
14
+ init(e2) {
15
+ this.registerNodeSpec(e2), this.registerCommands(e2), this.registerKeymap(e2), this.registerInputRule(e2), this.registerToolbarItem(e2);
16
+ }
17
+ registerNodeSpec(t2) {
18
+ t2.registerNodeSpec({ type: "blockquote", group: "block", content: { allow: ["text"] }, toDOM: (t3) => e("blockquote", t3.id), toHTML: (e2, t3) => `<blockquote>${t3 || "<br>"}</blockquote>`, parseHTML: [{ tag: "blockquote" }], sanitize: { tags: ["blockquote"] } });
19
+ }
20
+ registerCommands(e2) {
21
+ e2.registerCommand("toggleBlockquote", () => this.toggleBlockquote(e2)), e2.registerCommand("setBlockquote", () => this.setBlockType(e2, r("blockquote")));
22
+ }
23
+ registerKeymap(e2) {
24
+ e2.registerKeymap({ "Mod-Shift->": () => e2.executeCommand("toggleBlockquote") });
25
+ }
26
+ registerInputRule(e2) {
27
+ e2.registerInputRule({ pattern: /^> $/, handler(e3, c2, s2, l2) {
28
+ const i = e3.selection;
29
+ if (t(i)) return null;
30
+ if (!o(i)) return null;
31
+ const n = e3.getBlock(i.anchor.blockId);
32
+ return n && "paragraph" === n.type ? e3.transaction("input").deleteTextAt(i.anchor.blockId, s2, s2 + 2).setBlockType(i.anchor.blockId, r("blockquote")).setSelection(i).build() : null;
33
+ } });
34
+ }
35
+ registerToolbarItem(e2) {
36
+ e2.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: "Blockquote", tooltip: `Blockquote (${c("Mod-Shift->")})`, command: "toggleBlockquote", priority: 55, separatorAfter: this.config.separatorAfter, isActive: (e3) => {
37
+ if (t(e3.selection)) return false;
38
+ const o2 = e3.getBlock(e3.selection.anchor.blockId);
39
+ return "blockquote" === o2?.type;
40
+ } });
41
+ }
42
+ toggleBlockquote(e2) {
43
+ const o2 = e2.getState();
44
+ if (t(o2.selection)) return false;
45
+ const c2 = o2.getBlock(o2.selection.anchor.blockId);
46
+ return !!c2 && ("blockquote" === c2.type ? this.setBlockType(e2, r("paragraph")) : this.setBlockType(e2, r("blockquote")));
47
+ }
48
+ setBlockType(e2, o2, r2) {
49
+ const c2 = e2.getState(), s2 = c2.selection;
50
+ if (t(s2)) return false;
51
+ const l2 = c2.transaction("command").setBlockType(s2.anchor.blockId, o2, r2).setSelection(s2).build();
52
+ return e2.dispatch(l2), true;
53
+ }
54
+ }
55
+ export {
56
+ l as BlockquotePlugin
57
+ };
58
+ //# sourceMappingURL=blockquote.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockquote.mjs","sources":["../../src/plugins/blockquote/BlockquotePlugin.ts"],"sourcesContent":["/**\n * BlockquotePlugin: registers a blockquote block type with NodeSpec,\n * toggle command, keyboard shortcut, input rule, and a toolbar button.\n */\n\nimport { createBlockElement } from '../../model/NodeSpec.js';\nimport { isCollapsed, isNodeSelection } from '../../model/Selection.js';\nimport { type NodeTypeName, nodeType } from '../../model/TypeBrands.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { formatShortcut } from '../toolbar/ToolbarItem.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\tblockquote: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\nexport interface BlockquoteConfig {\n\t/** When true, a separator is rendered after the blockquote toolbar item. */\n\treadonly separatorAfter?: boolean;\n}\n\nconst DEFAULT_CONFIG: BlockquoteConfig = {};\n\n// --- Plugin ---\n\nexport class BlockquotePlugin implements Plugin {\n\treadonly id = 'blockquote';\n\treadonly name = 'Blockquote';\n\treadonly priority = 35;\n\n\tprivate readonly config: BlockquoteConfig;\n\n\tconstructor(config?: Partial<BlockquoteConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.registerNodeSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t\tthis.registerInputRule(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerNodeSpec(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'blockquote',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\ttoDOM(node) {\n\t\t\t\treturn createBlockElement('blockquote', node.id);\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<blockquote>${content || '<br>'}</blockquote>`;\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'blockquote' }],\n\t\t\tsanitize: { tags: ['blockquote'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('toggleBlockquote', () => {\n\t\t\treturn this.toggleBlockquote(context);\n\t\t});\n\n\t\tcontext.registerCommand('setBlockquote', () => {\n\t\t\treturn this.setBlockType(context, nodeType('blockquote'));\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-Shift->': () => context.executeCommand('toggleBlockquote'),\n\t\t});\n\t}\n\n\tprivate registerInputRule(context: PluginContext): void {\n\t\tcontext.registerInputRule({\n\t\t\tpattern: /^> $/,\n\t\t\thandler(state, _match, start, _end) {\n\t\t\t\tconst sel = state.selection;\n\t\t\t\tif (isNodeSelection(sel)) return null;\n\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\treturn state\n\t\t\t\t\t.transaction('input')\n\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, start, start + 2)\n\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('blockquote'))\n\t\t\t\t\t.setSelection(sel)\n\t\t\t\t\t.build();\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst icon =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'blockquote',\n\t\t\tgroup: 'block',\n\t\t\ticon,\n\t\t\tlabel: 'Blockquote',\n\t\t\ttooltip: `Blockquote (${formatShortcut('Mod-Shift->')})`,\n\t\t\tcommand: 'toggleBlockquote',\n\t\t\tpriority: 55,\n\t\t\tseparatorAfter: this.config.separatorAfter,\n\t\t\tisActive: (state) => {\n\t\t\t\tif (isNodeSelection(state.selection)) return false;\n\t\t\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\t\t\treturn block?.type === 'blockquote';\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Toggles between blockquote and paragraph.\n\t * If the block is already a blockquote, resets to paragraph.\n\t */\n\tprivate toggleBlockquote(context: PluginContext): boolean {\n\t\tconst state = context.getState();\n\t\tif (isNodeSelection(state.selection)) return false;\n\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\tif (!block) return false;\n\n\t\tif (block.type === 'blockquote') {\n\t\t\treturn this.setBlockType(context, nodeType('paragraph'));\n\t\t}\n\n\t\treturn this.setBlockType(context, nodeType('blockquote'));\n\t}\n\n\tprivate setBlockType(\n\t\tcontext: PluginContext,\n\t\ttype: NodeTypeName,\n\t\tattrs?: Record<string, string | number | boolean>,\n\t): boolean {\n\t\tconst state = context.getState();\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel)) return false;\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(sel.anchor.blockId, type, attrs)\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n}\n"],"names":["DEFAULT_CONFIG","BlockquotePlugin","id","name","priority","config","this","context","registerNodeSpec","registerCommands","registerKeymap","registerInputRule","registerToolbarItem","type","group","content","allow","toDOM","node","createBlockElement","toHTML","_node","parseHTML","tag","sanitize","tags","registerCommand","toggleBlockquote","setBlockType","nodeType","executeCommand","pattern","state","_match","start","_end","sel","selection","isNodeSelection","isCollapsed","block","getBlock","anchor","blockId","transaction","deleteTextAt","setSelection","build","icon","label","tooltip","formatShortcut","command","separatorAfter","isActive","getState","attrs","tr","dispatch"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { PluginContext } from '../Plugin.js';
2
+ import { CodeBlockConfig } from './CodeBlockTypes.js';
3
+ /** Registers all code-block commands. */
4
+ export declare function registerCodeBlockCommands(context: PluginContext, config: CodeBlockConfig): void;
5
+ //# sourceMappingURL=CodeBlockCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlockCommands.d.ts","sourceRoot":"","sources":["../../../src/plugins/code-block/CodeBlockCommands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,yCAAyC;AACzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAU/F"}
@@ -0,0 +1,10 @@
1
+ import { PluginContext } from '../Plugin.js';
2
+ import { CodeBlockConfig, CodeBlockKeymap } from './CodeBlockTypes.js';
3
+ /** Registers all code-block keyboard handlers. */
4
+ export declare function registerCodeBlockKeymaps(context: PluginContext, config: CodeBlockConfig, resolvedKeymap: Readonly<Record<keyof CodeBlockKeymap, string | null>>): void;
5
+ /**
6
+ * Exits the code block to the next block or creates a new paragraph.
7
+ * Exported for use by the `exitCodeBlock` command.
8
+ */
9
+ export declare function handleEscape(context: PluginContext): boolean;
10
+ //# sourceMappingURL=CodeBlockKeyboardHandlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlockKeyboardHandlers.d.ts","sourceRoot":"","sources":["../../../src/plugins/code-block/CodeBlockKeyboardHandlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAkC5E,kDAAkD;AAClD,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,eAAe,EACvB,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,GACpE,IAAI,CAuBN;AAsFD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAkB5D"}
@@ -0,0 +1,5 @@
1
+ import { NodeViewFactory } from '../../view/NodeView.js';
2
+ import { CodeBlockConfig } from './CodeBlockTypes.js';
3
+ /** Creates a NodeViewFactory for code_block nodes. */
4
+ export declare function createCodeBlockNodeViewFactory(config: CodeBlockConfig): NodeViewFactory;
5
+ //# sourceMappingURL=CodeBlockNodeView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlockNodeView.d.ts","sourceRoot":"","sources":["../../../src/plugins/code-block/CodeBlockNodeView.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK3D,sDAAsD;AACtD,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAkJvF"}
@@ -0,0 +1,27 @@
1
+ import { DecorationSet } from '../../decorations/Decoration.js';
2
+ import { EditorState } from '../../state/EditorState.js';
3
+ import { Transaction } from '../../state/Transaction.js';
4
+ import { Plugin, PluginContext } from '../Plugin.js';
5
+ import { CodeBlockConfig } from './CodeBlockTypes.js';
6
+ export { CODE_BLOCK_SERVICE_KEY, type CodeBlockConfig, type CodeBlockKeymap, type CodeBlockService, type SyntaxHighlighter, type SyntaxToken, } from './CodeBlockTypes.js';
7
+ export declare class CodeBlockPlugin implements Plugin {
8
+ readonly id = "code-block";
9
+ readonly name = "Code Block";
10
+ readonly priority = 36;
11
+ private readonly config;
12
+ private readonly resolvedKeymap;
13
+ private context;
14
+ constructor(config?: Partial<CodeBlockConfig>);
15
+ init(context: PluginContext): void;
16
+ destroy(): void;
17
+ onStateChange(oldState: EditorState, newState: EditorState, _tr: Transaction): void;
18
+ decorations(state: EditorState): DecorationSet;
19
+ private registerNodeSpec;
20
+ private registerNodeView;
21
+ private registerInputRule;
22
+ private registerToolbarItem;
23
+ private registerMiddleware;
24
+ private patchTableCellContent;
25
+ private setBlockFocused;
26
+ }
27
+ //# sourceMappingURL=CodeBlockPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlockPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/code-block/CodeBlockPlugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAWrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAM1D,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,qBAAqB,CAAC;AAIzF,OAAO,EACN,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,WAAW,GAChB,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,eAAgB,YAAW,MAAM;IAC7C,QAAQ,CAAC,EAAE,gBAAgB;IAC3B,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyD;IACxF,OAAO,CAAC,OAAO,CAA8B;gBAEjC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAQ7C,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAelC,OAAO,IAAI,IAAI;IAIf,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;IA8BnF,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa;IA+B9C,OAAO,CAAC,gBAAgB;IA+CxB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,iBAAiB;IA6BzB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,eAAe;CAQvB"}
@@ -0,0 +1,5 @@
1
+ import { PluginContext } from '../Plugin.js';
2
+ import { CodeBlockConfig } from './CodeBlockTypes.js';
3
+ /** Registers the CodeBlockService on the given context. */
4
+ export declare function registerCodeBlockService(context: PluginContext, config: CodeBlockConfig, getContext: () => PluginContext | null): void;
5
+ //# sourceMappingURL=CodeBlockService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlockService.d.ts","sourceRoot":"","sources":["../../../src/plugins/code-block/CodeBlockService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,2DAA2D;AAC3D,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM,aAAa,GAAG,IAAI,GACpC,IAAI,CAwCN"}