@notectl/core 1.0.9 → 1.6.1

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 (227) 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-o6hDR07y.mjs → index-83QoUENW.mjs} +25 -20
  32. package/dist/chunks/index-83QoUENW.mjs.map +1 -0
  33. package/dist/chunks/{index-DfO_fKw6.mjs → index-B0UFAfyb.mjs} +15 -15
  34. package/dist/chunks/{index-DfO_fKw6.mjs.map → index-B0UFAfyb.mjs.map} +1 -1
  35. package/dist/chunks/{index-BFsYGsBR.mjs → index-BDMP86F4.mjs} +39 -39
  36. package/dist/chunks/{index-BFsYGsBR.mjs.map → index-BDMP86F4.mjs.map} +1 -1
  37. package/dist/chunks/{index-Bsp4LC5t.mjs → index-BWXkaC2Z.mjs} +36 -36
  38. package/dist/chunks/index-BWXkaC2Z.mjs.map +1 -0
  39. package/dist/chunks/{index-DAFCISBN.mjs → index-BigJ0z6n.mjs} +3 -3
  40. package/dist/chunks/{index-DAFCISBN.mjs.map → index-BigJ0z6n.mjs.map} +1 -1
  41. package/dist/chunks/{index-uTnc9y7M.mjs → index-CPjf45-o.mjs} +28 -28
  42. package/dist/chunks/index-CPjf45-o.mjs.map +1 -0
  43. package/dist/chunks/{index-DGrRWMlW.mjs → index-CPyHuEzh.mjs} +105 -105
  44. package/dist/chunks/index-CPyHuEzh.mjs.map +1 -0
  45. package/dist/chunks/{index-BL56fbXt.mjs → index-D4GKlc-A.mjs} +89 -87
  46. package/dist/chunks/index-D4GKlc-A.mjs.map +1 -0
  47. package/dist/chunks/{index-BRYzYOYC.mjs → index-D67mP19g.mjs} +29 -29
  48. package/dist/chunks/index-D67mP19g.mjs.map +1 -0
  49. package/dist/chunks/{index-BIL37LSL.mjs → index-D8tbbW97.mjs} +18 -18
  50. package/dist/chunks/{index-BIL37LSL.mjs.map → index-D8tbbW97.mjs.map} +1 -1
  51. package/dist/chunks/{index-DC1EK22F.mjs → index-DIAXWwgJ.mjs} +24 -19
  52. package/dist/chunks/index-DIAXWwgJ.mjs.map +1 -0
  53. package/dist/chunks/{index-BSFLNveF.mjs → index-DQryjfJs.mjs} +352 -341
  54. package/dist/chunks/index-DQryjfJs.mjs.map +1 -0
  55. package/dist/chunks/{index-BTJfyJlJ.mjs → index-DRZwd-1W.mjs} +104 -104
  56. package/dist/chunks/index-DRZwd-1W.mjs.map +1 -0
  57. package/dist/chunks/{index-BQ8iIYLn.mjs → index-DUC1X43Z.mjs} +54 -54
  58. package/dist/chunks/index-DUC1X43Z.mjs.map +1 -0
  59. package/dist/chunks/{index-BCvuDpVr.mjs → index-DipAT_Q9.mjs} +31 -31
  60. package/dist/chunks/index-DipAT_Q9.mjs.map +1 -0
  61. package/dist/chunks/{index-DA8TG2S8.mjs → index-tBDVaSjG.mjs} +56 -56
  62. package/dist/chunks/index-tBDVaSjG.mjs.map +1 -0
  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 +25 -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 +2755 -2496
  114. package/dist/notectl-core.mjs.map +1 -1
  115. package/dist/notectl-core.umd.js +2672 -1680
  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 +1 -1
  122. package/dist/plugins/blockquote.mjs +1 -1
  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 +1 -1
  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 +1 -1
  135. package/dist/plugins/font.mjs +1 -1
  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 +1 -1
  148. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  149. package/dist/plugins/highlight.mjs +1 -1
  150. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
  151. package/dist/plugins/horizontal-rule.mjs +1 -1
  152. package/dist/plugins/image/ImageCommands.d.ts.map +1 -1
  153. package/dist/plugins/image.mjs +1 -1
  154. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  155. package/dist/plugins/link.mjs +1 -1
  156. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  157. package/dist/plugins/list.mjs +1 -1
  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 +1 -1
  165. package/dist/plugins/super-sub.mjs +1 -1
  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 +1 -1
  170. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  171. package/dist/plugins/text-color.mjs +1 -1
  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/state/EditorState.d.ts.map +1 -1
  178. package/dist/state/History.d.ts.map +1 -1
  179. package/dist/state/SelectionTransactions.d.ts +10 -0
  180. package/dist/state/SelectionTransactions.d.ts.map +1 -0
  181. package/dist/test/TestUtils.d.ts +23 -0
  182. package/dist/test/TestUtils.d.ts.map +1 -1
  183. package/dist/view/CaretNavigation.d.ts +48 -0
  184. package/dist/view/CaretNavigation.d.ts.map +1 -0
  185. package/dist/view/CursorWrapper.d.ts +19 -0
  186. package/dist/view/CursorWrapper.d.ts.map +1 -0
  187. package/dist/view/DomPointUtils.d.ts +20 -0
  188. package/dist/view/DomPointUtils.d.ts.map +1 -0
  189. package/dist/view/EditorView.d.ts +43 -0
  190. package/dist/view/EditorView.d.ts.map +1 -1
  191. package/dist/view/MarkRendering.d.ts +7 -0
  192. package/dist/view/MarkRendering.d.ts.map +1 -0
  193. package/dist/view/NodeViewRegistry.d.ts +9 -0
  194. package/dist/view/NodeViewRegistry.d.ts.map +1 -0
  195. package/dist/view/Platform.d.ts +29 -0
  196. package/dist/view/Platform.d.ts.map +1 -0
  197. package/dist/view/Reconciler.d.ts +4 -0
  198. package/dist/view/Reconciler.d.ts.map +1 -1
  199. package/dist/view/SelectionSync.d.ts +2 -0
  200. package/dist/view/SelectionSync.d.ts.map +1 -1
  201. package/dist/view/ViewMovementCommands.d.ts +40 -0
  202. package/dist/view/ViewMovementCommands.d.ts.map +1 -0
  203. package/package.json +10 -2
  204. package/dist/chunks/ColorNames-iaWsSZx1.mjs +0 -35
  205. package/dist/chunks/ColorNames-iaWsSZx1.mjs.map +0 -1
  206. package/dist/chunks/ColorValidation-Dyy4Bye8.mjs +0 -140
  207. package/dist/chunks/ColorValidation-Dyy4Bye8.mjs.map +0 -1
  208. package/dist/chunks/Commands-CSpSwGXv.mjs +0 -461
  209. package/dist/chunks/Commands-CSpSwGXv.mjs.map +0 -1
  210. package/dist/chunks/HTMLUtils-0wvCRvJc.mjs +0 -7
  211. package/dist/chunks/HTMLUtils-0wvCRvJc.mjs.map +0 -1
  212. package/dist/chunks/Selection-D5ZjXoB7.mjs +0 -44
  213. package/dist/chunks/Selection-D5ZjXoB7.mjs.map +0 -1
  214. package/dist/chunks/ToolbarItem-ugDymuXi.mjs +0 -7
  215. package/dist/chunks/ToolbarItem-ugDymuXi.mjs.map +0 -1
  216. package/dist/chunks/index-BCvuDpVr.mjs.map +0 -1
  217. package/dist/chunks/index-BL56fbXt.mjs.map +0 -1
  218. package/dist/chunks/index-BQ8iIYLn.mjs.map +0 -1
  219. package/dist/chunks/index-BRYzYOYC.mjs.map +0 -1
  220. package/dist/chunks/index-BSFLNveF.mjs.map +0 -1
  221. package/dist/chunks/index-BTJfyJlJ.mjs.map +0 -1
  222. package/dist/chunks/index-Bsp4LC5t.mjs.map +0 -1
  223. package/dist/chunks/index-DA8TG2S8.mjs.map +0 -1
  224. package/dist/chunks/index-DC1EK22F.mjs.map +0 -1
  225. package/dist/chunks/index-DGrRWMlW.mjs.map +0 -1
  226. package/dist/chunks/index-o6hDR07y.mjs.map +0 -1
  227. package/dist/chunks/index-uTnc9y7M.mjs.map +0 -1
@@ -1,11 +1,11 @@
1
1
  import { r as t } from "./resolvePluginLocale-B4w1OkPy.mjs";
2
- import { a as e } from "./AttrRegistry-D-przlzb.mjs";
3
- import { p as n, b as i } from "./Document-CI3iCwEP.mjs";
2
+ import { a as e } from "./AttrRegistry-I-VdmRnN.mjs";
3
+ import { p as n, e as i } from "./Document-CuwE73FF.mjs";
4
4
  import { c as s } from "./NodeSpec-NZVvcCuH.mjs";
