@notectl/core 1.0.9 → 1.7.0

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 (233) hide show
  1. package/dist/chunks/{AttrRegistry-D-przlzb.mjs → AttrRegistry-I-VdmRnN.mjs} +2 -2
  2. package/dist/chunks/{AttrRegistry-D-przlzb.mjs.map → AttrRegistry-I-VdmRnN.mjs.map} +1 -1
  3. package/dist/chunks/CaretNavigation-CAJXoaae.mjs +311 -0
  4. package/dist/chunks/CaretNavigation-CAJXoaae.mjs.map +1 -0
  5. package/dist/chunks/ColorNames-BdsHwA2f.mjs +59 -0
  6. package/dist/chunks/ColorNames-BdsHwA2f.mjs.map +1 -0
  7. package/dist/chunks/ColorPickerPopup-xL8ZUfpB.mjs +125 -0
  8. package/dist/chunks/ColorPickerPopup-xL8ZUfpB.mjs.map +1 -0
  9. package/dist/chunks/Commands-CicwYoTQ.mjs +286 -0
  10. package/dist/chunks/Commands-CicwYoTQ.mjs.map +1 -0
  11. package/dist/chunks/{Document-CI3iCwEP.mjs → Document-CuwE73FF.mjs} +35 -22
  12. package/dist/chunks/{Document-CI3iCwEP.mjs.map → Document-CuwE73FF.mjs.map} +1 -1
  13. package/dist/chunks/HTMLUtils-DTqQzcKR.mjs +35 -0
  14. package/dist/chunks/HTMLUtils-DTqQzcKR.mjs.map +1 -0
  15. package/dist/chunks/MarkCommands-CC37WA7Z.mjs +94 -0
  16. package/dist/chunks/MarkCommands-CC37WA7Z.mjs.map +1 -0
  17. package/dist/chunks/NavigationUtils-CyW0Vo8A.mjs +47 -0
  18. package/dist/chunks/NavigationUtils-CyW0Vo8A.mjs.map +1 -0
  19. package/dist/chunks/{NodeResolver-D68ZLXti.mjs → NodeResolver-B-wzthAQ.mjs} +2 -2
  20. package/dist/chunks/{NodeResolver-D68ZLXti.mjs.map → NodeResolver-B-wzthAQ.mjs.map} +1 -1
  21. package/dist/chunks/Platform-S_xqIqcM.mjs +26 -0
  22. package/dist/chunks/Platform-S_xqIqcM.mjs.map +1 -0
  23. package/dist/chunks/Selection-DmFDwiPJ.mjs +52 -0
  24. package/dist/chunks/Selection-DmFDwiPJ.mjs.map +1 -0
  25. package/dist/chunks/ToolbarItem-BpZggUGo.mjs +8 -0
  26. package/dist/chunks/ToolbarItem-BpZggUGo.mjs.map +1 -0
  27. package/dist/chunks/{ToolbarPlugin-DFkl1uYO.mjs → ToolbarPlugin-B6JETWaw.mjs} +3 -3
  28. package/dist/chunks/{ToolbarPlugin-DFkl1uYO.mjs.map → ToolbarPlugin-B6JETWaw.mjs.map} +1 -1
  29. package/dist/chunks/index--z_Txzej.mjs +467 -0
  30. package/dist/chunks/index--z_Txzej.mjs.map +1 -0
  31. package/dist/chunks/{index-uTnc9y7M.mjs → index-B-NSeaM4.mjs} +28 -28
  32. package/dist/chunks/index-B-NSeaM4.mjs.map +1 -0
  33. package/dist/chunks/{index-BTJfyJlJ.mjs → index-B9GkDVsx.mjs} +104 -104
  34. package/dist/chunks/index-B9GkDVsx.mjs.map +1 -0
  35. package/dist/chunks/{index-BRYzYOYC.mjs → index-C0cEs7Jc.mjs} +29 -29
  36. package/dist/chunks/index-C0cEs7Jc.mjs.map +1 -0
  37. package/dist/chunks/{index-BFsYGsBR.mjs → index-C9gc3Bws.mjs} +42 -42
  38. package/dist/chunks/{index-BFsYGsBR.mjs.map → index-C9gc3Bws.mjs.map} +1 -1
  39. package/dist/chunks/{index-DGrRWMlW.mjs → index-CAV2N-fF.mjs} +105 -105
  40. package/dist/chunks/index-CAV2N-fF.mjs.map +1 -0
  41. package/dist/chunks/{index-BQ8iIYLn.mjs → index-CKPrAOr6.mjs} +54 -54
  42. package/dist/chunks/index-CKPrAOr6.mjs.map +1 -0
  43. package/dist/chunks/{index-Bsp4LC5t.mjs → index-CNs4QQ8l.mjs} +36 -36
  44. package/dist/chunks/index-CNs4QQ8l.mjs.map +1 -0
  45. package/dist/chunks/{index-DC1EK22F.mjs → index-CflvcXSd.mjs} +24 -19
  46. package/dist/chunks/index-CflvcXSd.mjs.map +1 -0
  47. package/dist/chunks/{index-o6hDR07y.mjs → index-CoeD4T9-.mjs} +25 -20
  48. package/dist/chunks/index-CoeD4T9-.mjs.map +1 -0
  49. package/dist/chunks/{index-DA8TG2S8.mjs → index-D0s0Q8Wc.mjs} +56 -56
  50. package/dist/chunks/index-D0s0Q8Wc.mjs.map +1 -0
  51. package/dist/chunks/{index-BIL37LSL.mjs → index-D8tbbW97.mjs} +18 -18
  52. package/dist/chunks/{index-BIL37LSL.mjs.map → index-D8tbbW97.mjs.map} +1 -1
  53. package/dist/chunks/{index-DfO_fKw6.mjs → index-DMt3ojrY.mjs} +15 -15
  54. package/dist/chunks/{index-DfO_fKw6.mjs.map → index-DMt3ojrY.mjs.map} +1 -1
  55. package/dist/chunks/{index-BCvuDpVr.mjs → index-DfzCof6H.mjs} +31 -31
  56. package/dist/chunks/index-DfzCof6H.mjs.map +1 -0
  57. package/dist/chunks/{index-BL56fbXt.mjs → index-DyIwN_67.mjs} +89 -87
  58. package/dist/chunks/index-DyIwN_67.mjs.map +1 -0
  59. package/dist/chunks/{index-BSFLNveF.mjs → index-FlTg80Pk.mjs} +352 -341
  60. package/dist/chunks/index-FlTg80Pk.mjs.map +1 -0
  61. package/dist/chunks/{index-DAFCISBN.mjs → index-pxbbDHVH.mjs} +8 -8
  62. package/dist/chunks/{index-DAFCISBN.mjs.map → index-pxbbDHVH.mjs.map} +1 -1
  63. package/dist/chunks/resolvePluginLocale-B4w1OkPy.mjs.map +1 -1
  64. package/dist/commands/Commands.d.ts +13 -45
  65. package/dist/commands/Commands.d.ts.map +1 -1
  66. package/dist/commands/DeleteCommands.d.ts +15 -0
  67. package/dist/commands/DeleteCommands.d.ts.map +1 -0
  68. package/dist/commands/GapCursorCommands.d.ts +24 -0
  69. package/dist/commands/GapCursorCommands.d.ts.map +1 -0
  70. package/dist/commands/MarkCommands.d.ts +19 -0
  71. package/dist/commands/MarkCommands.d.ts.map +1 -0
  72. package/dist/commands/MovementCommands.d.ts +27 -0
  73. package/dist/commands/MovementCommands.d.ts.map +1 -0
  74. package/dist/commands/NodeSelectionCommands.d.ts +24 -0
  75. package/dist/commands/NodeSelectionCommands.d.ts.map +1 -0
  76. package/dist/commands/PasteCommand.d.ts.map +1 -1
  77. package/dist/commands/WordBoundary.d.ts +12 -0
  78. package/dist/commands/WordBoundary.d.ts.map +1 -0
  79. package/dist/editor/DocumentSerializer.d.ts.map +1 -1
  80. package/dist/editor/NotectlEditor.d.ts +7 -1
  81. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  82. package/dist/index.d.ts +28 -7
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  85. package/dist/input/CompositionTracker.d.ts +14 -0
  86. package/dist/input/CompositionTracker.d.ts.map +1 -0
  87. package/dist/input/FileHandlerRegistry.d.ts +16 -0
  88. package/dist/input/FileHandlerRegistry.d.ts.map +1 -0
  89. package/dist/input/InputHandler.d.ts +6 -4
  90. package/dist/input/InputHandler.d.ts.map +1 -1
  91. package/dist/input/InputRuleRegistry.d.ts +9 -0
  92. package/dist/input/InputRuleRegistry.d.ts.map +1 -0
  93. package/dist/input/KeyboardHandler.d.ts +20 -5
  94. package/dist/input/KeyboardHandler.d.ts.map +1 -1
  95. package/dist/input/Keymap.d.ts +11 -0
  96. package/dist/input/Keymap.d.ts.map +1 -1
  97. package/dist/input/KeymapRegistry.d.ts +19 -0
  98. package/dist/input/KeymapRegistry.d.ts.map +1 -0
  99. package/dist/input/PasteHandler.d.ts +3 -0
  100. package/dist/input/PasteHandler.d.ts.map +1 -1
  101. package/dist/model/Document.d.ts +8 -0
  102. package/dist/model/Document.d.ts.map +1 -1
  103. package/dist/model/GraphemeUtils.d.ts +20 -0
  104. package/dist/model/GraphemeUtils.d.ts.map +1 -0
  105. package/dist/model/HTMLUtils.d.ts +6 -1
  106. package/dist/model/HTMLUtils.d.ts.map +1 -1
  107. package/dist/model/NavigationUtils.d.ts +16 -0
  108. package/dist/model/NavigationUtils.d.ts.map +1 -0
  109. package/dist/model/SchemaRegistry.d.ts +0 -39
  110. package/dist/model/SchemaRegistry.d.ts.map +1 -1
  111. package/dist/model/Selection.d.ts +14 -3
  112. package/dist/model/Selection.d.ts.map +1 -1
  113. package/dist/notectl-core.mjs +2797 -2515
  114. package/dist/notectl-core.mjs.map +1 -1
  115. package/dist/notectl-core.umd.js +5869 -4844
  116. package/dist/notectl-core.umd.js.map +1 -1
  117. package/dist/plugins/Plugin.d.ts +17 -3
  118. package/dist/plugins/Plugin.d.ts.map +1 -1
  119. package/dist/plugins/PluginManager.d.ts +14 -0
  120. package/dist/plugins/PluginManager.d.ts.map +1 -1
  121. package/dist/plugins/alignment.mjs +3 -3
  122. package/dist/plugins/blockquote.mjs +2 -2
  123. package/dist/plugins/caret-navigation/CaretNavigationPlugin.d.ts +35 -0
  124. package/dist/plugins/caret-navigation/CaretNavigationPlugin.d.ts.map +1 -0
  125. package/dist/plugins/caret-navigation/index.d.ts +2 -0
  126. package/dist/plugins/caret-navigation/index.d.ts.map +1 -0
  127. package/dist/plugins/caret-navigation.mjs +5 -0
  128. package/dist/plugins/caret-navigation.mjs.map +1 -0
  129. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -1
  130. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  131. package/dist/plugins/code-block.mjs +3 -3
  132. package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
  133. package/dist/plugins/font-size/FontSizeOperations.d.ts.map +1 -1
  134. package/dist/plugins/font-size.mjs +2 -2
  135. package/dist/plugins/font.mjs +2 -2
  136. package/dist/plugins/gap-cursor/GapCursorPlugin.d.ts +15 -0
  137. package/dist/plugins/gap-cursor/GapCursorPlugin.d.ts.map +1 -0
  138. package/dist/plugins/gap-cursor/index.d.ts +2 -0
  139. package/dist/plugins/gap-cursor/index.d.ts.map +1 -0
  140. package/dist/plugins/gap-cursor.mjs +65 -0
  141. package/dist/plugins/gap-cursor.mjs.map +1 -0
  142. package/dist/plugins/hard-break.mjs +1 -1
  143. package/dist/plugins/heading/BlockTypePickerRegistry.d.ts +9 -0
  144. package/dist/plugins/heading/BlockTypePickerRegistry.d.ts.map +1 -0
  145. package/dist/plugins/heading/HeadingInputRules.d.ts.map +1 -1
  146. package/dist/plugins/heading/HeadingKeyboardHandlers.d.ts.map +1 -1
  147. package/dist/plugins/heading.mjs +2 -2
  148. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  149. package/dist/plugins/highlight.mjs +2 -2
  150. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
  151. package/dist/plugins/horizontal-rule.mjs +2 -2
  152. package/dist/plugins/image/ImageCommands.d.ts.map +1 -1
  153. package/dist/plugins/image.mjs +3 -3
  154. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  155. package/dist/plugins/link.mjs +2 -2
  156. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  157. package/dist/plugins/list.mjs +2 -2
  158. package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -1
  159. package/dist/plugins/print/PrintTypes.d.ts +5 -1
  160. package/dist/plugins/print/PrintTypes.d.ts.map +1 -1
  161. package/dist/plugins/shared/ColorMarkOperations.d.ts.map +1 -1
  162. package/dist/plugins/shared/ColorValidation.d.ts +7 -0
  163. package/dist/plugins/shared/ColorValidation.d.ts.map +1 -1
  164. package/dist/plugins/strikethrough.mjs +2 -2
  165. package/dist/plugins/super-sub.mjs +2 -2
  166. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  167. package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
  168. package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
  169. package/dist/plugins/table.mjs +10 -10
  170. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  171. package/dist/plugins/text-color.mjs +2 -2
  172. package/dist/plugins/text-formatting.mjs +1 -1
  173. package/dist/plugins/toolbar/ToolbarItem.d.ts.map +1 -1
  174. package/dist/plugins/toolbar/ToolbarRegistry.d.ts +12 -0
  175. package/dist/plugins/toolbar/ToolbarRegistry.d.ts.map +1 -0
  176. package/dist/plugins/toolbar.mjs +2 -2
  177. package/dist/presets/FullPreset.d.ts +16 -0
  178. package/dist/presets/FullPreset.d.ts.map +1 -0
  179. package/dist/presets/MinimalPreset.d.ts +7 -0
  180. package/dist/presets/MinimalPreset.d.ts.map +1 -0
  181. package/dist/presets/PresetTypes.d.ts +50 -0
  182. package/dist/presets/PresetTypes.d.ts.map +1 -0
  183. package/dist/state/EditorState.d.ts.map +1 -1
  184. package/dist/state/History.d.ts.map +1 -1
  185. package/dist/state/SelectionTransactions.d.ts +10 -0
  186. package/dist/state/SelectionTransactions.d.ts.map +1 -0
  187. package/dist/test/TestUtils.d.ts +23 -0
  188. package/dist/test/TestUtils.d.ts.map +1 -1
  189. package/dist/view/CaretNavigation.d.ts +48 -0
  190. package/dist/view/CaretNavigation.d.ts.map +1 -0
  191. package/dist/view/CursorWrapper.d.ts +19 -0
  192. package/dist/view/CursorWrapper.d.ts.map +1 -0
  193. package/dist/view/DomPointUtils.d.ts +20 -0
  194. package/dist/view/DomPointUtils.d.ts.map +1 -0
  195. package/dist/view/EditorView.d.ts +43 -0
  196. package/dist/view/EditorView.d.ts.map +1 -1
  197. package/dist/view/MarkRendering.d.ts +7 -0
  198. package/dist/view/MarkRendering.d.ts.map +1 -0
  199. package/dist/view/NodeViewRegistry.d.ts +9 -0
  200. package/dist/view/NodeViewRegistry.d.ts.map +1 -0
  201. package/dist/view/Platform.d.ts +29 -0
  202. package/dist/view/Platform.d.ts.map +1 -0
  203. package/dist/view/Reconciler.d.ts +4 -0
  204. package/dist/view/Reconciler.d.ts.map +1 -1
  205. package/dist/view/SelectionSync.d.ts +2 -0
  206. package/dist/view/SelectionSync.d.ts.map +1 -1
  207. package/dist/view/ViewMovementCommands.d.ts +40 -0
  208. package/dist/view/ViewMovementCommands.d.ts.map +1 -0
  209. package/package.json +10 -2
  210. package/dist/chunks/ColorNames-iaWsSZx1.mjs +0 -35
  211. package/dist/chunks/ColorNames-iaWsSZx1.mjs.map +0 -1
  212. package/dist/chunks/ColorValidation-Dyy4Bye8.mjs +0 -140
  213. package/dist/chunks/ColorValidation-Dyy4Bye8.mjs.map +0 -1
  214. package/dist/chunks/Commands-CSpSwGXv.mjs +0 -461
  215. package/dist/chunks/Commands-CSpSwGXv.mjs.map +0 -1
  216. package/dist/chunks/HTMLUtils-0wvCRvJc.mjs +0 -7
  217. package/dist/chunks/HTMLUtils-0wvCRvJc.mjs.map +0 -1
  218. package/dist/chunks/Selection-D5ZjXoB7.mjs +0 -44
  219. package/dist/chunks/Selection-D5ZjXoB7.mjs.map +0 -1
  220. package/dist/chunks/ToolbarItem-ugDymuXi.mjs +0 -7
  221. package/dist/chunks/ToolbarItem-ugDymuXi.mjs.map +0 -1
  222. package/dist/chunks/index-BCvuDpVr.mjs.map +0 -1
  223. package/dist/chunks/index-BL56fbXt.mjs.map +0 -1
  224. package/dist/chunks/index-BQ8iIYLn.mjs.map +0 -1
  225. package/dist/chunks/index-BRYzYOYC.mjs.map +0 -1
  226. package/dist/chunks/index-BSFLNveF.mjs.map +0 -1
  227. package/dist/chunks/index-BTJfyJlJ.mjs.map +0 -1
  228. package/dist/chunks/index-Bsp4LC5t.mjs.map +0 -1
  229. package/dist/chunks/index-DA8TG2S8.mjs.map +0 -1
  230. package/dist/chunks/index-DC1EK22F.mjs.map +0 -1
  231. package/dist/chunks/index-DGrRWMlW.mjs.map +0 -1
  232. package/dist/chunks/index-o6hDR07y.mjs.map +0 -1
  233. package/dist/chunks/index-uTnc9y7M.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index-DAFCISBN.mjs","sources":["../../src/plugins/alignment/AlignmentLocale.ts","../../src/plugins/alignment/AlignmentPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the AlignmentPlugin. */\n\nexport interface AlignmentLocale {\n\treadonly alignLeft: string;\n\treadonly alignCenter: string;\n\treadonly alignRight: 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\talignLeft: 'Align Left',\n\talignCenter: 'Align Center',\n\talignRight: 'Align Right',\n\tjustify: 'Justify',\n\ttoolbarLabel: 'Alignment',\n\ttoolbarTooltip: 'Alignment',\n};\n\n// --- German Locale ---\n\nexport const ALIGNMENT_LOCALE_DE: AlignmentLocale = {\n\talignLeft: 'Linksbündig',\n\talignCenter: 'Zentriert',\n\talignRight: 'Rechtsbündig',\n\tjustify: 'Blocksatz',\n\ttoolbarLabel: 'Ausrichtung',\n\ttoolbarTooltip: 'Ausrichtung',\n};\n\n// --- Spanish Locale ---\n\nexport const ALIGNMENT_LOCALE_ES: AlignmentLocale = {\n\talignLeft: 'Alinear a la izquierda',\n\talignCenter: 'Centrar',\n\talignRight: 'Alinear a la derecha',\n\tjustify: 'Justificar',\n\ttoolbarLabel: 'Alineación',\n\ttoolbarTooltip: 'Alineación',\n};\n\n// --- French Locale ---\n\nexport const ALIGNMENT_LOCALE_FR: AlignmentLocale = {\n\talignLeft: 'Aligner à gauche',\n\talignCenter: 'Centrer',\n\talignRight: 'Aligner à droite',\n\tjustify: 'Justifier',\n\ttoolbarLabel: 'Alignement',\n\ttoolbarTooltip: 'Alignement',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const ALIGNMENT_LOCALE_ZH: AlignmentLocale = {\n\talignLeft: '左对齐',\n\talignCenter: '居中',\n\talignRight: '右对齐',\n\tjustify: '两端对齐',\n\ttoolbarLabel: '对齐',\n\ttoolbarTooltip: '对齐',\n};\n\n// --- Russian Locale ---\n\nexport const ALIGNMENT_LOCALE_RU: AlignmentLocale = {\n\talignLeft: 'По левому краю',\n\talignCenter: 'По центру',\n\talignRight: 'По правому краю',\n\tjustify: 'По ширине',\n\ttoolbarLabel: 'Выравнивание',\n\ttoolbarTooltip: 'Выравнивание',\n};\n\n// --- Arabic Locale ---\n\nexport const ALIGNMENT_LOCALE_AR: AlignmentLocale = {\n\talignLeft: 'محاذاة لليسار',\n\talignCenter: 'توسيط',\n\talignRight: 'محاذاة لليمين',\n\tjustify: 'ضبط',\n\ttoolbarLabel: 'المحاذاة',\n\ttoolbarTooltip: 'المحاذاة',\n};\n\n// --- Hindi Locale ---\n\nexport const ALIGNMENT_LOCALE_HI: AlignmentLocale = {\n\talignLeft: 'बाएँ संरेखित करें',\n\talignCenter: 'केंद्र में',\n\talignRight: 'दाएँ संरेखित करें',\n\tjustify: 'समायोजित करें',\n\ttoolbarLabel: 'संरेखण',\n\ttoolbarTooltip: 'संरेखण',\n};\n\n// --- Locale Map ---\n\nexport const ALIGNMENT_LOCALES: Record<string, AlignmentLocale> = {\n\ten: ALIGNMENT_LOCALE_EN,\n\tde: ALIGNMENT_LOCALE_DE,\n\tes: ALIGNMENT_LOCALE_ES,\n\tfr: ALIGNMENT_LOCALE_FR,\n\tzh: ALIGNMENT_LOCALE_ZH,\n\tru: ALIGNMENT_LOCALE_RU,\n\tar: ALIGNMENT_LOCALE_AR,\n\thi: ALIGNMENT_LOCALE_HI,\n};\n","/**\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 { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\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';\nimport { ALIGNMENT_LOCALES, type AlignmentLocale } from './AlignmentLocale.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\treadonly locale?: AlignmentLocale;\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\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 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\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(ALIGNMENT_LOCALES, context, this.config.locale);\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] ?? '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: 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.left,\n\t\t\tlabel: this.locale.toolbarLabel,\n\t\t\ttooltip: this.locale.toolbarTooltip,\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\tprivate getAlignmentLabel(alignment: BlockAlignment): string {\n\t\tconst labels: Record<BlockAlignment, string> = {\n\t\t\tleft: this.locale.alignLeft,\n\t\t\tcenter: this.locale.alignCenter,\n\t\t\tright: this.locale.alignRight,\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 === 'left') 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\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":["ALIGNMENT_LOCALE_EN","alignLeft","alignCenter","alignRight","justify","toolbarLabel","toolbarTooltip","ALIGNMENT_LOCALE_DE","ALIGNMENT_LOCALES","en","de","es","fr","zh","ru","ar","hi","DEFAULT_CONFIG","alignments","alignableTypes","defaults","image","ALIGNMENT_ICONS","left","center","right","AlignmentPlugin","id","name","priority","config","locale","this","context","resolvePluginLocale","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","getAlignmentLabel","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":"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"}
