@notectl/core 2.0.0 → 2.0.2

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 (343) hide show
  1. package/README.md +12 -10
  2. package/dist/chunks/{AttrRegistry-B2AGfTE0.mjs → AttrRegistry-iNpjvcSG.mjs} +2 -2
  3. package/dist/chunks/{AttrRegistry-B2AGfTE0.mjs.map → AttrRegistry-iNpjvcSG.mjs.map} +1 -1
  4. package/dist/chunks/AttributedMarkCommands-BY1BSYWM.mjs +2 -0
  5. package/dist/chunks/AttributedMarkCommands-BY1BSYWM.mjs.map +1 -0
  6. package/dist/chunks/BlockInsertion-BJFhE0jA.mjs +2 -0
  7. package/dist/chunks/BlockInsertion-BJFhE0jA.mjs.map +1 -0
  8. package/dist/chunks/{ColorPickerPopup-DRzFvt7o.mjs → ColorPickerPopup-D6XjShhv.mjs} +2 -2
  9. package/dist/chunks/ColorPickerPopup-D6XjShhv.mjs.map +1 -0
  10. package/dist/chunks/CommandHelpers-M6mPS6Ww.mjs +2 -0
  11. package/dist/chunks/CommandHelpers-M6mPS6Ww.mjs.map +1 -0
  12. package/dist/chunks/Commands-D_gMCnVa.mjs +2 -0
  13. package/dist/chunks/Commands-D_gMCnVa.mjs.map +1 -0
  14. package/dist/chunks/Document-3pNX7ear.mjs +2 -0
  15. package/dist/chunks/Document-3pNX7ear.mjs.map +1 -0
  16. package/dist/chunks/DocumentParser-LvzDQOd1.mjs +2 -0
  17. package/dist/chunks/DocumentParser-LvzDQOd1.mjs.map +1 -0
  18. package/dist/chunks/DomUtils-CznMAZZg.mjs +2 -0
  19. package/dist/chunks/DomUtils-CznMAZZg.mjs.map +1 -0
  20. package/dist/chunks/HTMLUtils-Cxy99Ak2.mjs +2 -0
  21. package/dist/chunks/HTMLUtils-Cxy99Ak2.mjs.map +1 -0
  22. package/dist/chunks/HeadingPlugin-BmkeUXj8.mjs +2 -0
  23. package/dist/chunks/HeadingPlugin-BmkeUXj8.mjs.map +1 -0
  24. package/dist/chunks/MarkCommands-CeCa4WSC.mjs +2 -0
  25. package/dist/chunks/MarkCommands-CeCa4WSC.mjs.map +1 -0
  26. package/dist/chunks/NavigationQueries-11qe4j9x.mjs +2 -0
  27. package/dist/chunks/NavigationQueries-11qe4j9x.mjs.map +1 -0
  28. package/dist/chunks/NodeResolver-z0ReCR34.mjs +2 -0
  29. package/dist/chunks/NodeResolver-z0ReCR34.mjs.map +1 -0
  30. package/dist/chunks/NodeSelectionCommands-CXrOcPtG.mjs +2 -0
  31. package/dist/chunks/NodeSelectionCommands-CXrOcPtG.mjs.map +1 -0
  32. package/dist/chunks/NotectlEditor-BJD7-FFx.mjs +4 -0
  33. package/dist/chunks/NotectlEditor-BJD7-FFx.mjs.map +1 -0
  34. package/dist/chunks/PluginHelpers-CdPR0MuT.mjs +2 -0
  35. package/dist/chunks/PluginHelpers-CdPR0MuT.mjs.map +1 -0
  36. package/dist/chunks/PopupManager-0b_Q0m7K.mjs +2 -0
  37. package/dist/chunks/PopupManager-0b_Q0m7K.mjs.map +1 -0
  38. package/dist/chunks/PrintTypes-DukwDSWS.mjs +2 -0
  39. package/dist/chunks/{PrintTypes-ehbL7ipA.mjs.map → PrintTypes-DukwDSWS.mjs.map} +1 -1
  40. package/dist/chunks/{RangeIterator-CNI6smOg.mjs → RangeIterator-XFN5FaYf.mjs} +2 -2
  41. package/dist/chunks/{RangeIterator-CNI6smOg.mjs.map → RangeIterator-XFN5FaYf.mjs.map} +1 -1
  42. package/dist/chunks/{Selection-6-W6Flxc.mjs → Selection-DhbizDM4.mjs} +2 -2
  43. package/dist/chunks/{Selection-6-W6Flxc.mjs.map → Selection-DhbizDM4.mjs.map} +1 -1
  44. package/dist/chunks/SelectionTransactions-DzIZxcuN.mjs +2 -0
  45. package/dist/chunks/{SelectionTransactions-q71GEzgE.mjs.map → SelectionTransactions-DzIZxcuN.mjs.map} +1 -1
  46. package/dist/chunks/{TextDirectionLocale-DB_aqrMg.mjs → TextDirectionLocale-CKz0ZrH_.mjs} +2 -2
  47. package/dist/chunks/{TextDirectionLocale-DB_aqrMg.mjs.map → TextDirectionLocale-CKz0ZrH_.mjs.map} +1 -1
  48. package/dist/chunks/XmlPatterns-DxQXGjP8.mjs +2 -0
  49. package/dist/chunks/XmlPatterns-DxQXGjP8.mjs.map +1 -0
  50. package/dist/chunks/ar-b6VdnxAs.mjs +2 -0
  51. package/dist/chunks/ar-b6VdnxAs.mjs.map +1 -0
  52. package/dist/chunks/de-fXvs5vQT.mjs +2 -0
  53. package/dist/chunks/de-fXvs5vQT.mjs.map +1 -0
  54. package/dist/chunks/es-BTqy_aQ4.mjs +2 -0
  55. package/dist/chunks/es-BTqy_aQ4.mjs.map +1 -0
  56. package/dist/chunks/fr-VdiCNF4J.mjs +2 -0
  57. package/dist/chunks/fr-VdiCNF4J.mjs.map +1 -0
  58. package/dist/chunks/hi-BdtVhAzs.mjs +2 -0
  59. package/dist/chunks/hi-BdtVhAzs.mjs.map +1 -0
  60. package/dist/chunks/index-C-L4awHz.mjs +2 -0
  61. package/dist/chunks/index-C-L4awHz.mjs.map +1 -0
  62. package/dist/chunks/index-Cs9iqxhF.mjs +2 -0
  63. package/dist/chunks/index-Cs9iqxhF.mjs.map +1 -0
  64. package/dist/chunks/pt-K0BUlM9X.mjs +2 -0
  65. package/dist/chunks/pt-K0BUlM9X.mjs.map +1 -0
  66. package/dist/chunks/ru-Tzd5N37W.mjs +2 -0
  67. package/dist/chunks/ru-Tzd5N37W.mjs.map +1 -0
  68. package/dist/chunks/zh-Di3WqY4_.mjs +2 -0
  69. package/dist/chunks/zh-Di3WqY4_.mjs.map +1 -0
  70. package/dist/{input → commands}/BlockInsertion.d.ts +14 -1
  71. package/dist/commands/BlockInsertion.d.ts.map +1 -0
  72. package/dist/commands/CommandHelpers.d.ts +17 -2
  73. package/dist/commands/CommandHelpers.d.ts.map +1 -1
  74. package/dist/commands/Commands.d.ts.map +1 -1
  75. package/dist/commands/GapCursorCommands.d.ts.map +1 -1
  76. package/dist/commands/NodeSelectionCommands.d.ts +3 -8
  77. package/dist/commands/NodeSelectionCommands.d.ts.map +1 -1
  78. package/dist/commands/PasteCommand.d.ts.map +1 -1
  79. package/dist/editor/ContentSerializer.d.ts.map +1 -1
  80. package/dist/editor/EditorConfig.d.ts +50 -0
  81. package/dist/editor/EditorConfig.d.ts.map +1 -0
  82. package/dist/editor/EditorConfigController.d.ts +1 -1
  83. package/dist/editor/EditorConfigController.d.ts.map +1 -1
  84. package/dist/editor/EditorDOM.d.ts.map +1 -1
  85. package/dist/editor/EditorInitializer.d.ts +37 -0
  86. package/dist/editor/EditorInitializer.d.ts.map +1 -0
  87. package/dist/editor/EditorLifecycleCoordinator.d.ts +6 -1
  88. package/dist/editor/EditorLifecycleCoordinator.d.ts.map +1 -1
  89. package/dist/editor/EditorThemeController.d.ts.map +1 -1
  90. package/dist/editor/NotectlEditor.d.ts +13 -51
  91. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  92. package/dist/editor/PluginBootstrapper.d.ts +1 -1
  93. package/dist/editor/PluginBootstrapper.d.ts.map +1 -1
  94. package/dist/editor/styles/code-block.d.ts +1 -1
  95. package/dist/editor/styles/code-block.d.ts.map +1 -1
  96. package/dist/editor/theme/ThemeEngine.d.ts.map +1 -1
  97. package/dist/editor/theme/ThemeTokens.d.ts +17 -1
  98. package/dist/editor/theme/ThemeTokens.d.ts.map +1 -1
  99. package/dist/full.d.ts +1 -0
  100. package/dist/full.d.ts.map +1 -1
  101. package/dist/full.mjs +1 -1
  102. package/dist/html.mjs +1 -1
  103. package/dist/index.d.ts +1 -1
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/input/ClipboardHandler.d.ts +5 -0
  106. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  107. package/dist/input/HTMLParser.d.ts +9 -5
  108. package/dist/input/HTMLParser.d.ts.map +1 -1
  109. package/dist/input/InputHandler.d.ts +1 -0
  110. package/dist/input/InputHandler.d.ts.map +1 -1
  111. package/dist/input/InputManager.d.ts +2 -0
  112. package/dist/input/InputManager.d.ts.map +1 -1
  113. package/dist/input/InternalClipboard.d.ts +2 -22
  114. package/dist/input/InternalClipboard.d.ts.map +1 -1
  115. package/dist/input/PasteHTMLHandler.d.ts +25 -0
  116. package/dist/input/PasteHTMLHandler.d.ts.map +1 -0
  117. package/dist/input/PasteHandler.d.ts +7 -25
  118. package/dist/input/PasteHandler.d.ts.map +1 -1
  119. package/dist/input/PasteRichBlockHandler.d.ts +23 -0
  120. package/dist/input/PasteRichBlockHandler.d.ts.map +1 -0
  121. package/dist/input/SelectionDocument.d.ts +10 -0
  122. package/dist/input/SelectionDocument.d.ts.map +1 -0
  123. package/dist/model/Document.d.ts.map +1 -1
  124. package/dist/model/HTMLUtils.d.ts +2 -0
  125. package/dist/model/HTMLUtils.d.ts.map +1 -1
  126. package/dist/model/PasteInterceptor.d.ts +21 -0
  127. package/dist/model/PasteInterceptor.d.ts.map +1 -0
  128. package/dist/model/RichBlockData.d.ts +34 -0
  129. package/dist/model/RichBlockData.d.ts.map +1 -0
  130. package/dist/model/SchemaRegistry.d.ts +2 -0
  131. package/dist/model/SchemaRegistry.d.ts.map +1 -1
  132. package/dist/notectl-core.mjs +1 -1
  133. package/dist/notectl-core.umd.js +1 -1
  134. package/dist/notectl-core.umd.js.map +1 -1
  135. package/dist/plugins/Plugin.d.ts +3 -0
  136. package/dist/plugins/Plugin.d.ts.map +1 -1
  137. package/dist/plugins/PluginContextFactory.d.ts +73 -0
  138. package/dist/plugins/PluginContextFactory.d.ts.map +1 -0
  139. package/dist/plugins/PluginManager.d.ts +12 -0
  140. package/dist/plugins/PluginManager.d.ts.map +1 -1
  141. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
  142. package/dist/plugins/alignment.mjs +1 -1
  143. package/dist/plugins/alignment.mjs.map +1 -1
  144. package/dist/plugins/blockquote/BlockquoteKeyboardHandlers.d.ts.map +1 -1
  145. package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -1
  146. package/dist/plugins/blockquote.mjs +1 -1
  147. package/dist/plugins/blockquote.mjs.map +1 -1
  148. package/dist/plugins/caret-navigation/CaretNavigationPlugin.d.ts.map +1 -1
  149. package/dist/plugins/caret-navigation.mjs +1 -1
  150. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -1
  151. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +5 -0
  152. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  153. package/dist/plugins/code-block/CodeBlockTypes.d.ts +7 -0
  154. package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
  155. package/dist/plugins/code-block/highlighter/RegexTokenizer.d.ts +14 -0
  156. package/dist/plugins/code-block/highlighter/RegexTokenizer.d.ts.map +1 -0
  157. package/dist/plugins/code-block/highlighter/TokenizerTypes.d.ts +15 -0
  158. package/dist/plugins/code-block/highlighter/TokenizerTypes.d.ts.map +1 -0
  159. package/dist/plugins/code-block/highlighter/languages/index.d.ts +3 -0
  160. package/dist/plugins/code-block/highlighter/languages/index.d.ts.map +1 -0
  161. package/dist/plugins/code-block/highlighter/languages/json.d.ts +3 -0
  162. package/dist/plugins/code-block/highlighter/languages/json.d.ts.map +1 -0
  163. package/dist/plugins/code-block/highlighter/languages/xml.d.ts +3 -0
  164. package/dist/plugins/code-block/highlighter/languages/xml.d.ts.map +1 -0
  165. package/dist/plugins/code-block/index.d.ts +5 -1
  166. package/dist/plugins/code-block/index.d.ts.map +1 -1
  167. package/dist/plugins/code-block.mjs +1 -1
  168. package/dist/plugins/code-block.mjs.map +1 -1
  169. package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
  170. package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
  171. package/dist/plugins/font-size.mjs +1 -1
  172. package/dist/plugins/font-size.mjs.map +1 -1
  173. package/dist/plugins/font.mjs +1 -1
  174. package/dist/plugins/font.mjs.map +1 -1
  175. package/dist/plugins/gap-cursor/GapCursorPlugin.d.ts.map +1 -1
  176. package/dist/plugins/gap-cursor.mjs +1 -1
  177. package/dist/plugins/hard-break.mjs +1 -1
  178. package/dist/plugins/heading/HeadingInputRules.d.ts.map +1 -1
  179. package/dist/plugins/heading/HeadingKeyboardHandlers.d.ts.map +1 -1
  180. package/dist/plugins/heading/HeadingPlugin.d.ts.map +1 -1
  181. package/dist/plugins/heading.mjs +1 -1
  182. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  183. package/dist/plugins/highlight.mjs +1 -1
  184. package/dist/plugins/highlight.mjs.map +1 -1
  185. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
  186. package/dist/plugins/horizontal-rule.mjs +1 -1
  187. package/dist/plugins/horizontal-rule.mjs.map +1 -1
  188. package/dist/plugins/image/ImageCommands.d.ts.map +1 -1
  189. package/dist/plugins/image/ImagePlugin.d.ts +0 -1
  190. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
  191. package/dist/plugins/image/ImagePopup.d.ts +11 -0
  192. package/dist/plugins/image/ImagePopup.d.ts.map +1 -0
  193. package/dist/plugins/image.mjs +1 -1
  194. package/dist/plugins/image.mjs.map +1 -1
  195. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  196. package/dist/plugins/link.mjs +1 -1
  197. package/dist/plugins/link.mjs.map +1 -1
  198. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  199. package/dist/plugins/list.mjs +1 -1
  200. package/dist/plugins/list.mjs.map +1 -1
  201. package/dist/plugins/print/PrintPlugin.d.ts.map +1 -1
  202. package/dist/plugins/print.mjs +1 -1
  203. package/dist/plugins/print.mjs.map +1 -1
  204. package/dist/plugins/shared/ColorMarkOperations.d.ts +1 -2
  205. package/dist/plugins/shared/ColorMarkOperations.d.ts.map +1 -1
  206. package/dist/plugins/shared/ColorPickerPopup.d.ts +1 -8
  207. package/dist/plugins/shared/ColorPickerPopup.d.ts.map +1 -1
  208. package/dist/plugins/shared/PluginHelpers.d.ts +8 -0
  209. package/dist/plugins/shared/PluginHelpers.d.ts.map +1 -1
  210. package/dist/plugins/shared/PopupManager.d.ts.map +1 -1
  211. package/dist/plugins/shared/XmlPatterns.d.ts +10 -0
  212. package/dist/plugins/shared/XmlPatterns.d.ts.map +1 -0
  213. package/dist/plugins/shared/index.d.ts +1 -0
  214. package/dist/plugins/shared/index.d.ts.map +1 -1
  215. package/dist/plugins/shared.mjs +1 -1
  216. package/dist/plugins/shared.mjs.map +1 -1
  217. package/dist/plugins/smart-paste/SmartPasteLocale.d.ts +7 -0
  218. package/dist/plugins/smart-paste/SmartPasteLocale.d.ts.map +1 -0
  219. package/dist/plugins/smart-paste/SmartPastePlugin.d.ts +19 -0
  220. package/dist/plugins/smart-paste/SmartPastePlugin.d.ts.map +1 -0
  221. package/dist/plugins/smart-paste/SmartPasteTypes.d.ts +24 -0
  222. package/dist/plugins/smart-paste/SmartPasteTypes.d.ts.map +1 -0
  223. package/dist/plugins/smart-paste/detectors/JsonDetector.d.ts +6 -0
  224. package/dist/plugins/smart-paste/detectors/JsonDetector.d.ts.map +1 -0
  225. package/dist/plugins/smart-paste/detectors/XmlDetector.d.ts +26 -0
  226. package/dist/plugins/smart-paste/detectors/XmlDetector.d.ts.map +1 -0
  227. package/dist/plugins/smart-paste/index.d.ts +7 -0
  228. package/dist/plugins/smart-paste/index.d.ts.map +1 -0
  229. package/dist/plugins/smart-paste/locales/ar.d.ts +4 -0
  230. package/dist/plugins/smart-paste/locales/ar.d.ts.map +1 -0
  231. package/dist/plugins/smart-paste/locales/de.d.ts +4 -0
  232. package/dist/plugins/smart-paste/locales/de.d.ts.map +1 -0
  233. package/dist/plugins/smart-paste/locales/es.d.ts +4 -0
  234. package/dist/plugins/smart-paste/locales/es.d.ts.map +1 -0
  235. package/dist/plugins/smart-paste/locales/fr.d.ts +4 -0
  236. package/dist/plugins/smart-paste/locales/fr.d.ts.map +1 -0
  237. package/dist/plugins/smart-paste/locales/hi.d.ts +4 -0
  238. package/dist/plugins/smart-paste/locales/hi.d.ts.map +1 -0
  239. package/dist/plugins/smart-paste/locales/pt.d.ts +4 -0
  240. package/dist/plugins/smart-paste/locales/pt.d.ts.map +1 -0
  241. package/dist/plugins/smart-paste/locales/ru.d.ts +4 -0
  242. package/dist/plugins/smart-paste/locales/ru.d.ts.map +1 -0
  243. package/dist/plugins/smart-paste/locales/zh.d.ts +4 -0
  244. package/dist/plugins/smart-paste/locales/zh.d.ts.map +1 -0
  245. package/dist/plugins/smart-paste.mjs +2 -0
  246. package/dist/plugins/smart-paste.mjs.map +1 -0
  247. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -1
  248. package/dist/plugins/strikethrough.mjs +1 -1
  249. package/dist/plugins/strikethrough.mjs.map +1 -1
  250. package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -1
  251. package/dist/plugins/super-sub.mjs +1 -1
  252. package/dist/plugins/super-sub.mjs.map +1 -1
  253. package/dist/plugins/table/TableCommands.d.ts +1 -0
  254. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  255. package/dist/plugins/table/TableContextMenu.d.ts.map +1 -1
  256. package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
  257. package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
  258. package/dist/plugins/table/TableSelection.d.ts.map +1 -1
  259. package/dist/plugins/table/index.d.ts +1 -0
  260. package/dist/plugins/table/index.d.ts.map +1 -1
  261. package/dist/plugins/table.mjs +1 -1
  262. package/dist/plugins/table.mjs.map +1 -1
  263. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  264. package/dist/plugins/text-color.mjs +1 -1
  265. package/dist/plugins/text-color.mjs.map +1 -1
  266. package/dist/plugins/text-direction/TextDirectionCorePlugin.d.ts.map +1 -1
  267. package/dist/plugins/text-direction/TextDirectionPlugin.d.ts.map +1 -1
  268. package/dist/plugins/text-direction-advanced.mjs +1 -1
  269. package/dist/plugins/text-direction-advanced.mjs.map +1 -1
  270. package/dist/plugins/text-direction.mjs +1 -1
  271. package/dist/plugins/text-direction.mjs.map +1 -1
  272. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -1
  273. package/dist/plugins/text-formatting.mjs +1 -1
  274. package/dist/plugins/text-formatting.mjs.map +1 -1
  275. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts +2 -0
  276. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -1
  277. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
  278. package/dist/plugins/toolbar.mjs +1 -1
  279. package/dist/plugins/toolbar.mjs.map +1 -1
  280. package/dist/presets/FullPreset.d.ts.map +1 -1
  281. package/dist/presets/PresetTypes.d.ts +2 -0
  282. package/dist/presets/PresetTypes.d.ts.map +1 -1
  283. package/dist/presets/full.mjs +1 -1
  284. package/dist/presets/full.mjs.map +1 -1
  285. package/dist/serialization/DocumentSerializer.d.ts.map +1 -1
  286. package/dist/state/InlineContentOps.d.ts.map +1 -1
  287. package/dist/state/StepInversion.d.ts +7 -0
  288. package/dist/state/StepInversion.d.ts.map +1 -0
  289. package/dist/state/Steps.d.ts +108 -0
  290. package/dist/state/Steps.d.ts.map +1 -0
  291. package/dist/state/Transaction.d.ts +5 -174
  292. package/dist/state/Transaction.d.ts.map +1 -1
  293. package/dist/state/TransactionBuilder.d.ts +69 -0
  294. package/dist/state/TransactionBuilder.d.ts.map +1 -0
  295. package/dist/test/TestUtils.d.ts.map +1 -1
  296. package/dist/view/CaretNavigation.d.ts.map +1 -1
  297. package/dist/view/DomUtils.d.ts +10 -1
  298. package/dist/view/DomUtils.d.ts.map +1 -1
  299. package/dist/view/EditorView.d.ts +10 -60
  300. package/dist/view/EditorView.d.ts.map +1 -1
  301. package/dist/view/EditorViewEvents.d.ts +54 -0
  302. package/dist/view/EditorViewEvents.d.ts.map +1 -0
  303. package/dist/view/EditorViewNavigation.d.ts +47 -0
  304. package/dist/view/EditorViewNavigation.d.ts.map +1 -0
  305. package/dist/view/SelectionSync.d.ts.map +1 -1
  306. package/dist/view/ViewMovementCommands.d.ts.map +1 -1
  307. package/package.json +12 -2
  308. package/dist/chunks/AttributedMarkCommands-BB7lzFct.mjs +0 -2
  309. package/dist/chunks/AttributedMarkCommands-BB7lzFct.mjs.map +0 -1
  310. package/dist/chunks/ColorPickerPopup-DRzFvt7o.mjs.map +0 -1
  311. package/dist/chunks/Commands-P9wS8qtN.mjs +0 -2
  312. package/dist/chunks/Commands-P9wS8qtN.mjs.map +0 -1
  313. package/dist/chunks/Document-BFYAonMF.mjs +0 -2
  314. package/dist/chunks/Document-BFYAonMF.mjs.map +0 -1
  315. package/dist/chunks/DocumentParser-DFcvVMGY.mjs +0 -2
  316. package/dist/chunks/DocumentParser-DFcvVMGY.mjs.map +0 -1
  317. package/dist/chunks/DomUtils-Cdz1eDKM.mjs +0 -2
  318. package/dist/chunks/DomUtils-Cdz1eDKM.mjs.map +0 -1
  319. package/dist/chunks/HTMLUtils-CCvQ5f83.mjs +0 -2
  320. package/dist/chunks/HTMLUtils-CCvQ5f83.mjs.map +0 -1
  321. package/dist/chunks/HeadingPlugin-DYy3IoT_.mjs +0 -2
  322. package/dist/chunks/HeadingPlugin-DYy3IoT_.mjs.map +0 -1
  323. package/dist/chunks/LocaleService-B6Z-wyAF.mjs +0 -2
  324. package/dist/chunks/LocaleService-B6Z-wyAF.mjs.map +0 -1
  325. package/dist/chunks/MarkCommands-B_erV7zz.mjs +0 -2
  326. package/dist/chunks/MarkCommands-B_erV7zz.mjs.map +0 -1
  327. package/dist/chunks/NavigationQueries-ogQuObz7.mjs +0 -2
  328. package/dist/chunks/NavigationQueries-ogQuObz7.mjs.map +0 -1
  329. package/dist/chunks/NotectlEditor-4NFnXLyD.mjs +0 -2
  330. package/dist/chunks/NotectlEditor-4NFnXLyD.mjs.map +0 -1
  331. package/dist/chunks/Plugin-OzM8Oxm_.mjs +0 -2
  332. package/dist/chunks/Plugin-OzM8Oxm_.mjs.map +0 -1
  333. package/dist/chunks/PluginHelpers-DjZt0pQi.mjs +0 -2
  334. package/dist/chunks/PluginHelpers-DjZt0pQi.mjs.map +0 -1
  335. package/dist/chunks/PopupManager-BM8IT6M7.mjs +0 -2
  336. package/dist/chunks/PopupManager-BM8IT6M7.mjs.map +0 -1
  337. package/dist/chunks/PrintTypes-ehbL7ipA.mjs +0 -2
  338. package/dist/chunks/SelectionTransactions-q71GEzgE.mjs +0 -2
  339. package/dist/chunks/index-C8xtb3SM.mjs +0 -2
  340. package/dist/chunks/index-C8xtb3SM.mjs.map +0 -1
  341. package/dist/chunks/index-DAoSt12h.mjs +0 -2
  342. package/dist/chunks/index-DAoSt12h.mjs.map +0 -1
  343. package/dist/input/BlockInsertion.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"super-sub.mjs","sources":["../../src/plugins/super-sub/SuperSubLocale.ts","../../src/plugins/super-sub/SuperSubPlugin.ts"],"sourcesContent":["/**\n * Locale interface and default English locale for the SuperSubPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface SuperSubLocale {\n\treadonly superscriptLabel: string;\n\treadonly superscriptTooltip: (shortcut: string) => string;\n\treadonly subscriptLabel: string;\n\treadonly subscriptTooltip: (shortcut: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const SUPER_SUB_LOCALE_EN: SuperSubLocale = {\n\tsuperscriptLabel: 'Superscript',\n\tsuperscriptTooltip: (shortcut: string) => `Superscript (${shortcut})`,\n\tsubscriptLabel: 'Subscript',\n\tsubscriptTooltip: (shortcut: string) => `Subscript (${shortcut})`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: SuperSubLocale }>> = import.meta.glob<{\n\tdefault: SuperSubLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadSuperSubLocale(lang: string): Promise<SuperSubLocale> {\n\tif (lang === 'en') return SUPER_SUB_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return SUPER_SUB_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn SUPER_SUB_LOCALE_EN;\n\t}\n}\n","/**\n * SuperSubPlugin: registers superscript and subscript inline marks with\n * MarkSpecs, toggle commands, keyboard shortcuts, toolbar buttons, and\n * a middleware that enforces mutual exclusivity between the two marks.\n *\n * Data-driven — each mark type is defined declaratively and all\n * registrations are derived from the same definition table.\n */\n\nimport { isMarkActive, toggleMark } from '../../commands/Commands.js';\nimport { LocaleServiceKey } from '../../i18n/LocaleService.js';\nimport type { Mark } from '../../model/Document.js';\nimport type { ParseRule } from '../../model/ParseRule.js';\nimport type { SanitizeConfig } from '../../model/SanitizeConfig.js';\nimport { markType as mkType } from '../../model/TypeBrands.js';\nimport type { RemoveMarkStep, Step } from '../../state/Transaction.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport { SUPER_SUB_LOCALE_EN, type SuperSubLocale, loadSuperSubLocale } from './SuperSubLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tsuperscript: Record<string, never>;\n\t\tsubscript: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\n/** Controls toolbar button visibility per mark. */\nexport interface SuperSubToolbarConfig {\n\treadonly superscript?: boolean;\n\treadonly subscript?: boolean;\n}\n\n/** Controls which marks are enabled and which toolbar buttons are shown. */\nexport interface SuperSubConfig {\n\treadonly superscript: boolean;\n\treadonly subscript: boolean;\n\treadonly toolbar?: SuperSubToolbarConfig;\n\treadonly locale?: SuperSubLocale;\n}\n\nconst DEFAULT_CONFIG: SuperSubConfig = {\n\tsuperscript: true,\n\tsubscript: true,\n};\n\n// --- Mark Definitions ---\n\ninterface MarkDefinition {\n\treadonly type: 'superscript' | 'subscript';\n\treadonly opposite: 'superscript' | 'subscript';\n\treadonly configKey: keyof Omit<SuperSubConfig, 'toolbar' | 'locale'>;\n\treadonly rank: number;\n\treadonly tag: string;\n\treadonly icon: string;\n\treadonly keyBinding: string;\n\treadonly toHTMLString: (content: string) => string;\n\treadonly parseHTML: readonly ParseRule[];\n\treadonly sanitize: SanitizeConfig;\n}\n\nconst SUPERSCRIPT_ICON: string = [\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">',\n\t'<path d=\"M16 7.41L11.41 12 16 16.59 14.59 18l-6-6 6-6z\"',\n\t' fill=\"none\"/>',\n\t'<path d=\"M9.64 7.64c.23-.5.36-1.05.36-1.64',\n\t' 0-2.21-1.79-4-4-4H2v14h4.36c2.34 0 4.24-1.9',\n\t' 4.24-4.24 0-1.6-.89-2.99-2.2-3.71zM4.5 4.5H6c.83',\n\t' 0 1.5.67 1.5 1.5S6.83 7.5 6 7.5H4.5v-3zm2 9H4.5v-3H6.5c.83',\n\t' 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\" fill=\"none\"/>',\n\t'<path d=\"M15.97 3.84c0-.47.19-.91.53-1.21.34-.31.8-.49',\n\t' 1.3-.49.5 0 .95.18 1.28.48.32.3.5.7.51 1.15h1.59c-.02',\n\t'-.96-.43-1.83-1.13-2.42C19.36.77 18.45.44 17.5.44c-.88',\n\t' 0-1.74.28-2.39.8-.67.53-1.06 1.28-1.06 2.1 0 .76.34',\n\t' 1.47.93 1.97.59.49 1.41.84 2.32 1.15.7.24 1.26.5 1.62.8.35.3.53.64.53',\n\t' 1.02 0 .48-.2.93-.55 1.24-.36.3-.84.48-1.37.48-.55 0-1.04-.2-1.39-.54',\n\t'-.34-.33-.53-.8-.53-1.32h-1.58c.01 1.02.43 1.95 1.16 2.57.72.62 1.67.96',\n\t' 2.67.96.92 0 1.81-.3 2.46-.84.67-.56 1.04-1.33 1.04-2.18 0-.81-.36-1.56',\n\t'-.99-2.08-.62-.51-1.48-.88-2.43-1.2-.67-.23-1.2-.47-1.52-.75-.32-.27-.46',\n\t'-.59-.46-.94z\"/>',\n\t'<path d=\"M5.88 20h2.66l3.4-5.42L15.3 20h2.67l-4.73-7.38',\n\t' 4.37-6.62h-2.6l-3.07 4.98L8.92 6h-2.6l4.26 6.58z\"/>',\n\t'</svg>',\n].join('');\n\nconst SUBSCRIPT_ICON: string = [\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">',\n\t'<path d=\"M15.97 16.84c0-.47.19-.91.53-1.21.34-.31.8-.49',\n\t' 1.3-.49.5 0 .95.18 1.28.48.32.3.5.7.51 1.15h1.59c-.02',\n\t'-.96-.43-1.83-1.13-2.42-.7-.58-1.61-.91-2.56-.91-.88',\n\t' 0-1.74.28-2.39.8-.67.53-1.06 1.28-1.06 2.1 0 .76.34',\n\t' 1.47.93 1.97.59.49 1.41.84 2.32 1.15.7.24 1.26.5 1.62.8.35.3.53.64.53',\n\t' 1.02 0 .48-.2.93-.55 1.24-.36.3-.84.48-1.37.48-.55 0-1.04-.2-1.39-.54',\n\t'-.34-.33-.53-.8-.53-1.32h-1.58c.01 1.02.43 1.95 1.16 2.57.72.62 1.67.96',\n\t' 2.67.96.92 0 1.81-.3 2.46-.84.67-.56 1.04-1.33 1.04-2.18 0-.81-.36-1.56',\n\t'-.99-2.08-.62-.51-1.48-.88-2.43-1.2-.67-.23-1.2-.47-1.52-.75-.32-.27-.46',\n\t'-.59-.46-.94z\"/>',\n\t'<path d=\"M5.88 18h2.66l3.4-5.42L15.3 18h2.67l-4.73-7.38',\n\t' 4.37-6.62h-2.6l-3.07 4.98L8.92 4h-2.6l4.26 6.58z\"/>',\n\t'</svg>',\n].join('');\n\nconst MARK_DEFINITIONS: readonly MarkDefinition[] = [\n\t{\n\t\ttype: 'superscript',\n\t\topposite: 'subscript',\n\t\tconfigKey: 'superscript',\n\t\trank: 4,\n\t\ttag: 'sup',\n\t\ticon: SUPERSCRIPT_ICON,\n\t\tkeyBinding: 'Mod-.',\n\t\ttoHTMLString: (content) => `<sup>${content}</sup>`,\n\t\tparseHTML: [{ tag: 'sup' }],\n\t\tsanitize: { tags: ['sup'] },\n\t},\n\t{\n\t\ttype: 'subscript',\n\t\topposite: 'superscript',\n\t\tconfigKey: 'subscript',\n\t\trank: 4,\n\t\ttag: 'sub',\n\t\ticon: SUBSCRIPT_ICON,\n\t\tkeyBinding: 'Mod-,',\n\t\ttoHTMLString: (content) => `<sub>${content}</sub>`,\n\t\tparseHTML: [{ tag: 'sub' }],\n\t\tsanitize: { tags: ['sub'] },\n\t},\n];\n\n// --- Plugin ---\n\nexport class SuperSubPlugin implements Plugin {\n\treadonly id = 'super-sub';\n\treadonly name = 'Superscript & Subscript';\n\treadonly priority = 23;\n\n\tprivate readonly config: SuperSubConfig;\n\tprivate locale!: SuperSubLocale;\n\n\tconstructor(config?: Partial<SuperSubConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tif (this.config.locale) {\n\t\t\tthis.locale = this.config.locale;\n\t\t} else {\n\t\t\tconst service = context.getService(LocaleServiceKey);\n\t\t\tconst lang: string = service?.getLocale() ?? 'en';\n\t\t\tthis.locale = lang === 'en' ? SUPER_SUB_LOCALE_EN : await loadSuperSubLocale(lang);\n\t\t}\n\n\t\tconst enabledMarks: MarkDefinition[] = MARK_DEFINITIONS.filter(\n\t\t\t(def) => this.config[def.configKey],\n\t\t);\n\n\t\tfor (const def of enabledMarks) {\n\t\t\tthis.registerMark(context, def);\n\t\t}\n\n\t\tthis.registerKeymaps(context, enabledMarks);\n\t\tthis.registerExclusivityMiddleware(context, enabledMarks);\n\t\tthis.registerDisabledToolbarItems(context);\n\t}\n\n\tprivate registerMark(context: PluginContext, def: MarkDefinition): void {\n\t\tconst commandName: string = toCommandName(def.type);\n\t\tconst toolbarVisible: boolean = this.isToolbarVisible(def.configKey);\n\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: def.type,\n\t\t\trank: def.rank,\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement(def.tag);\n\t\t\t},\n\t\t\ttoHTMLString: (_mark, content) => def.toHTMLString(content),\n\t\t\tparseHTML: def.parseHTML,\n\t\t\tsanitize: def.sanitize,\n\t\t});\n\n\t\tcontext.registerCommand(commandName, () => {\n\t\t\tconst tr = toggleMark(context.getState(), mkType(def.type));\n\t\t\tif (tr) {\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (toolbarVisible) {\n\t\t\tconst label: string =\n\t\t\t\tdef.type === 'superscript' ? this.locale.superscriptLabel : this.locale.subscriptLabel;\n\t\t\tconst tooltip: string =\n\t\t\t\tdef.type === 'superscript'\n\t\t\t\t\t? this.locale.superscriptTooltip(formatShortcut(def.keyBinding))\n\t\t\t\t\t: this.locale.subscriptTooltip(formatShortcut(def.keyBinding));\n\t\t\tcontext.registerToolbarItem({\n\t\t\t\tid: def.type,\n\t\t\t\tgroup: 'format',\n\t\t\t\ticon: def.icon,\n\t\t\t\tlabel,\n\t\t\t\ttooltip,\n\t\t\t\tcommand: commandName,\n\t\t\t\tisActive: (state) => isMarkActive(state, mkType(def.type)),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate registerKeymaps(context: PluginContext, marks: readonly MarkDefinition[]): void {\n\t\tconst keymap: Record<string, () => boolean> = {};\n\t\tfor (const def of marks) {\n\t\t\tconst commandName: string = toCommandName(def.type);\n\t\t\tkeymap[def.keyBinding] = () => context.executeCommand(commandName);\n\t\t}\n\t\tif (Object.keys(keymap).length > 0) {\n\t\t\tcontext.registerKeymap(keymap);\n\t\t}\n\t}\n\n\t/**\n\t * Ensures superscript and subscript are mutually exclusive.\n\t * When an addMark step for one type is found, a removeMark step\n\t * for the opposite type is injected. For stored marks, the opposite\n\t * mark is filtered out.\n\t */\n\tprivate registerExclusivityMiddleware(\n\t\tcontext: PluginContext,\n\t\tenabledMarks: readonly MarkDefinition[],\n\t): void {\n\t\tconst bothEnabled: boolean =\n\t\t\tenabledMarks.some((d) => d.type === 'superscript') &&\n\t\t\tenabledMarks.some((d) => d.type === 'subscript');\n\n\t\tif (!bothEnabled) return;\n\n\t\tcontext.registerMiddleware(\n\t\t\t(tr, _state, next) => {\n\t\t\t\tlet patched = false;\n\n\t\t\t\t// Handle addMark steps: inject removeMark for the opposite type\n\t\t\t\tconst patchedSteps: Step[] = [];\n\t\t\t\tfor (const step of tr.steps) {\n\t\t\t\t\tif (step.type !== 'addMark') {\n\t\t\t\t\t\tpatchedSteps.push(step);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst markName: string = step.mark.type;\n\t\t\t\t\tconst def: MarkDefinition | undefined = MARK_DEFINITIONS.find((d) => d.type === markName);\n\t\t\t\t\tif (!def) {\n\t\t\t\t\t\tpatchedSteps.push(step);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tpatched = true;\n\t\t\t\t\tconst removeStep: RemoveMarkStep = {\n\t\t\t\t\t\ttype: 'removeMark',\n\t\t\t\t\t\tblockId: step.blockId,\n\t\t\t\t\t\tfrom: step.from,\n\t\t\t\t\t\tto: step.to,\n\t\t\t\t\t\tmark: { type: mkType(def.opposite) },\n\t\t\t\t\t\t...(step.path ? { path: step.path } : {}),\n\t\t\t\t\t};\n\t\t\t\t\tpatchedSteps.push(removeStep, step);\n\t\t\t\t}\n\n\t\t\t\t// Handle stored marks: remove the opposite mark\n\t\t\t\tlet storedMarksAfter: readonly Mark[] | null = tr.storedMarksAfter;\n\t\t\t\tif (storedMarksAfter) {\n\t\t\t\t\tconst hasSup: boolean = storedMarksAfter.some((m) => m.type === 'superscript');\n\t\t\t\t\tconst hasSub: boolean = storedMarksAfter.some((m) => m.type === 'subscript');\n\n\t\t\t\t\tif (hasSup && hasSub) {\n\t\t\t\t\t\t// Keep the one that was most recently added (last in array)\n\t\t\t\t\t\tconst lastSupIdx: number = storedMarksAfter.findLastIndex(\n\t\t\t\t\t\t\t(m) => m.type === 'superscript',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst lastSubIdx: number = storedMarksAfter.findLastIndex(\n\t\t\t\t\t\t\t(m) => m.type === 'subscript',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst removeType: string = lastSupIdx > lastSubIdx ? 'subscript' : 'superscript';\n\n\t\t\t\t\t\tstoredMarksAfter = storedMarksAfter.filter((m) => m.type !== removeType);\n\t\t\t\t\t\tpatched = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnext(patched ? { ...tr, steps: patchedSteps, storedMarksAfter } : tr);\n\t\t\t},\n\t\t\t{ name: 'super-sub:exclusivity' },\n\t\t);\n\t}\n\n\t/**\n\t * Registers disabled toolbar buttons for marks whose feature is disabled\n\t * but whose toolbar button is explicitly requested.\n\t */\n\tprivate registerDisabledToolbarItems(context: PluginContext): void {\n\t\tif (!this.config.toolbar) return;\n\n\t\tfor (const def of MARK_DEFINITIONS) {\n\t\t\tconst featureEnabled: boolean = this.config[def.configKey];\n\t\t\tconst toolbarVisible: boolean = this.config.toolbar[def.configKey] ?? true;\n\n\t\t\tif (!featureEnabled && toolbarVisible) {\n\t\t\t\tconst label: string =\n\t\t\t\t\tdef.type === 'superscript' ? this.locale.superscriptLabel : this.locale.subscriptLabel;\n\t\t\t\tcontext.registerToolbarItem({\n\t\t\t\t\tid: def.type,\n\t\t\t\t\tgroup: 'format',\n\t\t\t\t\ticon: def.icon,\n\t\t\t\t\tlabel,\n\t\t\t\t\tcommand: toCommandName(def.type),\n\t\t\t\t\tisEnabled: () => false,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isToolbarVisible(configKey: keyof Omit<SuperSubConfig, 'toolbar' | 'locale'>): boolean {\n\t\tif (!this.config.toolbar) return true;\n\t\treturn this.config.toolbar[configKey] ?? true;\n\t}\n}\n\n/** Converts a mark type to its toggle command name (e.g. 'superscript' → 'toggleSuperscript'). */\nfunction toCommandName(markType: string): string {\n\treturn `toggle${markType.charAt(0).toUpperCase()}${markType.slice(1)}`;\n}\n"],"names":["SUPER_SUB_LOCALE_EN","superscriptLabel","superscriptTooltip","shortcut","subscriptLabel","subscriptTooltip","localeModules","assign","import","async","loadSuperSubLocale","lang","loader","default","DEFAULT_CONFIG","superscript","subscript","MARK_DEFINITIONS","type","opposite","configKey","rank","tag","icon","join","keyBinding","toHTMLString","content","parseHTML","sanitize","tags","SuperSubPlugin","id","name","priority","config","locale","constructor","this","init","context","service","getService","LocaleServiceKey","getLocale","enabledMarks","filter","def","registerMark","registerKeymaps","registerExclusivityMiddleware","registerDisabledToolbarItems","commandName","toCommandName","toolbarVisible","isToolbarVisible","registerMarkSpec","toDOM","document","createElement","_mark","registerCommand","tr","toggleMark","getState","mkType","dispatch","label","tooltip","formatShortcut","registerToolbarItem","group","command","isActive","state","isMarkActive","marks","keymap","executeCommand","Object","keys","length","registerKeymap","some","d","registerMiddleware","_state","next","patched","patchedSteps","step","steps","push","markName","mark","find","removeStep","blockId","from","to","path","storedMarksAfter","hasSup","m","hasSub","removeType","findLastIndex","toolbar","featureEnabled","isEnabled","markType","charAt","toUpperCase","slice"],"mappings":"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"}