5
- import { i as r, a as l, c } from "./Selection-D5ZjXoB7.mjs";
6
- import { n as o, b as a } from "./TypeBrands-C09nE2qO.mjs";
7
- const d = { bulletList: "Bullet List", numberedList: "Numbered List", checklist: "Checklist" }, h = { en: d, de: { bulletList: "Aufzählung", numberedList: "Nummerierte Liste", checklist: "Checkliste" }, es: { bulletList: "Lista con viñetas", numberedList: "Lista numerada", checklist: "Lista de verificación" }, fr: { bulletList: "Liste à puces", numberedList: "Liste numérotée", checklist: "Liste de contrôle" }, zh: { bulletList: "无序列表", numberedList: "有序列表", checklist: "清单" }, ru: { bulletList: "Маркированный список", numberedList: "Нумерованный список", checklist: "Чек-лист" }, ar: { bulletList: "قائمة نقطية", numberedList: "قائمة مرقمة", checklist: "قائمة تحقق" }, hi: { bulletList: "बुलेट सूची", numberedList: "क्रमांकित सूची", checklist: "चेकलिस्ट" } }, u = { types: ["bullet", "ordered", "checklist"], maxIndent: 4 }, p = [{ type: "bullet", label: "Bullet List", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z"/></svg>', inputPattern: /^[-*] $/, inputPrefix: "- " }, { type: "ordered", label: "Numbered List", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z"/></svg>', inputPattern: /^\d+\. $/, inputPrefix: "1. " }, { type: "checklist", label: "Checklist", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22 7h-9v2h9V7zm0 8h-9v2h9v-2zM5.54 11L2 7.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 11zm0 8L2 15.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 19z"/></svg>', inputPattern: /^\[[ x]] $/, inputPrefix: "[ ] " }];
8
- class m {
5
+ import { i as l, a as c, b as r, c as o } from "./Selection-DmFDwiPJ.mjs";
6
+ import { n as a, b as d } from "./TypeBrands-C09nE2qO.mjs";
7
+ const h = { bulletList: "Bullet List", numberedList: "Numbered List", checklist: "Checklist" }, u = { en: h, de: { bulletList: "Aufzählung", numberedList: "Nummerierte Liste", checklist: "Checkliste" }, es: { bulletList: "Lista con viñetas", numberedList: "Lista numerada", checklist: "Lista de verificación" }, fr: { bulletList: "Liste à puces", numberedList: "Liste numérotée", checklist: "Liste de contrôle" }, zh: { bulletList: "无序列表", numberedList: "有序列表", checklist: "清单" }, ru: { bulletList: "Маркированный список", numberedList: "Нумерованный список", checklist: "Чек-лист" }, ar: { bulletList: "قائمة نقطية", numberedList: "قائمة مرقمة", checklist: "قائمة تحقق" }, hi: { bulletList: "बुलेट सूची", numberedList: "क्रमांकित सूची", checklist: "चेकलिस्ट" } }, p = { types: ["bullet", "ordered", "checklist"], maxIndent: 4 }, m = [{ type: "bullet", label: "Bullet List", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z"/></svg>', inputPattern: /^[-*] $/, inputPrefix: "- " }, { type: "ordered", label: "Numbered List", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z"/></svg>', inputPattern: /^\d+\. $/, inputPrefix: "1. " }, { type: "checklist", label: "Checklist", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22 7h-9v2h9V7zm0 8h-9v2h9v-2zM5.54 11L2 7.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 11zm0 8L2 15.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 19z"/></svg>', inputPattern: /^\[[ x]] $/, inputPrefix: "[ ] " }];
8
+ class g {
9
9
  id = "list";
10
10
  name = "List";
11
11
  priority = 35;
@@ -14,10 +14,10 @@ class m {
14
14
  context = null;
15
15
  checkboxClickHandler = null;
16
16
  constructor(t2) {
17
- this.config = { ...u, ...t2 };
17
+ this.config = { ...p, ...t2 };
18
18
  }
19
19
  init(e2) {
20
- this.context = e2, this.locale = t(h, e2, this.config.locale), e2.registerStyleSheet(`
20
+ this.context = e2, this.locale = t(u, e2, this.config.locale), e2.registerStyleSheet(`
21
21
  /* List Wrappers — suppress native markers, we use ::before pseudo-elements */
22
22
  .notectl-list {
23
23
  list-style: none;
@@ -87,8 +87,8 @@ class m {
87
87
  }
88
88
  registerNodeSpec(t2) {
89
89
  t2.registerNodeSpec({ type: "list_item", group: "block", content: { allow: ["text"] }, attrs: { listType: { default: "bullet" }, indent: { default: 0 }, checked: { default: false } }, toDOM(t3) {
90
- const e2 = t3.attrs?.listType ?? "bullet", n2 = t3.attrs?.indent ?? 0, i2 = t3.attrs?.checked ?? false, r2 = s("li", t3.id);
91
- return r2.setAttribute("role", "listitem"), r2.setAttribute("data-list-type", e2), r2.setAttribute("data-indent", String(n2)), r2.className = `notectl-list-item notectl-list-item--${e2}`, n2 > 0 && (r2.style.marginLeft = 24 * n2 + "px"), "checklist" === e2 && (r2.setAttribute("data-checked", String(i2)), r2.setAttribute("aria-checked", String(i2))), r2.setAttribute("aria-level", String(n2 + 1)), r2;
90
+ const e2 = t3.attrs?.listType ?? "bullet", n2 = t3.attrs?.indent ?? 0, i2 = t3.attrs?.checked ?? false, l2 = s("li", t3.id);
91
+ return l2.setAttribute("role", "listitem"), l2.setAttribute("data-list-type", e2), l2.setAttribute("data-indent", String(n2)), l2.className = `notectl-list-item notectl-list-item--${e2}`, n2 > 0 && (l2.style.marginLeft = 24 * n2 + "px"), "checklist" === e2 && (l2.setAttribute("data-checked", String(i2)), l2.setAttribute("aria-checked", String(i2))), l2.setAttribute("aria-level", String(n2 + 1)), l2;
92
92
  }, wrapper(t3) {
93
93
  const e2 = t3.attrs?.listType ?? "bullet";
94
94
  return { tag: "ordered" === e2 ? "ol" : "ul", key: `list-${e2}`, className: `notectl-list notectl-list--${e2}`, attrs: { role: "list" } };
@@ -105,13 +105,13 @@ class m {
105
105
  registerInputRules(t2) {
106
106
  const e2 = this.getEnabledTypes();
107
107
  for (const n2 of e2) t2.registerInputRule({ pattern: n2.inputPattern, handler: (t3, e3, i2, s2) => {
108
- const a2 = t3.selection;
109
- if (r(a2)) return null;
110
- if (!l(a2)) return null;
111
- const d2 = t3.getBlock(a2.anchor.blockId);
112
- if (!d2 || "paragraph" !== d2.type) return null;
113
- const h2 = e3[0] ?? "", u2 = h2.length, p2 = { listType: n2.type, indent: 0 };
114
- return "checklist" === n2.type && (p2.checked = h2.includes("[x]")), t3.transaction("input").deleteTextAt(a2.anchor.blockId, i2, i2 + u2).setBlockType(a2.anchor.blockId, o("list_item"), p2).setSelection(c(a2.anchor.blockId, 0)).build();
108
+ const d2 = t3.selection;
109
+ if (l(d2) || c(d2)) return null;
110
+ if (!r(d2)) return null;
111
+ const h2 = t3.getBlock(d2.anchor.blockId);
112
+ if (!h2 || "paragraph" !== h2.type) return null;
113
+ const u2 = e3[0] ?? "", p2 = u2.length, m2 = { listType: n2.type, indent: 0 };
114
+ return "checklist" === n2.type && (m2.checked = u2.includes("[x]")), t3.transaction("input").deleteTextAt(d2.anchor.blockId, i2, i2 + p2).setBlockType(d2.anchor.blockId, a("list_item"), m2).setSelection(o(d2.anchor.blockId, 0)).build();
115
115
  } });
116
116
  }
117
117
  getListLabel(t2) {
@@ -123,71 +123,71 @@ class m {
123
123
  }
124
124
  toggleList(t2, n2) {
125
125
  const i2 = t2.getState(), s2 = i2.selection;
126
- if (r(s2)) return false;
127
- const l2 = i2.getBlock(s2.anchor.blockId);
128
- if (!l2) return false;
129
- if ("list_item" === l2.type && l2.attrs?.listType === n2) {
130
- const e2 = i2.transaction("command").setBlockType(s2.anchor.blockId, o("paragraph")).setSelection(s2).build();
126
+ if (l(s2) || c(s2)) return false;
127
+ const r2 = i2.getBlock(s2.anchor.blockId);
128
+ if (!r2) return false;
129
+ if ("list_item" === r2.type && r2.attrs?.listType === n2) {
130
+ const e2 = i2.transaction("command").setBlockType(s2.anchor.blockId, a("paragraph")).setSelection(s2).build();
131
131
  return t2.dispatch(e2), true;
132
132
  }
133
- const c2 = { listType: n2, indent: e(l2, "list_item") ? l2.attrs.indent : 0 };
134
- "checklist" === n2 && (c2.checked = false);
135
- const a2 = i2.transaction("command").setBlockType(s2.anchor.blockId, o("list_item"), c2).setSelection(s2).build();
136
- return t2.dispatch(a2), true;
133
+ const o2 = { listType: n2, indent: e(r2, "list_item") ? r2.attrs.indent : 0 };
134
+ "checklist" === n2 && (o2.checked = false);
135
+ const d2 = i2.transaction("command").setBlockType(s2.anchor.blockId, a("list_item"), o2).setSelection(s2).build();
136
+ return t2.dispatch(d2), true;
137
137
  }
138
138
  indent(t2) {
139
139
  const n2 = t2.getState();
140
- if (r(n2.selection)) return false;
140
+ if (l(n2.selection) || c(n2.selection)) return false;
141
141
  const i2 = n2.getBlock(n2.selection.anchor.blockId);
142
142
  return !(!i2 || !e(i2, "list_item")) && !(i2.attrs.indent >= this.config.maxIndent) && this.setIndent(t2, n2, i2.attrs.indent + 1);
143
143
  }
144
144
  outdent(t2) {
145
145
  const n2 = t2.getState();
146
- if (r(n2.selection)) return false;
146
+ if (l(n2.selection) || c(n2.selection)) return false;
147
147
  const i2 = n2.getBlock(n2.selection.anchor.blockId);
148
148
  return !(!i2 || !e(i2, "list_item")) && !(i2.attrs.indent <= 0) && this.setIndent(t2, n2, i2.attrs.indent - 1);
149
149
  }
150
150
  setIndent(t2, e2, n2) {
151
151
  const i2 = e2.selection;
152
- if (r(i2)) return false;
152
+ if (l(i2) || c(i2)) return false;
153
153
  const s2 = e2.getBlock(i2.anchor.blockId);
154
154
  if (!s2) return false;
155
- const l2 = { ...s2.attrs, indent: n2 }, c2 = e2.transaction("command").setBlockType(i2.anchor.blockId, o("list_item"), l2).setSelection(i2).build();
156
- return t2.dispatch(c2), true;
155
+ const r2 = { ...s2.attrs, indent: n2 }, o2 = e2.transaction("command").setBlockType(i2.anchor.blockId, a("list_item"), r2).setSelection(i2).build();
156
+ return t2.dispatch(o2), true;
157
157
  }
158
158
  toggleChecked(t2, e2) {
159
159
  if (t2.isReadOnly() && !this.config.interactiveCheckboxes) return false;
160
- const n2 = t2.getState(), i2 = e2 ?? (r(n2.selection) ? null : n2.selection.anchor.blockId);
160
+ const n2 = t2.getState(), i2 = e2 ?? (l(n2.selection) || c(n2.selection) ? null : n2.selection.anchor.blockId);
161
161
  if (!i2) return false;
162
162
  const s2 = n2.getBlock(i2);
163
163
  if (!s2 || "list_item" !== s2.type || "checklist" !== s2.attrs?.listType) return false;
164
- const l2 = !s2.attrs?.checked, c2 = { ...s2.attrs, checked: l2 }, a2 = n2.transaction("command").setBlockType(i2, o("list_item"), c2).setSelection(n2.selection).build();
165
- return t2.dispatch(a2), true;
164
+ const r2 = !s2.attrs?.checked, o2 = { ...s2.attrs, checked: r2 }, d2 = n2.transaction("command").setBlockType(i2, a("list_item"), o2).setSelection(n2.selection).build();
165
+ return t2.dispatch(d2), true;
166
166
  }
167
167
  handleBackspace(t2) {
168
168
  const e2 = t2.getState(), n2 = e2.selection;
169
- if (r(n2)) return false;
170
- if (!l(n2)) return false;
169
+ if (l(n2) || c(n2)) return false;
170
+ if (!r(n2)) return false;
171
171
  const i2 = e2.getBlock(n2.anchor.blockId);
172
172
  if (!i2 || "list_item" !== i2.type) return false;
173
173
  if (0 !== n2.anchor.offset) return false;
174
- const s2 = e2.transaction("input").setBlockType(n2.anchor.blockId, o("paragraph")).setSelection(n2).build();
174
+ const s2 = e2.transaction("input").setBlockType(n2.anchor.blockId, a("paragraph")).setSelection(n2).build();
175
175
  return t2.dispatch(s2), true;
176
176
  }
177
177
  handleEnter(t2) {
178
- const s2 = t2.getState(), a2 = s2.selection;
179
- if (r(a2)) return false;
180
- if (!l(a2)) return false;
181
- const d2 = s2.getBlock(a2.anchor.blockId);
182
- if (!d2 || "list_item" !== d2.type) return false;
183
- if ("" === n(d2)) {
184
- const e2 = s2.transaction("input").setBlockType(a2.anchor.blockId, o("paragraph")).setSelection(a2).build();
178
+ const s2 = t2.getState(), d2 = s2.selection;
179
+ if (l(d2) || c(d2)) return false;
180
+ if (!r(d2)) return false;
181
+ const h2 = s2.getBlock(d2.anchor.blockId);
182
+ if (!h2 || "list_item" !== h2.type) return false;
183
+ if ("" === n(h2)) {
184
+ const e2 = s2.transaction("input").setBlockType(d2.anchor.blockId, a("paragraph")).setSelection(d2).build();
185
185
  return t2.dispatch(e2), true;
186
186
  }
187
- const h2 = i(), u2 = { listType: e(d2, "list_item") ? d2.attrs.listType : "bullet", indent: e(d2, "list_item") ? d2.attrs.indent : 0 };
188
- "checklist" === u2.listType && (u2.checked = false);
189
- const p2 = s2.transaction("input").splitBlock(a2.anchor.blockId, a2.anchor.offset, h2).setBlockType(h2, o("list_item"), u2).setSelection(c(h2, 0)).build();
190
- return t2.dispatch(p2), true;
187
+ const u2 = i(), p2 = { listType: e(h2, "list_item") ? h2.attrs.listType : "bullet", indent: e(h2, "list_item") ? h2.attrs.indent : 0 };
188
+ "checklist" === p2.listType && (p2.checked = false);
189
+ const m2 = s2.transaction("input").splitBlock(d2.anchor.blockId, d2.anchor.offset, u2).setBlockType(u2, a("list_item"), p2).setSelection(o(u2, 0)).build();
190
+ return t2.dispatch(m2), true;
191
191
  }
192
192
  registerCheckboxClickHandler(t2) {
193
193
  this.config.types.includes("checklist") && (this.checkboxClickHandler = (e2) => {
@@ -199,22 +199,22 @@ class m {
199
199
  const s2 = i2.getBoundingClientRect();
200
200
  if (e2.clientX - s2.left >= 24) return;
201
201
  e2.preventDefault();
202
- const r2 = i2.getAttribute("data-block-id");
203
- r2 && this.toggleChecked(t2, a(r2));
202
+ const l2 = i2.getAttribute("data-block-id");
203
+ l2 && this.toggleChecked(t2, d(l2));
204
204
  }, t2.getContainer().addEventListener("mousedown", this.checkboxClickHandler));
205
205
  }
206
206
  isListActive(t2, e2) {
207
- if (r(t2.selection)) return false;
207
+ if (l(t2.selection) || c(t2.selection)) return false;
208
208
  const n2 = t2.getBlock(t2.selection.anchor.blockId);
209
209
  return "list_item" === n2?.type && n2.attrs?.listType === e2;
210
210
  }
211
211
  getEnabledTypes() {
212
- return p.filter((t2) => this.config.types.includes(t2.type));
212
+ return m.filter((t2) => this.config.types.includes(t2.type));
213
213
  }
214
214
  }
215
215
  export {
216
- h as L,
217
- d as a,
218
- m as b
216
+ u as L,
217
+ h as a,
218
+ g as b
219
219
  };
220
- //# sourceMappingURL=index-DA8TG2S8.mjs.map
220
+ //# sourceMappingURL=index-tBDVaSjG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-tBDVaSjG.mjs","sources":["../../src/editor/styles/list.ts","../../src/plugins/list/ListLocale.ts","../../src/plugins/list/ListPlugin.ts"],"sourcesContent":["/** Width of the list marker / checkbox area in pixels. */\nexport const LIST_MARKER_WIDTH = 24;\n\n/** List styles — bullet, ordered, checklist items. */\nexport const LIST_CSS = `\n/* List Wrappers — suppress native markers, we use ::before pseudo-elements */\n.notectl-list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n/* Ordered List — each <ol> wrapper resets the counter */\n.notectl-list--ordered {\n\tcounter-reset: notectl-ordered;\n}\n\n/* List Items */\n.notectl-list-item {\n\tmargin: 0;\n\tpadding: 2px 0 2px ${LIST_MARKER_WIDTH}px;\n\tmin-height: 1.6em;\n\tposition: relative;\n}\n\n.notectl-list-item::before {\n\tposition: absolute;\n\tleft: 0;\n\tdisplay: inline-block;\n\twidth: ${LIST_MARKER_WIDTH}px;\n\ttext-align: center;\n}\n\n/* Bullet List */\n.notectl-list-item--bullet::before {\n\tcontent: '\\\\2022';\n\tcolor: var(--notectl-fg);\n}\n\n/* Ordered List — counter increment per item */\n.notectl-list-item--ordered {\n\tcounter-increment: notectl-ordered;\n}\n\n.notectl-list-item--ordered::before {\n\tcontent: counter(notectl-ordered) '.';\n\tcolor: var(--notectl-fg);\n\tfont-size: 14px;\n}\n\n/* Checklist */\n.notectl-list-item--checklist::before {\n\tcontent: '\\\\2610';\n\tfont-size: 16px;\n\tcolor: var(--notectl-fg-muted);\n\tcursor: pointer;\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"]::before {\n\tcontent: '\\\\2611';\n\tcolor: var(--notectl-success);\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"] {\n\tcolor: var(--notectl-fg-muted);\n\ttext-decoration: line-through;\n}\n`;\n","/**\n * Locale interface and default English locale for the ListPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface ListLocale {\n\treadonly bulletList: string;\n\treadonly numberedList: string;\n\treadonly checklist: string;\n}\n\n// --- Default English Locale ---\n\nexport const LIST_LOCALE_EN: ListLocale = {\n\tbulletList: 'Bullet List',\n\tnumberedList: 'Numbered List',\n\tchecklist: 'Checklist',\n};\n\n// --- German Locale ---\n\nexport const LIST_LOCALE_DE: ListLocale = {\n\tbulletList: 'Aufzählung',\n\tnumberedList: 'Nummerierte Liste',\n\tchecklist: 'Checkliste',\n};\n\n// --- Spanish Locale ---\n\nexport const LIST_LOCALE_ES: ListLocale = {\n\tbulletList: 'Lista con viñetas',\n\tnumberedList: 'Lista numerada',\n\tchecklist: 'Lista de verificación',\n};\n\n// --- French Locale ---\n\nexport const LIST_LOCALE_FR: ListLocale = {\n\tbulletList: 'Liste à puces',\n\tnumberedList: 'Liste numérotée',\n\tchecklist: 'Liste de contrôle',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const LIST_LOCALE_ZH: ListLocale = {\n\tbulletList: '无序列表',\n\tnumberedList: '有序列表',\n\tchecklist: '清单',\n};\n\n// --- Russian Locale ---\n\nexport const LIST_LOCALE_RU: ListLocale = {\n\tbulletList: 'Маркированный список',\n\tnumberedList: 'Нумерованный список',\n\tchecklist: 'Чек-лист',\n};\n\n// --- Arabic Locale ---\n\nexport const LIST_LOCALE_AR: ListLocale = {\n\tbulletList: 'قائمة نقطية',\n\tnumberedList: 'قائمة مرقمة',\n\tchecklist: 'قائمة تحقق',\n};\n\n// --- Hindi Locale ---\n\nexport const LIST_LOCALE_HI: ListLocale = {\n\tbulletList: 'बुलेट सूची',\n\tnumberedList: 'क्रमांकित सूची',\n\tchecklist: 'चेकलिस्ट',\n};\n\n// --- Locale Map ---\n\nexport const LIST_LOCALES: Record<string, ListLocale> = {\n\ten: LIST_LOCALE_EN,\n\tde: LIST_LOCALE_DE,\n\tes: LIST_LOCALE_ES,\n\tfr: LIST_LOCALE_FR,\n\tzh: LIST_LOCALE_ZH,\n\tru: LIST_LOCALE_RU,\n\tar: LIST_LOCALE_AR,\n\thi: LIST_LOCALE_HI,\n};\n","/**\n * ListPlugin: registers ordered, unordered, and checklist block types\n * with NodeSpecs, toggle commands, indent/outdent (Tab/Shift-Tab),\n * input rules, and toolbar buttons.\n *\n * List items are modeled as flat blocks with a `listType` and `indent` attribute,\n * allowing simple nesting representation without deep tree structures.\n */\n\nimport { LIST_CSS, LIST_MARKER_WIDTH } from '../../editor/styles/list.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport { isNodeOfType } from '../../model/AttrRegistry.js';\nimport { generateBlockId, getBlockText } from '../../model/Document.js';\nimport { createBlockElement } from '../../model/NodeSpec.js';\nimport {\n\tcreateCollapsedSelection,\n\tisCollapsed,\n\tisGapCursor,\n\tisNodeSelection,\n} from '../../model/Selection.js';\nimport { type BlockId, blockId, nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { LIST_LOCALES, type ListLocale } from './ListLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\nexport type ListType = 'bullet' | 'ordered' | 'checklist';\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\tlist_item: { listType: ListType; indent: number; checked: boolean };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface ListConfig {\n\t/** Which list types to enable. Defaults to all. */\n\treadonly types: readonly ListType[];\n\t/** Maximum indent depth. Defaults to 4. */\n\treadonly maxIndent: number;\n\t/** When true, a separator is rendered after the last list toolbar item. */\n\treadonly separatorAfter?: boolean;\n\t/**\n\t * When true, checklist checkboxes remain interactive even in read-only mode.\n\t * Defaults to false (checkboxes are fully read-only).\n\t */\n\treadonly interactiveCheckboxes?: boolean;\n\treadonly locale?: ListLocale;\n}\n\nconst DEFAULT_CONFIG: ListConfig = {\n\ttypes: ['bullet', 'ordered', 'checklist'],\n\tmaxIndent: 4,\n};\n\n// --- List Type Metadata ---\n\ninterface ListTypeDefinition {\n\treadonly type: ListType;\n\treadonly label: string;\n\treadonly icon: string;\n\treadonly inputPattern: RegExp;\n\treadonly inputPrefix: string;\n}\n\nconst BULLET_LIST_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\"/></svg>';\nconst NUMBERED_LIST_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"/></svg>';\nconst CHECKLIST_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M22 7h-9v2h9V7zm0 8h-9v2h9v-2zM5.54 11L2 7.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 11zm0 8L2 15.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 19z\"/></svg>';\n\nconst LIST_TYPE_DEFINITIONS: readonly ListTypeDefinition[] = [\n\t{\n\t\ttype: 'bullet',\n\t\tlabel: 'Bullet List',\n\t\ticon: BULLET_LIST_ICON,\n\t\tinputPattern: /^[-*] $/,\n\t\tinputPrefix: '- ',\n\t},\n\t{\n\t\ttype: 'ordered',\n\t\tlabel: 'Numbered List',\n\t\ticon: NUMBERED_LIST_ICON,\n\t\tinputPattern: /^\\d+\\. $/,\n\t\tinputPrefix: '1. ',\n\t},\n\t{\n\t\ttype: 'checklist',\n\t\tlabel: 'Checklist',\n\t\ticon: CHECKLIST_ICON,\n\t\tinputPattern: /^\\[[ x]] $/,\n\t\tinputPrefix: '[ ] ',\n\t},\n];\n\n// --- Plugin ---\n\nexport class ListPlugin implements Plugin {\n\treadonly id = 'list';\n\treadonly name = 'List';\n\treadonly priority = 35;\n\n\tprivate readonly config: ListConfig;\n\tprivate locale!: ListLocale;\n\tprivate context: PluginContext | null = null;\n\tprivate checkboxClickHandler: ((e: MouseEvent) => void) | null = null;\n\n\tconstructor(config?: Partial<ListConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.context = context;\n\t\tthis.locale = resolvePluginLocale(LIST_LOCALES, context, this.config.locale);\n\t\tcontext.registerStyleSheet(LIST_CSS);\n\t\tthis.registerNodeSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymaps(context);\n\t\tthis.registerInputRules(context);\n\t\tthis.registerToolbarItems(context);\n\t\tthis.registerCheckboxClickHandler(context);\n\t}\n\n\tdestroy(): void {\n\t\tif (this.checkboxClickHandler && this.context) {\n\t\t\tconst container: HTMLElement = this.context.getContainer();\n\t\t\tcontainer.removeEventListener('mousedown', this.checkboxClickHandler);\n\t\t}\n\t\tthis.checkboxClickHandler = null;\n\t\tthis.context = null;\n\t}\n\n\tprivate registerNodeSpec(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'list_item',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\tattrs: {\n\t\t\t\tlistType: { default: 'bullet' },\n\t\t\t\tindent: { default: 0 },\n\t\t\t\tchecked: { default: false },\n\t\t\t},\n\t\t\ttoDOM(node) {\n\t\t\t\tconst listType = node.attrs?.listType ?? 'bullet';\n\t\t\t\tconst indent = node.attrs?.indent ?? 0;\n\t\t\t\tconst checked = node.attrs?.checked ?? false;\n\n\t\t\t\tconst li = createBlockElement('li', node.id);\n\t\t\t\tli.setAttribute('role', 'listitem');\n\t\t\t\tli.setAttribute('data-list-type', listType);\n\t\t\t\tli.setAttribute('data-indent', String(indent));\n\t\t\t\tli.className = `notectl-list-item notectl-list-item--${listType}`;\n\n\t\t\t\tif (indent > 0) {\n\t\t\t\t\tli.style.marginLeft = `${indent * LIST_MARKER_WIDTH}px`;\n\t\t\t\t}\n\n\t\t\t\tif (listType === 'checklist') {\n\t\t\t\t\tli.setAttribute('data-checked', String(checked));\n\t\t\t\t\tli.setAttribute('aria-checked', String(checked));\n\t\t\t\t}\n\t\t\t\tli.setAttribute('aria-level', String(indent + 1));\n\n\t\t\t\treturn li;\n\t\t\t},\n\t\t\twrapper(node) {\n\t\t\t\tconst listType = node.attrs?.listType ?? 'bullet';\n\t\t\t\tconst tag = listType === 'ordered' ? 'ol' : 'ul';\n\t\t\t\treturn {\n\t\t\t\t\ttag,\n\t\t\t\t\tkey: `list-${listType}`,\n\t\t\t\t\tclassName: `notectl-list notectl-list--${listType}`,\n\t\t\t\t\tattrs: { role: 'list' },\n\t\t\t\t};\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<li>${content || '<br>'}</li>`;\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'li' }],\n\t\t\tsanitize: { tags: ['ul', 'ol', 'li'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tconst enabledTypes = this.getEnabledTypes();\n\n\t\tfor (const def of enabledTypes) {\n\t\t\tcontext.registerCommand(`toggleList:${def.type}`, () => {\n\t\t\t\treturn this.toggleList(context, def.type);\n\t\t\t});\n\t\t}\n\n\t\tcontext.registerCommand('indentListItem', () => {\n\t\t\treturn this.indent(context);\n\t\t});\n\n\t\tcontext.registerCommand('outdentListItem', () => {\n\t\t\treturn this.outdent(context);\n\t\t});\n\n\t\tif (this.config.types.includes('checklist')) {\n\t\t\tcontext.registerCommand('toggleChecklistItem', () => this.toggleChecked(context), {\n\t\t\t\treadonlyAllowed: true,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate registerKeymaps(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\tEnter: () => this.handleEnter(context),\n\t\t\tBackspace: () => this.handleBackspace(context),\n\t\t\tTab: () => this.indent(context),\n\t\t\t'Shift-Tab': () => this.outdent(context),\n\t\t});\n\t}\n\n\tprivate registerInputRules(context: PluginContext): void {\n\t\tconst enabledTypes = this.getEnabledTypes();\n\n\t\tfor (const def of enabledTypes) {\n\t\t\tcontext.registerInputRule({\n\t\t\t\tpattern: def.inputPattern,\n\t\t\t\thandler: (state, match, start, _end) => {\n\t\t\t\t\tconst sel = state.selection;\n\t\t\t\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return null;\n\t\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\t\tconst matchStr = match[0] ?? '';\n\t\t\t\t\tconst matchLen = matchStr.length;\n\t\t\t\t\tconst attrs: Record<string, string | number | boolean> = {\n\t\t\t\t\t\tlistType: def.type,\n\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t};\n\t\t\t\t\tif (def.type === 'checklist') {\n\t\t\t\t\t\tattrs.checked = matchStr.includes('[x]');\n\t\t\t\t\t}\n\n\t\t\t\t\treturn state\n\t\t\t\t\t\t.transaction('input')\n\t\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, start, start + matchLen)\n\t\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('list_item'), attrs)\n\t\t\t\t\t\t.setSelection(createCollapsedSelection(sel.anchor.blockId, 0))\n\t\t\t\t\t\t.build();\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate getListLabel(type: ListType): string {\n\t\tconst labels: Record<ListType, string> = {\n\t\t\tbullet: this.locale.bulletList,\n\t\t\tordered: this.locale.numberedList,\n\t\t\tchecklist: this.locale.checklist,\n\t\t};\n\t\treturn labels[type];\n\t}\n\n\tprivate registerToolbarItems(context: PluginContext): void {\n\t\tconst enabledTypes = this.getEnabledTypes();\n\t\tconst lastType = enabledTypes.at(-1);\n\n\t\tfor (const def of enabledTypes) {\n\t\t\tcontext.registerToolbarItem({\n\t\t\t\tid: `list-${def.type}`,\n\t\t\t\tgroup: 'block',\n\t\t\t\ticon: def.icon,\n\t\t\t\tlabel: this.getListLabel(def.type),\n\t\t\t\tcommand: `toggleList:${def.type}`,\n\t\t\t\tpriority: def.type === 'bullet' ? 70 : def.type === 'ordered' ? 71 : 72,\n\t\t\t\tseparatorAfter: this.config.separatorAfter && def === lastType,\n\t\t\t\tisActive: (state) => this.isListActive(state, def.type),\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- Command Implementations ---\n\n\tprivate toggleList(context: PluginContext, listType: ListType): boolean {\n\t\tconst state = context.getState();\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return false;\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block) return false;\n\n\t\t// If already this list type, convert back to paragraph\n\t\tif (block.type === 'list_item' && block.attrs?.listType === listType) {\n\t\t\tconst tr = state\n\t\t\t\t.transaction('command')\n\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(sel)\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Convert to list item\n\t\tconst attrs: Record<string, string | number | boolean> = {\n\t\t\tlistType,\n\t\t\tindent: isNodeOfType(block, 'list_item') ? block.attrs.indent : 0,\n\t\t};\n\t\tif (listType === 'checklist') {\n\t\t\tattrs.checked = false;\n\t\t}\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(sel.anchor.blockId, nodeType('list_item'), attrs)\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\tprivate indent(context: PluginContext): boolean {\n\t\tconst state = context.getState();\n\t\tif (isNodeSelection(state.selection) || isGapCursor(state.selection)) return false;\n\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\tif (!block || !isNodeOfType(block, 'list_item')) return false;\n\n\t\tif (block.attrs.indent >= this.config.maxIndent) return false;\n\n\t\treturn this.setIndent(context, state, block.attrs.indent + 1);\n\t}\n\n\tprivate outdent(context: PluginContext): boolean {\n\t\tconst state = context.getState();\n\t\tif (isNodeSelection(state.selection) || isGapCursor(state.selection)) return false;\n\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\tif (!block || !isNodeOfType(block, 'list_item')) return false;\n\n\t\tif (block.attrs.indent <= 0) return false;\n\n\t\treturn this.setIndent(context, state, block.attrs.indent - 1);\n\t}\n\n\tprivate setIndent(context: PluginContext, state: EditorState, indent: number): boolean {\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return false;\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block) return false;\n\n\t\tconst attrs = { ...block.attrs, indent } as Record<string, string | number | boolean>;\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(sel.anchor.blockId, nodeType('list_item'), attrs)\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\tprivate toggleChecked(context: PluginContext, targetId?: BlockId): boolean {\n\t\tif (context.isReadOnly() && !this.config.interactiveCheckboxes) return false;\n\n\t\tconst state = context.getState();\n\t\tconst bid: BlockId | null =\n\t\t\ttargetId ??\n\t\t\t(isNodeSelection(state.selection) || isGapCursor(state.selection)\n\t\t\t\t? null\n\t\t\t\t: state.selection.anchor.blockId);\n\t\tif (!bid) return false;\n\n\t\tconst block = state.getBlock(bid);\n\t\tif (!block || block.type !== 'list_item' || block.attrs?.listType !== 'checklist') {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst checked: boolean = !block.attrs?.checked;\n\t\tconst attrs = { ...block.attrs, checked } as Record<string, string | number | boolean>;\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(bid, nodeType('list_item'), attrs)\n\t\t\t.setSelection(state.selection)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Handles Backspace at the start of a list item.\n\t * Converts the list item back to a paragraph, preserving text.\n\t */\n\tprivate handleBackspace(context: PluginContext): boolean {\n\t\tconst state = context.getState();\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return false;\n\t\tif (!isCollapsed(sel)) return false;\n\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block || block.type !== 'list_item') return false;\n\t\tif (sel.anchor.offset !== 0) return false;\n\n\t\tconst tr = state\n\t\t\t.transaction('input')\n\t\t\t.setBlockType(sel.anchor.blockId, nodeType('paragraph'))\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Handles Enter inside a list item.\n\t * Empty item → exit list (convert to paragraph).\n\t * Non-empty item → split and create a new list item with the same type.\n\t */\n\tprivate handleEnter(context: PluginContext): boolean {\n\t\tconst state = context.getState();\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return false;\n\t\tif (!isCollapsed(sel)) return false;\n\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block || block.type !== 'list_item') return false;\n\n\t\tconst text = getBlockText(block);\n\n\t\tif (text === '') {\n\t\t\t// Empty list item → convert to paragraph (exit list)\n\t\t\tconst tr = state\n\t\t\t\t.transaction('input')\n\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(sel)\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Non-empty → split block and set new block to same list type\n\t\tconst newBlockId = generateBlockId();\n\t\tconst attrs: Record<string, string | number | boolean> = {\n\t\t\tlistType: isNodeOfType(block, 'list_item') ? block.attrs.listType : 'bullet',\n\t\t\tindent: isNodeOfType(block, 'list_item') ? block.attrs.indent : 0,\n\t\t};\n\t\tif (attrs.listType === 'checklist') {\n\t\t\tattrs.checked = false;\n\t\t}\n\n\t\tconst tr = state\n\t\t\t.transaction('input')\n\t\t\t.splitBlock(sel.anchor.blockId, sel.anchor.offset, newBlockId)\n\t\t\t.setBlockType(newBlockId, nodeType('list_item'), attrs)\n\t\t\t.setSelection(createCollapsedSelection(newBlockId, 0))\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\t// --- Checkbox Click Handling ---\n\n\tprivate registerCheckboxClickHandler(context: PluginContext): void {\n\t\tif (!this.config.types.includes('checklist')) return;\n\n\t\tthis.checkboxClickHandler = (e: MouseEvent) => {\n\t\t\tif (context.isReadOnly() && !this.config.interactiveCheckboxes) return;\n\n\t\t\tconst target: EventTarget | null = e.target;\n\t\t\tif (!(target instanceof HTMLElement)) return;\n\n\t\t\tconst li: HTMLElement | null = target.closest('.notectl-list-item--checklist');\n\t\t\tif (!li) return;\n\n\t\t\tconst rect: DOMRect = li.getBoundingClientRect();\n\t\t\tif (e.clientX - rect.left >= LIST_MARKER_WIDTH) return;\n\n\t\t\te.preventDefault();\n\n\t\t\tconst bid: string | null = li.getAttribute('data-block-id');\n\t\t\tif (!bid) return;\n\n\t\t\tthis.toggleChecked(context, blockId(bid));\n\t\t};\n\n\t\tconst container: HTMLElement = context.getContainer();\n\t\tcontainer.addEventListener('mousedown', this.checkboxClickHandler);\n\t}\n\n\t// --- Helpers ---\n\n\tprivate isListActive(state: EditorState, listType: ListType): boolean {\n\t\tif (isNodeSelection(state.selection) || isGapCursor(state.selection)) return false;\n\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\treturn block?.type === 'list_item' && block.attrs?.listType === listType;\n\t}\n\n\tprivate getEnabledTypes(): readonly ListTypeDefinition[] {\n\t\treturn LIST_TYPE_DEFINITIONS.filter((def) => this.config.types.includes(def.type));\n\t}\n}\n"],"names":["LIST_LOCALE_EN","bulletList","numberedList","checklist","LIST_LOCALES","en","de","es","fr","zh","ru","ar","hi","DEFAULT_CONFIG","types","maxIndent","LIST_TYPE_DEFINITIONS","type","label","icon","inputPattern","inputPrefix","ListPlugin","id","name","priority","config","locale","context","checkboxClickHandler","this","resolvePluginLocale","registerStyleSheet","registerNodeSpec","registerCommands","registerKeymaps","registerInputRules","registerToolbarItems","registerCheckboxClickHandler","destroy","getContainer","removeEventListener","group","content","allow","attrs","listType","default","indent","checked","node","li","createBlockElement","setAttribute","String","className","style","marginLeft","tag","key","role","toHTML","_node","parseHTML","sanitize","tags","enabledTypes","getEnabledTypes","def","registerCommand","toggleList","outdent","includes","toggleChecked","readonlyAllowed","registerKeymap","Enter","handleEnter","Backspace","handleBackspace","Tab","registerInputRule","pattern","handler","state","match","start","_end","sel","selection","isNodeSelection","isGapCursor","isCollapsed","block","getBlock","anchor","blockId","matchStr","matchLen","length","transaction","deleteTextAt","setBlockType","nodeType","setSelection","createCollapsedSelection","build","bullet","ordered","lastType","at","registerToolbarItem","getListLabel","command","separatorAfter","isActive","isListActive","getState","tr","dispatch","isNodeOfType","setIndent","targetId","isReadOnly","interactiveCheckboxes","bid","offset","getBlockText","newBlockId","generateBlockId","splitBlock","e","target","HTMLElement","closest","rect","getBoundingClientRect","clientX","left","preventDefault","getAttribute","addEventListener","filter"],"mappings":";;;;;;AACO,MCaMA,IAA6B,EACzCC,YAAY,eACZC,cAAc,iBACdC,WAAW,YAAA,GA6DCC,IAA2C,EACvDC,IAAIL,GACJM,IA1DyC,EACzCL,YAAY,cACZC,cAAc,qBACdC,WAAW,aAAA,GAwDXI,IAnDyC,EACzCN,YAAY,qBACZC,cAAc,kBACdC,WAAW,wBAAA,GAiDXK,IA5CyC,EACzCP,YAAY,iBACZC,cAAc,mBACdC,WAAW,uBA0CXM,IArCyC,EACzCR,YAAY,QACZC,cAAc,QACdC,WAAW,KAAA,GAmCXO,IA9ByC,EACzCT,YAAY,wBACZC,cAAc,uBACdC,WAAW,WAAA,GA4BXQ,IAvByC,EACzCV,YAAY,eACZC,cAAc,eACdC,WAAW,aAAA,GAqBXS,IAhByC,EACzCX,YAAY,cACZC,cAAc,kBACdC,WAAW,WAAA,EAAA,GCrBNU,IAA6B,EAClCC,OAAO,CAAC,UAAU,WAAW,WAAA,GAC7BC,WAAW,EAAA,GAoBNC,IAAuD,CAC5D,EACCC,MAAM,UACNC,OAAO,eACPC,MAVD,iWAWCC,cAAc,WACdC,aAAa,KAAA,GAEd,EACCJ,MAAM,WACNC,OAAO,iBACPC,MAfD,4NAgBCC,cAAc,YACdC,aAAa,MAAA,GAEd,EACCJ,MAAM,aACNC,OAAO,aACPC,MApBD,6OAqBCC,cAAc,cACdC,aAAa;AAMR,MAAMC,EAAAA;AAAAA,EACHC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,WAAW;AAAA,EAEHC;AAAAA,EACTC;AAAAA,EACAC,UAAgC;AAAA,EAChCC,uBAAyD;AAAA,EAEjE,YAAYH,IAAAA;AACXI,SAAKJ,SAAS,EAAA,GAAKb,GAAAA,GAAmBa,GAAAA;AAAAA,EACvC;AAAA,EAEA,KAAKE,IAAAA;AACJE,SAAKF,UAAUA,IACfE,KAAKH,SAASI,EAAoB3B,GAAcwB,IAASE,KAAKJ,OAAOC,MAAAA,GACrEC,GAAQI,mBFjHc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,GEkHtBF,KAAKG,iBAAiBL,EAAAA,GACtBE,KAAKI,iBAAiBN,EAAAA,GACtBE,KAAKK,gBAAgBP,EAAAA,GACrBE,KAAKM,mBAAmBR,KACxBE,KAAKO,qBAAqBT,EAAAA,GAC1BE,KAAKQ,6BAA6BV,EAAAA;AAAAA,EACnC;AAAA,EAEA,UAAAW;AACKT,SAAKD,wBAAwBC,KAAKF,WACNE,KAAKF,QAAQY,aAAAA,EAClCC,oBAAoB,aAAaX,KAAKD,oBAAAA,GAEjDC,KAAKD,uBAAuB,MAC5BC,KAAKF,UAAU;AAAA,EAChB;AAAA,EAEQ,iBAAiBA,IAAAA;AACxBA,IAAAA,GAAQK,iBAAiB,EACxBhB,MAAM,aACNyB,OAAO,SACPC,SAAS,EAAEC,OAAO,CAAC,MAAA,EAAA,GACnBC,OAAO,EACNC,UAAU,EAAEC,SAAS,SAAA,GACrBC,QAAQ,EAAED,SAAS,KACnBE,SAAS,EAAEF,SAAAA,MAAS,EAAA,GAErB,MAAMG,IAAAA;AACL,YAAMJ,KAAWI,GAAKL,OAAOC,YAAY,UACnCE,KAASE,GAAKL,OAAOG,UAAU,GAC/BC,KAAUC,GAAKL,OAAOI,WAAAA,OAEtBE,KAAKC,EAAmB,MAAMF,GAAK3B,EAAAA;AAgBzC,aAfA4B,GAAGE,aAAa,QAAQ,UAAA,GACxBF,GAAGE,aAAa,kBAAkBP,EAAAA,GAClCK,GAAGE,aAAa,eAAeC,OAAON,EAAAA,CAAAA,GACtCG,GAAGI,YAAY,wCAAwCT,EAAAA,IAEnDE,KAAS,MACZG,GAAGK,MAAMC,aF5JmB,KE4JHT,KAAH,OAGN,gBAAbF,OACHK,GAAGE,aAAa,gBAAgBC,OAAOL,EAAAA,CAAAA,GACvCE,GAAGE,aAAa,gBAAgBC,OAAOL,EAAAA,CAAAA,IAExCE,GAAGE,aAAa,cAAcC,OAAON,KAAS,CAAA,CAAA,GAEvCG;AAAAA,IACR,GACA,QAAQD;AACP,YAAMJ,KAAWI,GAAKL,OAAOC,YAAY;AAEzC,aAAO,EACNY,KAFwB,cAAbZ,KAAyB,OAAO,MAG3Ca,KAAK,QAAQb,EAAAA,IACbS,WAAW,8BAA8BT,MACzCD,OAAO,EAAEe,MAAM,OAAA,EAAA;AAAA,IAEjB,GACAC,QAAA,CAAOC,IAAOnB,OACN,OAAOA,MAAW,MAAA,SAE1BoB,WAAW,CAAC,EAAEL,KAAK,KAAA,CAAA,GACnBM,UAAU,EAAEC,MAAM,CAAC,MAAM,MAAM;EAEjC;AAAA,EAEQ,iBAAiBrC,IAAAA;AACxB,UAAMsC,KAAepC,KAAKqC,gBAAAA;AAE1B,eAAWC,MAAOF,GACjBtC,CAAAA,GAAQyC,gBAAgB,cAAcD,GAAInD,IAAAA,IAAQ,MAC1Ca,KAAKwC,WAAW1C,IAASwC,GAAInD,IAAAA,CAAAA;AAItCW,IAAAA,GAAQyC,gBAAgB,kBAAkB,MAClCvC,KAAKkB,OAAOpB,EAAAA,CAAAA,GAGpBA,GAAQyC,gBAAgB,mBAAmB,MACnCvC,KAAKyC,QAAQ3C,EAAAA,CAAAA,GAGjBE,KAAKJ,OAAOZ,MAAM0D,SAAS,WAAA,KAC9B5C,GAAQyC,gBAAgB,uBAAuB,MAAMvC,KAAK2C,cAAc7C,EAAAA,GAAU,EACjF8C,iBAAAA;EAGH;AAAA,EAEQ,gBAAgB9C,IAAAA;AACvBA,IAAAA,GAAQ+C,eAAe,EACtBC,OAAO,MAAM9C,KAAK+C,YAAYjD,EAAAA,GAC9BkD,WAAW,MAAMhD,KAAKiD,gBAAgBnD,EAAAA,GACtCoD,KAAK,MAAMlD,KAAKkB,OAAOpB,EAAAA,GACvB,aAAa,MAAME,KAAKyC,QAAQ3C,EAAAA,EAAAA,CAAAA;AAAAA,EAElC;AAAA,EAEQ,mBAAmBA,IAAAA;AAC1B,UAAMsC,KAAepC,KAAKqC,gBAAAA;AAE1B,eAAWC,MAAOF,GACjBtC,CAAAA,GAAQqD,kBAAkB,EACzBC,SAASd,GAAIhD,cACb+D,SAAS,CAACC,IAAOC,IAAOC,IAAOC,OAAAA;AAC9B,YAAMC,KAAMJ,GAAMK;AAClB,UAAIC,EAAgBF,EAAAA,KAAQG,EAAYH,EAAAA,EAAM,QAAO;AACrD,UAAA,CAAKI,EAAYJ,EAAAA,EAAM,QAAO;AAE9B,YAAMK,KAAQT,GAAMU,SAASN,GAAIO,OAAOC,OAAAA;AACxC,UAAA,CAAKH,MAAwB,gBAAfA,GAAM5E,KAAsB,QAAO;AAEjD,YAAMgF,KAAWZ,GAAM,CAAA,KAAM,IACvBa,KAAWD,GAASE,QACpBtD,KAAmD,EACxDC,UAAUsB,GAAInD,MACd+B,QAAQ,EAAA;AAMT,aAJiB,gBAAboB,GAAInD,SACP4B,GAAMI,UAAUgD,GAASzB,SAAS,SAG5BY,GACLgB,YAAY,OAAA,EACZC,aAAab,GAAIO,OAAOC,SAASV,IAAOA,KAAQY,EAAAA,EAChDI,aAAad,GAAIO,OAAOC,SAASO,EAAS,WAAA,GAAc1D,EAAAA,EACxD2D,aAAaC,EAAyBjB,GAAIO,OAAOC,SAAS,CAAA,CAAA,EAC1DU,MAAAA;AAAAA,IAAAA,EAAAA,CAAAA;AAAAA,EAIN;AAAA,EAEQ,aAAazF;AAMpB,WALyC,EACxC0F,QAAQ7E,KAAKH,OAAO1B,YACpB2G,SAAS9E,KAAKH,OAAOzB,cACrBC,WAAW2B,KAAKH,OAAOxB,UAAAA,EAEVc,EAAAA;AAAAA,EACf;AAAA,EAEQ,qBAAqBW;AAC5B,UAAMsC,KAAepC,KAAKqC,gBAAAA,GACpB0C,KAAW3C,GAAa4C,GAAAA;AAE9B,eAAW1C,MAAOF,GACjBtC,CAAAA,GAAQmF,oBAAoB,EAC3BxF,IAAI,QAAQ6C,GAAInD,QAChByB,OAAO,SACPvB,MAAMiD,GAAIjD,MACVD,OAAOY,KAAKkF,aAAa5C,GAAInD,OAC7BgG,SAAS,cAAc7C,GAAInD,IAAAA,IAC3BQ,UAAuB,aAAb2C,GAAInD,OAAoB,KAAkB,cAAbmD,GAAInD,OAAqB,KAAK,IACrEiG,gBAAgBpF,KAAKJ,OAAOwF,kBAAkB9C,OAAQyC,IACtDM,UAAW/B,CAAAA,OAAUtD,KAAKsF,aAAahC,IAAOhB,GAAInD,IAAAA,EAAAA,CAAAA;AAAAA,EAGrD;AAAA,EAIQ,WAAWW,IAAwBkB,IAAAA;AAC1C,UAAMsC,KAAQxD,GAAQyF,SAAAA,GAChB7B,KAAMJ,GAAMK;AAClB,QAAIC,EAAgBF,EAAAA,KAAQG,EAAYH,EAAAA,EAAM,QAAA;AAC9C,UAAMK,KAAQT,GAAMU,SAASN,GAAIO,OAAOC;AACxC,QAAA,CAAKH,GAAO,QAAA;AAGZ,QAAmB,gBAAfA,GAAM5E,QAAwB4E,GAAMhD,OAAOC,aAAaA,IAAU;AACrE,YAAMwE,KAAKlC,GACTgB,YAAY,SAAA,EACZE,aAAad,GAAIO,OAAOC,SAASO,EAAS,cAC1CC,aAAahB,EAAAA,EACbkB,MAAAA;AAEF,aADA9E,GAAQ2F,SAASD,EAAAA,GAAAA;AAAAA,IAElB;AAGA,UAAMzE,KAAmD,EACxDC,UAAAA,IACAE,QAAQwE,EAAa3B,IAAO,WAAA,IAAeA,GAAMhD,MAAMG,SAAS,EAAA;AAEhD,oBAAbF,OACHD,GAAMI,UAAAA;AAGP,UAAMqE,KAAKlC,GACTgB,YAAY,SAAA,EACZE,aAAad,GAAIO,OAAOC,SAASO,EAAS,WAAA,GAAc1D,IACxD2D,aAAahB,EAAAA,EACbkB,MAAAA;AAEF,WADA9E,GAAQ2F,SAASD,EAAAA,GAAAA;AAAAA,EAElB;AAAA,EAEQ,OAAO1F,IAAAA;AACd,UAAMwD,KAAQxD,GAAQyF,SAAAA;AACtB,QAAI3B,EAAgBN,GAAMK,SAAAA,KAAcE,EAAYP,GAAMK,SAAAA,EAAY,QAAA;AACtE,UAAMI,KAAQT,GAAMU,SAASV,GAAMK,UAAUM,OAAOC;AACpD,WAAA,EAAA,CAAKH,MAAAA,CAAU2B,EAAa3B,IAAO,mBAE/BA,GAAMhD,MAAMG,UAAUlB,KAAKJ,OAAOX,cAE/Be,KAAK2F,UAAU7F,IAASwD,IAAOS,GAAMhD,MAAMG,SAAS;EAC5D;AAAA,EAEQ,QAAQpB,IAAAA;AACf,UAAMwD,KAAQxD,GAAQyF,SAAAA;AACtB,QAAI3B,EAAgBN,GAAMK,SAAAA,KAAcE,EAAYP,GAAMK,SAAAA,EAAY,QAAA;AACtE,UAAMI,KAAQT,GAAMU,SAASV,GAAMK,UAAUM,OAAOC,OAAAA;AACpD,WAAA,EAAA,CAAKH,MAAAA,CAAU2B,EAAa3B,IAAO,WAAA,MAAA,EAE/BA,GAAMhD,MAAMG,UAAU,MAEnBlB,KAAK2F,UAAU7F,IAASwD,IAAOS,GAAMhD,MAAMG,SAAS,CAAA;AAAA,EAC5D;AAAA,EAEQ,UAAUpB,IAAwBwD,IAAoBpC,IAAAA;AAC7D,UAAMwC,KAAMJ,GAAMK;AAClB,QAAIC,EAAgBF,EAAAA,KAAQG,EAAYH,IAAM,QAAA;AAC9C,UAAMK,KAAQT,GAAMU,SAASN,GAAIO,OAAOC,OAAAA;AACxC,QAAA,CAAKH,GAAO,QAAA;AAEZ,UAAMhD,KAAQ,EAAA,GAAKgD,GAAMhD,OAAOG,cAE1BsE,KAAKlC,GACTgB,YAAY,SAAA,EACZE,aAAad,GAAIO,OAAOC,SAASO,EAAS,WAAA,GAAc1D,EAAAA,EACxD2D,aAAahB,EAAAA,EACbkB;AAEF,WADA9E,GAAQ2F,SAASD,EAAAA,GAAAA;AAAAA,EAElB;AAAA,EAEQ,cAAc1F,IAAwB8F;AAC7C,QAAI9F,GAAQ+F,WAAAA,KAAAA,CAAiB7F,KAAKJ,OAAOkG,sBAAuB,QAAA;AAEhE,UAAMxC,KAAQxD,GAAQyF,SAAAA,GAChBQ,KACLH,OACChC,EAAgBN,GAAMK,SAAAA,KAAcE,EAAYP,GAAMK,SAAAA,IACpD,OACAL,GAAMK,UAAUM,OAAOC;AAC3B,QAAA,CAAK6B,GAAK;AAEV,UAAMhC,KAAQT,GAAMU,SAAS+B,EAAAA;AAC7B,QAAA,CAAKhC,MAAwB,gBAAfA,GAAM5E,QAAkD,gBAA1B4E,GAAMhD,OAAOC,SACxD,QAAA;AAGD,UAAMG,KAAAA,CAAoB4C,GAAMhD,OAAOI,SACjCJ,KAAQ,EAAA,GAAKgD,GAAMhD,OAAOI,SAAAA,GAAAA,GAE1BqE,KAAKlC,GACTgB,YAAY,SAAA,EACZE,aAAauB,IAAKtB,EAAS,WAAA,GAAc1D,EAAAA,EACzC2D,aAAapB,GAAMK,WACnBiB,MAAAA;AAEF,WADA9E,GAAQ2F,SAASD;EAElB;AAAA,EAMQ,gBAAgB1F;AACvB,UAAMwD,KAAQxD,GAAQyF,SAAAA,GAChB7B,KAAMJ,GAAMK;AAClB,QAAIC,EAAgBF,EAAAA,KAAQG,EAAYH,EAAAA,EAAM,QAAA;AAC9C,QAAA,CAAKI,EAAYJ,EAAAA,EAAM,QAAA;AAEvB,UAAMK,KAAQT,GAAMU,SAASN,GAAIO,OAAOC,OAAAA;AACxC,QAAA,CAAKH,MAAwB,gBAAfA,GAAM5E,KAAsB,QAAA;AAC1C,QAA0B,MAAtBuE,GAAIO,OAAO+B,OAAc,QAAA;AAE7B,UAAMR,KAAKlC,GACTgB,YAAY,OAAA,EACZE,aAAad,GAAIO,OAAOC,SAASO,EAAS,WAAA,CAAA,EAC1CC,aAAahB,EAAAA,EACbkB,MAAAA;AAEF,WADA9E,GAAQ2F,SAASD,EAAAA,GAAAA;AAAAA,EAElB;AAAA,EAOQ,YAAY1F,IAAAA;AACnB,UAAMwD,KAAQxD,GAAQyF,SAAAA,GAChB7B,KAAMJ,GAAMK;AAClB,QAAIC,EAAgBF,EAAAA,KAAQG,EAAYH,EAAAA,EAAM;AAC9C,QAAA,CAAKI,EAAYJ,EAAAA,EAAM,QAAA;AAEvB,UAAMK,KAAQT,GAAMU,SAASN,GAAIO,OAAOC,OAAAA;AACxC,SAAKH,MAAwB,gBAAfA,GAAM5E,KAAsB;AAI1C,QAAa,OAFA8G,EAAalC,EAAAA,GAET;AAEhB,YAAMyB,KAAKlC,GACTgB,YAAY,OAAA,EACZE,aAAad,GAAIO,OAAOC,SAASO,EAAS,WAAA,CAAA,EAC1CC,aAAahB,IACbkB,MAAAA;AAEF,aADA9E,GAAQ2F,SAASD,EAAAA,GAAAA;AAAAA,IAElB;AAGA,UAAMU,KAAaC,EAAAA,GACbpF,KAAmD,EACxDC,UAAU0E,EAAa3B,IAAO,WAAA,IAAeA,GAAMhD,MAAMC,WAAW,UACpEE,QAAQwE,EAAa3B,IAAO,WAAA,IAAeA,GAAMhD,MAAMG,SAAS;AAE1C,oBAAnBH,GAAMC,aACTD,GAAMI;AAGP,UAAMqE,KAAKlC,GACTgB,YAAY,OAAA,EACZ8B,WAAW1C,GAAIO,OAAOC,SAASR,GAAIO,OAAO+B,QAAQE,IAClD1B,aAAa0B,IAAYzB,EAAS,WAAA,GAAc1D,IAChD2D,aAAaC,EAAyBuB,IAAY,CAAA,CAAA,EAClDtB;AAEF,WADA9E,GAAQ2F,SAASD,EAAAA,GAAAA;AAAAA,EAElB;AAAA,EAIQ,6BAA6B1F;AAC/BE,SAAKJ,OAAOZ,MAAM0D,SAAS,iBAEhC1C,KAAKD,uBAAwBsG,CAAAA,OAAAA;AAC5B,UAAIvG,GAAQ+F,WAAAA,KAAAA,CAAiB7F,KAAKJ,OAAOkG,sBAAuB;AAEhE,YAAMQ,KAA6BD,GAAEC;AACrC,UAAA,EAAMA,cAAkBC,aAAc;AAEtC,YAAMlF,KAAyBiF,GAAOE,QAAQ,+BAAA;AAC9C,WAAKnF,GAAI;AAET,YAAMoF,KAAgBpF,GAAGqF,sBAAAA;AACzB,UAAIL,GAAEM,UAAUF,GAAKG,QFtdS,GEsdkB;AAEhDP,MAAAA,GAAEQ,eAAAA;AAEF,YAAMd,KAAqB1E,GAAGyF,aAAa,eAAA;AACtCf,MAAAA,MAEL/F,KAAK2C,cAAc7C,IAASoE,EAAQ6B,EAAAA,CAAAA;AAAAA,IAAAA,GAGNjG,GAAQY,eAC7BqG,iBAAiB,aAAa/G,KAAKD,oBAAAA;AAAAA,EAC9C;AAAA,EAIQ,aAAauD,IAAoBtC,IAAAA;AACxC,QAAI4C,EAAgBN,GAAMK,SAAAA,KAAcE,EAAYP,GAAMK,SAAAA,EAAY,QAAA;AACtE,UAAMI,KAAQT,GAAMU,SAASV,GAAMK,UAAUM,OAAOC,OAAAA;AACpD,WAAuB,gBAAhBH,IAAO5E,QAAwB4E,GAAMhD,OAAOC,aAAaA;AAAAA,EACjE;AAAA,EAEQ,kBAAAqB;AACP,WAAOnD,EAAsB8H,OAAQ1E,CAAAA,OAAQtC,KAAKJ,OAAOZ,MAAM0D,SAASJ,GAAInD,IAAAA,CAAAA;AAAAA,EAC7E;AAAA;"}
@@ -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