1
+ {"version":3,"file":"index-pxbbDHVH.mjs","sources":["../../src/plugins/alignment/AlignmentLocale.ts","../../src/plugins/alignment/AlignmentPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the AlignmentPlugin. */\n\nexport interface AlignmentLocale {\n\treadonly alignLeft: string;\n\treadonly alignCenter: string;\n\treadonly alignRight: 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\talignLeft: 'Align Left',\n\talignCenter: 'Align Center',\n\talignRight: 'Align Right',\n\tjustify: 'Justify',\n\ttoolbarLabel: 'Alignment',\n\ttoolbarTooltip: 'Alignment',\n};\n\n// --- German Locale ---\n\nexport const ALIGNMENT_LOCALE_DE: AlignmentLocale = {\n\talignLeft: 'Linksbündig',\n\talignCenter: 'Zentriert',\n\talignRight: 'Rechtsbündig',\n\tjustify: 'Blocksatz',\n\ttoolbarLabel: 'Ausrichtung',\n\ttoolbarTooltip: 'Ausrichtung',\n};\n\n// --- Spanish Locale ---\n\nexport const ALIGNMENT_LOCALE_ES: AlignmentLocale = {\n\talignLeft: 'Alinear a la izquierda',\n\talignCenter: 'Centrar',\n\talignRight: 'Alinear a la derecha',\n\tjustify: 'Justificar',\n\ttoolbarLabel: 'Alineación',\n\ttoolbarTooltip: 'Alineación',\n};\n\n// --- French Locale ---\n\nexport const ALIGNMENT_LOCALE_FR: AlignmentLocale = {\n\talignLeft: 'Aligner à gauche',\n\talignCenter: 'Centrer',\n\talignRight: 'Aligner à droite',\n\tjustify: 'Justifier',\n\ttoolbarLabel: 'Alignement',\n\ttoolbarTooltip: 'Alignement',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const ALIGNMENT_LOCALE_ZH: AlignmentLocale = {\n\talignLeft: '左对齐',\n\talignCenter: '居中',\n\talignRight: '右对齐',\n\tjustify: '两端对齐',\n\ttoolbarLabel: '对齐',\n\ttoolbarTooltip: '对齐',\n};\n\n// --- Russian Locale ---\n\nexport const ALIGNMENT_LOCALE_RU: AlignmentLocale = {\n\talignLeft: 'По левому краю',\n\talignCenter: 'По центру',\n\talignRight: 'По правому краю',\n\tjustify: 'По ширине',\n\ttoolbarLabel: 'Выравнивание',\n\ttoolbarTooltip: 'Выравнивание',\n};\n\n// --- Arabic Locale ---\n\nexport const ALIGNMENT_LOCALE_AR: AlignmentLocale = {\n\talignLeft: 'محاذاة لليسار',\n\talignCenter: 'توسيط',\n\talignRight: 'محاذاة لليمين',\n\tjustify: 'ضبط',\n\ttoolbarLabel: 'المحاذاة',\n\ttoolbarTooltip: 'المحاذاة',\n};\n\n// --- Hindi Locale ---\n\nexport const ALIGNMENT_LOCALE_HI: AlignmentLocale = {\n\talignLeft: 'बाएँ संरेखित करें',\n\talignCenter: 'केंद्र में',\n\talignRight: 'दाएँ संरेखित करें',\n\tjustify: 'समायोजित करें',\n\ttoolbarLabel: 'संरेखण',\n\ttoolbarTooltip: 'संरेखण',\n};\n\n// --- Locale Map ---\n\nexport const ALIGNMENT_LOCALES: Record<string, AlignmentLocale> = {\n\ten: ALIGNMENT_LOCALE_EN,\n\tde: ALIGNMENT_LOCALE_DE,\n\tes: ALIGNMENT_LOCALE_ES,\n\tfr: ALIGNMENT_LOCALE_FR,\n\tzh: ALIGNMENT_LOCALE_ZH,\n\tru: ALIGNMENT_LOCALE_RU,\n\tar: ALIGNMENT_LOCALE_AR,\n\thi: ALIGNMENT_LOCALE_HI,\n};\n","/**\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 { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\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';\nimport { ALIGNMENT_LOCALES, type AlignmentLocale } from './AlignmentLocale.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\treadonly locale?: AlignmentLocale;\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\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 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\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(ALIGNMENT_LOCALES, context, this.config.locale);\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] ?? '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: 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.left,\n\t\t\tlabel: this.locale.toolbarLabel,\n\t\t\ttooltip: this.locale.toolbarTooltip,\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\tprivate getAlignmentLabel(alignment: BlockAlignment): string {\n\t\tconst labels: Record<BlockAlignment, string> = {\n\t\t\tleft: this.locale.alignLeft,\n\t\t\tcenter: this.locale.alignCenter,\n\t\t\tright: this.locale.alignRight,\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 === 'left') 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\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":["ALIGNMENT_LOCALE_EN","alignLeft","alignCenter","alignRight","justify","toolbarLabel","toolbarTooltip","ALIGNMENT_LOCALE_DE","ALIGNMENT_LOCALES","en","de","es","fr","zh","ru","ar","hi","DEFAULT_CONFIG","alignments","alignableTypes","defaults","image","ALIGNMENT_ICONS","left","center","right","AlignmentPlugin","id","name","priority","config","locale","this","context","resolvePluginLocale","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","getAlignmentLabel","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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolvePluginLocale-B4w1OkPy.mjs","sources":["../../src/plugins/Plugin.ts","../../src/i18n/LocaleService.ts","../../src/i18n/resolvePluginLocale.ts"],"sourcesContent":["/**\n * Plugin system types for the Notectl editor.\n */\n\nimport type { DecorationSet } from '../decorations/Decoration.js';\nimport type { InputRule } from '../input/InputRule.js';\nimport type { Keymap } from '../input/Keymap.js';\nimport type { InlineNodeSpec } from '../model/InlineNodeSpec.js';\nimport type { MarkSpec } from '../model/MarkSpec.js';\nimport type { NodeSpec } from '../model/NodeSpec.js';\nimport type { FileHandler } from '../model/SchemaRegistry.js';\nimport type { SchemaRegistry } from '../model/SchemaRegistry.js';\nimport type { EditorState } from '../state/EditorState.js';\nimport type { Transaction } from '../state/Transaction.js';\nimport type { NodeViewFactory } from '../view/NodeView.js';\nimport type { BlockTypePickerEntry } from './heading/BlockTypePickerEntry.js';\nimport type { ToolbarItem } from './toolbar/ToolbarItem.js';\n\n// --- Type-Safe Keys ---\n\n/** Type-safe event key for compile-time payload checking. */\nexport class EventKey<T> {\n\tdeclare readonly _type: T;\n\tconstructor(public readonly id: string) {}\n}\n\n/** Type-safe service key for compile-time type checking. */\nexport class ServiceKey<T> {\n\tdeclare readonly _type: T;\n\tconstructor(public readonly id: string) {}\n}\n\n// --- Command System ---\n\nexport type CommandHandler = () => boolean;\n\nexport interface CommandOptions {\n\t/** When true, the command may execute even if the editor is in read-only mode. */\n\treadonly readonlyAllowed?: boolean;\n}\n\nexport interface CommandEntry {\n\treadonly name: string;\n\treadonly handler: CommandHandler;\n\treadonly pluginId: string;\n\treadonly readonlyAllowed: boolean;\n}\n\n// --- Event System ---\n\nexport type PluginEventCallback<T = unknown> = (payload: T) => void;\n\nexport interface PluginEventBus {\n\temit<T>(key: EventKey<T>, payload: T): void;\n\ton<T>(key: EventKey<T>, callback: PluginEventCallback<T>): () => void;\n\toff<T>(key: EventKey<T>, callback: PluginEventCallback<T>): void;\n}\n\n// --- Configuration ---\n\nexport type PluginConfig = Record<string, unknown>;\n\n// --- Middleware ---\n\nexport type MiddlewareNext = (tr: Transaction) => void;\nexport type TransactionMiddleware = (\n\ttr: Transaction,\n\tstate: EditorState,\n\tnext: MiddlewareNext,\n) => void;\n\nexport interface MiddlewareOptions {\n\t/** Human-readable name for debugging and introspection. */\n\treadonly name?: string;\n\t/** Execution priority (lower values run first). Defaults to 100. */\n\treadonly priority?: number;\n}\n\n// --- Plugin Context ---\n\nexport interface PluginContext {\n\tgetState(): EditorState;\n\tdispatch(transaction: Transaction): void;\n\tgetContainer(): HTMLElement;\n\tgetPluginContainer(position: 'top' | 'bottom'): HTMLElement;\n\tregisterCommand(name: string, handler: CommandHandler, options?: CommandOptions): void;\n\texecuteCommand(name: string): boolean;\n\tgetEventBus(): PluginEventBus;\n\tregisterMiddleware(middleware: TransactionMiddleware, options?: MiddlewareOptions): void;\n\tregisterService<T>(key: ServiceKey<T>, service: T): void;\n\tgetService<T>(key: ServiceKey<T>): T | undefined;\n\tupdateConfig(config: PluginConfig): void;\n\n\t// --- Schema Extension ---\n\tregisterNodeSpec<T extends string>(spec: NodeSpec<T>): void;\n\tregisterMarkSpec<T extends string>(spec: MarkSpec<T>): void;\n\tregisterNodeView(type: string, factory: NodeViewFactory): void;\n\tregisterKeymap(keymap: Keymap): void;\n\tregisterInputRule(rule: InputRule): void;\n\tregisterToolbarItem(item: ToolbarItem): void;\n\tregisterInlineNodeSpec<T extends string>(spec: InlineNodeSpec<T>): void;\n\tregisterFileHandler(pattern: string, handler: FileHandler): void;\n\tregisterBlockTypePickerEntry(entry: BlockTypePickerEntry): void;\n\tgetSchemaRegistry(): SchemaRegistry;\n\n\t/** Registers a CSS string to be added to the editor's adopted stylesheets. */\n\tregisterStyleSheet(css: string): void;\n\n\t/** Returns whether the editor is currently in read-only mode. */\n\tisReadOnly(): boolean;\n\n\t/** Pushes a screen reader announcement via the editor's aria-live region. */\n\tannounce(text: string): void;\n}\n\n// --- Plugin Interface ---\n\nexport interface Plugin<TConfig extends Record<string, unknown> = Record<string, unknown>> {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly priority?: number;\n\treadonly dependencies?: readonly string[];\n\n\tinit(context: PluginContext): void | Promise<void>;\n\tdestroy?(): void | Promise<void>;\n\tonStateChange?(oldState: EditorState, newState: EditorState, tr: Transaction): void;\n\tonConfigure?(config: TConfig): void;\n\t/** Called after ALL plugins have been initialized. */\n\tonReady?(): void | Promise<void>;\n\t/** Called when the editor's read-only mode changes. */\n\tonReadOnlyChange?(readonly: boolean): void;\n\t/**\n\t * Returns decorations for the given state.\n\t * Called after state.apply() but BEFORE reconciliation.\n\t * Plugins should cache and only recompute when needed.\n\t */\n\tdecorations?(state: EditorState, tr?: Transaction): DecorationSet;\n}\n","/**\n * Global locale service that resolves the active language.\n * Registered as a system-level service before plugin init.\n */\n\nimport { ServiceKey } from '../plugins/Plugin.js';\n\nexport class LocaleService {\n\tprivate readonly resolvedLocale: string;\n\n\tconstructor(locale: string) {\n\t\tthis.resolvedLocale =\n\t\t\tlocale === 'browser'\n\t\t\t\t? typeof navigator !== 'undefined'\n\t\t\t\t\t? (navigator.language.split('-')[0] ?? 'en')\n\t\t\t\t\t: 'en'\n\t\t\t\t: locale;\n\t}\n\n\tgetLocale(): string {\n\t\treturn this.resolvedLocale;\n\t}\n}\n\nexport const LocaleServiceKey = new ServiceKey<LocaleService>('locale');\n","/**\n * Shared helper for resolving a plugin's locale.\n * Priority: per-plugin config override > global LocaleService > English fallback.\n */\n\nimport type { PluginContext } from '../plugins/Plugin.js';\nimport { LocaleServiceKey } from './LocaleService.js';\n\nexport function resolvePluginLocale<T>(\n\tlocaleMap: Readonly<Record<string, T>>,\n\tcontext: PluginContext,\n\tconfigOverride?: T,\n): T {\n\tif (configOverride) return configOverride;\n\tconst service = context.getService(LocaleServiceKey);\n\tconst lang: string = service?.getLocale() ?? 'en';\n\tconst resolved: T | undefined = localeMap[lang] ?? localeMap.en;\n\tif (!resolved) {\n\t\tthrow new Error('Locale map must contain an \"en\" entry');\n\t}\n\treturn resolved;\n}\n"],"names":["EventKey","id","this","ServiceKey","LocaleService","resolvedLocale","locale","navigator","language","split","getLocale","LocaleServiceKey","resolvePluginLocale","localeMap","context","configOverride","service","getService","resolved","en","Error"],"mappings":"AAqBO,MAAMA;EAEZ,YAA4BC,IAAAA;AAAAC,SAAAD,KAAAA;AAAAA,EAAa;AAAA;AAInC,MAAME,EAAAA;AAAAA,EAEZ,YAA4BF,IAAAA;AAAAC,SAAAD,KAAAA;AAAAA,EAAa;;ACtBnC,MAAMG,EAAAA;AAAAA,EACKC;AAAAA,EAEjB,YAAYC,IAAAA;AACXJ,SAAKG,iBACO,cAAXC,KACwB,sBAAdC,YACLA,UAAUC,SAASC,MAAM,KAAK,CAAA,KAAM,OACrC,OACDH;AAAAA,EACL;AAAA,EAEA,YAAAI;AACC,WAAOR,KAAKG;AAAAA,EACb;;AAGM,MAAMM,IAAmB,IAAIR,EAA0B;AChBvD,SAASS,EACfC,IACAC,IACAC;AAEA,MAAIA,GAAgB,QAAOA;AAC3B,QAAMC,KAAUF,GAAQG,WAAWN,CAAAA,GAE7BO,IAA0BL,GADXG,IAASN,UAAAA,KAAe,SACMG,GAAUM;AAC7D,OAAKD,EACJ,OAAM,IAAIE,MAAM;AAEjB,SAAOF;AACR;"}
1
+ {"version":3,"file":"resolvePluginLocale-B4w1OkPy.mjs","sources":["../../src/plugins/Plugin.ts","../../src/i18n/LocaleService.ts","../../src/i18n/resolvePluginLocale.ts"],"sourcesContent":["/**\n * Plugin system types for the Notectl editor.\n */\n\nimport type { DecorationSet } from '../decorations/Decoration.js';\nimport type { FileHandler } from '../input/FileHandlerRegistry.js';\nimport type { FileHandlerRegistry } from '../input/FileHandlerRegistry.js';\nimport type { InputRule } from '../input/InputRule.js';\nimport type { InputRuleRegistry } from '../input/InputRuleRegistry.js';\nimport type { Keymap, KeymapOptions } from '../input/Keymap.js';\nimport type { KeymapRegistry } from '../input/KeymapRegistry.js';\nimport type { InlineNodeSpec } from '../model/InlineNodeSpec.js';\nimport type { MarkSpec } from '../model/MarkSpec.js';\nimport type { NodeSpec } from '../model/NodeSpec.js';\nimport type { SchemaRegistry } from '../model/SchemaRegistry.js';\nimport type { EditorState } from '../state/EditorState.js';\nimport type { Transaction } from '../state/Transaction.js';\nimport type { NodeViewFactory } from '../view/NodeView.js';\nimport type { NodeViewRegistry } from '../view/NodeViewRegistry.js';\nimport type { BlockTypePickerEntry } from './heading/BlockTypePickerEntry.js';\nimport type { BlockTypePickerRegistry } from './heading/BlockTypePickerRegistry.js';\nimport type { ToolbarItem } from './toolbar/ToolbarItem.js';\nimport type { ToolbarRegistry } from './toolbar/ToolbarRegistry.js';\n\n// --- Type-Safe Keys ---\n\n/** Type-safe event key for compile-time payload checking. */\nexport class EventKey<T> {\n\tdeclare readonly _type: T;\n\tconstructor(public readonly id: string) {}\n}\n\n/** Type-safe service key for compile-time type checking. */\nexport class ServiceKey<T> {\n\tdeclare readonly _type: T;\n\tconstructor(public readonly id: string) {}\n}\n\n// --- Command System ---\n\nexport type CommandHandler = () => boolean;\n\nexport interface CommandOptions {\n\t/** When true, the command may execute even if the editor is in read-only mode. */\n\treadonly readonlyAllowed?: boolean;\n}\n\nexport interface CommandEntry {\n\treadonly name: string;\n\treadonly handler: CommandHandler;\n\treadonly pluginId: string;\n\treadonly readonlyAllowed: boolean;\n}\n\n// --- Event System ---\n\nexport type PluginEventCallback<T = unknown> = (payload: T) => void;\n\nexport interface PluginEventBus {\n\temit<T>(key: EventKey<T>, payload: T): void;\n\ton<T>(key: EventKey<T>, callback: PluginEventCallback<T>): () => void;\n\toff<T>(key: EventKey<T>, callback: PluginEventCallback<T>): void;\n}\n\n// --- Configuration ---\n\nexport type PluginConfig = Record<string, unknown>;\n\n// --- Middleware ---\n\nexport type MiddlewareNext = (tr: Transaction) => void;\nexport type TransactionMiddleware = (\n\ttr: Transaction,\n\tstate: EditorState,\n\tnext: MiddlewareNext,\n) => void;\n\nexport interface MiddlewareOptions {\n\t/** Human-readable name for debugging and introspection. */\n\treadonly name?: string;\n\t/** Execution priority (lower values run first). Defaults to 100. */\n\treadonly priority?: number;\n}\n\n// --- Plugin Context ---\n\nexport interface PluginContext {\n\tgetState(): EditorState;\n\tdispatch(transaction: Transaction): void;\n\tgetContainer(): HTMLElement;\n\tgetPluginContainer(position: 'top' | 'bottom'): HTMLElement;\n\tregisterCommand(name: string, handler: CommandHandler, options?: CommandOptions): void;\n\texecuteCommand(name: string): boolean;\n\tgetEventBus(): PluginEventBus;\n\tregisterMiddleware(middleware: TransactionMiddleware, options?: MiddlewareOptions): void;\n\tregisterService<T>(key: ServiceKey<T>, service: T): void;\n\tgetService<T>(key: ServiceKey<T>): T | undefined;\n\tupdateConfig(config: PluginConfig): void;\n\n\t// --- Schema Extension ---\n\tregisterNodeSpec<T extends string>(spec: NodeSpec<T>): void;\n\tregisterMarkSpec<T extends string>(spec: MarkSpec<T>): void;\n\tregisterNodeView(type: string, factory: NodeViewFactory): void;\n\tregisterKeymap(keymap: Keymap, options?: KeymapOptions): void;\n\tregisterInputRule(rule: InputRule): void;\n\tregisterToolbarItem(item: ToolbarItem): void;\n\tregisterInlineNodeSpec<T extends string>(spec: InlineNodeSpec<T>): void;\n\tregisterFileHandler(pattern: string, handler: FileHandler): void;\n\tregisterBlockTypePickerEntry(entry: BlockTypePickerEntry): void;\n\tgetSchemaRegistry(): SchemaRegistry;\n\tgetKeymapRegistry(): KeymapRegistry;\n\tgetInputRuleRegistry(): InputRuleRegistry;\n\tgetFileHandlerRegistry(): FileHandlerRegistry;\n\tgetNodeViewRegistry(): NodeViewRegistry;\n\tgetToolbarRegistry(): ToolbarRegistry;\n\tgetBlockTypePickerRegistry(): BlockTypePickerRegistry;\n\n\t/** Registers a CSS string to be added to the editor's adopted stylesheets. */\n\tregisterStyleSheet(css: string): void;\n\n\t/** Returns whether the editor is currently in read-only mode. */\n\tisReadOnly(): boolean;\n\n\t/** Pushes a screen reader announcement via the editor's aria-live region. */\n\tannounce(text: string): void;\n\n\t/** Returns whether the announcer live region currently has content. */\n\thasAnnouncement(): boolean;\n}\n\n// --- Plugin Interface ---\n\nexport interface Plugin<TConfig extends Record<string, unknown> = Record<string, unknown>> {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly priority?: number;\n\treadonly dependencies?: readonly string[];\n\n\tinit(context: PluginContext): void | Promise<void>;\n\tdestroy?(): void | Promise<void>;\n\tonStateChange?(oldState: EditorState, newState: EditorState, tr: Transaction): void;\n\tonConfigure?(config: TConfig): void;\n\t/** Called after ALL plugins have been initialized. */\n\tonReady?(): void | Promise<void>;\n\t/** Called when the editor's read-only mode changes. */\n\tonReadOnlyChange?(readonly: boolean): void;\n\t/**\n\t * Returns decorations for the given state.\n\t * Called after state.apply() but BEFORE reconciliation.\n\t * Plugins should cache and only recompute when needed.\n\t */\n\tdecorations?(state: EditorState, tr?: Transaction): DecorationSet;\n}\n","/**\n * Global locale service that resolves the active language.\n * Registered as a system-level service before plugin init.\n */\n\nimport { ServiceKey } from '../plugins/Plugin.js';\n\nexport class LocaleService {\n\tprivate readonly resolvedLocale: string;\n\n\tconstructor(locale: string) {\n\t\tthis.resolvedLocale =\n\t\t\tlocale === 'browser'\n\t\t\t\t? typeof navigator !== 'undefined'\n\t\t\t\t\t? (navigator.language.split('-')[0] ?? 'en')\n\t\t\t\t\t: 'en'\n\t\t\t\t: locale;\n\t}\n\n\tgetLocale(): string {\n\t\treturn this.resolvedLocale;\n\t}\n}\n\nexport const LocaleServiceKey = new ServiceKey<LocaleService>('locale');\n","/**\n * Shared helper for resolving a plugin's locale.\n * Priority: per-plugin config override > global LocaleService > English fallback.\n */\n\nimport type { PluginContext } from '../plugins/Plugin.js';\nimport { LocaleServiceKey } from './LocaleService.js';\n\nexport function resolvePluginLocale<T>(\n\tlocaleMap: Readonly<Record<string, T>>,\n\tcontext: PluginContext,\n\tconfigOverride?: T,\n): T {\n\tif (configOverride) return configOverride;\n\tconst service = context.getService(LocaleServiceKey);\n\tconst lang: string = service?.getLocale() ?? 'en';\n\tconst resolved: T | undefined = localeMap[lang] ?? localeMap.en;\n\tif (!resolved) {\n\t\tthrow new Error('Locale map must contain an \"en\" entry');\n\t}\n\treturn resolved;\n}\n"],"names":["EventKey","id","this","ServiceKey","LocaleService","resolvedLocale","locale","navigator","language","split","getLocale","LocaleServiceKey","resolvePluginLocale","localeMap","context","configOverride","service","getService","resolved","en","Error"],"mappings":"AA2BO,MAAMA;EAEZ,YAA4BC,IAAAA;AAAAC,SAAAD,KAAAA;AAAAA,EAAa;AAAA;AAInC,MAAME,EAAAA;AAAAA,EAEZ,YAA4BF,IAAAA;AAAAC,SAAAD,KAAAA;AAAAA,EAAa;;AC5BnC,MAAMG,EAAAA;AAAAA,EACKC;AAAAA,EAEjB,YAAYC,IAAAA;AACXJ,SAAKG,iBACO,cAAXC,KACwB,sBAAdC,YACLA,UAAUC,SAASC,MAAM,KAAK,CAAA,KAAM,OACrC,OACDH;AAAAA,EACL;AAAA,EAEA,YAAAI;AACC,WAAOR,KAAKG;AAAAA,EACb;;AAGM,MAAMM,IAAmB,IAAIR,EAA0B;AChBvD,SAASS,EACfC,IACAC,IACAC;AAEA,MAAIA,GAAgB,QAAOA;AAC3B,QAAMC,KAAUF,GAAQG,WAAWN,CAAAA,GAE7BO,IAA0BL,GADXG,IAASN,UAAAA,KAAe,SACMG,GAAUM;AAC7D,OAAKD,EACJ,OAAM,IAAIE,MAAM;AAEjB,SAAOF;AACR;"}
@@ -1,71 +1,39 @@
1
- import { MarkType } from '../model/Document.js';
2
- import { NodeSelection, SelectionRange } from '../model/Selection.js';
1
+ import { SelectionRange } from '../model/Selection.js';
3
2
  import { BlockId } from '../model/TypeBrands.js';
4
3
  import { EditorState } from '../state/EditorState.js';
5
4
  import { Transaction, TransactionBuilder } from '../state/Transaction.js';
6
- export interface FeatureConfig {
7
- readonly bold: boolean;
8
- readonly italic: boolean;
9
- readonly underline: boolean;
10
- }
11
- /** Returns true if the block with the given ID is a void block (e.g. image, HR). */
12
- export declare function isVoidBlock(state: EditorState, bid: BlockId): boolean;
13
- /**
14
- * Deletes the void block targeted by a NodeSelection and places cursor
15
- * on the adjacent block. If it's the only block, replaces with empty paragraph.
16
- */
17
- export declare function deleteNodeSelection(state: EditorState, sel: NodeSelection): Transaction | null;
5
+ export { canCrossBlockBoundary, isInsideIsolating, isIsolatingBlock, isVoidBlock, sharesParent, } from '../model/NavigationUtils.js';
6
+ export type { FeatureConfig } from './MarkCommands.js';
7
+ export { isMarkActive, toggleBold, toggleItalic, toggleMark, toggleUnderline, } from './MarkCommands.js';
8
+ export { deleteBackward, deleteForward, deleteSoftLineBackward, deleteSoftLineForward, deleteWordBackward, deleteWordForward, } from './DeleteCommands.js';
9
+ export { deleteNodeSelection, findFirstLeafBlockId, findLastLeafBlockId, insertParagraphAfterNodeSelection, insertTextAfterNodeSelection, navigateArrowIntoVoid, } from './NodeSelectionCommands.js';
10
+ export { deleteBackwardAtGap, deleteForwardAtGap, insertParagraphAtGap, insertTextAtGap, } from './GapCursorCommands.js';
11
+ export { findWordBoundaryBackward, findWordBoundaryForward, } from './WordBoundary.js';
18
12
  /**
19
13
  * Iterates over each block in the given selection range, invoking the callback
20
14
  * with the block ID, per-block start offset, and per-block end offset.
21
15
  * Blocks where `from === to` are skipped automatically.
22
16
  */
23
17
  export declare function forEachBlockInRange(state: EditorState, range: SelectionRange, callback: (blockId: BlockId, from: number, to: number) => void): void;
24
- /**
25
- * Toggles a mark on the current selection.
26
- * If collapsed, toggles stored marks. If range, applies/removes from text.
27
- */
28
- export declare function toggleMark(state: EditorState, markType: MarkType, features?: FeatureConfig): Transaction | null;
29
- export declare function toggleBold(state: EditorState, features?: FeatureConfig): Transaction | null;
30
- export declare function toggleItalic(state: EditorState, features?: FeatureConfig): Transaction | null;
31
- export declare function toggleUnderline(state: EditorState, features?: FeatureConfig): Transaction | null;
32
18
  /** Inserts text at the current selection, replacing any selected range. */
33
19
  export declare function insertTextCommand(state: EditorState, text: string, origin?: 'input' | 'paste'): Transaction;
34
20
  /** Deletes the current selection. */
35
21
  export declare function deleteSelectionCommand(state: EditorState): Transaction | null;
36
- /** Handles backspace key. */
37
- export declare function deleteBackward(state: EditorState): Transaction | null;
38
- /** Handles delete key. */
39
- export declare function deleteForward(state: EditorState): Transaction | null;
40
- /** Handles Ctrl+Backspace: delete word backward. */
41
- export declare function deleteWordBackward(state: EditorState): Transaction | null;
42
- /** Handles Ctrl+Delete: delete word forward. */
43
- export declare function deleteWordForward(state: EditorState): Transaction | null;
44
- /** Handles Cmd+Backspace: delete to start of line/block. */
45
- export declare function deleteSoftLineBackward(state: EditorState): Transaction | null;
46
- /** Handles Cmd+Delete: delete to end of line/block. */
47
- export declare function deleteSoftLineForward(state: EditorState): Transaction | null;
48
22
  /** Splits the current block at the cursor position (Enter key). */
49
23
  export declare function splitBlockCommand(state: EditorState): Transaction | null;
50
24
  /** Inserts a hard line break (InlineNode) at the current cursor position. */
51
25
  export declare function insertHardBreakCommand(state: EditorState): Transaction | null;
52
- /** Checks whether two blocks share the same parent in the document tree. */
53
- export declare function sharesParent(state: EditorState, blockIdA: BlockId, blockIdB: BlockId): boolean;
54
- /** Checks whether a block is inside an isolating node (e.g. table_cell). */
55
- export declare function isInsideIsolating(state: EditorState, blockId: BlockId): boolean;
56
26
  /**
57
27
  * Merges the current block with the previous block, respecting
58
28
  * isolating boundaries and void blocks.
59
29
  */
60
30
  export declare function mergeBlockBackward(state: EditorState): Transaction | null;
31
+ /**
32
+ * Merges the next block into the current block, respecting
33
+ * isolating boundaries and void blocks.
34
+ */
35
+ export declare function mergeBlockForward(state: EditorState): Transaction | null;
61
36
  /** Selects all content in the editor. */
62
37
  export declare function selectAll(state: EditorState): Transaction;
63
- /** Checks if a mark is active at the current selection. */
64
- export declare function isMarkActive(state: EditorState, markType: MarkType): boolean;
65
38
  export declare function addDeleteSelectionSteps(state: EditorState, builder: TransactionBuilder): void;
66
- /**
67
- * Navigates arrow keys into/out of void blocks.
68
- * Returns a transaction if navigation should create a NodeSelection, or null.
69
- */
70
- export declare function navigateArrowIntoVoid(state: EditorState, direction: 'left' | 'right' | 'up' | 'down'): Transaction | null;
71
39
  //# sourceMappingURL=Commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Commands.d.ts","sourceRoot":"","sources":["../../src/commands/Commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Commands.d.ts","sourceRoot":"","sources":["../../src/commands/Commands.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAU5D,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAUlE,OAAO,EACN,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,YAAY,GACZ,MAAM,6BAA6B,CAAC;AAErC,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACN,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,EACV,eAAe,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACN,cAAc,EACd,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,iCAAiC,EACjC,4BAA4B,EAC5B,qBAAqB,GACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACN,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,GACf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACN,wBAAwB,EACxB,uBAAuB,GACvB,MAAM,mBAAmB,CAAC;AAI3B;;;;GAIG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,GAC5D,IAAI,CAiBN;AAID,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,OAAO,GAAG,OAAiB,GACjC,WAAW,CA4Bb;AAED,qCAAqC;AACrC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAc7E;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAkCxE;AAED,6EAA6E;AAC7E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAoB7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAuCzE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAmCxE;AAED,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAiBzD;AAcD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAwC7F"}
@@ -0,0 +1,15 @@
1
+ import { EditorState } from '../state/EditorState.js';
2
+ import { Transaction } from '../state/Transaction.js';
3
+ /** Handles backspace key. */
4
+ export declare function deleteBackward(state: EditorState): Transaction | null;
5
+ /** Handles delete key. */
6
+ export declare function deleteForward(state: EditorState): Transaction | null;
7
+ /** Handles Ctrl+Backspace: delete word backward. */
8
+ export declare function deleteWordBackward(state: EditorState): Transaction | null;
9
+ /** Handles Ctrl+Delete: delete word forward. */
10
+ export declare function deleteWordForward(state: EditorState): Transaction | null;
11
+ /** Handles Cmd+Backspace: delete to start of line/block. */
12
+ export declare function deleteSoftLineBackward(state: EditorState): Transaction | null;
13
+ /** Handles Cmd+Delete: delete to end of line/block. */
14
+ export declare function deleteSoftLineForward(state: EditorState): Transaction | null;
15
+ //# sourceMappingURL=DeleteCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteCommands.d.ts","sourceRoot":"","sources":["../../src/commands/DeleteCommands.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAK3D,6BAA6B;AAC7B,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAyBrE;AAED,0BAA0B;AAC1B,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CA2BpE;AAED,oDAAoD;AACpD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CA0BzE;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CA2BxE;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAwB7E;AAED,uDAAuD;AACvD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAyB5E"}
@@ -0,0 +1,24 @@
1
+ import { GapCursorSelection } from '../model/Selection.js';
2
+ import { EditorState } from '../state/EditorState.js';
3
+ import { Transaction } from '../state/Transaction.js';
4
+ /**
5
+ * Deletes the void block adjacent to a GapCursor when pressing Backspace.
6
+ *
7
+ * - `side === 'after'` → void block is behind the cursor → delete it.
8
+ * - `side === 'before'` → void block is ahead → navigate backward (to previous block).
9
+ * - At document start with `side === 'before'` → `null` (no-op).
10
+ */
11
+ export declare function deleteBackwardAtGap(state: EditorState, sel: GapCursorSelection): Transaction | null;
12
+ /**
13
+ * Deletes the void block adjacent to a GapCursor when pressing Delete.
14
+ *
15
+ * - `side === 'before'` → void block is ahead of the cursor → delete it.
16
+ * - `side === 'after'` → void block is behind → navigate forward (to next block).
17
+ * - At document end with `side === 'after'` → `null` (no-op).
18
+ */
19
+ export declare function deleteForwardAtGap(state: EditorState, sel: GapCursorSelection): Transaction | null;
20
+ /** Inserts a new paragraph at a GapCursor position (before or after the void block). */
21
+ export declare function insertParagraphAtGap(state: EditorState, sel: GapCursorSelection): Transaction | null;
22
+ /** Inserts text in a new paragraph at a GapCursor position. */
23
+ export declare function insertTextAtGap(state: EditorState, sel: GapCursorSelection, text: string, origin: 'input' | 'paste'): Transaction;
24
+ //# sourceMappingURL=GapCursorCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GapCursorCommands.d.ts","sourceRoot":"","sources":["../../src/commands/GapCursorCommands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAiB,MAAM,uBAAuB,CAAC;AAG/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,kBAAkB,GACrB,WAAW,GAAG,IAAI,CA0BpB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,kBAAkB,GACrB,WAAW,GAAG,IAAI,CAuBpB;AASD,wFAAwF;AACxF,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,kBAAkB,GACrB,WAAW,GAAG,IAAI,CAgBpB;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAC9B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,GAAG,OAAO,GACvB,WAAW,CAeb"}
@@ -0,0 +1,19 @@
1
+ import { MarkType } from '../model/Document.js';
2
+ import { EditorState } from '../state/EditorState.js';
3
+ import { Transaction } from '../state/Transaction.js';
4
+ export interface FeatureConfig {
5
+ readonly bold: boolean;
6
+ readonly italic: boolean;
7
+ readonly underline: boolean;
8
+ }
9
+ /**
10
+ * Toggles a mark on the current selection.
11
+ * If collapsed, toggles stored marks. If range, applies/removes from text.
12
+ */
13
+ export declare function toggleMark(state: EditorState, markType: MarkType, features?: FeatureConfig): Transaction | null;
14
+ export declare function toggleBold(state: EditorState, features?: FeatureConfig): Transaction | null;
15
+ export declare function toggleItalic(state: EditorState, features?: FeatureConfig): Transaction | null;
16
+ export declare function toggleUnderline(state: EditorState, features?: FeatureConfig): Transaction | null;
17
+ /** Checks if a mark is active at the current selection. */
18
+ export declare function isMarkActive(state: EditorState, markType: MarkType): boolean;
19
+ //# sourceMappingURL=MarkCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkCommands.d.ts","sourceRoot":"","sources":["../../src/commands/MarkCommands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGN,KAAK,QAAQ,EAMb,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAK3D,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC5B;AAID;;;GAGG;AACH,wBAAgB,UAAU,CACzB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,GAAE,aAA+B,GACvC,WAAW,GAAG,IAAI,CA0CpB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,IAAI,CAE3F;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,IAAI,CAE7F;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,IAAI,CAEhG;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAe5E"}
@@ -0,0 +1,27 @@
1
+ import { EditorState } from '../state/EditorState.js';
2
+ import { Transaction } from '../state/Transaction.js';
3
+ /** Moves the cursor one character forward, skipping InlineNodes atomically. */
4
+ export declare function moveCharacterForward(state: EditorState): Transaction | null;
5
+ /** Moves the cursor one character backward, skipping InlineNodes atomically. */
6
+ export declare function moveCharacterBackward(state: EditorState): Transaction | null;
7
+ /** Moves the cursor to the start of the current block. */
8
+ export declare function moveToBlockStart(state: EditorState): Transaction | null;
9
+ /** Moves the cursor to the end of the current block. */
10
+ export declare function moveToBlockEnd(state: EditorState): Transaction | null;
11
+ /** Moves the cursor to the beginning of the document. */
12
+ export declare function moveToDocumentStart(state: EditorState): Transaction | null;
13
+ /** Moves the cursor to the end of the document. */
14
+ export declare function moveToDocumentEnd(state: EditorState): Transaction | null;
15
+ /** Extends the selection one character forward. */
16
+ export declare function extendCharacterForward(state: EditorState): Transaction | null;
17
+ /** Extends the selection one character backward. */
18
+ export declare function extendCharacterBackward(state: EditorState): Transaction | null;
19
+ /** Extends the selection to the start of the current block. */
20
+ export declare function extendToBlockStart(state: EditorState): Transaction | null;
21
+ /** Extends the selection to the end of the current block. */
22
+ export declare function extendToBlockEnd(state: EditorState): Transaction | null;
23
+ /** Extends the selection to the start of the document. */
24
+ export declare function extendToDocumentStart(state: EditorState): Transaction | null;
25
+ /** Extends the selection to the end of the document. */
26
+ export declare function extendToDocumentEnd(state: EditorState): Transaction | null;
27
+ //# sourceMappingURL=MovementCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MovementCommands.d.ts","sourceRoot":"","sources":["../../src/commands/MovementCommands.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA+B3D,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAqC3E;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAsC5E;AAMD,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CASvE;AAED,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAarE;AAMD,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAW1E;AAED,mDAAmD;AACnD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAaxE;AAMD,mDAAmD;AACnD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CA2B7E;AAED,oDAAoD;AACpD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CA2B9E;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CASzE;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAcvE;AAED,0DAA0D;AAC1D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAY5E;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAiB1E"}
@@ -0,0 +1,24 @@
1
+ import { BlockNode } from '../model/Document.js';
2
+ import { NodeSelection } from '../model/Selection.js';
3
+ import { BlockId } from '../model/TypeBrands.js';
4
+ import { EditorState } from '../state/EditorState.js';
5
+ import { Transaction } from '../state/Transaction.js';
6
+ /**
7
+ * Deletes the void block targeted by a NodeSelection and places cursor
8
+ * on the adjacent block. If it's the only block, replaces with empty paragraph.
9
+ */
10
+ export declare function deleteNodeSelection(state: EditorState, sel: NodeSelection): Transaction | null;
11
+ /** Inserts a new paragraph after a NodeSelection-targeted void block. */
12
+ export declare function insertParagraphAfterNodeSelection(state: EditorState, sel: NodeSelection): Transaction | null;
13
+ /** Inserts text in a new paragraph after a NodeSelection-targeted void block. */
14
+ export declare function insertTextAfterNodeSelection(state: EditorState, sel: NodeSelection, text: string, origin: 'input' | 'paste'): Transaction;
15
+ /**
16
+ * Navigates arrow keys into/out of void blocks.
17
+ * Returns a transaction if navigation should create a NodeSelection, or null.
18
+ */
19
+ export declare function navigateArrowIntoVoid(state: EditorState, direction: 'left' | 'right' | 'up' | 'down'): Transaction | null;
20
+ /** Finds the first leaf (deepest-first-child) block ID in a subtree. */
21
+ export declare function findFirstLeafBlockId(node: BlockNode): BlockId;
22
+ /** Finds the last leaf (deepest-last-child) block ID in a subtree. */
23
+ export declare function findLastLeafBlockId(node: BlockNode): BlockId;
24
+ //# sourceMappingURL=NodeSelectionCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeSelectionCommands.d.ts","sourceRoot":"","sources":["../../src/commands/NodeSelectionCommands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,KAAK,SAAS,EAMd,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAS3D,OAAO,EAAE,KAAK,OAAO,EAAY,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,WAAW,GAAG,IAAI,CA2C9F;AAED,yEAAyE;AACzE,wBAAgB,iCAAiC,CAChD,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,aAAa,GAChB,WAAW,GAAG,IAAI,CAepB;AAED,iFAAiF;AACjF,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,GAAG,OAAO,GACvB,WAAW,CAeb;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GACzC,WAAW,GAAG,IAAI,CAgBpB;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAS7D;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAc5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasteCommand.d.ts","sourceRoot":"","sources":["../../src/commands/PasteCommand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,0BAA0B,CAAC;AAWzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,yBAAyB,CAAC;AAG/E;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,GAAG,WAAW,CAiB/E"}
1
+ {"version":3,"file":"PasteCommand.d.ts","sourceRoot":"","sources":["../../src/commands/PasteCommand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,0BAA0B,CAAC;AAoBzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,yBAAyB,CAAC;AAG/E;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,GAAG,WAAW,CAiB/E"}
@@ -0,0 +1,12 @@
1
+ import { BlockNode } from '../model/Document.js';
2
+ /**
3
+ * Finds the word boundary backward from the given offset.
4
+ * InlineNodes act as word boundaries.
5
+ */
6
+ export declare function findWordBoundaryBackward(block: BlockNode, offset: number): number;
7
+ /**
8
+ * Finds the word boundary forward from the given offset.
9
+ * InlineNodes act as word boundaries.
10
+ */
11
+ export declare function findWordBoundaryForward(block: BlockNode, offset: number): number;
12
+ //# sourceMappingURL=WordBoundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WordBoundary.d.ts","sourceRoot":"","sources":["../../src/commands/WordBoundary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAsC,MAAM,sBAAsB,CAAC;AAE1F;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsBjF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAuBhF"}
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentSerializer.d.ts","sourceRoot":"","sources":["../../src/editor/DocumentSerializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAa,QAAQ,EAA8B,MAAM,sBAAsB,CAAC;AAG5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAKjE,0FAA0F;AAC1F,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAkCxF"}
1
+ {"version":3,"file":"DocumentSerializer.d.ts","sourceRoot":"","sources":["../../src/editor/DocumentSerializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAa,QAAQ,EAA8B,MAAM,sBAAsB,CAAC;AAQ5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAKjE,0FAA0F;AAC1F,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAUxF"}
@@ -93,7 +93,9 @@ export declare class NotectlEditor extends HTMLElement {
93
93
  /** Sets the document from JSON. */
94
94
  setJSON(doc: Document): void;
95
95
  /** Returns sanitized HTML representation of the document. */
96
- getHTML(): string;
96
+ getHTML(options?: GetHTMLOptions & {
97
+ pretty?: boolean;
98
+ }): string;
97
99
  /** Sets content from HTML (sanitized). */
98
100
  setHTML(html: string): void;
99
101
  /** Returns plain text content. */
@@ -155,6 +157,10 @@ export declare class NotectlEditor extends HTMLElement {
155
157
  * was explicitly registered. Uses the `features` config to determine which marks to enable.
156
158
  */
157
159
  private ensureTextFormattingPlugin;
160
+ /** Auto-registers CaretNavigationPlugin if not explicitly provided. */
161
+ private ensureCaretNavigationPlugin;
162
+ /** Auto-registers GapCursorPlugin if not explicitly provided. */
163
+ private ensureGapCursorPlugin;
158
164
  private applyPaperSize;
159
165
  private emit;
160
166
  private onStateChange;
@@ -1 +1 @@
1
- {"version":3,"file":"NotectlEditor.d.ts","sourceRoot":"","sources":["../../src/editor/NotectlEditor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NotectlEditor.d.ts","sourceRoot":"","sources":["../../src/editor/NotectlEditor.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,9 +3,10 @@
3
3
  * @packageDocumentation
4
4
  */
5
5
  export type { Document, BlockNode, TextNode, InlineNode, TextSegment, ContentSegment, ChildNode, Mark, BoldMark, ItalicMark, UnderlineMark, MarkType, NodeType, BlockAttrs, } from './model/Document.js';
6
- export { createDocument, createBlockNode, createTextNode, createInlineNode, isTextNode, isInlineNode, isBlockNode, isLeafBlock, getTextChildren, getInlineChildren, getBlockChildren, getBlockText, getBlockLength, getBlockMarksAtOffset, getContentAtOffset, hasMark, markSetsEqual, } from './model/Document.js';
7
- export type { Position, Selection, SelectionRange, NodeSelection, EditorSelection, } from './model/Selection.js';
8
- export { createPosition, createSelection, createCollapsedSelection, createNodeSelection, isCollapsed, isForward, selectionRange, isNodeSelection, isTextSelection, selectionsEqual, } from './model/Selection.js';
6
+ export { createDocument, createBlockNode, createTextNode, createInlineNode, isTextNode, isInlineNode, isBlockNode, isLeafBlock, getTextChildren, getInlineChildren, getBlockChildren, getBlockText, getBlockLength, blockOffsetToTextOffset, getBlockMarksAtOffset, getContentAtOffset, hasMark, markSetsEqual, } from './model/Document.js';
7
+ export { nextGraphemeSize, prevGraphemeSize } from './model/GraphemeUtils.js';
8
+ export type { Position, Selection, SelectionRange, NodeSelection, GapCursorSelection, EditorSelection, } from './model/Selection.js';
9
+ export { createPosition, createSelection, createCollapsedSelection, createNodeSelection, createGapCursor, isCollapsed, isForward, selectionRange, isNodeSelection, isGapCursor, isTextSelection, selectionsEqual, } from './model/Selection.js';
9
10
  export type { Schema } from './model/Schema.js';
10
11
  export { defaultSchema, schemaFromRegistry, isMarkAllowed } from './model/Schema.js';
11
12
  export type { BlockId, NodeTypeName, MarkTypeName, InlineTypeName, PluginId, CommandName, } from './model/TypeBrands.js';
@@ -18,8 +19,7 @@ export type { MarkSpec } from './model/MarkSpec.js';
18
19
  export type { InlineNodeSpec } from './model/InlineNodeSpec.js';
19
20
  export type { ParseRule } from './model/ParseRule.js';
20
21
  export type { SanitizeConfig } from './model/SanitizeConfig.js';
21
- export { escapeHTML } from './model/HTMLUtils.js';
22
- export type { FileHandler, FileHandlerEntry } from './model/SchemaRegistry.js';
22
+ export { escapeHTML, formatHTML } from './model/HTMLUtils.js';
23
23
  export { SchemaRegistry } from './model/SchemaRegistry.js';
24
24
  export { resolveNodeByPath, resolveParentByPath, findNodePath, findNode, findNodeWithPath, walkNodes, } from './model/NodeResolver.js';
25
25
  export { canContain, validateContent } from './model/ContentModel.js';
@@ -31,13 +31,28 @@ export { applyStep } from './state/StepApplication.js';
31
31
  export { isAllowedInReadonly, isSelectionOnlyTransaction } from './state/ReadonlyGuard.js';
32
32
  export { HistoryManager } from './state/History.js';
33
33
  export type { HistoryResult } from './state/History.js';
34
+ export { extendTx, moveTx, nodeSelTx } from './state/SelectionTransactions.js';
34
35
  export type { FeatureConfig } from './commands/Commands.js';
35
- export { forEachBlockInRange, toggleMark, toggleBold, toggleItalic, toggleUnderline, insertTextCommand, insertHardBreakCommand, deleteSelectionCommand, deleteBackward, deleteForward, splitBlockCommand, mergeBlockBackward, selectAll, isMarkActive, sharesParent, isInsideIsolating, isVoidBlock, deleteNodeSelection, navigateArrowIntoVoid, } from './commands/Commands.js';
36
+ export { forEachBlockInRange, toggleMark, toggleBold, toggleItalic, toggleUnderline, insertTextCommand, insertHardBreakCommand, deleteSelectionCommand, deleteBackward, deleteForward, splitBlockCommand, mergeBlockBackward, selectAll, isMarkActive, sharesParent, isInsideIsolating, isIsolatingBlock, isVoidBlock, deleteNodeSelection, deleteBackwardAtGap, deleteForwardAtGap, navigateArrowIntoVoid, findWordBoundaryForward, findWordBoundaryBackward, canCrossBlockBoundary, } from './commands/Commands.js';
37
+ export { moveCharacterForward, moveCharacterBackward, moveToBlockStart, moveToBlockEnd, moveToDocumentStart, moveToDocumentEnd, extendCharacterForward, extendCharacterBackward, extendToBlockStart, extendToBlockEnd, extendToDocumentStart, extendToDocumentEnd, } from './commands/MovementCommands.js';
38
+ export { viewMove, viewExtend, moveWordForward, moveWordBackward, moveToLineStart, moveToLineEnd, moveLineUp, moveLineDown, extendWordForward, extendWordBackward, extendToLineStart, extendToLineEnd, extendLineUp, extendLineDown, } from './view/ViewMovementCommands.js';
36
39
  export type { InputRule } from './input/InputRule.js';
37
- export type { Keymap, KeymapHandler } from './input/Keymap.js';
40
+ export type { Keymap, KeymapHandler, KeymapPriority, KeymapOptions } from './input/Keymap.js';
38
41
  export { normalizeKeyDescriptor } from './input/KeyboardHandler.js';
39
42
  export { ClipboardHandler } from './input/ClipboardHandler.js';
43
+ export { CompositionTracker } from './input/CompositionTracker.js';
44
+ export { KeymapRegistry } from './input/KeymapRegistry.js';
45
+ export { InputRuleRegistry } from './input/InputRuleRegistry.js';
46
+ export type { FileHandler, FileHandlerEntry } from './input/FileHandlerRegistry.js';
47
+ export { FileHandlerRegistry } from './input/FileHandlerRegistry.js';
48
+ export { NodeViewRegistry } from './view/NodeViewRegistry.js';
49
+ export { ToolbarRegistry } from './plugins/toolbar/ToolbarRegistry.js';
50
+ export { BlockTypePickerRegistry } from './plugins/heading/BlockTypePickerRegistry.js';
40
51
  export type { NodeView, NodeViewFactory } from './view/NodeView.js';
52
+ export { CursorWrapper } from './view/CursorWrapper.js';
53
+ export { isMac, isFirefox, isWebKit, getTextDirection } from './view/Platform.js';
54
+ export { endOfTextblock, navigateAcrossBlocks, navigateVerticalWithGoalColumn, navigateFromGapCursor, skipInlineNode, getCaretRectFromSelection, } from './view/CaretNavigation.js';
55
+ export type { CaretDirection } from './view/CaretNavigation.js';
41
56
  export type { Plugin, PluginContext, CommandHandler, CommandEntry, CommandOptions, PluginEventCallback, PluginEventBus, PluginConfig, TransactionMiddleware, MiddlewareNext, MiddlewareOptions, } from './plugins/Plugin.js';
42
57
  export { EventKey, ServiceKey } from './plugins/Plugin.js';
43
58
  export { EventBus } from './plugins/EventBus.js';
@@ -73,6 +88,8 @@ export { TableSelectionServiceKey, type TableSelectionService, type CellRange, }
73
88
  export { findTableContext, isInsideTable, type TableContext, } from './plugins/table/TableHelpers.js';
74
89
  export { ImagePlugin } from './plugins/image/ImagePlugin.js';
75
90
  export { HardBreakPlugin } from './plugins/hard-break/HardBreakPlugin.js';
91
+ export { GapCursorPlugin } from './plugins/gap-cursor/GapCursorPlugin.js';
92
+ export { CaretNavigationPlugin } from './plugins/caret-navigation/CaretNavigationPlugin.js';
76
93
  export { CodeBlockPlugin, CODE_BLOCK_SERVICE_KEY, type CodeBlockConfig, type CodeBlockKeymap, type CodeBlockService, type SyntaxHighlighter, type SyntaxToken, } from './plugins/code-block/CodeBlockPlugin.js';
77
94
  export { DEFAULT_IMAGE_KEYMAP, IMAGE_UPLOAD_SERVICE, type ImageAttrs, type ImageKeymap, type ImagePluginConfig, type ImageUploadResult, type ImageUploadService, } from './plugins/image/ImageUpload.js';
78
95
  export { PrintPlugin } from './plugins/print/PrintPlugin.js';
@@ -123,6 +140,10 @@ export { PRINT_LOCALE_EN, PRINT_LOCALES } from './plugins/print/PrintLocale.js';
123
140
  export type { ToolbarLocale } from './plugins/toolbar/ToolbarLocale.js';
124
141
  export { TOOLBAR_LOCALE_EN, TOOLBAR_LOCALES } from './plugins/toolbar/ToolbarLocale.js';
125
142
  export { TABLE_LOCALES } from './plugins/table/TableLocale.js';
143
+ export { getBlockTypeLabel } from './editor/Announcer.js';
126
144
  export type { NotectlEditorConfig, ToolbarConfig, StateChangeEvent, } from './editor/NotectlEditor.js';
127
145
  export { NotectlEditor, createEditor } from './editor/NotectlEditor.js';
146
+ export type { PresetConfig, MinimalPresetOptions, FullPresetOptions, } from './presets/PresetTypes.js';
147
+ export { createMinimalPreset } from './presets/MinimalPreset.js';
148
+ export { createFullPreset } from './presets/FullPreset.js';
128
149
  //# sourceMappingURL=index.d.ts.map