1
+ {"version":3,"file":"super-sub.mjs","sources":["../../src/plugins/super-sub/SuperSubLocale.ts","../../src/plugins/super-sub/SuperSubPlugin.ts"],"sourcesContent":["/**\n * Locale interface and default English locale for the SuperSubPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface SuperSubLocale {\n\treadonly superscriptLabel: string;\n\treadonly superscriptTooltip: (shortcut: string) => string;\n\treadonly subscriptLabel: string;\n\treadonly subscriptTooltip: (shortcut: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const SUPER_SUB_LOCALE_EN: SuperSubLocale = {\n\tsuperscriptLabel: 'Superscript',\n\tsuperscriptTooltip: (shortcut: string) => `Superscript (${shortcut})`,\n\tsubscriptLabel: 'Subscript',\n\tsubscriptTooltip: (shortcut: string) => `Subscript (${shortcut})`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: Record<string, () => Promise<{ default: SuperSubLocale }>> = import.meta.glob<{\n\tdefault: SuperSubLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadSuperSubLocale(lang: string): Promise<SuperSubLocale> {\n\tif (lang === 'en') return SUPER_SUB_LOCALE_EN;\n\tconst loader = localeModules[`./locales/${lang}.ts`];\n\tif (!loader) return SUPER_SUB_LOCALE_EN;\n\ttry {\n\t\tconst mod = await loader();\n\t\treturn mod.default;\n\t} catch {\n\t\treturn SUPER_SUB_LOCALE_EN;\n\t}\n}\n","/**\n * SuperSubPlugin: registers superscript and subscript inline marks with\n * MarkSpecs, toggle commands, keyboard shortcuts, toolbar buttons, and\n * a middleware that enforces mutual exclusivity between the two marks.\n *\n * Data-driven — each mark type is defined declaratively and all\n * registrations are derived from the same definition table.\n */\n\nimport { isMarkActive, toggleMark } from '../../commands/Commands.js';\nimport type { Mark } from '../../model/Document.js';\nimport type { ParseRule } from '../../model/ParseRule.js';\nimport type { SanitizeConfig } from '../../model/SanitizeConfig.js';\nimport { markType as mkType } from '../../model/TypeBrands.js';\nimport type { RemoveMarkStep, Step } from '../../state/Transaction.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale, toCommandName } from '../shared/PluginHelpers.js';\nimport { formatShortcut } from '../shared/ShortcutFormatting.js';\nimport { SUPER_SUB_LOCALE_EN, type SuperSubLocale, loadSuperSubLocale } from './SuperSubLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tsuperscript: Record<string, never>;\n\t\tsubscript: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\n/** Controls toolbar button visibility per mark. */\nexport interface SuperSubToolbarConfig {\n\treadonly superscript?: boolean;\n\treadonly subscript?: boolean;\n}\n\n/** Controls which marks are enabled and which toolbar buttons are shown. */\nexport interface SuperSubConfig {\n\treadonly superscript: boolean;\n\treadonly subscript: boolean;\n\treadonly toolbar?: SuperSubToolbarConfig;\n\treadonly locale?: SuperSubLocale;\n}\n\nconst DEFAULT_CONFIG: SuperSubConfig = {\n\tsuperscript: true,\n\tsubscript: true,\n};\n\n// --- Mark Definitions ---\n\ninterface MarkDefinition {\n\treadonly type: 'superscript' | 'subscript';\n\treadonly opposite: 'superscript' | 'subscript';\n\treadonly configKey: keyof Omit<SuperSubConfig, 'toolbar' | 'locale'>;\n\treadonly rank: number;\n\treadonly tag: string;\n\treadonly icon: string;\n\treadonly keyBinding: string;\n\treadonly toHTMLString: (content: string) => string;\n\treadonly parseHTML: readonly ParseRule[];\n\treadonly sanitize: SanitizeConfig;\n}\n\nconst SUPERSCRIPT_ICON: string = [\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">',\n\t'<path d=\"M16 7.41L11.41 12 16 16.59 14.59 18l-6-6 6-6z\"',\n\t' fill=\"none\"/>',\n\t'<path d=\"M9.64 7.64c.23-.5.36-1.05.36-1.64',\n\t' 0-2.21-1.79-4-4-4H2v14h4.36c2.34 0 4.24-1.9',\n\t' 4.24-4.24 0-1.6-.89-2.99-2.2-3.71zM4.5 4.5H6c.83',\n\t' 0 1.5.67 1.5 1.5S6.83 7.5 6 7.5H4.5v-3zm2 9H4.5v-3H6.5c.83',\n\t' 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\" fill=\"none\"/>',\n\t'<path d=\"M15.97 3.84c0-.47.19-.91.53-1.21.34-.31.8-.49',\n\t' 1.3-.49.5 0 .95.18 1.28.48.32.3.5.7.51 1.15h1.59c-.02',\n\t'-.96-.43-1.83-1.13-2.42C19.36.77 18.45.44 17.5.44c-.88',\n\t' 0-1.74.28-2.39.8-.67.53-1.06 1.28-1.06 2.1 0 .76.34',\n\t' 1.47.93 1.97.59.49 1.41.84 2.32 1.15.7.24 1.26.5 1.62.8.35.3.53.64.53',\n\t' 1.02 0 .48-.2.93-.55 1.24-.36.3-.84.48-1.37.48-.55 0-1.04-.2-1.39-.54',\n\t'-.34-.33-.53-.8-.53-1.32h-1.58c.01 1.02.43 1.95 1.16 2.57.72.62 1.67.96',\n\t' 2.67.96.92 0 1.81-.3 2.46-.84.67-.56 1.04-1.33 1.04-2.18 0-.81-.36-1.56',\n\t'-.99-2.08-.62-.51-1.48-.88-2.43-1.2-.67-.23-1.2-.47-1.52-.75-.32-.27-.46',\n\t'-.59-.46-.94z\"/>',\n\t'<path d=\"M5.88 20h2.66l3.4-5.42L15.3 20h2.67l-4.73-7.38',\n\t' 4.37-6.62h-2.6l-3.07 4.98L8.92 6h-2.6l4.26 6.58z\"/>',\n\t'</svg>',\n].join('');\n\nconst SUBSCRIPT_ICON: string = [\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">',\n\t'<path d=\"M15.97 16.84c0-.47.19-.91.53-1.21.34-.31.8-.49',\n\t' 1.3-.49.5 0 .95.18 1.28.48.32.3.5.7.51 1.15h1.59c-.02',\n\t'-.96-.43-1.83-1.13-2.42-.7-.58-1.61-.91-2.56-.91-.88',\n\t' 0-1.74.28-2.39.8-.67.53-1.06 1.28-1.06 2.1 0 .76.34',\n\t' 1.47.93 1.97.59.49 1.41.84 2.32 1.15.7.24 1.26.5 1.62.8.35.3.53.64.53',\n\t' 1.02 0 .48-.2.93-.55 1.24-.36.3-.84.48-1.37.48-.55 0-1.04-.2-1.39-.54',\n\t'-.34-.33-.53-.8-.53-1.32h-1.58c.01 1.02.43 1.95 1.16 2.57.72.62 1.67.96',\n\t' 2.67.96.92 0 1.81-.3 2.46-.84.67-.56 1.04-1.33 1.04-2.18 0-.81-.36-1.56',\n\t'-.99-2.08-.62-.51-1.48-.88-2.43-1.2-.67-.23-1.2-.47-1.52-.75-.32-.27-.46',\n\t'-.59-.46-.94z\"/>',\n\t'<path d=\"M5.88 18h2.66l3.4-5.42L15.3 18h2.67l-4.73-7.38',\n\t' 4.37-6.62h-2.6l-3.07 4.98L8.92 4h-2.6l4.26 6.58z\"/>',\n\t'</svg>',\n].join('');\n\nconst MARK_DEFINITIONS: readonly MarkDefinition[] = [\n\t{\n\t\ttype: 'superscript',\n\t\topposite: 'subscript',\n\t\tconfigKey: 'superscript',\n\t\trank: 4,\n\t\ttag: 'sup',\n\t\ticon: SUPERSCRIPT_ICON,\n\t\tkeyBinding: 'Mod-.',\n\t\ttoHTMLString: (content) => `<sup>${content}</sup>`,\n\t\tparseHTML: [{ tag: 'sup' }],\n\t\tsanitize: { tags: ['sup'] },\n\t},\n\t{\n\t\ttype: 'subscript',\n\t\topposite: 'superscript',\n\t\tconfigKey: 'subscript',\n\t\trank: 4,\n\t\ttag: 'sub',\n\t\ticon: SUBSCRIPT_ICON,\n\t\tkeyBinding: 'Mod-,',\n\t\ttoHTMLString: (content) => `<sub>${content}</sub>`,\n\t\tparseHTML: [{ tag: 'sub' }],\n\t\tsanitize: { tags: ['sub'] },\n\t},\n];\n\n// --- Plugin ---\n\nexport class SuperSubPlugin implements Plugin {\n\treadonly id = 'super-sub';\n\treadonly name = 'Superscript & Subscript';\n\treadonly priority = 23;\n\n\tprivate readonly config: SuperSubConfig;\n\tprivate locale!: SuperSubLocale;\n\n\tconstructor(config?: Partial<SuperSubConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tSUPER_SUB_LOCALE_EN,\n\t\t\tloadSuperSubLocale,\n\t\t);\n\n\t\tconst enabledMarks: MarkDefinition[] = MARK_DEFINITIONS.filter(\n\t\t\t(def) => this.config[def.configKey],\n\t\t);\n\n\t\tfor (const def of enabledMarks) {\n\t\t\tthis.registerMark(context, def);\n\t\t}\n\n\t\tthis.registerKeymaps(context, enabledMarks);\n\t\tthis.registerExclusivityMiddleware(context, enabledMarks);\n\t\tthis.registerDisabledToolbarItems(context);\n\t}\n\n\tprivate registerMark(context: PluginContext, def: MarkDefinition): void {\n\t\tconst commandName: string = toCommandName(def.type);\n\t\tconst toolbarVisible: boolean = this.isToolbarVisible(def.configKey);\n\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: def.type,\n\t\t\trank: def.rank,\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement(def.tag);\n\t\t\t},\n\t\t\ttoHTMLString: (_mark, content) => def.toHTMLString(content),\n\t\t\tparseHTML: def.parseHTML,\n\t\t\tsanitize: def.sanitize,\n\t\t});\n\n\t\tcontext.registerCommand(commandName, () => {\n\t\t\tconst tr = toggleMark(context.getState(), mkType(def.type));\n\t\t\tif (tr) {\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (toolbarVisible) {\n\t\t\tconst label: string =\n\t\t\t\tdef.type === 'superscript' ? this.locale.superscriptLabel : this.locale.subscriptLabel;\n\t\t\tconst tooltip: string =\n\t\t\t\tdef.type === 'superscript'\n\t\t\t\t\t? this.locale.superscriptTooltip(formatShortcut(def.keyBinding))\n\t\t\t\t\t: this.locale.subscriptTooltip(formatShortcut(def.keyBinding));\n\t\t\tcontext.registerToolbarItem({\n\t\t\t\tid: def.type,\n\t\t\t\tgroup: 'format',\n\t\t\t\ticon: def.icon,\n\t\t\t\tlabel,\n\t\t\t\ttooltip,\n\t\t\t\tcommand: commandName,\n\t\t\t\tisActive: (state) => isMarkActive(state, mkType(def.type)),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate registerKeymaps(context: PluginContext, marks: readonly MarkDefinition[]): void {\n\t\tconst keymap: Record<string, () => boolean> = {};\n\t\tfor (const def of marks) {\n\t\t\tconst commandName: string = toCommandName(def.type);\n\t\t\tkeymap[def.keyBinding] = () => context.executeCommand(commandName);\n\t\t}\n\t\tif (Object.keys(keymap).length > 0) {\n\t\t\tcontext.registerKeymap(keymap);\n\t\t}\n\t}\n\n\t/**\n\t * Ensures superscript and subscript are mutually exclusive.\n\t * When an addMark step for one type is found, a removeMark step\n\t * for the opposite type is injected. For stored marks, the opposite\n\t * mark is filtered out.\n\t */\n\tprivate registerExclusivityMiddleware(\n\t\tcontext: PluginContext,\n\t\tenabledMarks: readonly MarkDefinition[],\n\t): void {\n\t\tconst bothEnabled: boolean =\n\t\t\tenabledMarks.some((d) => d.type === 'superscript') &&\n\t\t\tenabledMarks.some((d) => d.type === 'subscript');\n\n\t\tif (!bothEnabled) return;\n\n\t\tcontext.registerMiddleware(\n\t\t\t(tr, _state, next) => {\n\t\t\t\tlet patched = false;\n\n\t\t\t\t// Handle addMark steps: inject removeMark for the opposite type\n\t\t\t\tconst patchedSteps: Step[] = [];\n\t\t\t\tfor (const step of tr.steps) {\n\t\t\t\t\tif (step.type !== 'addMark') {\n\t\t\t\t\t\tpatchedSteps.push(step);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst markName: string = step.mark.type;\n\t\t\t\t\tconst def: MarkDefinition | undefined = MARK_DEFINITIONS.find((d) => d.type === markName);\n\t\t\t\t\tif (!def) {\n\t\t\t\t\t\tpatchedSteps.push(step);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tpatched = true;\n\t\t\t\t\tconst removeStep: RemoveMarkStep = {\n\t\t\t\t\t\ttype: 'removeMark',\n\t\t\t\t\t\tblockId: step.blockId,\n\t\t\t\t\t\tfrom: step.from,\n\t\t\t\t\t\tto: step.to,\n\t\t\t\t\t\tmark: { type: mkType(def.opposite) },\n\t\t\t\t\t\t...(step.path ? { path: step.path } : {}),\n\t\t\t\t\t};\n\t\t\t\t\tpatchedSteps.push(removeStep, step);\n\t\t\t\t}\n\n\t\t\t\t// Handle stored marks: remove the opposite mark\n\t\t\t\tlet storedMarksAfter: readonly Mark[] | null = tr.storedMarksAfter;\n\t\t\t\tif (storedMarksAfter) {\n\t\t\t\t\tconst hasSup: boolean = storedMarksAfter.some((m) => m.type === 'superscript');\n\t\t\t\t\tconst hasSub: boolean = storedMarksAfter.some((m) => m.type === 'subscript');\n\n\t\t\t\t\tif (hasSup && hasSub) {\n\t\t\t\t\t\t// Keep the one that was most recently added (last in array)\n\t\t\t\t\t\tconst lastSupIdx: number = storedMarksAfter.findLastIndex(\n\t\t\t\t\t\t\t(m) => m.type === 'superscript',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst lastSubIdx: number = storedMarksAfter.findLastIndex(\n\t\t\t\t\t\t\t(m) => m.type === 'subscript',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst removeType: string = lastSupIdx > lastSubIdx ? 'subscript' : 'superscript';\n\n\t\t\t\t\t\tstoredMarksAfter = storedMarksAfter.filter((m) => m.type !== removeType);\n\t\t\t\t\t\tpatched = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnext(patched ? { ...tr, steps: patchedSteps, storedMarksAfter } : tr);\n\t\t\t},\n\t\t\t{ name: 'super-sub:exclusivity' },\n\t\t);\n\t}\n\n\t/**\n\t * Registers disabled toolbar buttons for marks whose feature is disabled\n\t * but whose toolbar button is explicitly requested.\n\t */\n\tprivate registerDisabledToolbarItems(context: PluginContext): void {\n\t\tif (!this.config.toolbar) return;\n\n\t\tfor (const def of MARK_DEFINITIONS) {\n\t\t\tconst featureEnabled: boolean = this.config[def.configKey];\n\t\t\tconst toolbarVisible: boolean = this.config.toolbar[def.configKey] ?? true;\n\n\t\t\tif (!featureEnabled && toolbarVisible) {\n\t\t\t\tconst label: string =\n\t\t\t\t\tdef.type === 'superscript' ? this.locale.superscriptLabel : this.locale.subscriptLabel;\n\t\t\t\tcontext.registerToolbarItem({\n\t\t\t\t\tid: def.type,\n\t\t\t\t\tgroup: 'format',\n\t\t\t\t\ticon: def.icon,\n\t\t\t\t\tlabel,\n\t\t\t\t\tcommand: toCommandName(def.type),\n\t\t\t\t\tisEnabled: () => false,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isToolbarVisible(configKey: keyof Omit<SuperSubConfig, 'toolbar' | 'locale'>): boolean {\n\t\tif (!this.config.toolbar) return true;\n\t\treturn this.config.toolbar[configKey] ?? true;\n\t}\n}\n"],"names":["SUPER_SUB_LOCALE_EN","superscriptLabel","superscriptTooltip","shortcut","subscriptLabel","subscriptTooltip","localeModules","assign","import","async","loadSuperSubLocale","lang","loader","default","DEFAULT_CONFIG","superscript","subscript","MARK_DEFINITIONS","type","opposite","configKey","rank","tag","icon","join","keyBinding","toHTMLString","content","parseHTML","sanitize","tags","SuperSubPlugin","id","name","priority","config","locale","constructor","this","init","context","resolveLocale","enabledMarks","filter","def","registerMark","registerKeymaps","registerExclusivityMiddleware","registerDisabledToolbarItems","commandName","toCommandName","toolbarVisible","isToolbarVisible","registerMarkSpec","toDOM","document","createElement","_mark","registerCommand","tr","toggleMark","getState","mkType","dispatch","label","tooltip","formatShortcut","registerToolbarItem","group","command","isActive","state","isMarkActive","marks","keymap","executeCommand","Object","keys","length","registerKeymap","some","d","registerMiddleware","_state","next","patched","patchedSteps","step","steps","push","markName","mark","find","removeStep","blockId","from","to","path","storedMarksAfter","hasSup","m","hasSub","removeType","findLastIndex","toolbar","featureEnabled","isEnabled"],"mappings":"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"}
@@ -22,6 +22,7 @@ export declare function buildDeleteColumnTransaction(state: EditorState, tableId
22
22
  /**
23
23
  * Creates a transaction that removes the given root-level table node.
24
24
  * Cursor placement prefers the next root block, then previous.
25
+ * If the table is the only root block, it is replaced with an empty paragraph.
25
26
  */
26
27
  export declare function createDeleteTableTransaction(state: EditorState, tableId: BlockId): Transaction | null;
27
28
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TableCommands.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/TableCommands.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,2BAA2B,CAAC;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAUlD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,sEAAsE;AACtE,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,GACd,WAAW,GAAG,IAAI,CAoBpB;AAED,yEAAyE;AACzE,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,GACd,WAAW,GAAG,IAAI,CAcpB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,SAAI,GACd,WAAW,GAAG,IAAI,CAmBpB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,SAAI,GACd,WAAW,GAAG,IAAI,CA2BpB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,GACd,WAAW,GAAG,IAAI,CAkBpB;AAQD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAiDvF;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAYhF;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAYhF;AAED,uDAAuD;AACvD,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAElF;AAED,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAEnF;AAiBD,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAiB9E;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAiBjF;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAUhF;AAED,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAsB3D;AAED,gEAAgE;AAChE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAUvF"}
1
+ {"version":3,"file":"TableCommands.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/TableCommands.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,2BAA2B,CAAC;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAUlD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,sEAAsE;AACtE,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,GACd,WAAW,GAAG,IAAI,CAoBpB;AAED,yEAAyE;AACzE,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,GACd,WAAW,GAAG,IAAI,CAcpB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,SAAI,GACd,WAAW,GAAG,IAAI,CAmBpB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,SAAI,GACd,WAAW,GAAG,IAAI,CA2BpB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,GACd,WAAW,GAAG,IAAI,CAkCpB;AAQD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAiDvF;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAYhF;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAYhF;AAED,uDAAuD;AACvD,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAElF;AAED,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAEnF;AAiBD,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAiB9E;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAiBjF;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAUhF;AAED,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAsB3D;AAED,gEAAgE;AAChE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAUvF"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableContextMenu.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/TableContextMenu.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG3E,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIrE,MAAM,WAAW,sBAAsB;IACtC,MAAM,IAAI,OAAO,CAAC;IAClB,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CAChB;AAyCD;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,OAAO,EACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,EACrB,MAAM,GAAE,WAA6B,EACrC,YAAY,CAAC,EAAE,YAAY,GACzB,sBAAsB,CAuSxB"}
1
+ {"version":3,"file":"TableContextMenu.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/TableContextMenu.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG3E,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIrE,MAAM,WAAW,sBAAsB;IACtC,MAAM,IAAI,OAAO,CAAC;IAClB,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CAChB;AAyCD;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,OAAO,EACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,EACrB,MAAM,GAAE,WAA6B,EACrC,YAAY,CAAC,EAAE,YAAY,GACzB,sBAAsB,CAkTxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableNavigation.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/TableNavigation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAUlD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,8CAA8C;AAC9C,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAetF"}
1
+ {"version":3,"file":"TableNavigation.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/TableNavigation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAUlD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,8CAA8C;AAC9C,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAetF"}
@@ -1 +1 @@
1
- {"version":3,"file":"TablePlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/TablePlugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,iCAAiC,CAAC;AASjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAK1D,OAAO,EAAmB,KAAK,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAetF,OAAO,QAAQ,6BAA6B,CAAC;IAC5C,UAAU,gBAAgB;QACzB,KAAK,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjC,UAAU,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACnD;CACD;AAID,MAAM,WAAW,WAAW;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,qDAAqD;IACrD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC9B;AAoCD,qBAAa,WAAY,YAAW,MAAM;IACzC,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,OAAO,CAA8B;gBAEjC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAInC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBjD,OAAO,IAAI,IAAI;IAMf,OAAO,IAAI,IAAI;IAOf,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa;IA0B9C,OAAO,CAAC,iBAAiB;IAgEzB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,mBAAmB;CAyB3B"}
1
+ {"version":3,"file":"TablePlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/TablePlugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAQjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAM1D,OAAO,EAAmB,KAAK,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAetF,OAAO,QAAQ,6BAA6B,CAAC;IAC5C,UAAU,gBAAgB;QACzB,KAAK,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjC,UAAU,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACnD;CACD;AAID,MAAM,WAAW,WAAW;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,qDAAqD;IACrD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC9B;AAoCD,qBAAa,WAAY,YAAW,MAAM;IACzC,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,OAAO,CAA8B;gBAEjC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAInC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjD,OAAO,IAAI,IAAI;IAMf,OAAO,IAAI,IAAI;IAOf,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa;IA0B9C,OAAO,CAAC,iBAAiB;IAgEzB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,mBAAmB;CAyB3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableSelection.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/TableSelection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,iDAAiD;AACjD,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACrC,gBAAgB,IAAI,SAAS,GAAG,IAAI,CAAC;IACrC,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;IAChD,yFAAyF;IACzF,oBAAoB,IAAI,IAAI,CAAC;IAC7B,kBAAkB,IAAI,SAAS,OAAO,EAAE,CAAC;IACzC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;CACrC;AAED,eAAO,MAAM,wBAAwB,mCAA0D,CAAC;AAEhG,uDAAuD;AACvD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,aAAa,GAAG,qBAAqB,CA2DzF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,qBAAqB,GAC5B,MAAM,IAAI,CAqFZ"}
1
+ {"version":3,"file":"TableSelection.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/TableSelection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,iDAAiD;AACjD,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACrC,gBAAgB,IAAI,SAAS,GAAG,IAAI,CAAC;IACrC,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;IAChD,yFAAyF;IACzF,oBAAoB,IAAI,IAAI,CAAC;IAC7B,kBAAkB,IAAI,SAAS,OAAO,EAAE,CAAC;IACzC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;CACrC;AAED,eAAO,MAAM,wBAAwB,mCAA0D,CAAC;AAEhG,uDAAuD;AACvD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,aAAa,GAAG,qBAAqB,CA2DzF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,qBAAqB,GAC5B,MAAM,IAAI,CA+FZ"}
@@ -1,2 +1,3 @@
1
1
  export { TablePlugin, type TableConfig, } from './TablePlugin.js';
2
+ export { TableSelectionServiceKey, type TableSelectionService } from './TableSelection.js';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,WAAW,EACX,KAAK,WAAW,GAChB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,WAAW,EACX,KAAK,WAAW,GAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,wBAAwB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,2 +1,2 @@
1
- import{D as t,n as e}from"../chunks/Decoration-D49mFXrH.mjs";import{a as n}from"../chunks/LocaleService-B6Z-wyAF.mjs";import{e as o}from"../chunks/HTMLUtils-CCvQ5f83.mjs";import{h as r,g as i,c as l,b as s,i as a}from"../chunks/Selection-6-W6Flxc.mjs";import{c}from"../chunks/ColorValidation-DCSKq9B2.mjs";import{r as d,g as u}from"../chunks/ColorGrid-CpkbKfXg.mjs";import{g as b,s as p,c as h,e as f,f as m}from"../chunks/Document-BFYAonMF.mjs";import{n as g}from"../chunks/TypeBrands-Bp_Z_o5Y.mjs";import{a as v,s as x,e as w}from"../chunks/StyleRuntime-BmsLoEa8.mjs";import{a as C}from"../chunks/KeyboardNav-DsYhKKuV.mjs";import{p as I}from"../chunks/PopupPositioning-DtvqMSop.mjs";import{S as y}from"../chunks/Plugin-OzM8Oxm_.mjs";function k(){const t=h(g("paragraph"),[f("")],p());return h(g("table_cell"),[t],p())}function S(t,e){const n=t.getNodePath(e);if(!n)return null;let o=null,r=null,i=null,l=null;for(const b of n){const e=t.getBlock(b);e&&("table"===e.type?(o=b,r=e):"table_row"===e.type?i=b:"table_cell"===e.type&&(l=b))}const s=t.getBlock(e);if("table_cell"===s?.type&&(l=e),!(o&&r&&l&&i))return null;const a=t.doc.children.findIndex(t=>t.id===o),c=b(r),d=c.findIndex(t=>t.id===i);if(-1===d)return null;const u=c[d];if(!u)return null;const p=b(u),h=p.findIndex(t=>t.id===l);if(-1===h)return null;const f=p.length,m=c.length;return{tableId:o,tableIndex:a,rowId:i,rowIndex:d,cellId:l,colIndex:h,totalRows:m,totalCols:f}}function L(t,e,n,o){const r=t.getBlock(e);if(!r)return null;const i=b(r)[n];if(!i)return null;const l=b(i)[o];return l?.id??null}function A(t,e){const n=t.getBlock(e);if(!n)return e;const o=b(n)[0];if(!o)return e;let r=o;for(;;){const t=b(r)[0];if(!t)return r.id;r=t}}function B(t,e){const n=t.getBlock(e);if(!n)return e;const o=b(n),r=o[o.length-1];if(!r)return e;let i=r;for(;;){const t=b(i),e=t[t.length-1];if(!e)return i.id;i=e}}function R(t,e){const n=t.getNodePath(e);if(!n)return!1;for(const o of n){const e=t.getBlock(o);if("table"===e?.type)return!0}return!1}const E={insertRowAbove:"Insert Row Above",insertRowBelow:"Insert Row Below",insertColumnLeft:"Insert Column Left",insertColumnRight:"Insert Column Right",deleteRow:"Delete Row",deleteColumn:"Delete Column",borderColorLabel:"Border Color...",deleteTable:"Delete Table",tableActions:"Table actions",menuKeyboardHint:"↑↓ Navigate · Enter Select · Esc Close",insertRow:"Insert row",insertColumn:"Insert column",addRow:"Add row",addColumn:"Add column",tableActionsHint:"Table actions (Right-click or Shift+F10)",contextMenuHint:"Right-click or Shift+F10 for table actions",borderColor:"Border color",defaultColor:"Default",noBorders:"No borders",borderColorPicker:"Border color picker",announceBorderColorSet:t=>`Table border color set to ${t}`,announceBorderReset:"Table borders reset to default",borderSwatchLabel:t=>`Border ${t}`,announceRowInsertedAbove:"Row inserted above",announceRowInsertedBelow:"Row inserted below",announceColumnInserted:t=>`Column inserted ${t}`,announceRowDeleted:"Row deleted",announceColumnDeleted:"Column deleted",announceTableDeleted:"Table deleted",insertTable:"Insert Table",tableAriaLabel:(t,e)=>`Table with ${t} rows and ${e} columns`,tableAriaDescription:"Right-click or press Shift+F10 for table actions"},T=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("../chunks/ar-CzVj8p__.mjs"),"./locales/de.ts":()=>import("../chunks/de-B4y4ndUw.mjs"),"./locales/es.ts":()=>import("../chunks/es-MgguVgIs.mjs"),"./locales/fr.ts":()=>import("../chunks/fr-RHXmueoO.mjs"),"./locales/hi.ts":()=>import("../chunks/hi-g7i0bmig.mjs"),"./locales/pt.ts":()=>import("../chunks/pt-DJfJVeY8.mjs"),"./locales/ru.ts":()=>import("../chunks/ru-B8teJin_.mjs"),"./locales/zh.ts":()=>import("../chunks/zh-Cpbg4evx.mjs")}),M=["#000000","#434343","#666666","#999999","#b7b7b7","#cccccc","#d9d9d9","#efefef","#980000","#cc0000","#e69138","#f1c232","#6aa84f","#45818e","#3c78d8","#3d85c6","#674ea7","#a64d79","#0b5394","#38761d"];function N(t,e,n){const o=t.getBlock(e);if(!o||"table"!==o.type)return null;const r=t.getNodePath(e);if(!r)return null;if(void 0===n){const{borderColor:e,...n}=o.attrs??{},i=n;return t.transaction("command").setNodeAttr(r,i).setSelection(t.selection).build()}const i={...o.attrs,borderColor:n};return t.transaction("command").setNodeAttr(r,i).setSelection(t.selection).build()}function H(t,e,n=E){const o=t.getState();if(r(o.selection)||i(o.selection))return!1;const l=S(o,o.selection.anchor.blockId);if(!l)return!1;const s=N(o,l.tableId,e);if(!s)return!1;t.dispatch(s);const a="none"===e?"none":u(e);return t.announce(n.announceBorderColorSet(a)),!0}function D(t,e=E){const n=t.getState();if(r(n.selection)||i(n.selection))return!1;const o=S(n,n.selection.anchor.blockId);if(!o)return!1;const l=N(n,o.tableId,void 0);return!!l&&(t.dispatch(l),t.announce(e.announceBorderReset),!0)}function P(t,e){const n=t.getBlock(e);if(n)return n.attrs?.borderColor}function z(t,e,n,o,r=E){t.classList.add("notectl-color-picker");const i=P(e.getState(),n),l=document.createElement("button");l.type="button",l.className="notectl-color-picker__default",l.textContent=r.defaultColor,l.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),D(e,r),o()}),l.addEventListener("keydown",t=>{"Escape"===t.key&&(t.preventDefault(),o())}),t.appendChild(l);const s=document.createElement("button");s.type="button",s.className="notectl-color-picker__default",s.textContent=r.noBorders,s.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),H(e,"none",r),o()}),s.addEventListener("keydown",t=>{"Escape"===t.key&&(t.preventDefault(),o())}),t.appendChild(s),d(t,{colors:M,columns:5,ariaLabel:r.borderColorPicker,ariaLabelPrefix:"",activeColor:i??null,swatchLabel:r.borderSwatchLabel,titleAsName:!0,onSelect:t=>{H(e,t,r),o()},onClose:o})}function $(t,e,n){const o=t.getBlock(e);if(!o)return null;const r=b(o),i=r[0]?b(r[0]).length:0;if(0===i)return null;const s=function(t){const e=[];for(let n=0;n<t;n++)e.push(k());return h(g("table_row"),e,p())}(i),a=t.transaction("command").insertNode([e],n,s),c=b(s)[0],d=c?b(c)[0]:void 0;return d?a.setSelection(l(d.id,0)):c&&a.setSelection(l(c.id,0)),a.build()}function j(t,e,n){const o=t.getBlock(e);if(!o)return null;const r=b(o),i=t.transaction("command");for(const l of r){const t=k();i.insertNode([e,l.id],n,t)}return i.setSelection(t.selection),i.build()}function _(t,e,n,o=0){const r=t.getBlock(e);if(!r)return null;if(b(r).length<=1)return O(t,e);const i=t.transaction("command").removeNode([e],n),s=L(t,e,n>0?n-1:1,o);if(s){const e=A(t,s);i.setSelection(l(e,0))}return i.build()}function V(t,e,n,o=0){const r=t.getBlock(e);if(!r)return null;const i=b(r);if((i[0]?b(i[0]).length:0)<=1)return O(t,e);const s=t.transaction("command");for(let l=i.length-1;l>=0;l--){const t=i[l];t&&s.removeNode([e,t.id],n)}const a=L(t,e,o,n>0?n-1:1);if(a){const e=A(t,a);s.setSelection(l(e,0))}return s.build()}function O(t,e){const n=t.doc.children.findIndex(t=>t.id===e);if(-1===n)return null;const o=t.transaction("command").removeNode([],n),r=t.doc.children[n+1];if(r)return o.setSelection(l(r.id,0)),o.build();const i=t.doc.children[n-1];return i&&o.setSelection(l(i.id,0)),o.build()}function q(t,e,n){const o=t.getState(),s=o.selection;if(r(s)||i(s))return!1;const a=s.anchor.blockId;let c=-1;for(let r=0;r<o.doc.children.length;r++){const t=o.doc.children[r];if(!t)continue;if(t.id===a){c=r;break}const e=o.getNodePath(a);if(e&&e[0]===t.id){c=r;break}}-1===c&&(c=o.doc.children.length-1);const d=function(t,e){const n=p(),o=[];for(let r=0;r<t;r++){const t=[];for(let n=0;n<e;n++)t.push(k());o.push(h(g("table_row"),t,p()))}return h(g("table"),o,n)}(e,n),u=h(g("paragraph")),f=c+1,m=o.transaction("command").insertNode([],f,d).insertNode([],f+1,u),v=b(d)[0],x=v?b(v)[0]:void 0,w=x?b(x)[0]:void 0;return w?m.setSelection(l(w.id,0)):x&&m.setSelection(l(x.id,0)),t.dispatch(m.build()),!0}function F(t,e){const n=t.getState();if(r(n.selection)||i(n.selection))return!1;const o=S(n,n.selection.anchor.blockId);if(!o)return!1;const l=$(n,o.tableId,o.rowIndex+1);return!!l&&(t.dispatch(l),t.announce(e.announceRowInsertedBelow),!0)}function Z(t,e,n){const o=t.getState();if(r(o.selection)||i(o.selection))return!1;const l=S(o,o.selection.anchor.blockId);if(!l)return!1;const s="left"===e?l.colIndex:l.colIndex+1,a=j(o,l.tableId,s);return!!a&&(t.dispatch(a),t.announce(n.announceColumnInserted(e)),!0)}function Y(t,e){t.registerCommand("insertTable",()=>q(t,3,3)),t.registerCommand("addRowAbove",()=>function(t,e){const n=t.getState();if(r(n.selection)||i(n.selection))return!1;const o=S(n,n.selection.anchor.blockId);if(!o)return!1;const l=$(n,o.tableId,o.rowIndex);return!!l&&(t.dispatch(l),t.announce(e.announceRowInsertedAbove),!0)}(t,e)),t.registerCommand("addRowBelow",()=>F(t,e)),t.registerCommand("addColumnLeft",()=>function(t,e){return Z(t,"left",e)}(t,e)),t.registerCommand("addColumnRight",()=>function(t,e){return Z(t,"right",e)}(t,e)),t.registerCommand("deleteRow",()=>function(t,e){const n=t.getState();if(r(n.selection)||i(n.selection))return!1;const o=S(n,n.selection.anchor.blockId);if(!o)return!1;const l=_(n,o.tableId,o.rowIndex,o.colIndex);return!!l&&(t.dispatch(l),t.announce(e.announceRowDeleted),!0)}(t,e)),t.registerCommand("deleteColumn",()=>function(t,e){const n=t.getState();if(r(n.selection)||i(n.selection))return!1;const o=S(n,n.selection.anchor.blockId);if(!o)return!1;const l=V(n,o.tableId,o.colIndex,o.rowIndex);return!!l&&(t.dispatch(l),t.announce(e.announceColumnDeleted),!0)}(t,e)),t.registerCommand("selectTable",()=>function(t){const e=t.getState(),n=e.selection;if(r(n)){const t=e.getBlock(n.nodeId);return"table"===t?.type}if(i(n))return!1;const o=S(e,n.anchor.blockId);if(!o)return!1;const l=e.getNodePath(o.tableId);if(!l)return!1;const a=e.transaction("command").setSelection(s(o.tableId,l)).build();return t.dispatch(a),!0}(t)),t.registerCommand("deleteTable",()=>function(t,e){const n=t.getState(),o=function(t){if(r(t.selection)){const e=t.getBlock(t.selection.nodeId);return"table"!==e?.type?null:{tableId:e.id}}if(i(t.selection))return null;const e=S(t,t.selection.anchor.blockId);return e?{tableId:e.tableId}:null}(n);if(!o)return!1;const l=O(n,o.tableId);return!!l&&(t.dispatch(l),t.announce(e.announceTableDeleted),!0)}(t,e))}function K(t,e,n,o,r,i=E,l){let s=!0,a=null;const c=document.createElement("div");c.className="notectl-table-context-menu",c.setAttribute("role","menu"),c.setAttribute("aria-label",i.tableActions),c.setAttribute("contenteditable","false");const d=[];let u=0;const b=function(t){return[{type:"item",label:t.insertRowAbove,command:"addRowAbove"},{type:"item",label:t.insertRowBelow,command:"addRowBelow"},{type:"separator"},{type:"item",label:t.insertColumnLeft,command:"addColumnLeft"},{type:"item",label:t.insertColumnRight,command:"addColumnRight"},{type:"separator"},{type:"item",label:t.deleteRow,command:"deleteRow"},{type:"item",label:t.deleteColumn,command:"deleteColumn"},{type:"separator"},{type:"submenu",label:t.borderColorLabel,id:"borderColor"},{type:"separator"},{type:"item",label:t.deleteTable,command:"deleteTable"}]}(i);for(const v of b){if("separator"===v.type){const t=document.createElement("div");t.setAttribute("role","separator"),c.appendChild(t);continue}const t=document.createElement("button");t.type="button",t.setAttribute("role","menuitem"),t.textContent=v.label,"submenu"===v.type&&(t.dataset.submenu=v.id,t.setAttribute("aria-haspopup","true"),t.setAttribute("aria-expanded","false")),"item"===v.type&&(t.dataset.command=v.command),t.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),t.addEventListener("click",n=>{n.stopPropagation(),"item"===v.type?(e.executeCommand(v.command),g()):"submenu"===v.type&&h(t)}),d.push(t),c.appendChild(t)}const p=document.createElement("div");function h(o){f(),o.setAttribute("aria-expanded","true");{a=document.createElement("div"),a.className="notectl-table-context-menu",v(a,"position","fixed"),a.setAttribute("contenteditable","false"),a.addEventListener("keydown",t=>{t.stopPropagation();const e="rtl"===getComputedStyle(c).direction?"ArrowRight":"ArrowLeft";t.key===e&&(t.preventDefault(),f(),o.focus())}),z(a,e,n,()=>g(),i),t.appendChild(a);const r=o.getBoundingClientRect(),l=c.getBoundingClientRect();let s=r.top;const d=window.innerWidth,u=window.innerHeight;let b;"rtl"===getComputedStyle(c).direction?(b=l.left-200-2,b<0&&(b=l.right+2)):(b=l.right+2,b+200>d&&(b=l.left-200-2)),s+200>u&&(s=u-200),x(a,{left:`${b}px`,top:`${s}px`}),requestAnimationFrame(()=>{const t=a?.querySelector("button");t?.focus()})}}function f(){a&&(a.remove(),a=null),function(){for(const t of d)t.dataset.submenu&&t.setAttribute("aria-expanded","false")}()}p.className="notectl-table-context-menu__hint",p.setAttribute("aria-hidden","true"),p.textContent=i.menuKeyboardHint,c.appendChild(p),C(d,u),c.addEventListener("keydown",t=>{switch(t.stopPropagation(),t.key){case"Escape":return t.preventDefault(),void g();case"ArrowDown":return t.preventDefault(),u=(u+1)%d.length,C(d,u),void d[u]?.focus();case"ArrowUp":return t.preventDefault(),u=(u-1+d.length)%d.length,C(d,u),void d[u]?.focus();case"ArrowRight":case"ArrowLeft":{t.preventDefault();const e="rtl"===getComputedStyle(c).direction?"ArrowLeft":"ArrowRight";if(t.key===e){const t=d[u];t?.dataset.submenu&&h(t)}else f(),d[u]?.focus();return}case"Enter":case" ":{t.preventDefault();const n=d[u];if(!n)return;return void(n.dataset.submenu?h(n):n.dataset.command&&(e.executeCommand(n.dataset.command),g()))}case"Home":return t.preventDefault(),u=0,C(d,u),void d[u]?.focus();case"End":return t.preventDefault(),u=d.length-1,C(d,u),void d[u]?.focus()}}),I(c,o,{position:"below-start"}),t.appendChild(c),d[0]?.focus(),requestAnimationFrame(()=>{s&&d[0]&&d[0].focus()});const m=t=>{const e=t.composedPath();e.includes(c)||a&&e.includes(a)||g()};function g(){s&&(s=!1,f(),c.remove(),document.removeEventListener("mousedown",m,!0),r?.())}return setTimeout(()=>{document.addEventListener("mousedown",m,!0)},0),{isOpen:()=>s,close:g,destroy:g}}function X(t,e){const n=t.getState();if(r(n.selection)||i(n.selection))return!1;const o=n.selection,l=S(n,o.anchor.blockId);return!!l&&e(n,o,l)}function W(t){return X(t,(e,n,o)=>{const r=o.tableIndex+1;if(r>=e.doc.children.length)return!1;const i=e.doc.children[r];if(!i)return!1;const s=e.transaction("command").setSelection(l(i.id,0)).build();return t.dispatch(s),!0})}let U=null;function G(t,e,n,o){const r=t.getState(),i=L(r,e,n,o);if(!i)return!1;const s=A(r,i),a=r.transaction("command").setSelection(l(s,0)).build();return t.dispatch(a),!0}function J(t,e,n,o){const r=t.getState(),i=L(r,e,n,o);if(!i)return!1;const s=B(r,i),a=r.getBlock(s);if(!a)return!1;const c=m(a),d=r.transaction("command").setSelection(l(s,c)).build();return t.dispatch(d),!0}function Q(t,e){const n=t.getState(),o=n.getNodePath(e);if(!o)return!1;const r=n.transaction("input").setSelection(s(e,o)).build();return t.dispatch(r),!0}const tt='<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M6 1v10M1 6h10" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>';function et(t,e,n){const o=document.createElement("button");return o.className=t,o.innerHTML=e,o.title=n,o.type="button",o.setAttribute("aria-label",n),o.setAttribute("contenteditable","false"),o.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),o}function nt(t,e){const n=document.createElement("div");n.className=`ntbl-insert-line ntbl-insert-line--${t}`,n.setAttribute("contenteditable","false"),n.setAttribute("data-notectl-no-print","");const o=et("ntbl-insert-btn",tt,e);return n.appendChild(o),n}function ot(t,e){const n=document.createElement("button");n.className=`ntbl-add-zone ${t}`,n.type="button",n.setAttribute("contenteditable","false"),n.setAttribute("aria-label",e),n.setAttribute("data-notectl-no-print",""),n.title=e;const o=document.createElement("span");return o.className="ntbl-add-icon",o.innerHTML=tt,n.appendChild(o),n.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),n}function rt(t){const e=document.createElement("div");return e.className=t,e.setAttribute("contenteditable","false"),e.setAttribute("data-notectl-no-print",""),e}function it(t,e){x(t,"none"===e?{backgroundColor:"transparent",border:"1px dashed rgba(128,128,128,0.4)"}:e?{backgroundColor:e,border:"1px solid rgba(0,0,0,0.15)"}:{backgroundColor:"var(--notectl-border)",border:"1px solid rgba(0,0,0,0.15)"})}function lt(t,e,n,o){const r=document.createElement("div");r.className=`ntbl-handle ${t}`,r.dataset.index=String(e);const i=et("ntbl-handle-delete",'<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 2l6 6M8 2l-6 6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>',n);return i.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),o(e)}),r.appendChild(i),r}function st(t,e){let n=0,o=0,r=t;for(;r&&r!==e;)n+=r.offsetTop,o+=r.offsetLeft,r=r.offsetParent;return{top:n,left:o}}class at{tableId;numRows;numCols;activeRowIndex=-1;activeColIndex=-1;colBar;rowBar;insertLineH;insertLineV;addRowZone;addColZone;deleteTableBtn;borderColorBtn;actionsBtn;contextHint;observer;borderColorPopup=null;activeContextMenu=null;container;tableEl;getState;dispatchFn;pluginContext;locale;onMouseMove=t=>{const e=this.tableEl.getBoundingClientRect(),n=t.clientX-e.left,o=t.clientY-e.top;if(!(n>=-10&&n<=e.width+10&&o>=-10&&o<=e.height+10))return void this.hideInsertLines();const r=function(t,e,n,o){let r=Number.POSITIVE_INFINITY,i=null;for(const a of n){const t=Math.abs(e-a.position);t<r&&t<10&&(r=t,i=a)}let l=Number.POSITIVE_INFINITY,s=null;for(const a of o){const e=Math.abs(t-a.position);e<l&&e<10&&(l=e,s=a)}return i&&(!s||r<=l)?{type:"row",border:i}:s?{type:"col",border:s}:{type:"none",border:null}}(n,o,function(t){const e=t.querySelectorAll(":scope > tbody > tr"),n=t.offsetTop,o=[];for(let r=1;r<e.length;r++){const t=e[r];t&&o.push({position:t.offsetTop-n,index:r})}return o}(this.tableEl),function(t,e){if(e<=1)return[];const n=t/e,o=[];for(let r=1;r<e;r++)o.push({position:Math.round(n*r),index:r});return o}(this.tableEl.offsetWidth,this.numCols));"row"===r.type&&r.border?(this.showHorizontalLine(r.border),this.hideVerticalLine()):"col"===r.type&&r.border?(this.showVerticalLine(r.border),this.hideHorizontalLine()):this.hideInsertLines()};onMouseLeave=()=>{this.hideInsertLines()};constructor(t,e,n,o,r,i,l=E){if(this.container=t,this.tableEl=e,this.getState=o,this.dispatchFn=r,this.pluginContext=i??null,this.locale=l,this.tableId=n.id,this.numRows=b(n).length,this.numCols=this.countCols(n),this.colBar=rt("ntbl-col-bar"),this.rowBar=rt("ntbl-row-bar"),this.insertLineH=nt("horizontal",l.insertRow),this.insertLineV=nt("vertical",l.insertColumn),this.addRowZone=ot("ntbl-add-row",l.addRow),this.addColZone=ot("ntbl-add-col",l.addColumn),this.deleteTableBtn=et("ntbl-delete-table-btn",'<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none"><path d="M9 3h6m-9 4h12M10 11v6m4-6v6m-9 3h14l-1-13H6L5 20z" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></svg>',l.deleteTable),this.deleteTableBtn.setAttribute("data-notectl-no-print",""),i){const t=P(o(),this.tableId);this.borderColorBtn=function(t,e){const n=et("ntbl-border-color-btn",'<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none"><path d="M3 3h18v18H3V3zm0 6h18M3 15h18M9 3v18M15 3v18" stroke="currentColor" stroke-width="1.5"/></svg>',t);n.setAttribute("data-notectl-no-print","");const o=document.createElement("span");return o.className="ntbl-border-color-swatch",it(o,e),n.appendChild(o),n}(l.borderColor,t),this.actionsBtn=function(t){const e=et("ntbl-actions-btn",'<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="5" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="12" cy="19" r="2"/></svg>',t);return e.setAttribute("data-notectl-no-print",""),e}(l.tableActionsHint)}else this.borderColorBtn=null,this.actionsBtn=null;t.append(this.colBar,this.rowBar,this.insertLineH,this.insertLineV,this.addRowZone,this.addColZone,this.deleteTableBtn),this.borderColorBtn&&t.appendChild(this.borderColorBtn),this.actionsBtn&&t.appendChild(this.actionsBtn),this.contextHint=function(t){const e=document.createElement("div");return e.className="ntbl-context-hint",e.setAttribute("aria-hidden","true"),e.setAttribute("contenteditable","false"),e.setAttribute("data-notectl-no-print",""),e.textContent=t,e}(l.contextMenuHint),t.appendChild(this.contextHint),this.rebuildColHandles(),this.rebuildRowHandles(),this.bindEventListeners(),this.observer=new ResizeObserver(()=>{this.positionControls()}),this.observer.observe(e),requestAnimationFrame(()=>this.positionControls())}update(t){this.tableId=t.id;const e=b(t).length,n=this.countCols(t);if(e===this.numRows&&n===this.numCols||(this.numRows=e,this.numCols=n,this.rebuildColHandles(),this.rebuildRowHandles()),this.borderColorBtn){const e=this.borderColorBtn.querySelector(".ntbl-border-color-swatch");if(e){const n=t.attrs?.borderColor;it(e,n)}}requestAnimationFrame(()=>this.positionControls())}destroy(){this.activeContextMenu?.destroy(),this.closeBorderColorPopup(),this.observer.disconnect(),this.container.removeEventListener("mousemove",this.onMouseMove),this.container.removeEventListener("mouseleave",this.onMouseLeave),this.colBar.remove(),this.rowBar.remove(),this.insertLineH.remove(),this.insertLineV.remove(),this.addRowZone.remove(),this.addColZone.remove(),this.deleteTableBtn.remove(),this.borderColorBtn?.remove(),this.actionsBtn?.remove(),this.contextHint.remove()}bindEventListeners(){const t=this.insertLineH.querySelector(".ntbl-insert-btn"),e=this.insertLineV.querySelector(".ntbl-insert-btn");if(t.addEventListener("click",()=>{this.activeRowIndex>=0&&this.dispatchTransaction($(this.getState(),this.tableId,this.activeRowIndex))}),e.addEventListener("click",()=>{this.activeColIndex>=0&&this.dispatchTransaction(j(this.getState(),this.tableId,this.activeColIndex))}),this.addRowZone.addEventListener("click",()=>{this.dispatchTransaction($(this.getState(),this.tableId,this.numRows))}),this.addColZone.addEventListener("click",()=>{this.dispatchTransaction(j(this.getState(),this.tableId,this.numCols))}),this.deleteTableBtn.addEventListener("click",()=>{this.dispatchTransaction(O(this.getState(),this.tableId))}),this.borderColorBtn&&this.pluginContext){const t=this.pluginContext;this.borderColorBtn.addEventListener("click",()=>{this.toggleBorderColorPopup(t)})}if(this.actionsBtn&&this.pluginContext){const t=this.pluginContext;this.actionsBtn.addEventListener("click",()=>{this.openActionsMenu(t)})}this.container.addEventListener("mousemove",this.onMouseMove),this.container.addEventListener("mouseleave",this.onMouseLeave)}openActionsMenu(t){if(this.activeContextMenu?.isOpen())return this.activeContextMenu.close(),void(this.activeContextMenu=null);if(!this.actionsBtn)return;const e=this.actionsBtn.getBoundingClientRect(),n=new DOMRect(e.left,e.bottom+4,0,0);this.activeContextMenu=K(this.container,t,this.tableId,n,()=>{this.activeContextMenu=null},this.locale)}toggleBorderColorPopup(t){this.borderColorPopup?this.closeBorderColorPopup():(this.borderColorPopup=document.createElement("div"),this.borderColorPopup.className="notectl-table-context-menu",x(this.borderColorPopup,{position:"absolute",top:"24px",left:"24px",zIndex:"10000"}),this.borderColorPopup.setAttribute("contenteditable","false"),z(this.borderColorPopup,t,this.tableId,()=>{this.closeBorderColorPopup()},this.locale),this.container.appendChild(this.borderColorPopup))}closeBorderColorPopup(){this.borderColorPopup&&(this.borderColorPopup.remove(),this.borderColorPopup=null)}dispatchTransaction(t){t&&this.dispatchFn(t)}countCols(t){const e=b(t);return e[0]?b(e[0]).length:0}positionControls(){!function(t,e,n){const o=t.children;if(0===o.length)return;const r=e/n;for(let i=0;i<o.length;i++){const t=o[i];x(t,{left:`${Math.round(r*i)}px`,width:`${Math.round(r)}px`})}v(t,"width",`${e}px`)}(this.colBar,this.tableEl.offsetWidth,this.numCols),function(t,e){const n=t.children;if(0===n.length)return;const o=e.querySelectorAll(":scope > tbody > tr"),r=e.offsetTop;let i=0;for(let l=0;l<n.length;l++){const t=n[l],e=o[l];if(e){const n=e.offsetTop-r,o=e.offsetHeight;x(t,{top:`${n}px`,height:`${o}px`}),i=n+o}}v(t,"height",`${i}px`)}(this.rowBar,this.tableEl),function(t,e,n,o){const r=st(n,o),i=n.offsetHeight,l=n.offsetWidth;x(t,{width:`${l}px`,left:`${r.left}px`}),x(e,{height:`${i}px`,top:`${r.top}px`})}(this.addRowZone,this.addColZone,this.tableEl,this.container)}showHorizontalLine(t){this.activeRowIndex=t.index;const e=st(this.tableEl,this.container);x(this.insertLineH,{top:e.top+t.position-1+"px",left:`${e.left}px`,width:`${this.tableEl.offsetWidth}px`}),this.insertLineH.classList.add("ntbl-insert-line--visible")}showVerticalLine(t){this.activeColIndex=t.index;const e=st(this.tableEl,this.container);x(this.insertLineV,{left:e.left+t.position-1+"px",top:`${e.top}px`,height:`${this.tableEl.offsetHeight}px`}),this.insertLineV.classList.add("ntbl-insert-line--visible")}hideInsertLines(){this.hideHorizontalLine(),this.hideVerticalLine()}hideHorizontalLine(){this.insertLineH.classList.remove("ntbl-insert-line--visible"),this.activeRowIndex=-1}hideVerticalLine(){this.insertLineV.classList.remove("ntbl-insert-line--visible"),this.activeColIndex=-1}rebuildColHandles(){this.colBar.innerHTML="";for(let t=0;t<this.numCols;t++){const e=lt("ntbl-col-handle",t,this.locale.deleteColumn,t=>{this.dispatchTransaction(V(this.getState(),this.tableId,t))});this.colBar.appendChild(e)}}rebuildRowHandles(){this.rowBar.innerHTML="";for(let t=0;t<this.numRows;t++){const e=lt("ntbl-row-handle",t,this.locale.deleteRow,t=>{this.dispatchTransaction(_(this.getState(),this.tableId,t))});this.rowBar.appendChild(e)}}}function ct(t,e){"none"===e?(v(t,"--ntbl-border-color","transparent"),t.classList.add("notectl-table--borderless")):e?(v(t,"--ntbl-border-color",e),t.classList.remove("notectl-table--borderless")):(w(t,"--ntbl-border-color"),t.classList.remove("notectl-table--borderless"))}const dt=new y("tableSelection"),ut={maxPickerRows:8,maxPickerCols:8},bt="border-collapse: collapse; width: 100%; table-layout: fixed",pt="border: 1px solid var(--ntbl-bc, #d0d0d0); padding: 8px 12px; vertical-align: top";class ht{id="table";name="Table";priority=40;config;locale;selectionService=null;cleanupMouseSelection=null;context=null;constructor(t){this.config={...ut,...t}}async init(t){if(this.config.locale)this.locale=this.config.locale;else{const e=t.getService(n),o=e?.getLocale()??"en";this.locale="en"===o?E:await async function(t){if("en"===t)return E;const e=T[`./locales/${t}.ts`];if(!e)return E;try{return(await e()).default}catch{return E}}(o)}t.registerStyleSheet('\n/* Table */\n.notectl-table-wrapper {\n\tmargin: 8px 0;\n\toverflow-x: auto;\n\tposition: relative;\n}\n\n.notectl-table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\ttable-layout: fixed;\n}\n\n.notectl-table td {\n\tborder: 1px solid var(--ntbl-border-color, var(--notectl-border));\n\tpadding: 8px 12px;\n\tmin-width: 60px;\n\tvertical-align: top;\n\tmin-height: 1.6em;\n}\n\n.notectl-table--borderless td {\n\tborder: 1px dashed rgba(128, 128, 128, 0.15);\n}\n\n@media print {\n\t.notectl-table--borderless td {\n\t\tborder: none;\n\t}\n}\n\n.notectl-table td:focus-within {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: -2px;\n}\n\n.notectl-table-cell--selected {\n\tbackground: var(--notectl-primary-muted);\n}\n\n/* Table Context Menu */\n.notectl-table-context-menu {\n\tposition: fixed;\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 12px var(--notectl-shadow);\n\tpadding: 4px 0;\n\tmin-width: 180px;\n\tz-index: 10000;\n}\n\n.notectl-table-context-menu button {\n\tdisplay: block;\n\twidth: 100%;\n\tpadding: 8px 12px;\n\ttext-align: start;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tfont-family: inherit;\n}\n\n.notectl-table-context-menu button:hover {\n\tbackground: var(--notectl-hover-bg);\n}\n\n.notectl-table-context-menu hr {\n\tborder: none;\n\tborder-top: 1px solid var(--notectl-border);\n\tmargin: 4px 0;\n}\n\n/* === Table Controls === */\n\n/* Outer container for table + controls */\n.ntbl-container {\n\tposition: relative;\n\tmargin: 8px 0;\n\tpadding-block-start: 24px;\n\tpadding-inline-start: 24px;\n}\n\n.ntbl-container .notectl-table-wrapper {\n\tmargin: 0;\n}\n\n.ntbl-container.notectl-table--selected .notectl-table-wrapper {\n\toutline: 2px solid var(--notectl-primary-fg);\n\toutline-offset: 2px;\n\tborder-radius: 6px;\n}\n\n/* --- Column Handle Bar --- */\n.ntbl-col-bar {\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 24px;\n\theight: 20px;\n\tdisplay: flex;\n\topacity: 0;\n\ttransition: opacity 0.2s ease;\n\tz-index: 3;\n\tpointer-events: none;\n}\n\n.ntbl-container:hover .ntbl-col-bar,\n.ntbl-container:focus-within .ntbl-col-bar {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n.ntbl-container.notectl-table--selected .ntbl-col-bar {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n/* --- Row Handle Bar --- */\n.ntbl-row-bar {\n\tposition: absolute;\n\ttop: 24px;\n\tinset-inline-start: 0;\n\twidth: 20px;\n\tdisplay: flex;\n\tflex-direction: column;\n\topacity: 0;\n\ttransition: opacity 0.2s ease;\n\tz-index: 3;\n\tpointer-events: none;\n}\n\n.ntbl-container:hover .ntbl-row-bar,\n.ntbl-container:focus-within .ntbl-row-bar {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n.ntbl-container.notectl-table--selected .ntbl-row-bar {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n/* --- Handle (shared base) --- */\n.ntbl-handle {\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcursor: pointer;\n\ttransition: background 0.15s ease;\n\tborder-radius: 3px;\n}\n\n.ntbl-col-handle {\n\theight: 100%;\n\tbackground: var(--notectl-hover-bg);\n\tborder-radius: 4px 4px 0 0;\n}\n\n.ntbl-col-handle:hover {\n\tbackground: var(--notectl-border);\n}\n\n.ntbl-row-handle {\n\twidth: 100%;\n\tbackground: var(--notectl-hover-bg);\n\tborder-start-start-radius: 4px;\n\tborder-end-start-radius: 4px;\n}\n\n.ntbl-row-handle:hover {\n\tbackground: var(--notectl-border);\n}\n\n/* --- Handle Delete Button --- */\n.ntbl-handle-delete {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\theight: 16px;\n\tborder: none;\n\tbackground: transparent;\n\tcolor: var(--notectl-fg-muted);\n\tcursor: pointer;\n\tborder-radius: 3px;\n\tpadding: 0;\n\topacity: 0;\n\ttransform: scale(0.7);\n\ttransition: opacity 0.15s, transform 0.15s,\n\t\tbackground 0.15s, color 0.15s;\n}\n\n.ntbl-handle:hover .ntbl-handle-delete,\n.ntbl-handle:focus-within .ntbl-handle-delete {\n\topacity: 1;\n\ttransform: scale(1);\n}\n\n.ntbl-handle-delete:hover,\n.ntbl-handle-delete:focus-visible {\n\tbackground: var(--notectl-danger-muted);\n\tcolor: var(--notectl-danger);\n}\n\n.ntbl-handle-delete:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n/* --- Insert Lines --- */\n.ntbl-insert-line {\n\tposition: absolute;\n\tpointer-events: none;\n\topacity: 0;\n\ttransition: opacity 0.15s ease;\n\tz-index: 6;\n}\n\n.ntbl-insert-line--visible {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n.ntbl-insert-line--horizontal {\n\theight: 2px;\n\tbackground: linear-gradient(\n\t\t90deg,\n\t\ttransparent,\n\t\tvar(--notectl-primary) 8%,\n\t\tvar(--notectl-primary) 92%,\n\t\ttransparent\n\t);\n\tbox-shadow: 0 0 6px var(--notectl-focus-ring);\n}\n\n.ntbl-insert-line--vertical {\n\twidth: 2px;\n\tbackground: linear-gradient(\n\t\t180deg,\n\t\ttransparent,\n\t\tvar(--notectl-primary) 8%,\n\t\tvar(--notectl-primary) 92%,\n\t\ttransparent\n\t);\n\tbox-shadow: 0 0 6px var(--notectl-focus-ring);\n}\n\n/* --- Insert Button on Line --- */\n.ntbl-insert-btn {\n\tposition: absolute;\n\twidth: 20px;\n\theight: 20px;\n\tborder-radius: 50%;\n\tbackground: var(--notectl-bg);\n\tborder: 2px solid var(--notectl-primary);\n\tcolor: var(--notectl-primary);\n\tcursor: pointer;\n\tpointer-events: all;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 0;\n\tbox-shadow: 0 2px 8px var(--notectl-focus-ring);\n\ttransition: background 0.15s, color 0.15s,\n\t\ttransform 0.15s, box-shadow 0.15s;\n}\n\n.ntbl-insert-line--horizontal .ntbl-insert-btn {\n\tleft: 50%;\n\ttop: -9px;\n\ttransform: translateX(-50%);\n}\n\n.ntbl-insert-line--vertical .ntbl-insert-btn {\n\ttop: 50%;\n\tinset-inline-start: -9px;\n\ttransform: translateY(-50%);\n}\n\n.ntbl-insert-btn:hover,\n.ntbl-insert-btn:focus-visible {\n\tbackground: var(--notectl-primary);\n\tcolor: var(--notectl-bg);\n\tbox-shadow: 0 2px 12px var(--notectl-focus-ring);\n}\n\n.ntbl-insert-btn:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.ntbl-insert-line--horizontal .ntbl-insert-btn:hover {\n\ttransform: translateX(-50%) scale(1.2);\n}\n\n.ntbl-insert-line--vertical .ntbl-insert-btn:hover {\n\ttransform: translateY(-50%) scale(1.2);\n}\n\n/* --- Add Row / Add Column Zones --- */\n.ntbl-add-zone {\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcursor: pointer;\n\tuser-select: none;\n\topacity: 0;\n\ttransition: opacity 0.2s ease, background 0.2s ease,\n\t\tborder-color 0.2s ease;\n}\n\n.ntbl-container:hover .ntbl-add-zone,\n.ntbl-container:focus-within .ntbl-add-zone {\n\topacity: 1;\n}\n\n.ntbl-container.notectl-table--selected .ntbl-add-zone {\n\topacity: 1;\n}\n\n.ntbl-delete-table-btn {\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 0;\n\twidth: 20px;\n\theight: 20px;\n\tborder: 1px solid var(--notectl-danger);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-bg);\n\tcolor: var(--notectl-danger);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\topacity: 0;\n\ttransition: opacity 0.2s ease, background 0.15s, border-color 0.15s;\n\tz-index: 7;\n}\n\n.ntbl-container:hover .ntbl-delete-table-btn,\n.ntbl-container:focus-within .ntbl-delete-table-btn,\n.ntbl-container.notectl-table--selected .ntbl-delete-table-btn {\n\topacity: 1;\n}\n\n.ntbl-delete-table-btn:hover,\n.ntbl-delete-table-btn:focus-visible {\n\tbackground: var(--notectl-danger-muted);\n\tborder-color: var(--notectl-danger);\n}\n\n.ntbl-delete-table-btn:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n/* --- Context Menu Discovery Hint --- */\n.ntbl-context-hint {\n\tposition: absolute;\n\ttop: 4px;\n\tinset-inline-end: 0;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\tpadding: 2px 8px;\n\tborder-radius: 4px;\n\topacity: 0;\n\ttransition: opacity 0.2s ease;\n\tpointer-events: none;\n\twhite-space: nowrap;\n\tz-index: 5;\n}\n\n.ntbl-container:hover .ntbl-context-hint,\n.ntbl-container:focus-within .ntbl-context-hint,\n.ntbl-container.notectl-table--selected .ntbl-context-hint {\n\topacity: 1;\n}\n\n/* --- Table Actions Button --- */\n.ntbl-actions-btn {\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 48px;\n\twidth: 20px;\n\theight: 20px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-bg);\n\tcolor: var(--notectl-fg-muted);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\topacity: 0;\n\ttransition: opacity 0.2s ease, background 0.15s, border-color 0.15s;\n\tz-index: 7;\n\tcursor: pointer;\n\tpadding: 0;\n}\n\n.ntbl-container:hover .ntbl-actions-btn,\n.ntbl-container:focus-within .ntbl-actions-btn,\n.ntbl-container.notectl-table--selected .ntbl-actions-btn {\n\topacity: 1;\n}\n\n.ntbl-actions-btn:hover,\n.ntbl-actions-btn:focus-visible {\n\tbackground: var(--notectl-hover-bg);\n\tborder-color: var(--notectl-primary);\n}\n\n.ntbl-actions-btn:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n/* --- Border Color Button --- */\n.ntbl-border-color-btn {\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 24px;\n\twidth: 20px;\n\theight: 20px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-bg);\n\tcolor: var(--notectl-fg-muted);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\topacity: 0;\n\ttransition: opacity 0.2s ease, background 0.15s, border-color 0.15s;\n\tz-index: 7;\n\tcursor: pointer;\n\tpadding: 0;\n}\n\n.ntbl-container:hover .ntbl-border-color-btn,\n.ntbl-container:focus-within .ntbl-border-color-btn,\n.ntbl-container.notectl-table--selected .ntbl-border-color-btn {\n\topacity: 1;\n}\n\n.ntbl-border-color-btn:hover,\n.ntbl-border-color-btn:focus-visible {\n\tbackground: var(--notectl-hover-bg);\n\tborder-color: var(--notectl-primary);\n}\n\n.ntbl-border-color-btn:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.ntbl-border-color-swatch {\n\twidth: 10px;\n\theight: 10px;\n\tborder-radius: 2px;\n\tborder: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n/* --- Context Menu Keyboard Hint --- */\n.notectl-table-context-menu__hint {\n\tpadding: 4px 12px 6px;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\tborder-top: 1px solid var(--notectl-border);\n\tmargin-top: 4px;\n\ttext-align: center;\n\tuser-select: none;\n}\n\n/* --- Context Menu Focus --- */\n.notectl-table-context-menu button:focus-visible {\n\toutline: none;\n\tbackground: var(--notectl-primary-muted);\n\tbox-shadow: inset 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.notectl-table-context-menu [role="separator"] {\n\tborder: none;\n\tborder-top: 1px solid var(--notectl-border);\n\tmargin: 4px 0;\n\theight: 0;\n}\n\n.ntbl-add-row {\n\tbottom: 0;\n\theight: 24px;\n\tborder: 1px dashed var(--notectl-border);\n\tborder-end-start-radius: 6px;\n\tborder-end-end-radius: 6px;\n\tborder-block-start: none;\n\tcolor: var(--notectl-fg-muted);\n\ttransform: translateY(100%);\n}\n\n.ntbl-add-row:hover,\n.ntbl-add-row:focus-visible {\n\tbackground: var(--notectl-primary-muted);\n\tborder-color: var(--notectl-primary);\n\tcolor: var(--notectl-primary);\n}\n\n.ntbl-add-row:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.ntbl-add-col {\n\tinset-inline-end: 0;\n\ttop: 24px;\n\twidth: 24px;\n\tborder: 1px dashed var(--notectl-border);\n\tborder-start-end-radius: 6px;\n\tborder-end-end-radius: 6px;\n\tborder-inline-start: none;\n\tcolor: var(--notectl-fg-muted);\n\ttransform: translateX(100%);\n}\n\n[dir="rtl"] .ntbl-add-col {\n\ttransform: translateX(-100%);\n}\n\n.ntbl-add-col:hover,\n.ntbl-add-col:focus-visible {\n\tbackground: var(--notectl-primary-muted);\n\tborder-color: var(--notectl-primary);\n\tcolor: var(--notectl-primary);\n}\n\n.ntbl-add-col:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.ntbl-add-icon {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\ttransition: transform 0.2s ease;\n}\n\n.ntbl-add-zone:hover .ntbl-add-icon {\n\ttransform: scale(1.15);\n}\n'),this.context=t,this.registerNodeSpecs(t),this.registerNodeViews(t),Y(t,this.locale),t.registerCommand("resetTableBorderColor",()=>D(t,this.locale)),function(t,e){const n={Tab:()=>function(t,e){return X(t,(n,o,r)=>r.colIndex<r.totalCols-1?G(t,r.tableId,r.rowIndex,r.colIndex+1):r.rowIndex<r.totalRows-1?G(t,r.tableId,r.rowIndex+1,0):(F(t,e),!0))}(t,e),"Shift-Tab":()=>function(t){return X(t,(e,n,o)=>o.colIndex>0?G(t,o.tableId,o.rowIndex,o.colIndex-1):!(o.rowIndex>0)||G(t,o.tableId,o.rowIndex-1,o.totalCols-1))}(t),Backspace:()=>function(t){return X(t,(e,n,o)=>{if(!a(n))return!1;if(0!==n.anchor.offset)return!1;if(0!==o.rowIndex||0!==o.colIndex)return!1;const r=A(e,o.cellId);return n.anchor.blockId===r&&Q(t,o.tableId)})}(t),Delete:()=>function(t){return X(t,(e,n,o)=>{if(!a(n))return!1;const r=e.getBlock(n.anchor.blockId);if(!r)return!1;const i=m(r);if(n.anchor.offset!==i)return!1;if(o.rowIndex!==o.totalRows-1||o.colIndex!==o.totalCols-1)return!1;const l=B(e,o.cellId);return n.anchor.blockId===l&&Q(t,o.tableId)})}(t),ArrowDown:()=>function(t){return X(t,(e,n,o)=>{const r=B(e,o.cellId);return n.anchor.blockId===r&&(o.rowIndex>=o.totalRows-1?W(t):G(t,o.tableId,o.rowIndex+1,o.colIndex))})}(t),ArrowUp:()=>function(t){return X(t,(e,n,o)=>{const r=A(e,o.cellId);return n.anchor.blockId===r&&!(o.rowIndex<=0)&&G(t,o.tableId,o.rowIndex-1,o.colIndex)})}(t),ArrowRight:()=>function(t){return X(t,(e,n,o)=>{if(!a(n))return!1;const r=e.getBlock(n.anchor.blockId);if(!r)return!1;const i=m(r);if(n.anchor.offset!==i)return!1;const l=B(e,o.cellId);return n.anchor.blockId===l&&(o.colIndex<o.totalCols-1?G(t,o.tableId,o.rowIndex,o.colIndex+1):!(o.rowIndex<o.totalRows-1)||G(t,o.tableId,o.rowIndex+1,0))})}(t),ArrowLeft:()=>function(t){return X(t,(e,n,o)=>{if(!a(n))return!1;if(0!==n.anchor.offset)return!1;const r=A(e,o.cellId);return n.anchor.blockId===r&&(o.colIndex>0?J(t,o.tableId,o.rowIndex,o.colIndex-1):!(o.rowIndex>0)||J(t,o.tableId,o.rowIndex-1,o.totalCols-1))})}(t),Escape:()=>W(t),"Shift-F10":()=>function(t){return X(t,(e,n,o)=>{const r=t.getContainer(),i=r.querySelector(`[data-block-id="${o.cellId}"]`);if(!i)return!1;const l=i.getBoundingClientRect(),s=new DOMRect(l.left+l.width/2,l.bottom,0,0),a=r.querySelector(`[data-block-id="${o.tableId}"].ntbl-container`)??r;return U?.close(),U=K(a,t,o.tableId,s,()=>{U=null}),!0})}(t)};t.registerKeymap(n,{priority:"context"})}(t,this.locale),this.registerToolbarItem(t),this.selectionService=function(t){let e=null,n=[],o=/* @__PURE__ */new Set;function r(){if(!e)return n=[],void(o=/* @__PURE__ */new Set);const r=t.getState(),i=[],l=Math.min(e.fromRow,e.toRow),s=Math.max(e.fromRow,e.toRow),a=Math.min(e.fromCol,e.toCol),c=Math.max(e.fromCol,e.toCol);for(let t=l;t<=s;t++)for(let n=a;n<=c;n++){const o=L(r,e.tableId,t,n);o&&i.push(o)}n=i,o=new Set(i)}const i={getSelectedRange:()=>e,setSelectedRange(n){e=n,r();const o=t.getState();t.dispatch(o.transaction("api").setSelection(o.selection).build())},clearSelectionSilent(){e=null,r()},getSelectedCellIds:()=>n,isSelected:t=>o.has(t)};return t.registerService(dt,i),i}(t)}onReady(){this.context&&this.selectionService&&(this.cleanupMouseSelection=function(t,e){const n=t.getContainer();let o=null,r=!1;function i(n){const i=n.target.closest("td[data-block-id]");if(i)if(n.shiftKey){if(o){const r=S(t.getState(),i.getAttribute("data-block-id"));if(!r||r.tableId!==o.tableId)return;n.preventDefault(),e.setSelectedRange({tableId:o.tableId,fromRow:o.row,fromCol:o.col,toRow:r.rowIndex,toCol:r.colIndex})}}else{e.setSelectedRange(null);const n=S(t.getState(),i.getAttribute("data-block-id"));if(!n)return;o={tableId:n.tableId,row:n.rowIndex,col:n.colIndex},r=!0}else e.setSelectedRange(null)}function l(n){if(!r||!o)return;const i=n.target.closest("td[data-block-id]");if(!i)return;const l=S(t.getState(),i.getAttribute("data-block-id"));l&&l.tableId===o.tableId&&(l.rowIndex===o.row&&l.colIndex===o.col||(n.preventDefault(),e.setSelectedRange({tableId:o.tableId,fromRow:o.row,fromCol:o.col,toRow:l.rowIndex,toCol:l.colIndex})))}function s(){r=!1}return n.addEventListener("mousedown",i),n.addEventListener("mousemove",l),document.addEventListener("mouseup",s),()=>{n.removeEventListener("mousedown",i),n.removeEventListener("mousemove",l),document.removeEventListener("mouseup",s)}}(this.context,this.selectionService))}destroy(){this.cleanupMouseSelection?.(),this.cleanupMouseSelection=null,this.selectionService=null,this.context=null}decorations(n){if(!this.selectionService)return t.empty;if(!this.selectionService.getSelectedRange())return t.empty;const o=n.selection;if(r(o)||i(o)||!R(n,o.anchor.blockId))return this.selectionService.clearSelectionSilent(),t.empty;const l=this.selectionService.getSelectedCellIds();if(0===l.length)return t.empty;const s=[];for(const t of l)s.push(e(t,{class:"notectl-table-cell--selected"}));return t.create(s)}registerNodeSpecs(t){t.registerNodeSpec({type:"table",group:"block",content:{allow:["table_row"],min:1},isolating:!0,selectable:!0,toDOM(t){const e=document.createElement("div");return e.className="notectl-table-wrapper",e.setAttribute("data-block-id",t.id),e},toHTML(t,e,n){const r=t.attrs?.borderColor,i=function(t){return t?"none"===t?`${bt}; --ntbl-bc: transparent`:c(t)?`${bt}; --ntbl-bc: ${o(t)}`:bt:bt}(r);return`<table${n?.styleAttr(i)??` style="${i}"`}>${e}</table>`},sanitize:{tags:["table","tbody"]}}),t.registerNodeSpec({type:"table_row",group:"table_content",content:{allow:["table_cell"],min:1},toDOM(t){const e=document.createElement("tr");return e.setAttribute("data-block-id",t.id),e.setAttribute("role","row"),e},toHTML:(t,e)=>`<tr>${e}</tr>`,sanitize:{tags:["tr"]}}),t.registerNodeSpec({type:"table_cell",group:"table_content",content:{allow:["paragraph","list_item","heading","blockquote","image","horizontal_rule"]},isolating:!0,toDOM(t){const e=document.createElement("td");return e.setAttribute("data-block-id",t.id),e.setAttribute("role","cell"),e},toHTML(t,e,n){const o=t.attrs?.colspan??1,r=t.attrs?.rowspan??1,i=[n?.styleAttr(pt)??` style="${pt}"`];return o>1&&i.push(` colspan="${o}"`),r>1&&i.push(` rowspan="${r}"`),`<td${i.join("")}>${e}</td>`},sanitize:{tags:["td"],attrs:["colspan","rowspan"]}})}registerNodeViews(t){t.getSchemaRegistry(),t.registerNodeView("table",function(t,e,n=E){return(t,o,r)=>{const i=document.createElement("div");i.className="ntbl-container",i.setAttribute("data-block-id",t.id),i.setAttribute("data-selectable","true");const l=document.createElement("div");l.className="notectl-table-wrapper";const s=document.createElement("table");s.className="notectl-table",s.setAttribute("role","table");const a=b(t),c=a.length,d=a[0]?b(a[0]).length:0;s.setAttribute("aria-label",n.tableAriaLabel(c,d)),s.setAttribute("aria-description",n.tableAriaDescription);const u=document.createElement("tbody");s.appendChild(u),l.appendChild(s),i.appendChild(l),ct(s,t.attrs?.borderColor);const p=document.createElement("div");p.className="notectl-sr-only",p.setAttribute("aria-live","polite"),p.setAttribute("aria-atomic","true"),i.appendChild(p);const h=function(t,e,n,o,r,i,l){return new at(t,e,n,o,r,i,l)}(i,s,t,o,r,e,n);let f=null,m=t.id;const g=t=>{if(!e)return;t.preventDefault(),t.stopPropagation(),f?.close();const o=new DOMRect(t.clientX,t.clientY,0,0);f=K(i,e,m,o,()=>{f=null},n)};return s.addEventListener("contextmenu",g),{dom:i,contentDOM:u,update(t){if("table"!==t.type)return!1;m=t.id,i.setAttribute("data-block-id",t.id),i.setAttribute("data-selectable","true");const e=b(t),o=e.length,r=e[0]?b(e[0]).length:0;return s.setAttribute("aria-label",n.tableAriaLabel(o,r)),ct(s,t.attrs?.borderColor),h.update(t),!1},destroy(){f?.destroy(),s.removeEventListener("contextmenu",g),h.destroy()},selectNode(){i.classList.add("notectl-table--selected")},deselectNode(){i.classList.remove("notectl-table--selected")}}}}(0,t,this.locale)),t.registerNodeView("table_row",(t,e,n)=>{const o=document.createElement("tr");return o.setAttribute("data-block-id",t.id),o.setAttribute("role","row"),{dom:o,contentDOM:o,update:t=>("table_row"!==t.type||o.setAttribute("data-block-id",t.id),!1),destroy(){}}}),t.registerNodeView("table_cell",(t,e,n)=>{const o=document.createElement("td");o.setAttribute("data-block-id",t.id),o.setAttribute("role","cell");const r=t.attrs?.colspan??1,i=t.attrs?.rowspan??1;r>1&&(o.colSpan=r),i>1&&(o.rowSpan=i);const l=t.attrs?.align;return l&&"left"!==l&&v(o,"textAlign",l),{dom:o,contentDOM:o,update(t){if("table_cell"!==t.type)return!1;o.setAttribute("data-block-id",t.id);const e=t.attrs?.colspan??1,n=t.attrs?.rowspan??1;return e>1?o.colSpan=e:o.removeAttribute("colspan"),n>1?o.rowSpan=n:o.removeAttribute("rowspan"),!1},destroy(){}}})}registerToolbarItem(t){const e=this.config.maxPickerRows??8,n=this.config.maxPickerCols??8;t.registerToolbarItem({id:"table",group:"insert",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 3h18v18H3V3zm2 2v4h6V5H5zm8 0v4h6V5h-6zm-8 6v4h6v-4H5zm8 0v4h6v-4h-6zm-8 6v4h6v-4H5zm8 0v4h6v-4h-6z"/></svg>',label:this.locale.insertTable,tooltip:this.locale.insertTable,command:"insertTable",popupType:"gridPicker",popupConfig:{maxRows:e,maxCols:n,onSelect:(e,n)=>{q(t,e,n)}},isActive:t=>!r(t.selection)&&!i(t.selection)&&R(t,t.selection.anchor.blockId)})}}export{ht as TablePlugin};
1
+ import{D as t,n as e}from"../chunks/Decoration-D49mFXrH.mjs";import{a as n}from"../chunks/HTMLUtils-Cxy99Ak2.mjs";import{j as o,c as r,h as i,g as l,b as s,i as a}from"../chunks/Selection-DhbizDM4.mjs";import{c}from"../chunks/ColorValidation-DCSKq9B2.mjs";import{S as d,r as u}from"../chunks/PluginHelpers-CdPR0MuT.mjs";import{r as b,g as p}from"../chunks/ColorGrid-CpkbKfXg.mjs";import{g as h,s as m,c as f,e as g,f as v}from"../chunks/Document-3pNX7ear.mjs";import{n as x}from"../chunks/TypeBrands-Bp_Z_o5Y.mjs";import{c as w,a as C}from"../chunks/CommandHelpers-M6mPS6Ww.mjs";import{a as I,s as y,e as k}from"../chunks/StyleRuntime-BmsLoEa8.mjs";import{a as S}from"../chunks/KeyboardNav-DsYhKKuV.mjs";import{p as L}from"../chunks/PopupPositioning-DtvqMSop.mjs";function B(){const t=f(x("paragraph"),[g("")],m());return f(x("table_cell"),[t],m())}function A(t,e){const n=t.getNodePath(e);if(!n)return null;let o=null,r=null,i=null,l=null;for(const h of n){const e=t.getBlock(h);e&&("table"===e.type?(o=h,r=e):"table_row"===e.type?i=h:"table_cell"===e.type&&(l=h))}const s=t.getBlock(e);if("table_cell"===s?.type&&(l=e),!(o&&r&&l&&i))return null;const a=t.doc.children.findIndex(t=>t.id===o),c=h(r),d=c.findIndex(t=>t.id===i);if(-1===d)return null;const u=c[d];if(!u)return null;const b=h(u),p=b.findIndex(t=>t.id===l);if(-1===p)return null;const m=b.length,f=c.length;return{tableId:o,tableIndex:a,rowId:i,rowIndex:d,cellId:l,colIndex:p,totalRows:f,totalCols:m}}function R(t,e,n,o){const r=t.getBlock(e);if(!r)return null;const i=h(r)[n];if(!i)return null;const l=h(i)[o];return l?.id??null}function E(t,e){const n=t.getBlock(e);if(!n)return e;const o=h(n)[0];if(!o)return e;let r=o;for(;;){const t=h(r)[0];if(!t)return r.id;r=t}}function T(t,e){const n=t.getBlock(e);if(!n)return e;const o=h(n),r=o[o.length-1];if(!r)return e;let i=r;for(;;){const t=h(i),e=t[t.length-1];if(!e)return i.id;i=e}}function M(t,e){const n=t.getNodePath(e);if(!n)return!1;for(const o of n){const e=t.getBlock(o);if("table"===e?.type)return!0}return!1}const N={insertRowAbove:"Insert Row Above",insertRowBelow:"Insert Row Below",insertColumnLeft:"Insert Column Left",insertColumnRight:"Insert Column Right",deleteRow:"Delete Row",deleteColumn:"Delete Column",borderColorLabel:"Border Color...",deleteTable:"Delete Table",tableActions:"Table actions",menuKeyboardHint:"↑↓ Navigate · Enter Select · Esc Close",insertRow:"Insert row",insertColumn:"Insert column",addRow:"Add row",addColumn:"Add column",tableActionsHint:"Table actions (Right-click or Shift+F10)",contextMenuHint:"Right-click or Shift+F10 for table actions",borderColor:"Border color",defaultColor:"Default",noBorders:"No borders",borderColorPicker:"Border color picker",announceBorderColorSet:t=>`Table border color set to ${t}`,announceBorderReset:"Table borders reset to default",borderSwatchLabel:t=>`Border ${t}`,announceRowInsertedAbove:"Row inserted above",announceRowInsertedBelow:"Row inserted below",announceColumnInserted:t=>`Column inserted ${t}`,announceRowDeleted:"Row deleted",announceColumnDeleted:"Column deleted",announceTableDeleted:"Table deleted",insertTable:"Insert Table",tableAriaLabel:(t,e)=>`Table with ${t} rows and ${e} columns`,tableAriaDescription:"Right-click or press Shift+F10 for table actions"},H=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("../chunks/ar-CzVj8p__.mjs"),"./locales/de.ts":()=>import("../chunks/de-B4y4ndUw.mjs"),"./locales/es.ts":()=>import("../chunks/es-MgguVgIs.mjs"),"./locales/fr.ts":()=>import("../chunks/fr-RHXmueoO.mjs"),"./locales/hi.ts":()=>import("../chunks/hi-g7i0bmig.mjs"),"./locales/pt.ts":()=>import("../chunks/pt-DJfJVeY8.mjs"),"./locales/ru.ts":()=>import("../chunks/ru-B8teJin_.mjs"),"./locales/zh.ts":()=>import("../chunks/zh-Cpbg4evx.mjs")});async function D(t){if("en"===t)return N;const e=H[`./locales/${t}.ts`];if(!e)return N;try{return(await e()).default}catch{return N}}const P=["#000000","#434343","#666666","#999999","#b7b7b7","#cccccc","#d9d9d9","#efefef","#980000","#cc0000","#e69138","#f1c232","#6aa84f","#45818e","#3c78d8","#3d85c6","#674ea7","#a64d79","#0b5394","#38761d"];function z(t,e,n){const o=t.getBlock(e);if(!o||"table"!==o.type)return null;const r=t.getNodePath(e);if(!r)return null;if(void 0===n){const{borderColor:e,...n}=o.attrs??{},i=n;return t.transaction("command").setNodeAttr(r,i).setSelection(t.selection).build()}const i={...o.attrs,borderColor:n};return t.transaction("command").setNodeAttr(r,i).setSelection(t.selection).build()}function $(t,e,n=N){const r=t.getState();if(!o(r.selection))return!1;const i=A(r,r.selection.anchor.blockId);if(!i)return!1;const l=z(r,i.tableId,e);if(!l)return!1;t.dispatch(l);const s="none"===e?"none":p(e);return t.announce(n.announceBorderColorSet(s)),!0}function j(t,e=N){const n=t.getState();if(!o(n.selection))return!1;const r=A(n,n.selection.anchor.blockId);if(!r)return!1;const i=z(n,r.tableId,void 0);return!!i&&(t.dispatch(i),t.announce(e.announceBorderReset),!0)}function _(t,e){const n=t.getBlock(e);if(n)return n.attrs?.borderColor}function V(t,e,n,o,r=N){t.classList.add("notectl-color-picker");const i=_(e.getState(),n),l=document.createElement("button");l.type="button",l.className="notectl-color-picker__default",l.textContent=r.defaultColor,l.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),j(e,r),o()}),l.addEventListener("keydown",t=>{"Escape"===t.key&&(t.preventDefault(),o())}),t.appendChild(l);const s=document.createElement("button");s.type="button",s.className="notectl-color-picker__default",s.textContent=r.noBorders,s.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),$(e,"none",r),o()}),s.addEventListener("keydown",t=>{"Escape"===t.key&&(t.preventDefault(),o())}),t.appendChild(s),b(t,{colors:P,columns:5,ariaLabel:r.borderColorPicker,ariaLabelPrefix:"",activeColor:i??null,swatchLabel:r.borderSwatchLabel,titleAsName:!0,onSelect:t=>{$(e,t,r),o()},onClose:o})}function O(t,e,n){const o=t.getBlock(e);if(!o)return null;const i=h(o),l=i[0]?h(i[0]).length:0;if(0===l)return null;const s=function(t){const e=[];for(let n=0;n<t;n++)e.push(B());return f(x("table_row"),e,m())}(l),a=t.transaction("command").insertNode([e],n,s),c=h(s)[0],d=c?h(c)[0]:void 0;return d?a.setSelection(r(d.id,0)):c&&a.setSelection(r(c.id,0)),a.build()}function q(t,e,n){const o=t.getBlock(e);if(!o)return null;const r=h(o),i=t.transaction("command");for(const l of r){const t=B();i.insertNode([e,l.id],n,t)}return i.setSelection(t.selection),i.build()}function F(t,e,n,o=0){const i=t.getBlock(e);if(!i)return null;if(h(i).length<=1)return Y(t,e);const l=t.transaction("command").removeNode([e],n),s=R(t,e,n>0?n-1:1,o);if(s){const e=E(t,s);l.setSelection(r(e,0))}return l.build()}function Z(t,e,n,o=0){const i=t.getBlock(e);if(!i)return null;const l=h(i);if((l[0]?h(l[0]).length:0)<=1)return Y(t,e);const s=t.transaction("command");for(let r=l.length-1;r>=0;r--){const t=l[r];t&&s.removeNode([e,t.id],n)}const a=R(t,e,o,n>0?n-1:1);if(a){const e=E(t,a);s.setSelection(r(e,0))}return s.build()}function Y(t,e){const n=t.doc.children.findIndex(t=>t.id===e);if(-1===n)return null;if(1===t.doc.children.length){const e=w(m());return t.transaction("command").insertNode([],0,e).removeNode([],1).setSelection(r(e.id,0)).build()}const o=t.transaction("command").removeNode([],n),i=t.doc.children[n+1];if(i){const e=C(t,i.id,"start");if(e)return o.setSelection(e),o.build()}const l=t.doc.children[n-1];if(l){const e=C(t,l.id,"end");e&&o.setSelection(e)}return o.build()}function K(t,e,n){const i=t.getState(),l=i.selection;if(!o(l))return!1;const s=l.anchor.blockId;let a=-1;for(let o=0;o<i.doc.children.length;o++){const t=i.doc.children[o];if(!t)continue;if(t.id===s){a=o;break}const e=i.getNodePath(s);if(e&&e[0]===t.id){a=o;break}}-1===a&&(a=i.doc.children.length-1);const c=function(t,e){const n=m(),o=[];for(let r=0;r<t;r++){const t=[];for(let n=0;n<e;n++)t.push(B());o.push(f(x("table_row"),t,m()))}return f(x("table"),o,n)}(e,n),d=f(x("paragraph")),u=a+1,b=i.transaction("command").insertNode([],u,c).insertNode([],u+1,d),p=h(c)[0],g=p?h(p)[0]:void 0,v=g?h(g)[0]:void 0;return v?b.setSelection(r(v.id,0)):g&&b.setSelection(r(g.id,0)),t.dispatch(b.build()),!0}function X(t,e){const n=t.getState();if(!o(n.selection))return!1;const r=A(n,n.selection.anchor.blockId);if(!r)return!1;const i=O(n,r.tableId,r.rowIndex+1);return!!i&&(t.dispatch(i),t.announce(e.announceRowInsertedBelow),!0)}function W(t,e,n){const r=t.getState();if(!o(r.selection))return!1;const i=A(r,r.selection.anchor.blockId);if(!i)return!1;const l="left"===e?i.colIndex:i.colIndex+1,s=q(r,i.tableId,l);return!!s&&(t.dispatch(s),t.announce(n.announceColumnInserted(e)),!0)}function U(t,e){t.registerCommand("insertTable",()=>K(t,3,3)),t.registerCommand("addRowAbove",()=>function(t,e){const n=t.getState();if(!o(n.selection))return!1;const r=A(n,n.selection.anchor.blockId);if(!r)return!1;const i=O(n,r.tableId,r.rowIndex);return!!i&&(t.dispatch(i),t.announce(e.announceRowInsertedAbove),!0)}(t,e)),t.registerCommand("addRowBelow",()=>X(t,e)),t.registerCommand("addColumnLeft",()=>function(t,e){return W(t,"left",e)}(t,e)),t.registerCommand("addColumnRight",()=>function(t,e){return W(t,"right",e)}(t,e)),t.registerCommand("deleteRow",()=>function(t,e){const n=t.getState();if(!o(n.selection))return!1;const r=A(n,n.selection.anchor.blockId);if(!r)return!1;const i=F(n,r.tableId,r.rowIndex,r.colIndex);return!!i&&(t.dispatch(i),t.announce(e.announceRowDeleted),!0)}(t,e)),t.registerCommand("deleteColumn",()=>function(t,e){const n=t.getState();if(!o(n.selection))return!1;const r=A(n,n.selection.anchor.blockId);if(!r)return!1;const i=Z(n,r.tableId,r.colIndex,r.rowIndex);return!!i&&(t.dispatch(i),t.announce(e.announceColumnDeleted),!0)}(t,e)),t.registerCommand("selectTable",()=>function(t){const e=t.getState(),n=e.selection;if(i(n)){const t=e.getBlock(n.nodeId);return"table"===t?.type}if(l(n))return!1;const o=A(e,n.anchor.blockId);if(!o)return!1;const r=e.getNodePath(o.tableId);if(!r)return!1;const a=e.transaction("command").setSelection(s(o.tableId,r)).build();return t.dispatch(a),!0}(t)),t.registerCommand("deleteTable",()=>function(t,e){const n=t.getState(),o=function(t){if(i(t.selection)){const e=t.getBlock(t.selection.nodeId);return"table"!==e?.type?null:{tableId:e.id}}if(l(t.selection))return null;const e=A(t,t.selection.anchor.blockId);return e?{tableId:e.tableId}:null}(n);if(!o)return!1;const r=Y(n,o.tableId);return!!r&&(t.dispatch(r),t.announce(e.announceTableDeleted),!0)}(t,e))}function G(t,e,n,o,r,i=N,l){let s=!0,a=null;const c=document.createElement("div");c.className="notectl-table-context-menu",c.setAttribute("role","menu"),c.setAttribute("aria-label",i.tableActions),c.setAttribute("contenteditable","false");const d=[];let u=0;const b=function(t){return[{type:"item",label:t.insertRowAbove,command:"addRowAbove"},{type:"item",label:t.insertRowBelow,command:"addRowBelow"},{type:"separator"},{type:"item",label:t.insertColumnLeft,command:"addColumnLeft"},{type:"item",label:t.insertColumnRight,command:"addColumnRight"},{type:"separator"},{type:"item",label:t.deleteRow,command:"deleteRow"},{type:"item",label:t.deleteColumn,command:"deleteColumn"},{type:"separator"},{type:"submenu",label:t.borderColorLabel,id:"borderColor"},{type:"separator"},{type:"item",label:t.deleteTable,command:"deleteTable"}]}(i);for(const w of b){if("separator"===w.type){const t=document.createElement("div");t.setAttribute("role","separator"),c.appendChild(t);continue}const t=document.createElement("button");t.type="button",t.setAttribute("role","menuitem"),t.textContent=w.label,"submenu"===w.type&&(t.dataset.submenu=w.id,t.setAttribute("aria-haspopup","true"),t.setAttribute("aria-expanded","false")),"item"===w.type&&(t.dataset.command=w.command),t.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),t.addEventListener("click",n=>{n.stopPropagation(),"item"===w.type?(e.executeCommand(w.command),x()):"submenu"===w.type&&h(t)}),d.push(t),c.appendChild(t)}const p=document.createElement("div");function h(o){m(),o.setAttribute("aria-expanded","true");{a=document.createElement("div"),a.className="notectl-table-context-menu",I(a,"position","fixed"),a.setAttribute("contenteditable","false"),a.addEventListener("keydown",t=>{t.stopPropagation();const e="rtl"===getComputedStyle(c).direction?"ArrowRight":"ArrowLeft";t.key===e&&(t.preventDefault(),m(),o.focus())}),V(a,e,n,()=>x(),i),t.appendChild(a);const r=o.getBoundingClientRect(),l=c.getBoundingClientRect();let s=r.top;const d=window.innerWidth,u=window.innerHeight;let b;"rtl"===getComputedStyle(c).direction?(b=l.left-200-2,b<0&&(b=l.right+2)):(b=l.right+2,b+200>d&&(b=l.left-200-2)),s+200>u&&(s=u-200),y(a,{left:`${b}px`,top:`${s}px`}),requestAnimationFrame(()=>{const t=a?.querySelector("button");t?.focus()})}}function m(){a&&(a.remove(),a=null),function(){for(const t of d)t.dataset.submenu&&t.setAttribute("aria-expanded","false")}()}p.className="notectl-table-context-menu__hint",p.setAttribute("aria-hidden","true"),p.textContent=i.menuKeyboardHint,c.appendChild(p),S(d,u),c.addEventListener("keydown",t=>{switch(t.stopPropagation(),t.key){case"Escape":return t.preventDefault(),void x();case"ArrowDown":return t.preventDefault(),u=(u+1)%d.length,S(d,u),void d[u]?.focus();case"ArrowUp":return t.preventDefault(),u=(u-1+d.length)%d.length,S(d,u),void d[u]?.focus();case"ArrowRight":case"ArrowLeft":{t.preventDefault();const e="rtl"===getComputedStyle(c).direction?"ArrowLeft":"ArrowRight";if(t.key===e){const t=d[u];t?.dataset.submenu&&h(t)}else m(),d[u]?.focus();return}case"Enter":case" ":{t.preventDefault();const n=d[u];if(!n)return;return void(n.dataset.submenu?h(n):n.dataset.command&&(e.executeCommand(n.dataset.command),x()))}case"Home":return t.preventDefault(),u=0,S(d,u),void d[u]?.focus();case"End":return t.preventDefault(),u=d.length-1,S(d,u),void d[u]?.focus()}}),L(c,o,{position:"below-start"}),t.appendChild(c),d[0]?.focus(),requestAnimationFrame(()=>{s&&d[0]&&d[0].focus()});const f=t=>{const e=t.composedPath();e.includes(c)||a&&e.includes(a)||x()};let g=null,v=!1;function x(){s&&(s=!1,m(),c.remove(),null!==g&&(clearTimeout(g),g=null),v&&(document.removeEventListener("mousedown",f,!0),v=!1),r?.())}return g=setTimeout(()=>{g=null,document.addEventListener("mousedown",f,!0),v=!0},0),{isOpen:()=>s,close:x,destroy:x}}function J(t,e){const n=t.getState();if(!o(n.selection))return!1;const r=n.selection,i=A(n,r.anchor.blockId);return!!i&&e(n,r,i)}function Q(t){return J(t,(e,n,o)=>{const i=o.tableIndex+1;if(i>=e.doc.children.length)return!1;const l=e.doc.children[i];if(!l)return!1;const s=e.transaction("command").setSelection(r(l.id,0)).build();return t.dispatch(s),!0})}let tt=null;function et(t,e,n,o){const i=t.getState(),l=R(i,e,n,o);if(!l)return!1;const s=E(i,l),a=i.transaction("command").setSelection(r(s,0)).build();return t.dispatch(a),!0}function nt(t,e,n,o){const i=t.getState(),l=R(i,e,n,o);if(!l)return!1;const s=T(i,l),a=i.getBlock(s);if(!a)return!1;const c=v(a),d=i.transaction("command").setSelection(r(s,c)).build();return t.dispatch(d),!0}function ot(t,e){const n=t.getState(),o=n.getNodePath(e);if(!o)return!1;const r=n.transaction("input").setSelection(s(e,o)).build();return t.dispatch(r),!0}const rt='<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M6 1v10M1 6h10" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>';function it(t,e,n){const o=document.createElement("button");return o.className=t,o.innerHTML=e,o.title=n,o.type="button",o.setAttribute("aria-label",n),o.setAttribute("contenteditable","false"),o.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),o}function lt(t,e){const n=document.createElement("div");n.className=`ntbl-insert-line ntbl-insert-line--${t}`,n.setAttribute("contenteditable","false"),n.setAttribute("data-notectl-no-print","");const o=it("ntbl-insert-btn",rt,e);return n.appendChild(o),n}function st(t,e){const n=document.createElement("button");n.className=`ntbl-add-zone ${t}`,n.type="button",n.setAttribute("contenteditable","false"),n.setAttribute("aria-label",e),n.setAttribute("data-notectl-no-print",""),n.title=e;const o=document.createElement("span");return o.className="ntbl-add-icon",o.innerHTML=rt,n.appendChild(o),n.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),n}function at(t){const e=document.createElement("div");return e.className=t,e.setAttribute("contenteditable","false"),e.setAttribute("data-notectl-no-print",""),e}function ct(t,e){y(t,"none"===e?{backgroundColor:"transparent",border:"1px dashed rgba(128,128,128,0.4)"}:e?{backgroundColor:e,border:"1px solid rgba(0,0,0,0.15)"}:{backgroundColor:"var(--notectl-border)",border:"1px solid rgba(0,0,0,0.15)"})}function dt(t,e,n,o){const r=document.createElement("div");r.className=`ntbl-handle ${t}`,r.dataset.index=String(e);const i=it("ntbl-handle-delete",'<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 2l6 6M8 2l-6 6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>',n);return i.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),o(e)}),r.appendChild(i),r}function ut(t,e){let n=0,o=0,r=t;for(;r&&r!==e;)n+=r.offsetTop,o+=r.offsetLeft,r=r.offsetParent;return{top:n,left:o}}class bt{tableId;numRows;numCols;activeRowIndex=-1;activeColIndex=-1;colBar;rowBar;insertLineH;insertLineV;addRowZone;addColZone;deleteTableBtn;borderColorBtn;actionsBtn;contextHint;observer;borderColorPopup=null;activeContextMenu=null;container;tableEl;getState;dispatchFn;pluginContext;locale;onMouseMove=t=>{const e=this.tableEl.getBoundingClientRect(),n=t.clientX-e.left,o=t.clientY-e.top;if(!(n>=-10&&n<=e.width+10&&o>=-10&&o<=e.height+10))return void this.hideInsertLines();const r=function(t,e,n,o){let r=Number.POSITIVE_INFINITY,i=null;for(const a of n){const t=Math.abs(e-a.position);t<r&&t<10&&(r=t,i=a)}let l=Number.POSITIVE_INFINITY,s=null;for(const a of o){const e=Math.abs(t-a.position);e<l&&e<10&&(l=e,s=a)}return i&&(!s||r<=l)?{type:"row",border:i}:s?{type:"col",border:s}:{type:"none",border:null}}(n,o,function(t){const e=t.querySelectorAll(":scope > tbody > tr"),n=t.offsetTop,o=[];for(let r=1;r<e.length;r++){const t=e[r];t&&o.push({position:t.offsetTop-n,index:r})}return o}(this.tableEl),function(t,e){if(e<=1)return[];const n=t/e,o=[];for(let r=1;r<e;r++)o.push({position:Math.round(n*r),index:r});return o}(this.tableEl.offsetWidth,this.numCols));"row"===r.type&&r.border?(this.showHorizontalLine(r.border),this.hideVerticalLine()):"col"===r.type&&r.border?(this.showVerticalLine(r.border),this.hideHorizontalLine()):this.hideInsertLines()};onMouseLeave=()=>{this.hideInsertLines()};constructor(t,e,n,o,r,i,l=N){if(this.container=t,this.tableEl=e,this.getState=o,this.dispatchFn=r,this.pluginContext=i??null,this.locale=l,this.tableId=n.id,this.numRows=h(n).length,this.numCols=this.countCols(n),this.colBar=at("ntbl-col-bar"),this.rowBar=at("ntbl-row-bar"),this.insertLineH=lt("horizontal",l.insertRow),this.insertLineV=lt("vertical",l.insertColumn),this.addRowZone=st("ntbl-add-row",l.addRow),this.addColZone=st("ntbl-add-col",l.addColumn),this.deleteTableBtn=it("ntbl-delete-table-btn",'<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none"><path d="M9 3h6m-9 4h12M10 11v6m4-6v6m-9 3h14l-1-13H6L5 20z" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></svg>',l.deleteTable),this.deleteTableBtn.setAttribute("data-notectl-no-print",""),i){const t=_(o(),this.tableId);this.borderColorBtn=function(t,e){const n=it("ntbl-border-color-btn",'<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none"><path d="M3 3h18v18H3V3zm0 6h18M3 15h18M9 3v18M15 3v18" stroke="currentColor" stroke-width="1.5"/></svg>',t);n.setAttribute("data-notectl-no-print","");const o=document.createElement("span");return o.className="ntbl-border-color-swatch",ct(o,e),n.appendChild(o),n}(l.borderColor,t),this.actionsBtn=function(t){const e=it("ntbl-actions-btn",'<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="5" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="12" cy="19" r="2"/></svg>',t);return e.setAttribute("data-notectl-no-print",""),e}(l.tableActionsHint)}else this.borderColorBtn=null,this.actionsBtn=null;t.append(this.colBar,this.rowBar,this.insertLineH,this.insertLineV,this.addRowZone,this.addColZone,this.deleteTableBtn),this.borderColorBtn&&t.appendChild(this.borderColorBtn),this.actionsBtn&&t.appendChild(this.actionsBtn),this.contextHint=function(t){const e=document.createElement("div");return e.className="ntbl-context-hint",e.setAttribute("aria-hidden","true"),e.setAttribute("contenteditable","false"),e.setAttribute("data-notectl-no-print",""),e.textContent=t,e}(l.contextMenuHint),t.appendChild(this.contextHint),this.rebuildColHandles(),this.rebuildRowHandles(),this.bindEventListeners(),this.observer=new ResizeObserver(()=>{this.positionControls()}),this.observer.observe(e),requestAnimationFrame(()=>this.positionControls())}update(t){this.tableId=t.id;const e=h(t).length,n=this.countCols(t);if(e===this.numRows&&n===this.numCols||(this.numRows=e,this.numCols=n,this.rebuildColHandles(),this.rebuildRowHandles()),this.borderColorBtn){const e=this.borderColorBtn.querySelector(".ntbl-border-color-swatch");if(e){const n=t.attrs?.borderColor;ct(e,n)}}requestAnimationFrame(()=>this.positionControls())}destroy(){this.activeContextMenu?.destroy(),this.closeBorderColorPopup(),this.observer.disconnect(),this.container.removeEventListener("mousemove",this.onMouseMove),this.container.removeEventListener("mouseleave",this.onMouseLeave),this.colBar.remove(),this.rowBar.remove(),this.insertLineH.remove(),this.insertLineV.remove(),this.addRowZone.remove(),this.addColZone.remove(),this.deleteTableBtn.remove(),this.borderColorBtn?.remove(),this.actionsBtn?.remove(),this.contextHint.remove()}bindEventListeners(){const t=this.insertLineH.querySelector(".ntbl-insert-btn"),e=this.insertLineV.querySelector(".ntbl-insert-btn");if(t.addEventListener("click",()=>{this.activeRowIndex>=0&&this.dispatchTransaction(O(this.getState(),this.tableId,this.activeRowIndex))}),e.addEventListener("click",()=>{this.activeColIndex>=0&&this.dispatchTransaction(q(this.getState(),this.tableId,this.activeColIndex))}),this.addRowZone.addEventListener("click",()=>{this.dispatchTransaction(O(this.getState(),this.tableId,this.numRows))}),this.addColZone.addEventListener("click",()=>{this.dispatchTransaction(q(this.getState(),this.tableId,this.numCols))}),this.deleteTableBtn.addEventListener("click",()=>{this.dispatchTransaction(Y(this.getState(),this.tableId))}),this.borderColorBtn&&this.pluginContext){const t=this.pluginContext;this.borderColorBtn.addEventListener("click",()=>{this.toggleBorderColorPopup(t)})}if(this.actionsBtn&&this.pluginContext){const t=this.pluginContext;this.actionsBtn.addEventListener("click",()=>{this.openActionsMenu(t)})}this.container.addEventListener("mousemove",this.onMouseMove),this.container.addEventListener("mouseleave",this.onMouseLeave)}openActionsMenu(t){if(this.activeContextMenu?.isOpen())return this.activeContextMenu.close(),void(this.activeContextMenu=null);if(!this.actionsBtn)return;const e=this.actionsBtn.getBoundingClientRect(),n=new DOMRect(e.left,e.bottom+4,0,0);this.activeContextMenu=G(this.container,t,this.tableId,n,()=>{this.activeContextMenu=null},this.locale)}toggleBorderColorPopup(t){this.borderColorPopup?this.closeBorderColorPopup():(this.borderColorPopup=document.createElement("div"),this.borderColorPopup.className="notectl-table-context-menu",y(this.borderColorPopup,{position:"absolute",top:"24px",left:"24px",zIndex:"10000"}),this.borderColorPopup.setAttribute("contenteditable","false"),V(this.borderColorPopup,t,this.tableId,()=>{this.closeBorderColorPopup()},this.locale),this.container.appendChild(this.borderColorPopup))}closeBorderColorPopup(){this.borderColorPopup&&(this.borderColorPopup.remove(),this.borderColorPopup=null)}dispatchTransaction(t){t&&this.dispatchFn(t)}countCols(t){const e=h(t);return e[0]?h(e[0]).length:0}positionControls(){!function(t,e,n){const o=t.children;if(0===o.length)return;const r=e/n;for(let i=0;i<o.length;i++){const t=o[i];y(t,{left:`${Math.round(r*i)}px`,width:`${Math.round(r)}px`})}I(t,"width",`${e}px`)}(this.colBar,this.tableEl.offsetWidth,this.numCols),function(t,e){const n=t.children;if(0===n.length)return;const o=e.querySelectorAll(":scope > tbody > tr"),r=e.offsetTop;let i=0;for(let l=0;l<n.length;l++){const t=n[l],e=o[l];if(e){const n=e.offsetTop-r,o=e.offsetHeight;y(t,{top:`${n}px`,height:`${o}px`}),i=n+o}}I(t,"height",`${i}px`)}(this.rowBar,this.tableEl),function(t,e,n,o){const r=ut(n,o),i=n.offsetHeight,l=n.offsetWidth;y(t,{width:`${l}px`,left:`${r.left}px`}),y(e,{height:`${i}px`,top:`${r.top}px`})}(this.addRowZone,this.addColZone,this.tableEl,this.container)}showHorizontalLine(t){this.activeRowIndex=t.index;const e=ut(this.tableEl,this.container);y(this.insertLineH,{top:e.top+t.position-1+"px",left:`${e.left}px`,width:`${this.tableEl.offsetWidth}px`}),this.insertLineH.classList.add("ntbl-insert-line--visible")}showVerticalLine(t){this.activeColIndex=t.index;const e=ut(this.tableEl,this.container);y(this.insertLineV,{left:e.left+t.position-1+"px",top:`${e.top}px`,height:`${this.tableEl.offsetHeight}px`}),this.insertLineV.classList.add("ntbl-insert-line--visible")}hideInsertLines(){this.hideHorizontalLine(),this.hideVerticalLine()}hideHorizontalLine(){this.insertLineH.classList.remove("ntbl-insert-line--visible"),this.activeRowIndex=-1}hideVerticalLine(){this.insertLineV.classList.remove("ntbl-insert-line--visible"),this.activeColIndex=-1}rebuildColHandles(){this.colBar.innerHTML="";for(let t=0;t<this.numCols;t++){const e=dt("ntbl-col-handle",t,this.locale.deleteColumn,t=>{this.dispatchTransaction(Z(this.getState(),this.tableId,t))});this.colBar.appendChild(e)}}rebuildRowHandles(){this.rowBar.innerHTML="";for(let t=0;t<this.numRows;t++){const e=dt("ntbl-row-handle",t,this.locale.deleteRow,t=>{this.dispatchTransaction(F(this.getState(),this.tableId,t))});this.rowBar.appendChild(e)}}}function pt(t,e){"none"===e?(I(t,"--ntbl-border-color","transparent"),t.classList.add("notectl-table--borderless")):e?(I(t,"--ntbl-border-color",e),t.classList.remove("notectl-table--borderless")):(k(t,"--ntbl-border-color"),t.classList.remove("notectl-table--borderless"))}const ht=new d("tableSelection"),mt={maxPickerRows:8,maxPickerCols:8},ft="border-collapse: collapse; width: 100%; table-layout: fixed",gt="border: 1px solid var(--ntbl-bc, #d0d0d0); padding: 8px 12px; vertical-align: top";class vt{id="table";name="Table";priority=40;config;locale;selectionService=null;cleanupMouseSelection=null;context=null;constructor(t){this.config={...mt,...t}}async init(t){this.locale=await u(t,this.config.locale,N,D),t.registerStyleSheet('\n/* Table */\n.notectl-table-wrapper {\n\tmargin: 8px 0;\n\toverflow-x: auto;\n\tposition: relative;\n}\n\n.notectl-table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\ttable-layout: fixed;\n}\n\n.notectl-table td {\n\tborder: 1px solid var(--ntbl-border-color, var(--notectl-border));\n\tpadding: 8px 12px;\n\tmin-width: 60px;\n\tvertical-align: top;\n\tmin-height: 1.6em;\n}\n\n.notectl-table--borderless td {\n\tborder: 1px dashed rgba(128, 128, 128, 0.15);\n}\n\n@media print {\n\t.notectl-table--borderless td {\n\t\tborder: none;\n\t}\n}\n\n.notectl-table td:focus-within {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: -2px;\n}\n\n.notectl-table-cell--selected {\n\tbackground: var(--notectl-primary-muted);\n}\n\n/* Table Context Menu */\n.notectl-table-context-menu {\n\tposition: fixed;\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 12px var(--notectl-shadow);\n\tpadding: 4px 0;\n\tmin-width: 180px;\n\tz-index: 10000;\n}\n\n.notectl-table-context-menu button {\n\tdisplay: block;\n\twidth: 100%;\n\tpadding: 8px 12px;\n\ttext-align: start;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tfont-family: inherit;\n}\n\n.notectl-table-context-menu button:hover {\n\tbackground: var(--notectl-hover-bg);\n}\n\n.notectl-table-context-menu hr {\n\tborder: none;\n\tborder-top: 1px solid var(--notectl-border);\n\tmargin: 4px 0;\n}\n\n/* === Table Controls === */\n\n/* Outer container for table + controls */\n.ntbl-container {\n\tposition: relative;\n\tmargin: 8px 0;\n\tpadding-block-start: 24px;\n\tpadding-inline-start: 24px;\n}\n\n.ntbl-container .notectl-table-wrapper {\n\tmargin: 0;\n}\n\n.ntbl-container.notectl-table--selected .notectl-table-wrapper {\n\toutline: 2px solid var(--notectl-primary-fg);\n\toutline-offset: 2px;\n\tborder-radius: 6px;\n}\n\n/* --- Column Handle Bar --- */\n.ntbl-col-bar {\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 24px;\n\theight: 20px;\n\tdisplay: flex;\n\topacity: 0;\n\ttransition: opacity 0.2s ease;\n\tz-index: 3;\n\tpointer-events: none;\n}\n\n.ntbl-container:hover .ntbl-col-bar,\n.ntbl-container:focus-within .ntbl-col-bar {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n.ntbl-container.notectl-table--selected .ntbl-col-bar {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n/* --- Row Handle Bar --- */\n.ntbl-row-bar {\n\tposition: absolute;\n\ttop: 24px;\n\tinset-inline-start: 0;\n\twidth: 20px;\n\tdisplay: flex;\n\tflex-direction: column;\n\topacity: 0;\n\ttransition: opacity 0.2s ease;\n\tz-index: 3;\n\tpointer-events: none;\n}\n\n.ntbl-container:hover .ntbl-row-bar,\n.ntbl-container:focus-within .ntbl-row-bar {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n.ntbl-container.notectl-table--selected .ntbl-row-bar {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n/* --- Handle (shared base) --- */\n.ntbl-handle {\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcursor: pointer;\n\ttransition: background 0.15s ease;\n\tborder-radius: 3px;\n}\n\n.ntbl-col-handle {\n\theight: 100%;\n\tbackground: var(--notectl-hover-bg);\n\tborder-radius: 4px 4px 0 0;\n}\n\n.ntbl-col-handle:hover {\n\tbackground: var(--notectl-border);\n}\n\n.ntbl-row-handle {\n\twidth: 100%;\n\tbackground: var(--notectl-hover-bg);\n\tborder-start-start-radius: 4px;\n\tborder-end-start-radius: 4px;\n}\n\n.ntbl-row-handle:hover {\n\tbackground: var(--notectl-border);\n}\n\n/* --- Handle Delete Button --- */\n.ntbl-handle-delete {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 16px;\n\theight: 16px;\n\tborder: none;\n\tbackground: transparent;\n\tcolor: var(--notectl-fg-muted);\n\tcursor: pointer;\n\tborder-radius: 3px;\n\tpadding: 0;\n\topacity: 0;\n\ttransform: scale(0.7);\n\ttransition: opacity 0.15s, transform 0.15s,\n\t\tbackground 0.15s, color 0.15s;\n}\n\n.ntbl-handle:hover .ntbl-handle-delete,\n.ntbl-handle:focus-within .ntbl-handle-delete {\n\topacity: 1;\n\ttransform: scale(1);\n}\n\n.ntbl-handle-delete:hover,\n.ntbl-handle-delete:focus-visible {\n\tbackground: var(--notectl-danger-muted);\n\tcolor: var(--notectl-danger);\n}\n\n.ntbl-handle-delete:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n/* --- Insert Lines --- */\n.ntbl-insert-line {\n\tposition: absolute;\n\tpointer-events: none;\n\topacity: 0;\n\ttransition: opacity 0.15s ease;\n\tz-index: 6;\n}\n\n.ntbl-insert-line--visible {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n.ntbl-insert-line--horizontal {\n\theight: 2px;\n\tbackground: linear-gradient(\n\t\t90deg,\n\t\ttransparent,\n\t\tvar(--notectl-primary) 8%,\n\t\tvar(--notectl-primary) 92%,\n\t\ttransparent\n\t);\n\tbox-shadow: 0 0 6px var(--notectl-focus-ring);\n}\n\n.ntbl-insert-line--vertical {\n\twidth: 2px;\n\tbackground: linear-gradient(\n\t\t180deg,\n\t\ttransparent,\n\t\tvar(--notectl-primary) 8%,\n\t\tvar(--notectl-primary) 92%,\n\t\ttransparent\n\t);\n\tbox-shadow: 0 0 6px var(--notectl-focus-ring);\n}\n\n/* --- Insert Button on Line --- */\n.ntbl-insert-btn {\n\tposition: absolute;\n\twidth: 20px;\n\theight: 20px;\n\tborder-radius: 50%;\n\tbackground: var(--notectl-bg);\n\tborder: 2px solid var(--notectl-primary);\n\tcolor: var(--notectl-primary);\n\tcursor: pointer;\n\tpointer-events: all;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 0;\n\tbox-shadow: 0 2px 8px var(--notectl-focus-ring);\n\ttransition: background 0.15s, color 0.15s,\n\t\ttransform 0.15s, box-shadow 0.15s;\n}\n\n.ntbl-insert-line--horizontal .ntbl-insert-btn {\n\tleft: 50%;\n\ttop: -9px;\n\ttransform: translateX(-50%);\n}\n\n.ntbl-insert-line--vertical .ntbl-insert-btn {\n\ttop: 50%;\n\tinset-inline-start: -9px;\n\ttransform: translateY(-50%);\n}\n\n.ntbl-insert-btn:hover,\n.ntbl-insert-btn:focus-visible {\n\tbackground: var(--notectl-primary);\n\tcolor: var(--notectl-bg);\n\tbox-shadow: 0 2px 12px var(--notectl-focus-ring);\n}\n\n.ntbl-insert-btn:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.ntbl-insert-line--horizontal .ntbl-insert-btn:hover {\n\ttransform: translateX(-50%) scale(1.2);\n}\n\n.ntbl-insert-line--vertical .ntbl-insert-btn:hover {\n\ttransform: translateY(-50%) scale(1.2);\n}\n\n/* --- Add Row / Add Column Zones --- */\n.ntbl-add-zone {\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcursor: pointer;\n\tuser-select: none;\n\topacity: 0;\n\ttransition: opacity 0.2s ease, background 0.2s ease,\n\t\tborder-color 0.2s ease;\n}\n\n.ntbl-container:hover .ntbl-add-zone,\n.ntbl-container:focus-within .ntbl-add-zone {\n\topacity: 1;\n}\n\n.ntbl-container.notectl-table--selected .ntbl-add-zone {\n\topacity: 1;\n}\n\n.ntbl-delete-table-btn {\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 0;\n\twidth: 20px;\n\theight: 20px;\n\tborder: 1px solid var(--notectl-danger);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-bg);\n\tcolor: var(--notectl-danger);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\topacity: 0;\n\ttransition: opacity 0.2s ease, background 0.15s, border-color 0.15s;\n\tz-index: 7;\n}\n\n.ntbl-container:hover .ntbl-delete-table-btn,\n.ntbl-container:focus-within .ntbl-delete-table-btn,\n.ntbl-container.notectl-table--selected .ntbl-delete-table-btn {\n\topacity: 1;\n}\n\n.ntbl-delete-table-btn:hover,\n.ntbl-delete-table-btn:focus-visible {\n\tbackground: var(--notectl-danger-muted);\n\tborder-color: var(--notectl-danger);\n}\n\n.ntbl-delete-table-btn:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n/* --- Context Menu Discovery Hint --- */\n.ntbl-context-hint {\n\tposition: absolute;\n\ttop: 4px;\n\tinset-inline-end: 0;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\tpadding: 2px 8px;\n\tborder-radius: 4px;\n\topacity: 0;\n\ttransition: opacity 0.2s ease;\n\tpointer-events: none;\n\twhite-space: nowrap;\n\tz-index: 5;\n}\n\n.ntbl-container:hover .ntbl-context-hint,\n.ntbl-container:focus-within .ntbl-context-hint,\n.ntbl-container.notectl-table--selected .ntbl-context-hint {\n\topacity: 1;\n}\n\n/* --- Table Actions Button --- */\n.ntbl-actions-btn {\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 48px;\n\twidth: 20px;\n\theight: 20px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-bg);\n\tcolor: var(--notectl-fg-muted);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\topacity: 0;\n\ttransition: opacity 0.2s ease, background 0.15s, border-color 0.15s;\n\tz-index: 7;\n\tcursor: pointer;\n\tpadding: 0;\n}\n\n.ntbl-container:hover .ntbl-actions-btn,\n.ntbl-container:focus-within .ntbl-actions-btn,\n.ntbl-container.notectl-table--selected .ntbl-actions-btn {\n\topacity: 1;\n}\n\n.ntbl-actions-btn:hover,\n.ntbl-actions-btn:focus-visible {\n\tbackground: var(--notectl-hover-bg);\n\tborder-color: var(--notectl-primary);\n}\n\n.ntbl-actions-btn:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n/* --- Border Color Button --- */\n.ntbl-border-color-btn {\n\tposition: absolute;\n\ttop: 0;\n\tinset-inline-start: 24px;\n\twidth: 20px;\n\theight: 20px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-bg);\n\tcolor: var(--notectl-fg-muted);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\topacity: 0;\n\ttransition: opacity 0.2s ease, background 0.15s, border-color 0.15s;\n\tz-index: 7;\n\tcursor: pointer;\n\tpadding: 0;\n}\n\n.ntbl-container:hover .ntbl-border-color-btn,\n.ntbl-container:focus-within .ntbl-border-color-btn,\n.ntbl-container.notectl-table--selected .ntbl-border-color-btn {\n\topacity: 1;\n}\n\n.ntbl-border-color-btn:hover,\n.ntbl-border-color-btn:focus-visible {\n\tbackground: var(--notectl-hover-bg);\n\tborder-color: var(--notectl-primary);\n}\n\n.ntbl-border-color-btn:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.ntbl-border-color-swatch {\n\twidth: 10px;\n\theight: 10px;\n\tborder-radius: 2px;\n\tborder: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n/* --- Context Menu Keyboard Hint --- */\n.notectl-table-context-menu__hint {\n\tpadding: 4px 12px 6px;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\tborder-top: 1px solid var(--notectl-border);\n\tmargin-top: 4px;\n\ttext-align: center;\n\tuser-select: none;\n}\n\n/* --- Context Menu Focus --- */\n.notectl-table-context-menu button:focus-visible {\n\toutline: none;\n\tbackground: var(--notectl-primary-muted);\n\tbox-shadow: inset 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.notectl-table-context-menu [role="separator"] {\n\tborder: none;\n\tborder-top: 1px solid var(--notectl-border);\n\tmargin: 4px 0;\n\theight: 0;\n}\n\n.ntbl-add-row {\n\tbottom: 0;\n\theight: 24px;\n\tborder: 1px dashed var(--notectl-border);\n\tborder-end-start-radius: 6px;\n\tborder-end-end-radius: 6px;\n\tborder-block-start: none;\n\tcolor: var(--notectl-fg-muted);\n\ttransform: translateY(100%);\n}\n\n.ntbl-add-row:hover,\n.ntbl-add-row:focus-visible {\n\tbackground: var(--notectl-primary-muted);\n\tborder-color: var(--notectl-primary);\n\tcolor: var(--notectl-primary);\n}\n\n.ntbl-add-row:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.ntbl-add-col {\n\tinset-inline-end: 0;\n\ttop: 24px;\n\twidth: 24px;\n\tborder: 1px dashed var(--notectl-border);\n\tborder-start-end-radius: 6px;\n\tborder-end-end-radius: 6px;\n\tborder-inline-start: none;\n\tcolor: var(--notectl-fg-muted);\n\ttransform: translateX(100%);\n}\n\n[dir="rtl"] .ntbl-add-col {\n\ttransform: translateX(-100%);\n}\n\n.ntbl-add-col:hover,\n.ntbl-add-col:focus-visible {\n\tbackground: var(--notectl-primary-muted);\n\tborder-color: var(--notectl-primary);\n\tcolor: var(--notectl-primary);\n}\n\n.ntbl-add-col:focus-visible {\n\toutline: none;\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n}\n\n.ntbl-add-icon {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\ttransition: transform 0.2s ease;\n}\n\n.ntbl-add-zone:hover .ntbl-add-icon {\n\ttransform: scale(1.15);\n}\n'),this.context=t,this.registerNodeSpecs(t),this.registerNodeViews(t),U(t,this.locale),t.registerCommand("resetTableBorderColor",()=>j(t,this.locale)),function(t,e){const n={Tab:()=>function(t,e){return J(t,(n,o,r)=>r.colIndex<r.totalCols-1?et(t,r.tableId,r.rowIndex,r.colIndex+1):r.rowIndex<r.totalRows-1?et(t,r.tableId,r.rowIndex+1,0):(X(t,e),!0))}(t,e),"Shift-Tab":()=>function(t){return J(t,(e,n,o)=>o.colIndex>0?et(t,o.tableId,o.rowIndex,o.colIndex-1):!(o.rowIndex>0)||et(t,o.tableId,o.rowIndex-1,o.totalCols-1))}(t),Backspace:()=>function(t){return J(t,(e,n,o)=>{if(!a(n))return!1;if(0!==n.anchor.offset)return!1;if(0!==o.rowIndex||0!==o.colIndex)return!1;const r=E(e,o.cellId);return n.anchor.blockId===r&&ot(t,o.tableId)})}(t),Delete:()=>function(t){return J(t,(e,n,o)=>{if(!a(n))return!1;const r=e.getBlock(n.anchor.blockId);if(!r)return!1;const i=v(r);if(n.anchor.offset!==i)return!1;if(o.rowIndex!==o.totalRows-1||o.colIndex!==o.totalCols-1)return!1;const l=T(e,o.cellId);return n.anchor.blockId===l&&ot(t,o.tableId)})}(t),ArrowDown:()=>function(t){return J(t,(e,n,o)=>{const r=T(e,o.cellId);return n.anchor.blockId===r&&(o.rowIndex>=o.totalRows-1?Q(t):et(t,o.tableId,o.rowIndex+1,o.colIndex))})}(t),ArrowUp:()=>function(t){return J(t,(e,n,o)=>{const r=E(e,o.cellId);return n.anchor.blockId===r&&!(o.rowIndex<=0)&&et(t,o.tableId,o.rowIndex-1,o.colIndex)})}(t),ArrowRight:()=>function(t){return J(t,(e,n,o)=>{if(!a(n))return!1;const r=e.getBlock(n.anchor.blockId);if(!r)return!1;const i=v(r);if(n.anchor.offset!==i)return!1;const l=T(e,o.cellId);return n.anchor.blockId===l&&(o.colIndex<o.totalCols-1?et(t,o.tableId,o.rowIndex,o.colIndex+1):!(o.rowIndex<o.totalRows-1)||et(t,o.tableId,o.rowIndex+1,0))})}(t),ArrowLeft:()=>function(t){return J(t,(e,n,o)=>{if(!a(n))return!1;if(0!==n.anchor.offset)return!1;const r=E(e,o.cellId);return n.anchor.blockId===r&&(o.colIndex>0?nt(t,o.tableId,o.rowIndex,o.colIndex-1):!(o.rowIndex>0)||nt(t,o.tableId,o.rowIndex-1,o.totalCols-1))})}(t),Escape:()=>Q(t),"Shift-F10":()=>function(t){return J(t,(e,n,o)=>{const r=t.getContainer(),i=r.querySelector(`[data-block-id="${o.cellId}"]`);if(!i)return!1;const l=i.getBoundingClientRect(),s=new DOMRect(l.left+l.width/2,l.bottom,0,0),a=r.querySelector(`[data-block-id="${o.tableId}"].ntbl-container`)??r;return tt?.close(),tt=G(a,t,o.tableId,s,()=>{tt=null}),!0})}(t)};t.registerKeymap(n,{priority:"context"})}(t,this.locale),this.registerToolbarItem(t),this.selectionService=function(t){let e=null,n=[],o=/* @__PURE__ */new Set;function r(){if(!e)return n=[],void(o=/* @__PURE__ */new Set);const r=t.getState(),i=[],l=Math.min(e.fromRow,e.toRow),s=Math.max(e.fromRow,e.toRow),a=Math.min(e.fromCol,e.toCol),c=Math.max(e.fromCol,e.toCol);for(let t=l;t<=s;t++)for(let n=a;n<=c;n++){const o=R(r,e.tableId,t,n);o&&i.push(o)}n=i,o=new Set(i)}const i={getSelectedRange:()=>e,setSelectedRange(n){e=n,r();const o=t.getState();t.dispatch(o.transaction("api").setSelection(o.selection).build())},clearSelectionSilent(){e=null,r()},getSelectedCellIds:()=>n,isSelected:t=>o.has(t)};return t.registerService(ht,i),i}(t)}onReady(){this.context&&this.selectionService&&(this.cleanupMouseSelection=function(t,e){const n=t.getContainer();let o=null,r=!1;function i(n){const i=n.target.closest("td[data-block-id]");if(!i)return o=null,r=!1,void e.setSelectedRange(null);if(n.shiftKey){if(o){const r=A(t.getState(),i.getAttribute("data-block-id"));if(!r||r.tableId!==o.tableId)return o=null,void e.setSelectedRange(null);n.preventDefault(),e.setSelectedRange({tableId:o.tableId,fromRow:o.row,fromCol:o.col,toRow:r.rowIndex,toCol:r.colIndex})}}else{e.setSelectedRange(null);const n=A(t.getState(),i.getAttribute("data-block-id"));if(!n)return o=null,void(r=!1);o={tableId:n.tableId,row:n.rowIndex,col:n.colIndex},r=!0}}function l(n){if(!r||!o)return;const i=n.target.closest("td[data-block-id]");if(!i)return;const l=A(t.getState(),i.getAttribute("data-block-id"));l&&l.tableId===o.tableId&&(l.rowIndex===o.row&&l.colIndex===o.col||(n.preventDefault(),e.setSelectedRange({tableId:o.tableId,fromRow:o.row,fromCol:o.col,toRow:l.rowIndex,toCol:l.colIndex})))}function s(){r=!1}return n.addEventListener("mousedown",i),n.addEventListener("mousemove",l),document.addEventListener("mouseup",s),()=>{n.removeEventListener("mousedown",i),n.removeEventListener("mousemove",l),document.removeEventListener("mouseup",s)}}(this.context,this.selectionService))}destroy(){this.cleanupMouseSelection?.(),this.cleanupMouseSelection=null,this.selectionService=null,this.context=null}decorations(n){if(!this.selectionService)return t.empty;if(!this.selectionService.getSelectedRange())return t.empty;const r=n.selection;if(!o(r)||!M(n,r.anchor.blockId))return this.selectionService.clearSelectionSilent(),t.empty;const i=this.selectionService.getSelectedCellIds();if(0===i.length)return t.empty;const l=[];for(const t of i)l.push(e(t,{class:"notectl-table-cell--selected"}));return t.create(l)}registerNodeSpecs(t){t.registerNodeSpec({type:"table",group:"block",content:{allow:["table_row"],min:1},isolating:!0,selectable:!0,toDOM(t){const e=document.createElement("div");return e.className="notectl-table-wrapper",e.setAttribute("data-block-id",t.id),e},toHTML(t,e,o){const r=t.attrs?.borderColor,i=function(t){return t?"none"===t?`${ft}; --ntbl-bc: transparent`:c(t)?`${ft}; --ntbl-bc: ${n(t)}`:ft:ft}(r);return`<table${o?.styleAttr(i)??` style="${i}"`}>${e}</table>`},sanitize:{tags:["table","tbody"]}}),t.registerNodeSpec({type:"table_row",group:"table_content",content:{allow:["table_cell"],min:1},toDOM(t){const e=document.createElement("tr");return e.setAttribute("data-block-id",t.id),e.setAttribute("role","row"),e},toHTML:(t,e)=>`<tr>${e}</tr>`,sanitize:{tags:["tr"]}}),t.registerNodeSpec({type:"table_cell",group:"table_content",content:{allow:["paragraph","list_item","heading","blockquote","image","horizontal_rule"]},isolating:!0,toDOM(t){const e=document.createElement("td");return e.setAttribute("data-block-id",t.id),e.setAttribute("role","cell"),e},toHTML(t,e,n){const o=t.attrs?.colspan??1,r=t.attrs?.rowspan??1,i=[n?.styleAttr(gt)??` style="${gt}"`];return o>1&&i.push(` colspan="${o}"`),r>1&&i.push(` rowspan="${r}"`),`<td${i.join("")}>${e}</td>`},sanitize:{tags:["td"],attrs:["colspan","rowspan"]}})}registerNodeViews(t){t.getSchemaRegistry(),t.registerNodeView("table",function(t,e,n=N){return(t,o,r)=>{const i=document.createElement("div");i.className="ntbl-container",i.setAttribute("data-block-id",t.id),i.setAttribute("data-selectable","true");const l=document.createElement("div");l.className="notectl-table-wrapper";const s=document.createElement("table");s.className="notectl-table",s.setAttribute("role","table");const a=h(t),c=a.length,d=a[0]?h(a[0]).length:0;s.setAttribute("aria-label",n.tableAriaLabel(c,d)),s.setAttribute("aria-description",n.tableAriaDescription);const u=document.createElement("tbody");s.appendChild(u),l.appendChild(s),i.appendChild(l),pt(s,t.attrs?.borderColor);const b=document.createElement("div");b.className="notectl-sr-only",b.setAttribute("aria-live","polite"),b.setAttribute("aria-atomic","true"),i.appendChild(b);const p=function(t,e,n,o,r,i,l){return new bt(t,e,n,o,r,i,l)}(i,s,t,o,r,e,n);let m=null,f=t.id;const g=t=>{if(!e)return;t.preventDefault(),t.stopPropagation(),m?.close();const o=new DOMRect(t.clientX,t.clientY,0,0);m=G(i,e,f,o,()=>{m=null},n)};return s.addEventListener("contextmenu",g),{dom:i,contentDOM:u,update(t){if("table"!==t.type)return!1;f=t.id,i.setAttribute("data-block-id",t.id),i.setAttribute("data-selectable","true");const e=h(t),o=e.length,r=e[0]?h(e[0]).length:0;return s.setAttribute("aria-label",n.tableAriaLabel(o,r)),pt(s,t.attrs?.borderColor),p.update(t),!1},destroy(){m?.destroy(),s.removeEventListener("contextmenu",g),p.destroy()},selectNode(){i.classList.add("notectl-table--selected")},deselectNode(){i.classList.remove("notectl-table--selected")}}}}(0,t,this.locale)),t.registerNodeView("table_row",(t,e,n)=>{const o=document.createElement("tr");return o.setAttribute("data-block-id",t.id),o.setAttribute("role","row"),{dom:o,contentDOM:o,update:t=>("table_row"!==t.type||o.setAttribute("data-block-id",t.id),!1),destroy(){}}}),t.registerNodeView("table_cell",(t,e,n)=>{const o=document.createElement("td");o.setAttribute("data-block-id",t.id),o.setAttribute("role","cell");const r=t.attrs?.colspan??1,i=t.attrs?.rowspan??1;r>1&&(o.colSpan=r),i>1&&(o.rowSpan=i);const l=t.attrs?.align;return l&&"left"!==l&&I(o,"textAlign",l),{dom:o,contentDOM:o,update(t){if("table_cell"!==t.type)return!1;o.setAttribute("data-block-id",t.id);const e=t.attrs?.colspan??1,n=t.attrs?.rowspan??1;return e>1?o.colSpan=e:o.removeAttribute("colspan"),n>1?o.rowSpan=n:o.removeAttribute("rowspan"),!1},destroy(){}}})}registerToolbarItem(t){const e=this.config.maxPickerRows??8,n=this.config.maxPickerCols??8;t.registerToolbarItem({id:"table",group:"insert",icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 3h18v18H3V3zm2 2v4h6V5H5zm8 0v4h6V5h-6zm-8 6v4h6v-4H5zm8 0v4h6v-4h-6zm-8 6v4h6v-4H5zm8 0v4h6v-4h-6z"/></svg>',label:this.locale.insertTable,tooltip:this.locale.insertTable,command:"insertTable",popupType:"gridPicker",popupConfig:{maxRows:e,maxCols:n,onSelect:(e,n)=>{K(t,e,n)}},isActive:t=>!!o(t.selection)&&M(t,t.selection.anchor.blockId)})}}export{vt as TablePlugin,ht as TableSelectionServiceKey};
2
2
  //# sourceMappingURL=table.mjs.map