@notectl/core 2.2.1 → 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1280) hide show
  1. package/README.md +2 -0
  2. package/dist/chunks/AlignmentPlugin-h6sx-yIf.mjs +2 -0
  3. package/dist/chunks/AlignmentPlugin-h6sx-yIf.mjs.map +1 -0
  4. package/dist/chunks/AttrRegistry-DcDVyzLm.mjs +2 -0
  5. package/dist/chunks/AttrRegistry-DcDVyzLm.mjs.map +1 -0
  6. package/dist/chunks/AttributedMarkCommands-D4W2Jgpj.mjs +2 -0
  7. package/dist/chunks/AttributedMarkCommands-D4W2Jgpj.mjs.map +1 -0
  8. package/dist/chunks/BidiIsolationPlugin-Bm3h9J15.mjs +2 -0
  9. package/dist/chunks/BidiIsolationPlugin-Bm3h9J15.mjs.map +1 -0
  10. package/dist/chunks/BlockInsertion-6rR9tIGP.mjs +2 -0
  11. package/dist/chunks/BlockInsertion-6rR9tIGP.mjs.map +1 -0
  12. package/dist/chunks/BlockTypePickerRegistry-BTET9jM-.mjs +2 -0
  13. package/dist/chunks/BlockTypePickerRegistry-BTET9jM-.mjs.map +1 -0
  14. package/dist/chunks/BlockquotePlugin-CxrCA0vY.mjs +2 -0
  15. package/dist/chunks/BlockquotePlugin-CxrCA0vY.mjs.map +1 -0
  16. package/dist/chunks/CaretNavigationPlugin-Bb7W_FMg.mjs +2 -0
  17. package/dist/chunks/CaretNavigationPlugin-Bb7W_FMg.mjs.map +1 -0
  18. package/dist/chunks/CodeBlockPlugin-CcB0WaIz.mjs +2 -0
  19. package/dist/chunks/CodeBlockPlugin-CcB0WaIz.mjs.map +1 -0
  20. package/dist/chunks/ColorGrid-CXRdpP_n.mjs +2 -0
  21. package/dist/chunks/ColorGrid-CXRdpP_n.mjs.map +1 -0
  22. package/dist/chunks/ColorPickerPopup-C_74bqid.mjs +2 -0
  23. package/dist/chunks/ColorPickerPopup-C_74bqid.mjs.map +1 -0
  24. package/dist/chunks/ColorValidation-DAijTjG9.mjs +2 -0
  25. package/dist/chunks/ColorValidation-DAijTjG9.mjs.map +1 -0
  26. package/dist/chunks/Commands-BIIpx_Zd.mjs +2 -0
  27. package/dist/chunks/Commands-BIIpx_Zd.mjs.map +1 -0
  28. package/dist/chunks/Decoration-ZeyVfwJB.mjs +2 -0
  29. package/dist/chunks/Decoration-ZeyVfwJB.mjs.map +1 -0
  30. package/dist/chunks/DirectionDetection-C7XE0nxW.mjs +2 -0
  31. package/dist/chunks/DirectionDetection-C7XE0nxW.mjs.map +1 -0
  32. package/dist/chunks/DirectionIcons-Bbawl9ei.mjs +2 -0
  33. package/dist/chunks/DirectionIcons-Bbawl9ei.mjs.map +1 -0
  34. package/dist/chunks/Document-r7vLOAGA.mjs +2 -0
  35. package/dist/chunks/Document-r7vLOAGA.mjs.map +1 -0
  36. package/dist/chunks/DocumentParser-CcTSeT1B.mjs +2 -0
  37. package/dist/chunks/DocumentParser-CcTSeT1B.mjs.map +1 -0
  38. package/dist/chunks/DomUtils-Bf7JLFlx.mjs +2 -0
  39. package/dist/chunks/DomUtils-Bf7JLFlx.mjs.map +1 -0
  40. package/dist/chunks/FontPlugin-1VYDwETg.mjs +2 -0
  41. package/dist/chunks/FontPlugin-1VYDwETg.mjs.map +1 -0
  42. package/dist/chunks/FontSizePlugin-L1uDVsKY.mjs +2 -0
  43. package/dist/chunks/FontSizePlugin-L1uDVsKY.mjs.map +1 -0
  44. package/dist/chunks/FormulaPlugin-66Cc9sH2.mjs +2 -0
  45. package/dist/chunks/FormulaPlugin-66Cc9sH2.mjs.map +1 -0
  46. package/dist/chunks/GapCursorNavigation-ycNzuQVH.mjs +2 -0
  47. package/dist/chunks/GapCursorNavigation-ycNzuQVH.mjs.map +1 -0
  48. package/dist/chunks/GapCursorPlugin-B29ieXel.mjs +2 -0
  49. package/dist/chunks/GapCursorPlugin-B29ieXel.mjs.map +1 -0
  50. package/dist/chunks/HTMLUtils-C6B4UT00.mjs +2 -0
  51. package/dist/chunks/HTMLUtils-C6B4UT00.mjs.map +1 -0
  52. package/dist/chunks/HardBreakPlugin-9DOyCyyM.mjs +2 -0
  53. package/dist/chunks/HardBreakPlugin-9DOyCyyM.mjs.map +1 -0
  54. package/dist/chunks/HeadingPlugin-SICF6Tm0.mjs +2 -0
  55. package/dist/chunks/HeadingPlugin-SICF6Tm0.mjs.map +1 -0
  56. package/dist/chunks/HighlightPlugin-B3b_qe68.mjs +2 -0
  57. package/dist/chunks/HighlightPlugin-B3b_qe68.mjs.map +1 -0
  58. package/dist/chunks/HorizontalRulePlugin-BrFlrpmb.mjs +2 -0
  59. package/dist/chunks/HorizontalRulePlugin-BrFlrpmb.mjs.map +1 -0
  60. package/dist/chunks/ImagePlugin-eRVtFFou.mjs +2 -0
  61. package/dist/chunks/ImagePlugin-eRVtFFou.mjs.map +1 -0
  62. package/dist/chunks/InlineCodePlugin-Cj1EZ3x2.mjs +2 -0
  63. package/dist/chunks/InlineCodePlugin-Cj1EZ3x2.mjs.map +1 -0
  64. package/dist/chunks/InlineStyleMarkSpec-4R6DC7ij.mjs +2 -0
  65. package/dist/chunks/InlineStyleMarkSpec-4R6DC7ij.mjs.map +1 -0
  66. package/dist/chunks/KeyboardNav-D0my3wuy.mjs +2 -0
  67. package/dist/chunks/KeyboardNav-D0my3wuy.mjs.map +1 -0
  68. package/dist/chunks/LinkPlugin-B_ysjORS.mjs +2 -0
  69. package/dist/chunks/LinkPlugin-B_ysjORS.mjs.map +1 -0
  70. package/dist/chunks/ListPlugin-C0BV8CnQ.mjs +2 -0
  71. package/dist/chunks/ListPlugin-C0BV8CnQ.mjs.map +1 -0
  72. package/dist/chunks/NavigationQueries-Bt4zZ17v.mjs +2 -0
  73. package/dist/chunks/NavigationQueries-Bt4zZ17v.mjs.map +1 -0
  74. package/dist/chunks/NodeResolver-ChgLF_IP.mjs +2 -0
  75. package/dist/chunks/NodeResolver-ChgLF_IP.mjs.map +1 -0
  76. package/dist/chunks/NodeSelectionCommands-Dj4VxLdD.mjs +2 -0
  77. package/dist/chunks/NodeSelectionCommands-Dj4VxLdD.mjs.map +1 -0
  78. package/dist/chunks/NodeSpecPatching-B_yLknTl.mjs +2 -0
  79. package/dist/chunks/NodeSpecPatching-B_yLknTl.mjs.map +1 -0
  80. package/dist/chunks/Platform-ByobkiCc.mjs +2 -0
  81. package/dist/chunks/Platform-ByobkiCc.mjs.map +1 -0
  82. package/dist/chunks/PluginHelpers-D4quRJ5a.mjs +2 -0
  83. package/dist/chunks/PluginHelpers-D4quRJ5a.mjs.map +1 -0
  84. package/dist/chunks/PopupKeyboardPatterns-tUrT9TyV.mjs +2 -0
  85. package/dist/chunks/PopupKeyboardPatterns-tUrT9TyV.mjs.map +1 -0
  86. package/dist/chunks/PopupManager-CyOfZUab.mjs +2 -0
  87. package/dist/chunks/PopupManager-CyOfZUab.mjs.map +1 -0
  88. package/dist/chunks/PopupPositioning-DtUrY9bh.mjs +2 -0
  89. package/dist/chunks/PopupPositioning-DtUrY9bh.mjs.map +1 -0
  90. package/dist/chunks/PrintPlugin-CXDFFzWB.mjs +2 -0
  91. package/dist/chunks/PrintPlugin-CXDFFzWB.mjs.map +1 -0
  92. package/dist/chunks/PrintTypes-WdtgSj74.mjs +2 -0
  93. package/dist/chunks/PrintTypes-WdtgSj74.mjs.map +1 -0
  94. package/dist/chunks/RangeIterator-o8v3msQe.mjs +2 -0
  95. package/dist/chunks/RangeIterator-o8v3msQe.mjs.map +1 -0
  96. package/dist/chunks/Selection-HYoVFpAx.mjs +2 -0
  97. package/dist/chunks/Selection-HYoVFpAx.mjs.map +1 -0
  98. package/dist/chunks/SelectionSync-BSHIw1EE.mjs +2 -0
  99. package/dist/chunks/SelectionSync-BSHIw1EE.mjs.map +1 -0
  100. package/dist/chunks/ShortcutFormatting-TwiufqeV.mjs +2 -0
  101. package/dist/chunks/ShortcutFormatting-TwiufqeV.mjs.map +1 -0
  102. package/dist/chunks/SimpleMark-Bdqjcz0G.mjs +2 -0
  103. package/dist/chunks/SimpleMark-Bdqjcz0G.mjs.map +1 -0
  104. package/dist/chunks/SmartPastePlugin-BhkoH03E.mjs +2 -0
  105. package/dist/chunks/SmartPastePlugin-BhkoH03E.mjs.map +1 -0
  106. package/dist/chunks/StrikethroughPlugin-DRuwEZhu.mjs +2 -0
  107. package/dist/chunks/StrikethroughPlugin-DRuwEZhu.mjs.map +1 -0
  108. package/dist/chunks/StyleRuntime-BAutwDZT.mjs +2 -0
  109. package/dist/chunks/StyleRuntime-BAutwDZT.mjs.map +1 -0
  110. package/dist/chunks/SuperSubPlugin-IZ_x8GS-.mjs +2 -0
  111. package/dist/chunks/SuperSubPlugin-IZ_x8GS-.mjs.map +1 -0
  112. package/dist/chunks/SyntaxTokenTypes-BUCOMtL8.mjs +2 -0
  113. package/dist/chunks/SyntaxTokenTypes-BUCOMtL8.mjs.map +1 -0
  114. package/dist/chunks/TablePlugin-CRp4qSZE.mjs +2 -0
  115. package/dist/chunks/TablePlugin-CRp4qSZE.mjs.map +1 -0
  116. package/dist/chunks/TextColorPlugin-CViEiYZk.mjs +2 -0
  117. package/dist/chunks/TextColorPlugin-CViEiYZk.mjs.map +1 -0
  118. package/dist/chunks/TextDirectionAutoPlugin-CzWJjrvG.mjs +2 -0
  119. package/dist/chunks/TextDirectionAutoPlugin-CzWJjrvG.mjs.map +1 -0
  120. package/dist/chunks/TextDirectionPlugin-CQGkaS2s.mjs +2 -0
  121. package/dist/chunks/TextDirectionPlugin-CQGkaS2s.mjs.map +1 -0
  122. package/dist/chunks/TextDirectionService-OFOU6r_s.mjs +2 -0
  123. package/dist/chunks/TextDirectionService-OFOU6r_s.mjs.map +1 -0
  124. package/dist/chunks/TextFormattingPlugin-CpyZgtLi.mjs +2 -0
  125. package/dist/chunks/TextFormattingPlugin-CpyZgtLi.mjs.map +1 -0
  126. package/dist/chunks/ToolbarPlugin-B5UUc6dY.mjs +2 -0
  127. package/dist/chunks/ToolbarPlugin-B5UUc6dY.mjs.map +1 -0
  128. package/dist/chunks/TypeBrands-Ch9856Gb.mjs +2 -0
  129. package/dist/chunks/TypeBrands-Ch9856Gb.mjs.map +1 -0
  130. package/dist/chunks/TypedKeys-CA4bfw9O.mjs +2 -0
  131. package/dist/chunks/TypedKeys-CA4bfw9O.mjs.map +1 -0
  132. package/dist/chunks/VideoPlugin-mXIDODzC.mjs +2 -0
  133. package/dist/chunks/VideoPlugin-mXIDODzC.mjs.map +1 -0
  134. package/dist/chunks/WordBoundary-DxeMBRyP.mjs +2 -0
  135. package/dist/chunks/WordBoundary-DxeMBRyP.mjs.map +1 -0
  136. package/dist/chunks/XmlDetector-D7TQpw-e.mjs +2 -0
  137. package/dist/chunks/XmlDetector-D7TQpw-e.mjs.map +1 -0
  138. package/dist/chunks/XmlPatterns-RN32-0ob.mjs +2 -0
  139. package/dist/chunks/XmlPatterns-RN32-0ob.mjs.map +1 -0
  140. package/dist/chunks/XmlSupport-BYiRwlkK.mjs +2 -0
  141. package/dist/chunks/XmlSupport-BYiRwlkK.mjs.map +1 -0
  142. package/dist/chunks/ar--Isa9OHJ.mjs +2 -0
  143. package/dist/chunks/ar--Isa9OHJ.mjs.map +1 -0
  144. package/dist/chunks/ar--O0A9OTR.mjs +2 -0
  145. package/dist/chunks/ar--O0A9OTR.mjs.map +1 -0
  146. package/dist/chunks/ar-0g2bmXTn.mjs +2 -0
  147. package/dist/chunks/ar-0g2bmXTn.mjs.map +1 -0
  148. package/dist/chunks/ar-4b8e2YSc.mjs +2 -0
  149. package/dist/chunks/ar-4b8e2YSc.mjs.map +1 -0
  150. package/dist/chunks/ar-B03uY4xr.mjs +2 -0
  151. package/dist/chunks/ar-B03uY4xr.mjs.map +1 -0
  152. package/dist/chunks/ar-BAfInw85.mjs +2 -0
  153. package/dist/chunks/ar-BAfInw85.mjs.map +1 -0
  154. package/dist/chunks/ar-BRX5E_Pw.mjs +2 -0
  155. package/dist/chunks/ar-BRX5E_Pw.mjs.map +1 -0
  156. package/dist/chunks/ar-BTShmP2E.mjs +2 -0
  157. package/dist/chunks/ar-BTShmP2E.mjs.map +1 -0
  158. package/dist/chunks/ar-BWOue6jG.mjs +2 -0
  159. package/dist/chunks/ar-BWOue6jG.mjs.map +1 -0
  160. package/dist/chunks/ar-Bdmunk5h.mjs +2 -0
  161. package/dist/chunks/ar-Bdmunk5h.mjs.map +1 -0
  162. package/dist/chunks/ar-BwaoCUVN.mjs +2 -0
  163. package/dist/chunks/ar-BwaoCUVN.mjs.map +1 -0
  164. package/dist/chunks/ar-BzqAYGER.mjs +2 -0
  165. package/dist/chunks/ar-BzqAYGER.mjs.map +1 -0
  166. package/dist/chunks/ar-C9lO1jsY.mjs +2 -0
  167. package/dist/chunks/ar-C9lO1jsY.mjs.map +1 -0
  168. package/dist/chunks/ar-CMXjVzFx.mjs +2 -0
  169. package/dist/chunks/ar-CMXjVzFx.mjs.map +1 -0
  170. package/dist/chunks/ar-CR6UdFL9.mjs +2 -0
  171. package/dist/chunks/ar-CR6UdFL9.mjs.map +1 -0
  172. package/dist/chunks/ar-CrOb0jL2.mjs +2 -0
  173. package/dist/chunks/ar-CrOb0jL2.mjs.map +1 -0
  174. package/dist/chunks/ar-Ctrv6cIi.mjs +2 -0
  175. package/dist/chunks/ar-Ctrv6cIi.mjs.map +1 -0
  176. package/dist/chunks/ar-Cy_77yRf.mjs +2 -0
  177. package/dist/chunks/ar-Cy_77yRf.mjs.map +1 -0
  178. package/dist/chunks/ar-D1jFXqLJ.mjs +2 -0
  179. package/dist/chunks/ar-D1jFXqLJ.mjs.map +1 -0
  180. package/dist/chunks/ar-DahJwMI9.mjs +2 -0
  181. package/dist/chunks/ar-DahJwMI9.mjs.map +1 -0
  182. package/dist/chunks/ar-Dcl3kgtd.mjs +2 -0
  183. package/dist/chunks/ar-Dcl3kgtd.mjs.map +1 -0
  184. package/dist/chunks/ar-Dx2lO0Nm.mjs +2 -0
  185. package/dist/chunks/ar-Dx2lO0Nm.mjs.map +1 -0
  186. package/dist/chunks/ar-NV_puwI2.mjs +2 -0
  187. package/dist/chunks/ar-NV_puwI2.mjs.map +1 -0
  188. package/dist/chunks/ar-Uzo1Azdw.mjs +2 -0
  189. package/dist/chunks/ar-Uzo1Azdw.mjs.map +1 -0
  190. package/dist/chunks/ar-XmSFrtmd.mjs +2 -0
  191. package/dist/chunks/ar-XmSFrtmd.mjs.map +1 -0
  192. package/dist/chunks/ar-jbplYWkC.mjs +2 -0
  193. package/dist/chunks/ar-jbplYWkC.mjs.map +1 -0
  194. package/dist/chunks/ar-sGZ-oZqB.mjs +2 -0
  195. package/dist/chunks/ar-sGZ-oZqB.mjs.map +1 -0
  196. package/dist/chunks/color-picker-C9B2rYw-.mjs +2 -0
  197. package/dist/chunks/color-picker-C9B2rYw-.mjs.map +1 -0
  198. package/dist/chunks/de-B8-w9gPi.mjs +2 -0
  199. package/dist/chunks/de-B8-w9gPi.mjs.map +1 -0
  200. package/dist/chunks/de-B9zSHWqY.mjs +2 -0
  201. package/dist/chunks/de-B9zSHWqY.mjs.map +1 -0
  202. package/dist/chunks/de-BX4y4PlH.mjs +2 -0
  203. package/dist/chunks/de-BX4y4PlH.mjs.map +1 -0
  204. package/dist/chunks/de-BXQBXxFJ.mjs +2 -0
  205. package/dist/chunks/de-BXQBXxFJ.mjs.map +1 -0
  206. package/dist/chunks/de-BcPntcnr.mjs +2 -0
  207. package/dist/chunks/de-BcPntcnr.mjs.map +1 -0
  208. package/dist/chunks/de-BdD3DpUB.mjs +2 -0
  209. package/dist/chunks/de-BdD3DpUB.mjs.map +1 -0
  210. package/dist/chunks/de-Bwxlcuee.mjs +2 -0
  211. package/dist/chunks/de-Bwxlcuee.mjs.map +1 -0
  212. package/dist/chunks/de-BxQIt_1Y.mjs +2 -0
  213. package/dist/chunks/de-BxQIt_1Y.mjs.map +1 -0
  214. package/dist/chunks/de-C--bRmjW.mjs +2 -0
  215. package/dist/chunks/de-C--bRmjW.mjs.map +1 -0
  216. package/dist/chunks/de-C-Yf378-.mjs +2 -0
  217. package/dist/chunks/de-C-Yf378-.mjs.map +1 -0
  218. package/dist/chunks/de-C7uehgMu.mjs +2 -0
  219. package/dist/chunks/de-C7uehgMu.mjs.map +1 -0
  220. package/dist/chunks/de-C9ZhDqPi.mjs +2 -0
  221. package/dist/chunks/de-C9ZhDqPi.mjs.map +1 -0
  222. package/dist/chunks/de-CHcv_Vmf.mjs +2 -0
  223. package/dist/chunks/de-CHcv_Vmf.mjs.map +1 -0
  224. package/dist/chunks/de-CTzAMkXC.mjs +2 -0
  225. package/dist/chunks/de-CTzAMkXC.mjs.map +1 -0
  226. package/dist/chunks/de-CaeEIyzV.mjs +2 -0
  227. package/dist/chunks/de-CaeEIyzV.mjs.map +1 -0
  228. package/dist/chunks/de-DHs9i4af.mjs +2 -0
  229. package/dist/chunks/de-DHs9i4af.mjs.map +1 -0
  230. package/dist/chunks/de-DN-e6G5A.mjs +2 -0
  231. package/dist/chunks/de-DN-e6G5A.mjs.map +1 -0
  232. package/dist/chunks/de-DViI26lG.mjs +2 -0
  233. package/dist/chunks/de-DViI26lG.mjs.map +1 -0
  234. package/dist/chunks/de-DY3obIAF.mjs +2 -0
  235. package/dist/chunks/de-DY3obIAF.mjs.map +1 -0
  236. package/dist/chunks/de-DcMhfRBu.mjs +2 -0
  237. package/dist/chunks/de-DcMhfRBu.mjs.map +1 -0
  238. package/dist/chunks/de-DiPz7abS.mjs +2 -0
  239. package/dist/chunks/de-DiPz7abS.mjs.map +1 -0
  240. package/dist/chunks/de-Dl4QFHMa.mjs +2 -0
  241. package/dist/chunks/de-Dl4QFHMa.mjs.map +1 -0
  242. package/dist/chunks/de-JhGflzS5.mjs +2 -0
  243. package/dist/chunks/de-JhGflzS5.mjs.map +1 -0
  244. package/dist/chunks/de-XCCpWyg0.mjs +2 -0
  245. package/dist/chunks/de-XCCpWyg0.mjs.map +1 -0
  246. package/dist/chunks/de-e6J6nvAD.mjs +2 -0
  247. package/dist/chunks/de-e6J6nvAD.mjs.map +1 -0
  248. package/dist/chunks/de-i95F9SDy.mjs +2 -0
  249. package/dist/chunks/de-i95F9SDy.mjs.map +1 -0
  250. package/dist/chunks/de-uKR7koQe.mjs +2 -0
  251. package/dist/chunks/de-uKR7koQe.mjs.map +1 -0
  252. package/dist/chunks/es-B0Za939C.mjs +2 -0
  253. package/dist/chunks/es-B0Za939C.mjs.map +1 -0
  254. package/dist/chunks/es-B8K3Yvf3.mjs +2 -0
  255. package/dist/chunks/es-B8K3Yvf3.mjs.map +1 -0
  256. package/dist/chunks/es-BIXm2Coj.mjs +2 -0
  257. package/dist/chunks/es-BIXm2Coj.mjs.map +1 -0
  258. package/dist/chunks/es-BJHF95J_.mjs +2 -0
  259. package/dist/chunks/es-BJHF95J_.mjs.map +1 -0
  260. package/dist/chunks/es-BMm9kqjC.mjs +2 -0
  261. package/dist/chunks/es-BMm9kqjC.mjs.map +1 -0
  262. package/dist/chunks/es-BQweZX6P.mjs +2 -0
  263. package/dist/chunks/es-BQweZX6P.mjs.map +1 -0
  264. package/dist/chunks/es-BdpTTRuX.mjs +2 -0
  265. package/dist/chunks/es-BdpTTRuX.mjs.map +1 -0
  266. package/dist/chunks/es-Bv7bDbMp.mjs +2 -0
  267. package/dist/chunks/es-Bv7bDbMp.mjs.map +1 -0
  268. package/dist/chunks/es-C7uVqFYr.mjs +2 -0
  269. package/dist/chunks/es-C7uVqFYr.mjs.map +1 -0
  270. package/dist/chunks/es-CCQFu1t1.mjs +2 -0
  271. package/dist/chunks/es-CCQFu1t1.mjs.map +1 -0
  272. package/dist/chunks/es-CM55WeEN.mjs +2 -0
  273. package/dist/chunks/es-CM55WeEN.mjs.map +1 -0
  274. package/dist/chunks/es-CUKJujcb.mjs +2 -0
  275. package/dist/chunks/es-CUKJujcb.mjs.map +1 -0
  276. package/dist/chunks/es-CXuMz87y.mjs +2 -0
  277. package/dist/chunks/es-CXuMz87y.mjs.map +1 -0
  278. package/dist/chunks/es-CgMfhkJJ.mjs +2 -0
  279. package/dist/chunks/es-CgMfhkJJ.mjs.map +1 -0
  280. package/dist/chunks/es-CtOtKQCP.mjs +2 -0
  281. package/dist/chunks/es-CtOtKQCP.mjs.map +1 -0
  282. package/dist/chunks/es-DD01rZ6N.mjs +2 -0
  283. package/dist/chunks/es-DD01rZ6N.mjs.map +1 -0
  284. package/dist/chunks/es-DDoqchUq.mjs +2 -0
  285. package/dist/chunks/es-DDoqchUq.mjs.map +1 -0
  286. package/dist/chunks/es-DFUVd7eO.mjs +2 -0
  287. package/dist/chunks/es-DFUVd7eO.mjs.map +1 -0
  288. package/dist/chunks/es-DFokqQst.mjs +2 -0
  289. package/dist/chunks/es-DFokqQst.mjs.map +1 -0
  290. package/dist/chunks/es-DHxdoEzR.mjs +2 -0
  291. package/dist/chunks/es-DHxdoEzR.mjs.map +1 -0
  292. package/dist/chunks/es-DehVGwQ8.mjs +2 -0
  293. package/dist/chunks/es-DehVGwQ8.mjs.map +1 -0
  294. package/dist/chunks/es-DrJyl38L.mjs +2 -0
  295. package/dist/chunks/es-DrJyl38L.mjs.map +1 -0
  296. package/dist/chunks/es-fTW0TkYV.mjs +2 -0
  297. package/dist/chunks/es-fTW0TkYV.mjs.map +1 -0
  298. package/dist/chunks/es-kfKiqpyD.mjs +2 -0
  299. package/dist/chunks/es-kfKiqpyD.mjs.map +1 -0
  300. package/dist/chunks/es-nRLq7bgP.mjs +2 -0
  301. package/dist/chunks/es-nRLq7bgP.mjs.map +1 -0
  302. package/dist/chunks/es-paXY7HFt.mjs +2 -0
  303. package/dist/chunks/es-paXY7HFt.mjs.map +1 -0
  304. package/dist/chunks/es-xuahrvJN.mjs +2 -0
  305. package/dist/chunks/es-xuahrvJN.mjs.map +1 -0
  306. package/dist/chunks/fonts-DQC6Uj4r.mjs +2 -0
  307. package/dist/chunks/fonts-DQC6Uj4r.mjs.map +1 -0
  308. package/dist/chunks/fr-0qEo3bRP.mjs +2 -0
  309. package/dist/chunks/fr-0qEo3bRP.mjs.map +1 -0
  310. package/dist/chunks/fr-5HkMazAf.mjs +2 -0
  311. package/dist/chunks/fr-5HkMazAf.mjs.map +1 -0
  312. package/dist/chunks/fr-B9pBLaVx.mjs +2 -0
  313. package/dist/chunks/fr-B9pBLaVx.mjs.map +1 -0
  314. package/dist/chunks/fr-BRXUnq3R.mjs +2 -0
  315. package/dist/chunks/fr-BRXUnq3R.mjs.map +1 -0
  316. package/dist/chunks/fr-BSUKEtTk.mjs +2 -0
  317. package/dist/chunks/fr-BSUKEtTk.mjs.map +1 -0
  318. package/dist/chunks/fr-BaXKyPmX.mjs +2 -0
  319. package/dist/chunks/fr-BaXKyPmX.mjs.map +1 -0
  320. package/dist/chunks/fr-BeRlON1t.mjs +2 -0
  321. package/dist/chunks/fr-BeRlON1t.mjs.map +1 -0
  322. package/dist/chunks/fr-Bg937iAy.mjs +2 -0
  323. package/dist/chunks/fr-Bg937iAy.mjs.map +1 -0
  324. package/dist/chunks/fr-BwWrFThE.mjs +2 -0
  325. package/dist/chunks/fr-BwWrFThE.mjs.map +1 -0
  326. package/dist/chunks/fr-C3EKRThN.mjs +2 -0
  327. package/dist/chunks/fr-C3EKRThN.mjs.map +1 -0
  328. package/dist/chunks/fr-CKjH6tJI.mjs +2 -0
  329. package/dist/chunks/fr-CKjH6tJI.mjs.map +1 -0
  330. package/dist/chunks/fr-CQs0-pNX.mjs +2 -0
  331. package/dist/chunks/fr-CQs0-pNX.mjs.map +1 -0
  332. package/dist/chunks/fr-C_2i5Ono.mjs +2 -0
  333. package/dist/chunks/fr-C_2i5Ono.mjs.map +1 -0
  334. package/dist/chunks/fr-CfhyYN-t.mjs +2 -0
  335. package/dist/chunks/fr-CfhyYN-t.mjs.map +1 -0
  336. package/dist/chunks/fr-D0MDdoir.mjs +2 -0
  337. package/dist/chunks/fr-D0MDdoir.mjs.map +1 -0
  338. package/dist/chunks/fr-D5ulA3Z6.mjs +2 -0
  339. package/dist/chunks/fr-D5ulA3Z6.mjs.map +1 -0
  340. package/dist/chunks/fr-DEZ_oxzS.mjs +2 -0
  341. package/dist/chunks/fr-DEZ_oxzS.mjs.map +1 -0
  342. package/dist/chunks/fr-DciSEykY.mjs +2 -0
  343. package/dist/chunks/fr-DciSEykY.mjs.map +1 -0
  344. package/dist/chunks/fr-DiDhVhyV.mjs +2 -0
  345. package/dist/chunks/fr-DiDhVhyV.mjs.map +1 -0
  346. package/dist/chunks/fr-DjMZ-3K5.mjs +2 -0
  347. package/dist/chunks/fr-DjMZ-3K5.mjs.map +1 -0
  348. package/dist/chunks/fr-DtzIu6tU.mjs +2 -0
  349. package/dist/chunks/fr-DtzIu6tU.mjs.map +1 -0
  350. package/dist/chunks/fr-F2ZrfVaF.mjs +2 -0
  351. package/dist/chunks/fr-F2ZrfVaF.mjs.map +1 -0
  352. package/dist/chunks/fr-KXmbys88.mjs +2 -0
  353. package/dist/chunks/fr-KXmbys88.mjs.map +1 -0
  354. package/dist/chunks/fr-SbpHNrQ-.mjs +2 -0
  355. package/dist/chunks/fr-SbpHNrQ-.mjs.map +1 -0
  356. package/dist/chunks/fr-ZsRdLuys.mjs +2 -0
  357. package/dist/chunks/fr-ZsRdLuys.mjs.map +1 -0
  358. package/dist/chunks/fr-eC0UdAPu.mjs +2 -0
  359. package/dist/chunks/fr-eC0UdAPu.mjs.map +1 -0
  360. package/dist/chunks/fr-fshsDD66.mjs +2 -0
  361. package/dist/chunks/fr-fshsDD66.mjs.map +1 -0
  362. package/dist/chunks/full-CHkwduuY.mjs +2 -0
  363. package/dist/chunks/full-CHkwduuY.mjs.map +1 -0
  364. package/dist/chunks/hi-4CiAKVjT.mjs +2 -0
  365. package/dist/chunks/hi-4CiAKVjT.mjs.map +1 -0
  366. package/dist/chunks/hi-B-ZuX4aN.mjs +2 -0
  367. package/dist/chunks/hi-B-ZuX4aN.mjs.map +1 -0
  368. package/dist/chunks/hi-B2YB3Bo4.mjs +2 -0
  369. package/dist/chunks/hi-B2YB3Bo4.mjs.map +1 -0
  370. package/dist/chunks/hi-B2uhiPCN.mjs +2 -0
  371. package/dist/chunks/hi-B2uhiPCN.mjs.map +1 -0
  372. package/dist/chunks/hi-B5cl8TWK.mjs +2 -0
  373. package/dist/chunks/hi-B5cl8TWK.mjs.map +1 -0
  374. package/dist/chunks/hi-BNJIGWQQ.mjs +2 -0
  375. package/dist/chunks/hi-BNJIGWQQ.mjs.map +1 -0
  376. package/dist/chunks/hi-BOMkDPqC.mjs +2 -0
  377. package/dist/chunks/hi-BOMkDPqC.mjs.map +1 -0
  378. package/dist/chunks/hi-Bl-yeeOI.mjs +2 -0
  379. package/dist/chunks/hi-Bl-yeeOI.mjs.map +1 -0
  380. package/dist/chunks/hi-Bu799xIO.mjs +2 -0
  381. package/dist/chunks/hi-Bu799xIO.mjs.map +1 -0
  382. package/dist/chunks/hi-By8YwVIX.mjs +2 -0
  383. package/dist/chunks/hi-By8YwVIX.mjs.map +1 -0
  384. package/dist/chunks/hi-BzbMD_cP.mjs +2 -0
  385. package/dist/chunks/hi-BzbMD_cP.mjs.map +1 -0
  386. package/dist/chunks/hi-C2jEsf8v.mjs +2 -0
  387. package/dist/chunks/hi-C2jEsf8v.mjs.map +1 -0
  388. package/dist/chunks/hi-C9fvG91d.mjs +2 -0
  389. package/dist/chunks/hi-C9fvG91d.mjs.map +1 -0
  390. package/dist/chunks/hi-CTWubxLY.mjs +2 -0
  391. package/dist/chunks/hi-CTWubxLY.mjs.map +1 -0
  392. package/dist/chunks/hi-CoclKAUM.mjs +2 -0
  393. package/dist/chunks/hi-CoclKAUM.mjs.map +1 -0
  394. package/dist/chunks/hi-CrmakMVj.mjs +2 -0
  395. package/dist/chunks/hi-CrmakMVj.mjs.map +1 -0
  396. package/dist/chunks/hi-DWX6k5ZD.mjs +2 -0
  397. package/dist/chunks/hi-DWX6k5ZD.mjs.map +1 -0
  398. package/dist/chunks/hi-DY55FuDK.mjs +2 -0
  399. package/dist/chunks/hi-DY55FuDK.mjs.map +1 -0
  400. package/dist/chunks/hi-DsdXcOB6.mjs +2 -0
  401. package/dist/chunks/hi-DsdXcOB6.mjs.map +1 -0
  402. package/dist/chunks/hi-Dt89SxNy.mjs +2 -0
  403. package/dist/chunks/hi-Dt89SxNy.mjs.map +1 -0
  404. package/dist/chunks/hi-J8ErB5nB.mjs +2 -0
  405. package/dist/chunks/hi-J8ErB5nB.mjs.map +1 -0
  406. package/dist/chunks/hi-L6pJxZam.mjs +2 -0
  407. package/dist/chunks/hi-L6pJxZam.mjs.map +1 -0
  408. package/dist/chunks/hi-SECtQQzq.mjs +2 -0
  409. package/dist/chunks/hi-SECtQQzq.mjs.map +1 -0
  410. package/dist/chunks/hi-aH9HZG23.mjs +2 -0
  411. package/dist/chunks/hi-aH9HZG23.mjs.map +1 -0
  412. package/dist/chunks/hi-j3TDLMYd.mjs +2 -0
  413. package/dist/chunks/hi-j3TDLMYd.mjs.map +1 -0
  414. package/dist/chunks/hi-l6DA-aOw.mjs +2 -0
  415. package/dist/chunks/hi-l6DA-aOw.mjs.map +1 -0
  416. package/dist/chunks/hi-uACJUw53.mjs +2 -0
  417. package/dist/chunks/hi-uACJUw53.mjs.map +1 -0
  418. package/dist/chunks/minimal-D5v-raei.mjs +2 -0
  419. package/dist/chunks/minimal-D5v-raei.mjs.map +1 -0
  420. package/dist/chunks/pt-5VeuNDd2.mjs +2 -0
  421. package/dist/chunks/pt-5VeuNDd2.mjs.map +1 -0
  422. package/dist/chunks/pt-BCXgUDiU.mjs +2 -0
  423. package/dist/chunks/pt-BCXgUDiU.mjs.map +1 -0
  424. package/dist/chunks/pt-BDam9cDu.mjs +2 -0
  425. package/dist/chunks/pt-BDam9cDu.mjs.map +1 -0
  426. package/dist/chunks/pt-Bb908r0n.mjs +2 -0
  427. package/dist/chunks/pt-Bb908r0n.mjs.map +1 -0
  428. package/dist/chunks/pt-BkpVtod-.mjs +2 -0
  429. package/dist/chunks/pt-BkpVtod-.mjs.map +1 -0
  430. package/dist/chunks/pt-BlFAJZo7.mjs +2 -0
  431. package/dist/chunks/pt-BlFAJZo7.mjs.map +1 -0
  432. package/dist/chunks/pt-Bu7Mbz67.mjs +2 -0
  433. package/dist/chunks/pt-Bu7Mbz67.mjs.map +1 -0
  434. package/dist/chunks/pt-C8sOyw0V.mjs +2 -0
  435. package/dist/chunks/pt-C8sOyw0V.mjs.map +1 -0
  436. package/dist/chunks/pt-CEUgbrii.mjs +2 -0
  437. package/dist/chunks/pt-CEUgbrii.mjs.map +1 -0
  438. package/dist/chunks/pt-CMrFpUWS.mjs +2 -0
  439. package/dist/chunks/pt-CMrFpUWS.mjs.map +1 -0
  440. package/dist/chunks/pt-CMx2wPPY.mjs +2 -0
  441. package/dist/chunks/pt-CMx2wPPY.mjs.map +1 -0
  442. package/dist/chunks/pt-CR4j8gtE.mjs +2 -0
  443. package/dist/chunks/pt-CR4j8gtE.mjs.map +1 -0
  444. package/dist/chunks/pt-Cc4zysaT.mjs +2 -0
  445. package/dist/chunks/pt-Cc4zysaT.mjs.map +1 -0
  446. package/dist/chunks/pt-Cv6q7x5x.mjs +2 -0
  447. package/dist/chunks/pt-Cv6q7x5x.mjs.map +1 -0
  448. package/dist/chunks/pt-DFKJVh7k.mjs +2 -0
  449. package/dist/chunks/pt-DFKJVh7k.mjs.map +1 -0
  450. package/dist/chunks/pt-DYMyMgKQ.mjs +2 -0
  451. package/dist/chunks/pt-DYMyMgKQ.mjs.map +1 -0
  452. package/dist/chunks/pt-D__tcM2T.mjs +2 -0
  453. package/dist/chunks/pt-D__tcM2T.mjs.map +1 -0
  454. package/dist/chunks/pt-Dg2ctkug.mjs +2 -0
  455. package/dist/chunks/pt-Dg2ctkug.mjs.map +1 -0
  456. package/dist/chunks/pt-DgfMoLWR.mjs +2 -0
  457. package/dist/chunks/pt-DgfMoLWR.mjs.map +1 -0
  458. package/dist/chunks/pt-DmN9u3NX.mjs +2 -0
  459. package/dist/chunks/pt-DmN9u3NX.mjs.map +1 -0
  460. package/dist/chunks/pt-GqLw5tN0.mjs +2 -0
  461. package/dist/chunks/pt-GqLw5tN0.mjs.map +1 -0
  462. package/dist/chunks/pt-Hy-0Xnnc.mjs +2 -0
  463. package/dist/chunks/pt-Hy-0Xnnc.mjs.map +1 -0
  464. package/dist/chunks/pt-OXa_IR4Q.mjs +2 -0
  465. package/dist/chunks/pt-OXa_IR4Q.mjs.map +1 -0
  466. package/dist/chunks/pt-UPF7DBlz.mjs +2 -0
  467. package/dist/chunks/pt-UPF7DBlz.mjs.map +1 -0
  468. package/dist/chunks/pt-_qxIe7zX.mjs +2 -0
  469. package/dist/chunks/pt-_qxIe7zX.mjs.map +1 -0
  470. package/dist/chunks/pt-paXY7HFt.mjs +2 -0
  471. package/dist/chunks/pt-paXY7HFt.mjs.map +1 -0
  472. package/dist/chunks/pt-zMHcNGPk.mjs +2 -0
  473. package/dist/chunks/pt-zMHcNGPk.mjs.map +1 -0
  474. package/dist/chunks/ru-4g_qsaLr.mjs +2 -0
  475. package/dist/chunks/ru-4g_qsaLr.mjs.map +1 -0
  476. package/dist/chunks/ru-B1m8J9dl.mjs +2 -0
  477. package/dist/chunks/ru-B1m8J9dl.mjs.map +1 -0
  478. package/dist/chunks/ru-BFpEOrVp.mjs +2 -0
  479. package/dist/chunks/ru-BFpEOrVp.mjs.map +1 -0
  480. package/dist/chunks/ru-BNPUT-3S.mjs +2 -0
  481. package/dist/chunks/ru-BNPUT-3S.mjs.map +1 -0
  482. package/dist/chunks/ru-BotG0MFT.mjs +2 -0
  483. package/dist/chunks/ru-BotG0MFT.mjs.map +1 -0
  484. package/dist/chunks/ru-BxySx7an.mjs +2 -0
  485. package/dist/chunks/ru-BxySx7an.mjs.map +1 -0
  486. package/dist/chunks/ru-C-APN_dm.mjs +2 -0
  487. package/dist/chunks/ru-C-APN_dm.mjs.map +1 -0
  488. package/dist/chunks/ru-C9yFslEG.mjs +2 -0
  489. package/dist/chunks/ru-C9yFslEG.mjs.map +1 -0
  490. package/dist/chunks/ru-CkG_bpfo.mjs +2 -0
  491. package/dist/chunks/ru-CkG_bpfo.mjs.map +1 -0
  492. package/dist/chunks/ru-Cs8KCNyq.mjs +2 -0
  493. package/dist/chunks/ru-Cs8KCNyq.mjs.map +1 -0
  494. package/dist/chunks/ru-CvDl-yEd.mjs +2 -0
  495. package/dist/chunks/ru-CvDl-yEd.mjs.map +1 -0
  496. package/dist/chunks/ru-CwyPz2Va.mjs +2 -0
  497. package/dist/chunks/ru-CwyPz2Va.mjs.map +1 -0
  498. package/dist/chunks/ru-D53d-_UB.mjs +2 -0
  499. package/dist/chunks/ru-D53d-_UB.mjs.map +1 -0
  500. package/dist/chunks/ru-DJMpeuey.mjs +2 -0
  501. package/dist/chunks/ru-DJMpeuey.mjs.map +1 -0
  502. package/dist/chunks/ru-DSRv3_Rg.mjs +2 -0
  503. package/dist/chunks/ru-DSRv3_Rg.mjs.map +1 -0
  504. package/dist/chunks/ru-DV-lgEtM.mjs +2 -0
  505. package/dist/chunks/ru-DV-lgEtM.mjs.map +1 -0
  506. package/dist/chunks/ru-DiwQV30V.mjs +2 -0
  507. package/dist/chunks/ru-DiwQV30V.mjs.map +1 -0
  508. package/dist/chunks/ru-DkW9XZFy.mjs +2 -0
  509. package/dist/chunks/ru-DkW9XZFy.mjs.map +1 -0
  510. package/dist/chunks/ru-DyCTlhjg.mjs +2 -0
  511. package/dist/chunks/ru-DyCTlhjg.mjs.map +1 -0
  512. package/dist/chunks/ru-QGX8lOTs.mjs +2 -0
  513. package/dist/chunks/ru-QGX8lOTs.mjs.map +1 -0
  514. package/dist/chunks/ru-QcTo2yoL.mjs +2 -0
  515. package/dist/chunks/ru-QcTo2yoL.mjs.map +1 -0
  516. package/dist/chunks/ru-Y11wuxOB.mjs +2 -0
  517. package/dist/chunks/ru-Y11wuxOB.mjs.map +1 -0
  518. package/dist/chunks/ru-Yngw7nFP.mjs +2 -0
  519. package/dist/chunks/ru-Yngw7nFP.mjs.map +1 -0
  520. package/dist/chunks/ru-d68SZpEe.mjs +2 -0
  521. package/dist/chunks/ru-d68SZpEe.mjs.map +1 -0
  522. package/dist/chunks/ru-k7o3Qks3.mjs +2 -0
  523. package/dist/chunks/ru-k7o3Qks3.mjs.map +1 -0
  524. package/dist/chunks/ru-l73diFXn.mjs +2 -0
  525. package/dist/chunks/ru-l73diFXn.mjs.map +1 -0
  526. package/dist/chunks/ru-q8kz-237.mjs +2 -0
  527. package/dist/chunks/ru-q8kz-237.mjs.map +1 -0
  528. package/dist/chunks/src-gVRDR_79.mjs +2 -0
  529. package/dist/chunks/src-gVRDR_79.mjs.map +1 -0
  530. package/dist/chunks/zh-BGYJXxVl.mjs +2 -0
  531. package/dist/chunks/zh-BGYJXxVl.mjs.map +1 -0
  532. package/dist/chunks/zh-BP97XjlS.mjs +2 -0
  533. package/dist/chunks/zh-BP97XjlS.mjs.map +1 -0
  534. package/dist/chunks/zh-BQ73oqxc.mjs +2 -0
  535. package/dist/chunks/zh-BQ73oqxc.mjs.map +1 -0
  536. package/dist/chunks/zh-BQqf3wJZ.mjs +2 -0
  537. package/dist/chunks/zh-BQqf3wJZ.mjs.map +1 -0
  538. package/dist/chunks/zh-Baxh6v0j.mjs +2 -0
  539. package/dist/chunks/zh-Baxh6v0j.mjs.map +1 -0
  540. package/dist/chunks/zh-BjoyjClN.mjs +2 -0
  541. package/dist/chunks/zh-BjoyjClN.mjs.map +1 -0
  542. package/dist/chunks/zh-BvuAbM2S.mjs +2 -0
  543. package/dist/chunks/zh-BvuAbM2S.mjs.map +1 -0
  544. package/dist/chunks/zh-C-wHnDo5.mjs +2 -0
  545. package/dist/chunks/zh-C-wHnDo5.mjs.map +1 -0
  546. package/dist/chunks/zh-C7iCgCRP.mjs +2 -0
  547. package/dist/chunks/zh-C7iCgCRP.mjs.map +1 -0
  548. package/dist/chunks/zh-CRsDvfPR.mjs +2 -0
  549. package/dist/chunks/zh-CRsDvfPR.mjs.map +1 -0
  550. package/dist/chunks/zh-CWGAPVei.mjs +2 -0
  551. package/dist/chunks/zh-CWGAPVei.mjs.map +1 -0
  552. package/dist/chunks/zh-CWIzJcXi.mjs +2 -0
  553. package/dist/chunks/zh-CWIzJcXi.mjs.map +1 -0
  554. package/dist/chunks/zh-CYV-db-K.mjs +2 -0
  555. package/dist/chunks/zh-CYV-db-K.mjs.map +1 -0
  556. package/dist/chunks/zh-CnW44JEw.mjs +2 -0
  557. package/dist/chunks/zh-CnW44JEw.mjs.map +1 -0
  558. package/dist/chunks/zh-D1HSmSOf.mjs +2 -0
  559. package/dist/chunks/zh-D1HSmSOf.mjs.map +1 -0
  560. package/dist/chunks/zh-DWN1Jqn3.mjs +2 -0
  561. package/dist/chunks/zh-DWN1Jqn3.mjs.map +1 -0
  562. package/dist/chunks/zh-DYD476c5.mjs +2 -0
  563. package/dist/chunks/zh-DYD476c5.mjs.map +1 -0
  564. package/dist/chunks/zh-DdzgYD7k.mjs +2 -0
  565. package/dist/chunks/zh-DdzgYD7k.mjs.map +1 -0
  566. package/dist/chunks/zh-DeZP08HI.mjs +2 -0
  567. package/dist/chunks/zh-DeZP08HI.mjs.map +1 -0
  568. package/dist/chunks/zh-DgSmvLyw.mjs +2 -0
  569. package/dist/chunks/zh-DgSmvLyw.mjs.map +1 -0
  570. package/dist/chunks/zh-DlVfQn4z.mjs +2 -0
  571. package/dist/chunks/zh-DlVfQn4z.mjs.map +1 -0
  572. package/dist/chunks/zh-DuucmOns.mjs +2 -0
  573. package/dist/chunks/zh-DuucmOns.mjs.map +1 -0
  574. package/dist/chunks/zh-Oj-qSUEp.mjs +2 -0
  575. package/dist/chunks/zh-Oj-qSUEp.mjs.map +1 -0
  576. package/dist/chunks/zh-YfuE_m2y.mjs +2 -0
  577. package/dist/chunks/zh-YfuE_m2y.mjs.map +1 -0
  578. package/dist/chunks/zh-dGSDBBzb.mjs +2 -0
  579. package/dist/chunks/zh-dGSDBBzb.mjs.map +1 -0
  580. package/dist/chunks/zh-ikm3rSTR.mjs +2 -0
  581. package/dist/chunks/zh-ikm3rSTR.mjs.map +1 -0
  582. package/dist/chunks/zh-oZl1P_p0.mjs +2 -0
  583. package/dist/chunks/zh-oZl1P_p0.mjs.map +1 -0
  584. package/dist/commands/BlockInsertion.d.ts +49 -2
  585. package/dist/commands/BlockInsertion.d.ts.map +1 -1
  586. package/dist/commands/Commands.d.ts.map +1 -1
  587. package/dist/commands/NodeSelectionCommands.d.ts +10 -2
  588. package/dist/commands/NodeSelectionCommands.d.ts.map +1 -1
  589. package/dist/editor/styles/list.d.ts +1 -1
  590. package/dist/editor/styles/list.d.ts.map +1 -1
  591. package/dist/fonts.mjs +1 -1
  592. package/dist/full.mjs +1 -1
  593. package/dist/html.mjs +1 -1
  594. package/dist/index.d.ts +1 -1
  595. package/dist/index.d.ts.map +1 -1
  596. package/dist/input/KeyDescriptor.d.ts +40 -0
  597. package/dist/input/KeyDescriptor.d.ts.map +1 -0
  598. package/dist/input/KeyboardHandler.d.ts +17 -5
  599. package/dist/input/KeyboardHandler.d.ts.map +1 -1
  600. package/dist/input/PasteHTMLHandler.d.ts.map +1 -1
  601. package/dist/input/PasteRichBlockHandler.d.ts +22 -3
  602. package/dist/input/PasteRichBlockHandler.d.ts.map +1 -1
  603. package/dist/model/Document.d.ts +2 -2
  604. package/dist/model/Document.d.ts.map +1 -1
  605. package/dist/notectl-core.mjs +1 -1
  606. package/dist/notectl-core.umd.js +1 -1
  607. package/dist/notectl-core.umd.js.map +1 -1
  608. package/dist/plugins/alignment.mjs +1 -1
  609. package/dist/plugins/bidi-isolation.mjs +1 -1
  610. package/dist/plugins/blockquote.mjs +1 -1
  611. package/dist/plugins/caret-navigation.mjs +1 -1
  612. package/dist/plugins/code-block.mjs +1 -1
  613. package/dist/plugins/font-size.mjs +1 -1
  614. package/dist/plugins/font.mjs +1 -1
  615. package/dist/plugins/formula/DisplayMathNodeSpec.d.ts.map +1 -1
  616. package/dist/plugins/formula/FormulaCommands.d.ts +14 -0
  617. package/dist/plugins/formula/FormulaCommands.d.ts.map +1 -1
  618. package/dist/plugins/formula/FormulaEditorMount.d.ts.map +1 -1
  619. package/dist/plugins/formula/FormulaLocale.d.ts +7 -1
  620. package/dist/plugins/formula/FormulaLocale.d.ts.map +1 -1
  621. package/dist/plugins/formula/FormulaPasteInterceptor.d.ts +12 -3
  622. package/dist/plugins/formula/FormulaPasteInterceptor.d.ts.map +1 -1
  623. package/dist/plugins/formula/FormulaSerialization.d.ts +17 -0
  624. package/dist/plugins/formula/FormulaSerialization.d.ts.map +1 -0
  625. package/dist/plugins/formula/FormulaStyles.d.ts +1 -1
  626. package/dist/plugins/formula/FormulaStyles.d.ts.map +1 -1
  627. package/dist/plugins/formula/InlineMathNodeSpec.d.ts.map +1 -1
  628. package/dist/plugins/formula/locales/ar.d.ts.map +1 -1
  629. package/dist/plugins/formula/locales/de.d.ts.map +1 -1
  630. package/dist/plugins/formula/locales/es.d.ts.map +1 -1
  631. package/dist/plugins/formula/locales/fr.d.ts.map +1 -1
  632. package/dist/plugins/formula/locales/hi.d.ts.map +1 -1
  633. package/dist/plugins/formula/locales/pt.d.ts.map +1 -1
  634. package/dist/plugins/formula/locales/ru.d.ts.map +1 -1
  635. package/dist/plugins/formula/locales/zh.d.ts.map +1 -1
  636. package/dist/plugins/formula/math-field/MathPalette.d.ts.map +1 -1
  637. package/dist/plugins/formula/math-field/MathPaletteData.d.ts +7 -1
  638. package/dist/plugins/formula/math-field/MathPaletteData.d.ts.map +1 -1
  639. package/dist/plugins/formula/mathml/MathMLDocument.d.ts +13 -0
  640. package/dist/plugins/formula/mathml/MathMLDocument.d.ts.map +1 -1
  641. package/dist/plugins/formula.mjs +1 -1
  642. package/dist/plugins/gap-cursor.mjs +1 -1
  643. package/dist/plugins/hard-break.mjs +1 -1
  644. package/dist/plugins/heading.mjs +1 -1
  645. package/dist/plugins/highlight.mjs +1 -1
  646. package/dist/plugins/horizontal-rule.mjs +1 -1
  647. package/dist/plugins/image.mjs +1 -1
  648. package/dist/plugins/inline-code.mjs +1 -1
  649. package/dist/plugins/language.mjs +1 -1
  650. package/dist/plugins/link.mjs +1 -1
  651. package/dist/plugins/list/ListCommands.d.ts +16 -3
  652. package/dist/plugins/list/ListCommands.d.ts.map +1 -1
  653. package/dist/plugins/list/ListLocale.d.ts +6 -0
  654. package/dist/plugins/list/ListLocale.d.ts.map +1 -1
  655. package/dist/plugins/list/ListMarker.d.ts +14 -0
  656. package/dist/plugins/list/ListMarker.d.ts.map +1 -0
  657. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  658. package/dist/plugins/list/locales/ar.d.ts.map +1 -1
  659. package/dist/plugins/list/locales/de.d.ts.map +1 -1
  660. package/dist/plugins/list/locales/es.d.ts.map +1 -1
  661. package/dist/plugins/list/locales/fr.d.ts.map +1 -1
  662. package/dist/plugins/list/locales/hi.d.ts.map +1 -1
  663. package/dist/plugins/list/locales/pt.d.ts.map +1 -1
  664. package/dist/plugins/list/locales/ru.d.ts.map +1 -1
  665. package/dist/plugins/list/locales/zh.d.ts.map +1 -1
  666. package/dist/plugins/list.mjs +1 -1
  667. package/dist/plugins/print.mjs +1 -1
  668. package/dist/plugins/shared.mjs +1 -1
  669. package/dist/plugins/smart-paste.mjs +1 -1
  670. package/dist/plugins/strikethrough.mjs +1 -1
  671. package/dist/plugins/super-sub.mjs +1 -1
  672. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  673. package/dist/plugins/table.mjs +1 -1
  674. package/dist/plugins/text-color.mjs +1 -1
  675. package/dist/plugins/text-direction-auto.mjs +1 -1
  676. package/dist/plugins/text-direction.mjs +1 -1
  677. package/dist/plugins/text-formatting.mjs +1 -1
  678. package/dist/plugins/toolbar/ToolbarPopupController.d.ts.map +1 -1
  679. package/dist/plugins/toolbar.mjs +1 -1
  680. package/dist/plugins/video/VideoCommands.d.ts.map +1 -1
  681. package/dist/plugins/video.mjs +1 -1
  682. package/dist/presets/full.mjs +1 -1
  683. package/dist/presets/minimal.mjs +1 -1
  684. package/dist/presets.mjs +1 -1
  685. package/dist/state/InlineContentOps.d.ts +5 -3
  686. package/dist/state/InlineContentOps.d.ts.map +1 -1
  687. package/dist/state/StepInversion.d.ts.map +1 -1
  688. package/dist/state/StepMaps.d.ts.map +1 -1
  689. package/dist/state/Steps.d.ts +20 -3
  690. package/dist/state/Steps.d.ts.map +1 -1
  691. package/dist/state/TransactionBuilder.d.ts +3 -3
  692. package/dist/state/TransactionBuilder.d.ts.map +1 -1
  693. package/dist/test/TestUtils.d.ts +2 -0
  694. package/dist/test/TestUtils.d.ts.map +1 -1
  695. package/dist/view/SelectionSync.d.ts.map +1 -1
  696. package/package.json +2 -2
  697. package/dist/chunks/AlignmentPlugin-BLzRjrUl.mjs +0 -2
  698. package/dist/chunks/AlignmentPlugin-BLzRjrUl.mjs.map +0 -1
  699. package/dist/chunks/AttrRegistry-CRnXTPha.mjs +0 -2
  700. package/dist/chunks/AttrRegistry-CRnXTPha.mjs.map +0 -1
  701. package/dist/chunks/AttributedMarkCommands-CxhdUsuE.mjs +0 -2
  702. package/dist/chunks/AttributedMarkCommands-CxhdUsuE.mjs.map +0 -1
  703. package/dist/chunks/BidiIsolationPlugin-DNPXe5ga.mjs +0 -2
  704. package/dist/chunks/BidiIsolationPlugin-DNPXe5ga.mjs.map +0 -1
  705. package/dist/chunks/BlockInsertion-C7jFEeYB.mjs +0 -2
  706. package/dist/chunks/BlockInsertion-C7jFEeYB.mjs.map +0 -1
  707. package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs +0 -2
  708. package/dist/chunks/BlockTypePickerRegistry-U4uY7-lN.mjs.map +0 -1
  709. package/dist/chunks/BlockquotePlugin-YgXcV4mT.mjs +0 -2
  710. package/dist/chunks/BlockquotePlugin-YgXcV4mT.mjs.map +0 -1
  711. package/dist/chunks/CaretNavigationPlugin-P6OYaTSq.mjs +0 -2
  712. package/dist/chunks/CaretNavigationPlugin-P6OYaTSq.mjs.map +0 -1
  713. package/dist/chunks/CodeBlockPlugin-ChPv3Edf.mjs +0 -2
  714. package/dist/chunks/CodeBlockPlugin-ChPv3Edf.mjs.map +0 -1
  715. package/dist/chunks/ColorGrid-D5-teEjD.mjs +0 -2
  716. package/dist/chunks/ColorGrid-D5-teEjD.mjs.map +0 -1
  717. package/dist/chunks/ColorPickerPopup-_Gp09pdx.mjs +0 -2
  718. package/dist/chunks/ColorPickerPopup-_Gp09pdx.mjs.map +0 -1
  719. package/dist/chunks/ColorValidation-okAvytHQ.mjs +0 -2
  720. package/dist/chunks/ColorValidation-okAvytHQ.mjs.map +0 -1
  721. package/dist/chunks/CommandHelpers-NV80Ff1G.mjs +0 -2
  722. package/dist/chunks/CommandHelpers-NV80Ff1G.mjs.map +0 -1
  723. package/dist/chunks/Commands-ixGhPiRG.mjs +0 -2
  724. package/dist/chunks/Commands-ixGhPiRG.mjs.map +0 -1
  725. package/dist/chunks/Decoration-DZK7hrL1.mjs +0 -2
  726. package/dist/chunks/Decoration-DZK7hrL1.mjs.map +0 -1
  727. package/dist/chunks/DirectionDetection-7HmMUZrx.mjs +0 -2
  728. package/dist/chunks/DirectionDetection-7HmMUZrx.mjs.map +0 -1
  729. package/dist/chunks/DirectionIcons-DhRvPVoz.mjs +0 -2
  730. package/dist/chunks/DirectionIcons-DhRvPVoz.mjs.map +0 -1
  731. package/dist/chunks/Document-znhIcvM9.mjs +0 -2
  732. package/dist/chunks/Document-znhIcvM9.mjs.map +0 -1
  733. package/dist/chunks/DocumentParser-DCjOW3us.mjs +0 -2
  734. package/dist/chunks/DocumentParser-DCjOW3us.mjs.map +0 -1
  735. package/dist/chunks/DomUtils-RKbAVBQz.mjs +0 -2
  736. package/dist/chunks/DomUtils-RKbAVBQz.mjs.map +0 -1
  737. package/dist/chunks/FontPlugin-COYtG1Uo.mjs +0 -2
  738. package/dist/chunks/FontPlugin-COYtG1Uo.mjs.map +0 -1
  739. package/dist/chunks/FontSizePlugin-CLcfdTm3.mjs +0 -2
  740. package/dist/chunks/FontSizePlugin-CLcfdTm3.mjs.map +0 -1
  741. package/dist/chunks/FormulaPlugin-DphHU4Rn.mjs +0 -2
  742. package/dist/chunks/FormulaPlugin-DphHU4Rn.mjs.map +0 -1
  743. package/dist/chunks/GapCursorNavigation-Bkuu_Ek8.mjs +0 -2
  744. package/dist/chunks/GapCursorNavigation-Bkuu_Ek8.mjs.map +0 -1
  745. package/dist/chunks/GapCursorPlugin-CRDmQEi1.mjs +0 -2
  746. package/dist/chunks/GapCursorPlugin-CRDmQEi1.mjs.map +0 -1
  747. package/dist/chunks/HTMLUtils-brwcaufP.mjs +0 -2
  748. package/dist/chunks/HTMLUtils-brwcaufP.mjs.map +0 -1
  749. package/dist/chunks/HardBreakPlugin-Cr6dMQ-H.mjs +0 -2
  750. package/dist/chunks/HardBreakPlugin-Cr6dMQ-H.mjs.map +0 -1
  751. package/dist/chunks/HeadingPlugin-3NL4ARPp.mjs +0 -2
  752. package/dist/chunks/HeadingPlugin-3NL4ARPp.mjs.map +0 -1
  753. package/dist/chunks/HighlightPlugin-dHxnAuoW.mjs +0 -2
  754. package/dist/chunks/HighlightPlugin-dHxnAuoW.mjs.map +0 -1
  755. package/dist/chunks/HorizontalRulePlugin-BYPaI4TR.mjs +0 -2
  756. package/dist/chunks/HorizontalRulePlugin-BYPaI4TR.mjs.map +0 -1
  757. package/dist/chunks/ImagePlugin-kgokm-a1.mjs +0 -2
  758. package/dist/chunks/ImagePlugin-kgokm-a1.mjs.map +0 -1
  759. package/dist/chunks/InlineCodePlugin-Bl1jyDwk.mjs +0 -2
  760. package/dist/chunks/InlineCodePlugin-Bl1jyDwk.mjs.map +0 -1
  761. package/dist/chunks/InlineStyleMarkSpec-Cc-b1tlm.mjs +0 -2
  762. package/dist/chunks/InlineStyleMarkSpec-Cc-b1tlm.mjs.map +0 -1
  763. package/dist/chunks/KeyboardNav-DZXdTg-_.mjs +0 -2
  764. package/dist/chunks/KeyboardNav-DZXdTg-_.mjs.map +0 -1
  765. package/dist/chunks/LinkPlugin-Dmcfo3On.mjs +0 -2
  766. package/dist/chunks/LinkPlugin-Dmcfo3On.mjs.map +0 -1
  767. package/dist/chunks/ListPlugin-Ch-5CsFc.mjs +0 -2
  768. package/dist/chunks/ListPlugin-Ch-5CsFc.mjs.map +0 -1
  769. package/dist/chunks/NavigationQueries-3zTaNBlp.mjs +0 -2
  770. package/dist/chunks/NavigationQueries-3zTaNBlp.mjs.map +0 -1
  771. package/dist/chunks/NodeResolver-BplmzA7c.mjs +0 -2
  772. package/dist/chunks/NodeResolver-BplmzA7c.mjs.map +0 -1
  773. package/dist/chunks/NodeSelectionCommands-dUmbRoZ2.mjs +0 -2
  774. package/dist/chunks/NodeSelectionCommands-dUmbRoZ2.mjs.map +0 -1
  775. package/dist/chunks/NodeSpecPatching-DToX09gc.mjs +0 -2
  776. package/dist/chunks/NodeSpecPatching-DToX09gc.mjs.map +0 -1
  777. package/dist/chunks/Platform-wPvKFB9m.mjs +0 -2
  778. package/dist/chunks/Platform-wPvKFB9m.mjs.map +0 -1
  779. package/dist/chunks/PluginHelpers-C3aCCGfX.mjs +0 -2
  780. package/dist/chunks/PluginHelpers-C3aCCGfX.mjs.map +0 -1
  781. package/dist/chunks/PopupKeyboardPatterns-ZdAQB78m.mjs +0 -2
  782. package/dist/chunks/PopupKeyboardPatterns-ZdAQB78m.mjs.map +0 -1
  783. package/dist/chunks/PopupManager-DsT1uRWi.mjs +0 -2
  784. package/dist/chunks/PopupManager-DsT1uRWi.mjs.map +0 -1
  785. package/dist/chunks/PopupPositioning-BEnz90Oh.mjs +0 -2
  786. package/dist/chunks/PopupPositioning-BEnz90Oh.mjs.map +0 -1
  787. package/dist/chunks/PrintPlugin-Bq-Z14K1.mjs +0 -2
  788. package/dist/chunks/PrintPlugin-Bq-Z14K1.mjs.map +0 -1
  789. package/dist/chunks/PrintTypes-DA0Cc--M.mjs +0 -2
  790. package/dist/chunks/PrintTypes-DA0Cc--M.mjs.map +0 -1
  791. package/dist/chunks/RangeIterator-Cl4_k8cx.mjs +0 -2
  792. package/dist/chunks/RangeIterator-Cl4_k8cx.mjs.map +0 -1
  793. package/dist/chunks/Selection-aeiSsvhe.mjs +0 -2
  794. package/dist/chunks/Selection-aeiSsvhe.mjs.map +0 -1
  795. package/dist/chunks/SelectionSync-DCJpNFat.mjs +0 -2
  796. package/dist/chunks/SelectionSync-DCJpNFat.mjs.map +0 -1
  797. package/dist/chunks/ShortcutFormatting-DZK70CN9.mjs +0 -2
  798. package/dist/chunks/ShortcutFormatting-DZK70CN9.mjs.map +0 -1
  799. package/dist/chunks/SimpleMark-CezTJnXh.mjs +0 -2
  800. package/dist/chunks/SimpleMark-CezTJnXh.mjs.map +0 -1
  801. package/dist/chunks/SmartPastePlugin-DlApY6Vw.mjs +0 -2
  802. package/dist/chunks/SmartPastePlugin-DlApY6Vw.mjs.map +0 -1
  803. package/dist/chunks/StrikethroughPlugin-BuFDABvz.mjs +0 -2
  804. package/dist/chunks/StrikethroughPlugin-BuFDABvz.mjs.map +0 -1
  805. package/dist/chunks/StyleRuntime-Bwde5icB.mjs +0 -2
  806. package/dist/chunks/StyleRuntime-Bwde5icB.mjs.map +0 -1
  807. package/dist/chunks/SuperSubPlugin-CiLJ7i4s.mjs +0 -2
  808. package/dist/chunks/SuperSubPlugin-CiLJ7i4s.mjs.map +0 -1
  809. package/dist/chunks/SyntaxTokenTypes-C9dGwufi.mjs +0 -2
  810. package/dist/chunks/SyntaxTokenTypes-C9dGwufi.mjs.map +0 -1
  811. package/dist/chunks/TablePlugin-5ru-y-YX.mjs +0 -2
  812. package/dist/chunks/TablePlugin-5ru-y-YX.mjs.map +0 -1
  813. package/dist/chunks/TextColorPlugin-Vz-Nz8aH.mjs +0 -2
  814. package/dist/chunks/TextColorPlugin-Vz-Nz8aH.mjs.map +0 -1
  815. package/dist/chunks/TextDirectionAutoPlugin-Behl6KMe.mjs +0 -2
  816. package/dist/chunks/TextDirectionAutoPlugin-Behl6KMe.mjs.map +0 -1
  817. package/dist/chunks/TextDirectionPlugin-C3h1n-aA.mjs +0 -2
  818. package/dist/chunks/TextDirectionPlugin-C3h1n-aA.mjs.map +0 -1
  819. package/dist/chunks/TextDirectionService-DRfeQnF6.mjs +0 -2
  820. package/dist/chunks/TextDirectionService-DRfeQnF6.mjs.map +0 -1
  821. package/dist/chunks/TextFormattingPlugin-D_nRMeBn.mjs +0 -2
  822. package/dist/chunks/TextFormattingPlugin-D_nRMeBn.mjs.map +0 -1
  823. package/dist/chunks/ToolbarPlugin-CSMSgjPM.mjs +0 -2
  824. package/dist/chunks/ToolbarPlugin-CSMSgjPM.mjs.map +0 -1
  825. package/dist/chunks/TypeBrands-BZDKMjR-.mjs +0 -2
  826. package/dist/chunks/TypeBrands-BZDKMjR-.mjs.map +0 -1
  827. package/dist/chunks/TypedKeys-E3jOGByL.mjs +0 -2
  828. package/dist/chunks/TypedKeys-E3jOGByL.mjs.map +0 -1
  829. package/dist/chunks/VideoPlugin-BUCGIYXr.mjs +0 -2
  830. package/dist/chunks/VideoPlugin-BUCGIYXr.mjs.map +0 -1
  831. package/dist/chunks/WordBoundary-CYDAtEks.mjs +0 -2
  832. package/dist/chunks/WordBoundary-CYDAtEks.mjs.map +0 -1
  833. package/dist/chunks/XmlDetector-DxBGXqua.mjs +0 -2
  834. package/dist/chunks/XmlDetector-DxBGXqua.mjs.map +0 -1
  835. package/dist/chunks/XmlPatterns-BiHS8w3k.mjs +0 -2
  836. package/dist/chunks/XmlPatterns-BiHS8w3k.mjs.map +0 -1
  837. package/dist/chunks/XmlSupport-B_F65M8G.mjs +0 -2
  838. package/dist/chunks/XmlSupport-B_F65M8G.mjs.map +0 -1
  839. package/dist/chunks/ar-B38MlRRN.mjs +0 -2
  840. package/dist/chunks/ar-B38MlRRN.mjs.map +0 -1
  841. package/dist/chunks/ar-BIeE0C5A.mjs +0 -2
  842. package/dist/chunks/ar-BIeE0C5A.mjs.map +0 -1
  843. package/dist/chunks/ar-BK0rFxF_.mjs +0 -2
  844. package/dist/chunks/ar-BK0rFxF_.mjs.map +0 -1
  845. package/dist/chunks/ar-BK4O36ep.mjs +0 -2
  846. package/dist/chunks/ar-BK4O36ep.mjs.map +0 -1
  847. package/dist/chunks/ar-BNUWuZe3.mjs +0 -2
  848. package/dist/chunks/ar-BNUWuZe3.mjs.map +0 -1
  849. package/dist/chunks/ar-BSXH8acw.mjs +0 -2
  850. package/dist/chunks/ar-BSXH8acw.mjs.map +0 -1
  851. package/dist/chunks/ar-BY8yNlGe.mjs +0 -2
  852. package/dist/chunks/ar-BY8yNlGe.mjs.map +0 -1
  853. package/dist/chunks/ar-BgHkduPE.mjs +0 -2
  854. package/dist/chunks/ar-BgHkduPE.mjs.map +0 -1
  855. package/dist/chunks/ar-BnfWtLhK.mjs +0 -2
  856. package/dist/chunks/ar-BnfWtLhK.mjs.map +0 -1
  857. package/dist/chunks/ar-BwCPhCf6.mjs +0 -2
  858. package/dist/chunks/ar-BwCPhCf6.mjs.map +0 -1
  859. package/dist/chunks/ar-Bymjd9Z_.mjs +0 -2
  860. package/dist/chunks/ar-Bymjd9Z_.mjs.map +0 -1
  861. package/dist/chunks/ar-CKPpdJ7F.mjs +0 -2
  862. package/dist/chunks/ar-CKPpdJ7F.mjs.map +0 -1
  863. package/dist/chunks/ar-C_ir5Uf4.mjs +0 -2
  864. package/dist/chunks/ar-C_ir5Uf4.mjs.map +0 -1
  865. package/dist/chunks/ar-CkE6GDVA.mjs +0 -2
  866. package/dist/chunks/ar-CkE6GDVA.mjs.map +0 -1
  867. package/dist/chunks/ar-ClgA1KQM.mjs +0 -2
  868. package/dist/chunks/ar-ClgA1KQM.mjs.map +0 -1
  869. package/dist/chunks/ar-Cm1DOK74.mjs +0 -2
  870. package/dist/chunks/ar-Cm1DOK74.mjs.map +0 -1
  871. package/dist/chunks/ar-CseGhQtS.mjs +0 -2
  872. package/dist/chunks/ar-CseGhQtS.mjs.map +0 -1
  873. package/dist/chunks/ar-D0bqkviV.mjs +0 -2
  874. package/dist/chunks/ar-D0bqkviV.mjs.map +0 -1
  875. package/dist/chunks/ar-D5d185g0.mjs +0 -2
  876. package/dist/chunks/ar-D5d185g0.mjs.map +0 -1
  877. package/dist/chunks/ar-DSwUyX47.mjs +0 -2
  878. package/dist/chunks/ar-DSwUyX47.mjs.map +0 -1
  879. package/dist/chunks/ar-DfSNWZX7.mjs +0 -2
  880. package/dist/chunks/ar-DfSNWZX7.mjs.map +0 -1
  881. package/dist/chunks/ar-Dghtfs46.mjs +0 -2
  882. package/dist/chunks/ar-Dghtfs46.mjs.map +0 -1
  883. package/dist/chunks/ar-DvNKBrJd.mjs +0 -2
  884. package/dist/chunks/ar-DvNKBrJd.mjs.map +0 -1
  885. package/dist/chunks/ar-KNULRI8r.mjs +0 -2
  886. package/dist/chunks/ar-KNULRI8r.mjs.map +0 -1
  887. package/dist/chunks/ar-NtGRavHz.mjs +0 -2
  888. package/dist/chunks/ar-NtGRavHz.mjs.map +0 -1
  889. package/dist/chunks/ar-Y9KjJLX8.mjs +0 -2
  890. package/dist/chunks/ar-Y9KjJLX8.mjs.map +0 -1
  891. package/dist/chunks/ar-odM5gkvw.mjs +0 -2
  892. package/dist/chunks/ar-odM5gkvw.mjs.map +0 -1
  893. package/dist/chunks/color-picker-C89H4SVX.mjs +0 -2
  894. package/dist/chunks/color-picker-C89H4SVX.mjs.map +0 -1
  895. package/dist/chunks/de-B1TXiyll.mjs +0 -2
  896. package/dist/chunks/de-B1TXiyll.mjs.map +0 -1
  897. package/dist/chunks/de-BDRaxLyi.mjs +0 -2
  898. package/dist/chunks/de-BDRaxLyi.mjs.map +0 -1
  899. package/dist/chunks/de-BGOpZ8Ls.mjs +0 -2
  900. package/dist/chunks/de-BGOpZ8Ls.mjs.map +0 -1
  901. package/dist/chunks/de-BfZ5qXWz.mjs +0 -2
  902. package/dist/chunks/de-BfZ5qXWz.mjs.map +0 -1
  903. package/dist/chunks/de-BibufNIa.mjs +0 -2
  904. package/dist/chunks/de-BibufNIa.mjs.map +0 -1
  905. package/dist/chunks/de-BkZqCmzL.mjs +0 -2
  906. package/dist/chunks/de-BkZqCmzL.mjs.map +0 -1
  907. package/dist/chunks/de-BzRd2oyR.mjs +0 -2
  908. package/dist/chunks/de-BzRd2oyR.mjs.map +0 -1
  909. package/dist/chunks/de-C4gnHDmk.mjs +0 -2
  910. package/dist/chunks/de-C4gnHDmk.mjs.map +0 -1
  911. package/dist/chunks/de-C4iw9SEp.mjs +0 -2
  912. package/dist/chunks/de-C4iw9SEp.mjs.map +0 -1
  913. package/dist/chunks/de-CLWzcDoW.mjs +0 -2
  914. package/dist/chunks/de-CLWzcDoW.mjs.map +0 -1
  915. package/dist/chunks/de-Cbv0otYM.mjs +0 -2
  916. package/dist/chunks/de-Cbv0otYM.mjs.map +0 -1
  917. package/dist/chunks/de-Cinp7zmo.mjs +0 -2
  918. package/dist/chunks/de-Cinp7zmo.mjs.map +0 -1
  919. package/dist/chunks/de-CvnyjI_X.mjs +0 -2
  920. package/dist/chunks/de-CvnyjI_X.mjs.map +0 -1
  921. package/dist/chunks/de-DCx3Shj3.mjs +0 -2
  922. package/dist/chunks/de-DCx3Shj3.mjs.map +0 -1
  923. package/dist/chunks/de-Dav2GzjV.mjs +0 -2
  924. package/dist/chunks/de-Dav2GzjV.mjs.map +0 -1
  925. package/dist/chunks/de-Dc7GRbWc.mjs +0 -2
  926. package/dist/chunks/de-Dc7GRbWc.mjs.map +0 -1
  927. package/dist/chunks/de-DdntlpT3.mjs +0 -2
  928. package/dist/chunks/de-DdntlpT3.mjs.map +0 -1
  929. package/dist/chunks/de-DefykdF-.mjs +0 -2
  930. package/dist/chunks/de-DefykdF-.mjs.map +0 -1
  931. package/dist/chunks/de-DfQQIP8Y.mjs +0 -2
  932. package/dist/chunks/de-DfQQIP8Y.mjs.map +0 -1
  933. package/dist/chunks/de-DkcKDkbA.mjs +0 -2
  934. package/dist/chunks/de-DkcKDkbA.mjs.map +0 -1
  935. package/dist/chunks/de-DqGfLfeV.mjs +0 -2
  936. package/dist/chunks/de-DqGfLfeV.mjs.map +0 -1
  937. package/dist/chunks/de-DudqIJho.mjs +0 -2
  938. package/dist/chunks/de-DudqIJho.mjs.map +0 -1
  939. package/dist/chunks/de-LCXA2xWj.mjs +0 -2
  940. package/dist/chunks/de-LCXA2xWj.mjs.map +0 -1
  941. package/dist/chunks/de-YygmrxGp.mjs +0 -2
  942. package/dist/chunks/de-YygmrxGp.mjs.map +0 -1
  943. package/dist/chunks/de-asI3UlFG.mjs +0 -2
  944. package/dist/chunks/de-asI3UlFG.mjs.map +0 -1
  945. package/dist/chunks/de-kvMvD3AJ.mjs +0 -2
  946. package/dist/chunks/de-kvMvD3AJ.mjs.map +0 -1
  947. package/dist/chunks/de-pnfTnS03.mjs +0 -2
  948. package/dist/chunks/de-pnfTnS03.mjs.map +0 -1
  949. package/dist/chunks/es-4tbAR0If.mjs +0 -2
  950. package/dist/chunks/es-4tbAR0If.mjs.map +0 -1
  951. package/dist/chunks/es-B9z2Xwj0.mjs +0 -2
  952. package/dist/chunks/es-B9z2Xwj0.mjs.map +0 -1
  953. package/dist/chunks/es-BJxjRQSg.mjs +0 -2
  954. package/dist/chunks/es-BJxjRQSg.mjs.map +0 -1
  955. package/dist/chunks/es-BSyxBRjn.mjs +0 -2
  956. package/dist/chunks/es-BSyxBRjn.mjs.map +0 -1
  957. package/dist/chunks/es-Bcpq2xfU.mjs +0 -2
  958. package/dist/chunks/es-Bcpq2xfU.mjs.map +0 -1
  959. package/dist/chunks/es-BhUjc8mO.mjs +0 -2
  960. package/dist/chunks/es-BhUjc8mO.mjs.map +0 -1
  961. package/dist/chunks/es-Bm7hoJSI.mjs +0 -2
  962. package/dist/chunks/es-Bm7hoJSI.mjs.map +0 -1
  963. package/dist/chunks/es-C0E-lFIC.mjs +0 -2
  964. package/dist/chunks/es-C0E-lFIC.mjs.map +0 -1
  965. package/dist/chunks/es-C2wBBQ7N.mjs +0 -2
  966. package/dist/chunks/es-C2wBBQ7N.mjs.map +0 -1
  967. package/dist/chunks/es-C9vhYpfP.mjs +0 -2
  968. package/dist/chunks/es-C9vhYpfP.mjs.map +0 -1
  969. package/dist/chunks/es-Cgslt0Hp.mjs +0 -2
  970. package/dist/chunks/es-Cgslt0Hp.mjs.map +0 -1
  971. package/dist/chunks/es-CksXDFxg.mjs +0 -2
  972. package/dist/chunks/es-CksXDFxg.mjs.map +0 -1
  973. package/dist/chunks/es-CnQUZlfY.mjs +0 -2
  974. package/dist/chunks/es-CnQUZlfY.mjs.map +0 -1
  975. package/dist/chunks/es-CrRNOn2Q.mjs +0 -2
  976. package/dist/chunks/es-CrRNOn2Q.mjs.map +0 -1
  977. package/dist/chunks/es-D0427MIH.mjs +0 -2
  978. package/dist/chunks/es-D0427MIH.mjs.map +0 -1
  979. package/dist/chunks/es-D19xfXus.mjs +0 -2
  980. package/dist/chunks/es-D19xfXus.mjs.map +0 -1
  981. package/dist/chunks/es-Dk6lCcOt.mjs +0 -2
  982. package/dist/chunks/es-Dk6lCcOt.mjs.map +0 -1
  983. package/dist/chunks/es-Dls_xPCW.mjs +0 -2
  984. package/dist/chunks/es-Dls_xPCW.mjs.map +0 -1
  985. package/dist/chunks/es-DrcsyDvI.mjs +0 -2
  986. package/dist/chunks/es-DrcsyDvI.mjs.map +0 -1
  987. package/dist/chunks/es-DwKejbO9.mjs +0 -2
  988. package/dist/chunks/es-DwKejbO9.mjs.map +0 -1
  989. package/dist/chunks/es-NcrWuNe1.mjs +0 -2
  990. package/dist/chunks/es-NcrWuNe1.mjs.map +0 -1
  991. package/dist/chunks/es-RaZerssd.mjs +0 -2
  992. package/dist/chunks/es-RaZerssd.mjs.map +0 -1
  993. package/dist/chunks/es-TIjHCFNF.mjs +0 -2
  994. package/dist/chunks/es-TIjHCFNF.mjs.map +0 -1
  995. package/dist/chunks/es-eZcDkBb-.mjs +0 -2
  996. package/dist/chunks/es-eZcDkBb-.mjs.map +0 -1
  997. package/dist/chunks/es-j_-KW9-4.mjs +0 -2
  998. package/dist/chunks/es-j_-KW9-4.mjs.map +0 -1
  999. package/dist/chunks/es-kGLwn8EB.mjs +0 -2
  1000. package/dist/chunks/es-kGLwn8EB.mjs.map +0 -1
  1001. package/dist/chunks/es-qQRDC0Ge.mjs +0 -2
  1002. package/dist/chunks/es-qQRDC0Ge.mjs.map +0 -1
  1003. package/dist/chunks/fonts-ZXAIMT3b.mjs +0 -2
  1004. package/dist/chunks/fonts-ZXAIMT3b.mjs.map +0 -1
  1005. package/dist/chunks/fr-B27zAq0X.mjs +0 -2
  1006. package/dist/chunks/fr-B27zAq0X.mjs.map +0 -1
  1007. package/dist/chunks/fr-BEd3ZHO4.mjs +0 -2
  1008. package/dist/chunks/fr-BEd3ZHO4.mjs.map +0 -1
  1009. package/dist/chunks/fr-BHXLpdaH.mjs +0 -2
  1010. package/dist/chunks/fr-BHXLpdaH.mjs.map +0 -1
  1011. package/dist/chunks/fr-BKu4eU3V.mjs +0 -2
  1012. package/dist/chunks/fr-BKu4eU3V.mjs.map +0 -1
  1013. package/dist/chunks/fr-BUrUZ5UQ.mjs +0 -2
  1014. package/dist/chunks/fr-BUrUZ5UQ.mjs.map +0 -1
  1015. package/dist/chunks/fr-BlqlUQ3b.mjs +0 -2
  1016. package/dist/chunks/fr-BlqlUQ3b.mjs.map +0 -1
  1017. package/dist/chunks/fr-BruEqDw1.mjs +0 -2
  1018. package/dist/chunks/fr-BruEqDw1.mjs.map +0 -1
  1019. package/dist/chunks/fr-BwuuFBkA.mjs +0 -2
  1020. package/dist/chunks/fr-BwuuFBkA.mjs.map +0 -1
  1021. package/dist/chunks/fr-C2lLh5Ti.mjs +0 -2
  1022. package/dist/chunks/fr-C2lLh5Ti.mjs.map +0 -1
  1023. package/dist/chunks/fr-C7N2_AlK.mjs +0 -2
  1024. package/dist/chunks/fr-C7N2_AlK.mjs.map +0 -1
  1025. package/dist/chunks/fr-COfd6sLW.mjs +0 -2
  1026. package/dist/chunks/fr-COfd6sLW.mjs.map +0 -1
  1027. package/dist/chunks/fr-COx4cSxc.mjs +0 -2
  1028. package/dist/chunks/fr-COx4cSxc.mjs.map +0 -1
  1029. package/dist/chunks/fr-CX37XjPO.mjs +0 -2
  1030. package/dist/chunks/fr-CX37XjPO.mjs.map +0 -1
  1031. package/dist/chunks/fr-CYn6fMiH.mjs +0 -2
  1032. package/dist/chunks/fr-CYn6fMiH.mjs.map +0 -1
  1033. package/dist/chunks/fr-CbsiyDEa.mjs +0 -2
  1034. package/dist/chunks/fr-CbsiyDEa.mjs.map +0 -1
  1035. package/dist/chunks/fr-CcZiELJY.mjs +0 -2
  1036. package/dist/chunks/fr-CcZiELJY.mjs.map +0 -1
  1037. package/dist/chunks/fr-CeHzUPVT.mjs +0 -2
  1038. package/dist/chunks/fr-CeHzUPVT.mjs.map +0 -1
  1039. package/dist/chunks/fr-Cv73J4QZ.mjs +0 -2
  1040. package/dist/chunks/fr-Cv73J4QZ.mjs.map +0 -1
  1041. package/dist/chunks/fr-DDLuorz7.mjs +0 -2
  1042. package/dist/chunks/fr-DDLuorz7.mjs.map +0 -1
  1043. package/dist/chunks/fr-DMA4CAyo.mjs +0 -2
  1044. package/dist/chunks/fr-DMA4CAyo.mjs.map +0 -1
  1045. package/dist/chunks/fr-DNJuGtO1.mjs +0 -2
  1046. package/dist/chunks/fr-DNJuGtO1.mjs.map +0 -1
  1047. package/dist/chunks/fr-DQOE8O6_.mjs +0 -2
  1048. package/dist/chunks/fr-DQOE8O6_.mjs.map +0 -1
  1049. package/dist/chunks/fr-DXjOwGew.mjs +0 -2
  1050. package/dist/chunks/fr-DXjOwGew.mjs.map +0 -1
  1051. package/dist/chunks/fr-DilrEvE_.mjs +0 -2
  1052. package/dist/chunks/fr-DilrEvE_.mjs.map +0 -1
  1053. package/dist/chunks/fr-P7iY3ntE.mjs +0 -2
  1054. package/dist/chunks/fr-P7iY3ntE.mjs.map +0 -1
  1055. package/dist/chunks/fr-ViUNGo_J.mjs +0 -2
  1056. package/dist/chunks/fr-ViUNGo_J.mjs.map +0 -1
  1057. package/dist/chunks/fr-gdIyLcGC.mjs +0 -2
  1058. package/dist/chunks/fr-gdIyLcGC.mjs.map +0 -1
  1059. package/dist/chunks/full-h88Sb2MR.mjs +0 -2
  1060. package/dist/chunks/full-h88Sb2MR.mjs.map +0 -1
  1061. package/dist/chunks/hi-BC82Jxjl.mjs +0 -2
  1062. package/dist/chunks/hi-BC82Jxjl.mjs.map +0 -1
  1063. package/dist/chunks/hi-BCTarnem.mjs +0 -2
  1064. package/dist/chunks/hi-BCTarnem.mjs.map +0 -1
  1065. package/dist/chunks/hi-BMStjhJF.mjs +0 -2
  1066. package/dist/chunks/hi-BMStjhJF.mjs.map +0 -1
  1067. package/dist/chunks/hi-BQ2Fyx7t.mjs +0 -2
  1068. package/dist/chunks/hi-BQ2Fyx7t.mjs.map +0 -1
  1069. package/dist/chunks/hi-Bg4-z2Os.mjs +0 -2
  1070. package/dist/chunks/hi-Bg4-z2Os.mjs.map +0 -1
  1071. package/dist/chunks/hi-BgqI_gOH.mjs +0 -2
  1072. package/dist/chunks/hi-BgqI_gOH.mjs.map +0 -1
  1073. package/dist/chunks/hi-CEPSeUBX.mjs +0 -2
  1074. package/dist/chunks/hi-CEPSeUBX.mjs.map +0 -1
  1075. package/dist/chunks/hi-CRaZj5Uo.mjs +0 -2
  1076. package/dist/chunks/hi-CRaZj5Uo.mjs.map +0 -1
  1077. package/dist/chunks/hi-CT0uK1Me.mjs +0 -2
  1078. package/dist/chunks/hi-CT0uK1Me.mjs.map +0 -1
  1079. package/dist/chunks/hi-CnIpMd8L.mjs +0 -2
  1080. package/dist/chunks/hi-CnIpMd8L.mjs.map +0 -1
  1081. package/dist/chunks/hi-CnSv0JhL.mjs +0 -2
  1082. package/dist/chunks/hi-CnSv0JhL.mjs.map +0 -1
  1083. package/dist/chunks/hi-DLLBZu67.mjs +0 -2
  1084. package/dist/chunks/hi-DLLBZu67.mjs.map +0 -1
  1085. package/dist/chunks/hi-DMg_aiSR.mjs +0 -2
  1086. package/dist/chunks/hi-DMg_aiSR.mjs.map +0 -1
  1087. package/dist/chunks/hi-DWwLzOX5.mjs +0 -2
  1088. package/dist/chunks/hi-DWwLzOX5.mjs.map +0 -1
  1089. package/dist/chunks/hi-D_4Xi4Nv.mjs +0 -2
  1090. package/dist/chunks/hi-D_4Xi4Nv.mjs.map +0 -1
  1091. package/dist/chunks/hi-D_Jtykmj.mjs +0 -2
  1092. package/dist/chunks/hi-D_Jtykmj.mjs.map +0 -1
  1093. package/dist/chunks/hi-Da5pRz8E.mjs +0 -2
  1094. package/dist/chunks/hi-Da5pRz8E.mjs.map +0 -1
  1095. package/dist/chunks/hi-DqL20WmM.mjs +0 -2
  1096. package/dist/chunks/hi-DqL20WmM.mjs.map +0 -1
  1097. package/dist/chunks/hi-DwQopxRg.mjs +0 -2
  1098. package/dist/chunks/hi-DwQopxRg.mjs.map +0 -1
  1099. package/dist/chunks/hi-IuMohSSw.mjs +0 -2
  1100. package/dist/chunks/hi-IuMohSSw.mjs.map +0 -1
  1101. package/dist/chunks/hi-PUX7dDPm.mjs +0 -2
  1102. package/dist/chunks/hi-PUX7dDPm.mjs.map +0 -1
  1103. package/dist/chunks/hi-RmfZAmwT.mjs +0 -2
  1104. package/dist/chunks/hi-RmfZAmwT.mjs.map +0 -1
  1105. package/dist/chunks/hi-UIBrTEVu.mjs +0 -2
  1106. package/dist/chunks/hi-UIBrTEVu.mjs.map +0 -1
  1107. package/dist/chunks/hi-_SjWnfeh.mjs +0 -2
  1108. package/dist/chunks/hi-_SjWnfeh.mjs.map +0 -1
  1109. package/dist/chunks/hi-dV2GZgH_.mjs +0 -2
  1110. package/dist/chunks/hi-dV2GZgH_.mjs.map +0 -1
  1111. package/dist/chunks/hi-ehh5oKz3.mjs +0 -2
  1112. package/dist/chunks/hi-ehh5oKz3.mjs.map +0 -1
  1113. package/dist/chunks/hi-yXnRBFJK.mjs +0 -2
  1114. package/dist/chunks/hi-yXnRBFJK.mjs.map +0 -1
  1115. package/dist/chunks/minimal-a40NeBQ_.mjs +0 -2
  1116. package/dist/chunks/minimal-a40NeBQ_.mjs.map +0 -1
  1117. package/dist/chunks/pt-2a8Oto6x.mjs +0 -2
  1118. package/dist/chunks/pt-2a8Oto6x.mjs.map +0 -1
  1119. package/dist/chunks/pt-ALzIyTiI.mjs +0 -2
  1120. package/dist/chunks/pt-ALzIyTiI.mjs.map +0 -1
  1121. package/dist/chunks/pt-B2hMlTc6.mjs +0 -2
  1122. package/dist/chunks/pt-B2hMlTc6.mjs.map +0 -1
  1123. package/dist/chunks/pt-BCIkSb0w.mjs +0 -2
  1124. package/dist/chunks/pt-BCIkSb0w.mjs.map +0 -1
  1125. package/dist/chunks/pt-BFotmq5x.mjs +0 -2
  1126. package/dist/chunks/pt-BFotmq5x.mjs.map +0 -1
  1127. package/dist/chunks/pt-BM7OScX6.mjs +0 -2
  1128. package/dist/chunks/pt-BM7OScX6.mjs.map +0 -1
  1129. package/dist/chunks/pt-BM7zXWxW.mjs +0 -2
  1130. package/dist/chunks/pt-BM7zXWxW.mjs.map +0 -1
  1131. package/dist/chunks/pt-BchCuzFq.mjs +0 -2
  1132. package/dist/chunks/pt-BchCuzFq.mjs.map +0 -1
  1133. package/dist/chunks/pt-BmcHFWoR.mjs +0 -2
  1134. package/dist/chunks/pt-BmcHFWoR.mjs.map +0 -1
  1135. package/dist/chunks/pt-C53W99RV.mjs +0 -2
  1136. package/dist/chunks/pt-C53W99RV.mjs.map +0 -1
  1137. package/dist/chunks/pt-CORQy8qv.mjs +0 -2
  1138. package/dist/chunks/pt-CORQy8qv.mjs.map +0 -1
  1139. package/dist/chunks/pt-CUPKr943.mjs +0 -2
  1140. package/dist/chunks/pt-CUPKr943.mjs.map +0 -1
  1141. package/dist/chunks/pt-CYkKDsLa.mjs +0 -2
  1142. package/dist/chunks/pt-CYkKDsLa.mjs.map +0 -1
  1143. package/dist/chunks/pt-Cd_SXHKt.mjs +0 -2
  1144. package/dist/chunks/pt-Cd_SXHKt.mjs.map +0 -1
  1145. package/dist/chunks/pt-CjN3Oq-6.mjs +0 -2
  1146. package/dist/chunks/pt-CjN3Oq-6.mjs.map +0 -1
  1147. package/dist/chunks/pt-CrKrgktr.mjs +0 -2
  1148. package/dist/chunks/pt-CrKrgktr.mjs.map +0 -1
  1149. package/dist/chunks/pt-Crmbkj0e.mjs +0 -2
  1150. package/dist/chunks/pt-Crmbkj0e.mjs.map +0 -1
  1151. package/dist/chunks/pt-D19IWOM_.mjs +0 -2
  1152. package/dist/chunks/pt-D19IWOM_.mjs.map +0 -1
  1153. package/dist/chunks/pt-D6zY7l2E.mjs +0 -2
  1154. package/dist/chunks/pt-D6zY7l2E.mjs.map +0 -1
  1155. package/dist/chunks/pt-DA5hufLZ.mjs +0 -2
  1156. package/dist/chunks/pt-DA5hufLZ.mjs.map +0 -1
  1157. package/dist/chunks/pt-DEfBqu-c.mjs +0 -2
  1158. package/dist/chunks/pt-DEfBqu-c.mjs.map +0 -1
  1159. package/dist/chunks/pt-DG3rw6nK.mjs +0 -2
  1160. package/dist/chunks/pt-DG3rw6nK.mjs.map +0 -1
  1161. package/dist/chunks/pt-DRoAHNZi.mjs +0 -2
  1162. package/dist/chunks/pt-DRoAHNZi.mjs.map +0 -1
  1163. package/dist/chunks/pt-Eml9QiUL.mjs +0 -2
  1164. package/dist/chunks/pt-Eml9QiUL.mjs.map +0 -1
  1165. package/dist/chunks/pt-Haa3wVmA.mjs +0 -2
  1166. package/dist/chunks/pt-Haa3wVmA.mjs.map +0 -1
  1167. package/dist/chunks/pt-aj7zOxTg.mjs +0 -2
  1168. package/dist/chunks/pt-aj7zOxTg.mjs.map +0 -1
  1169. package/dist/chunks/pt-l6dTmkQk.mjs +0 -2
  1170. package/dist/chunks/pt-l6dTmkQk.mjs.map +0 -1
  1171. package/dist/chunks/ru--JPEpdcJ.mjs +0 -2
  1172. package/dist/chunks/ru--JPEpdcJ.mjs.map +0 -1
  1173. package/dist/chunks/ru-B76ORyqe.mjs +0 -2
  1174. package/dist/chunks/ru-B76ORyqe.mjs.map +0 -1
  1175. package/dist/chunks/ru-BDQ62WuE.mjs +0 -2
  1176. package/dist/chunks/ru-BDQ62WuE.mjs.map +0 -1
  1177. package/dist/chunks/ru-BQ6W3lwr.mjs +0 -2
  1178. package/dist/chunks/ru-BQ6W3lwr.mjs.map +0 -1
  1179. package/dist/chunks/ru-BQpaitci.mjs +0 -2
  1180. package/dist/chunks/ru-BQpaitci.mjs.map +0 -1
  1181. package/dist/chunks/ru-Bm9VwJLu.mjs +0 -2
  1182. package/dist/chunks/ru-Bm9VwJLu.mjs.map +0 -1
  1183. package/dist/chunks/ru-BnNdik6i.mjs +0 -2
  1184. package/dist/chunks/ru-BnNdik6i.mjs.map +0 -1
  1185. package/dist/chunks/ru-Bo4am8cd.mjs +0 -2
  1186. package/dist/chunks/ru-Bo4am8cd.mjs.map +0 -1
  1187. package/dist/chunks/ru-C1k56xWQ.mjs +0 -2
  1188. package/dist/chunks/ru-C1k56xWQ.mjs.map +0 -1
  1189. package/dist/chunks/ru-C4rnSQlI.mjs +0 -2
  1190. package/dist/chunks/ru-C4rnSQlI.mjs.map +0 -1
  1191. package/dist/chunks/ru-CKM3t1sv.mjs +0 -2
  1192. package/dist/chunks/ru-CKM3t1sv.mjs.map +0 -1
  1193. package/dist/chunks/ru-CO6eCsxU.mjs +0 -2
  1194. package/dist/chunks/ru-CO6eCsxU.mjs.map +0 -1
  1195. package/dist/chunks/ru-CTaYpQ9_.mjs +0 -2
  1196. package/dist/chunks/ru-CTaYpQ9_.mjs.map +0 -1
  1197. package/dist/chunks/ru-CdY8d80t.mjs +0 -2
  1198. package/dist/chunks/ru-CdY8d80t.mjs.map +0 -1
  1199. package/dist/chunks/ru-CsDtaWRd.mjs +0 -2
  1200. package/dist/chunks/ru-CsDtaWRd.mjs.map +0 -1
  1201. package/dist/chunks/ru-Cy_4nn8h.mjs +0 -2
  1202. package/dist/chunks/ru-Cy_4nn8h.mjs.map +0 -1
  1203. package/dist/chunks/ru-DACtjNuJ.mjs +0 -2
  1204. package/dist/chunks/ru-DACtjNuJ.mjs.map +0 -1
  1205. package/dist/chunks/ru-DN6yN_w9.mjs +0 -2
  1206. package/dist/chunks/ru-DN6yN_w9.mjs.map +0 -1
  1207. package/dist/chunks/ru-DThFtd76.mjs +0 -2
  1208. package/dist/chunks/ru-DThFtd76.mjs.map +0 -1
  1209. package/dist/chunks/ru-Dd_P7hP7.mjs +0 -2
  1210. package/dist/chunks/ru-Dd_P7hP7.mjs.map +0 -1
  1211. package/dist/chunks/ru-Dhuxwzwy.mjs +0 -2
  1212. package/dist/chunks/ru-Dhuxwzwy.mjs.map +0 -1
  1213. package/dist/chunks/ru-Dn6UDGIG.mjs +0 -2
  1214. package/dist/chunks/ru-Dn6UDGIG.mjs.map +0 -1
  1215. package/dist/chunks/ru-DojHc5wu.mjs +0 -2
  1216. package/dist/chunks/ru-DojHc5wu.mjs.map +0 -1
  1217. package/dist/chunks/ru-DyWzWBjV.mjs +0 -2
  1218. package/dist/chunks/ru-DyWzWBjV.mjs.map +0 -1
  1219. package/dist/chunks/ru-NBxCkjlP.mjs +0 -2
  1220. package/dist/chunks/ru-NBxCkjlP.mjs.map +0 -1
  1221. package/dist/chunks/ru-_MQaVHam.mjs +0 -2
  1222. package/dist/chunks/ru-_MQaVHam.mjs.map +0 -1
  1223. package/dist/chunks/ru-wv17PPrd.mjs +0 -2
  1224. package/dist/chunks/ru-wv17PPrd.mjs.map +0 -1
  1225. package/dist/chunks/src-ooaZ_Egu.mjs +0 -2
  1226. package/dist/chunks/src-ooaZ_Egu.mjs.map +0 -1
  1227. package/dist/chunks/zh-2-Y3Limy.mjs +0 -2
  1228. package/dist/chunks/zh-2-Y3Limy.mjs.map +0 -1
  1229. package/dist/chunks/zh-B02VPMqX.mjs +0 -2
  1230. package/dist/chunks/zh-B02VPMqX.mjs.map +0 -1
  1231. package/dist/chunks/zh-BYjLBWWN.mjs +0 -2
  1232. package/dist/chunks/zh-BYjLBWWN.mjs.map +0 -1
  1233. package/dist/chunks/zh-Bt2ZdHcS.mjs +0 -2
  1234. package/dist/chunks/zh-Bt2ZdHcS.mjs.map +0 -1
  1235. package/dist/chunks/zh-BuN_C4o-.mjs +0 -2
  1236. package/dist/chunks/zh-BuN_C4o-.mjs.map +0 -1
  1237. package/dist/chunks/zh-CA3BDj0Y.mjs +0 -2
  1238. package/dist/chunks/zh-CA3BDj0Y.mjs.map +0 -1
  1239. package/dist/chunks/zh-CHuGP7RS.mjs +0 -2
  1240. package/dist/chunks/zh-CHuGP7RS.mjs.map +0 -1
  1241. package/dist/chunks/zh-CIPsF5P8.mjs +0 -2
  1242. package/dist/chunks/zh-CIPsF5P8.mjs.map +0 -1
  1243. package/dist/chunks/zh-C_YS18re.mjs +0 -2
  1244. package/dist/chunks/zh-C_YS18re.mjs.map +0 -1
  1245. package/dist/chunks/zh-CfMPFWUg.mjs +0 -2
  1246. package/dist/chunks/zh-CfMPFWUg.mjs.map +0 -1
  1247. package/dist/chunks/zh-CfjCcBIB.mjs +0 -2
  1248. package/dist/chunks/zh-CfjCcBIB.mjs.map +0 -1
  1249. package/dist/chunks/zh-CqQph809.mjs +0 -2
  1250. package/dist/chunks/zh-CqQph809.mjs.map +0 -1
  1251. package/dist/chunks/zh-Cxe42GC5.mjs +0 -2
  1252. package/dist/chunks/zh-Cxe42GC5.mjs.map +0 -1
  1253. package/dist/chunks/zh-CyMU2cTf.mjs +0 -2
  1254. package/dist/chunks/zh-CyMU2cTf.mjs.map +0 -1
  1255. package/dist/chunks/zh-Cynz1sBa.mjs +0 -2
  1256. package/dist/chunks/zh-Cynz1sBa.mjs.map +0 -1
  1257. package/dist/chunks/zh-DRKs6Q0a.mjs +0 -2
  1258. package/dist/chunks/zh-DRKs6Q0a.mjs.map +0 -1
  1259. package/dist/chunks/zh-DTuIJjx6.mjs +0 -2
  1260. package/dist/chunks/zh-DTuIJjx6.mjs.map +0 -1
  1261. package/dist/chunks/zh-DTz9l6mp.mjs +0 -2
  1262. package/dist/chunks/zh-DTz9l6mp.mjs.map +0 -1
  1263. package/dist/chunks/zh-DZwjiJmn.mjs +0 -2
  1264. package/dist/chunks/zh-DZwjiJmn.mjs.map +0 -1
  1265. package/dist/chunks/zh-D_VJDQl4.mjs +0 -2
  1266. package/dist/chunks/zh-D_VJDQl4.mjs.map +0 -1
  1267. package/dist/chunks/zh-Dt20Om7Z.mjs +0 -2
  1268. package/dist/chunks/zh-Dt20Om7Z.mjs.map +0 -1
  1269. package/dist/chunks/zh-SgsZ9f-W.mjs +0 -2
  1270. package/dist/chunks/zh-SgsZ9f-W.mjs.map +0 -1
  1271. package/dist/chunks/zh-XR7Ls7m-.mjs +0 -2
  1272. package/dist/chunks/zh-XR7Ls7m-.mjs.map +0 -1
  1273. package/dist/chunks/zh-aXPI9lKF.mjs +0 -2
  1274. package/dist/chunks/zh-aXPI9lKF.mjs.map +0 -1
  1275. package/dist/chunks/zh-cLXIKkZQ.mjs +0 -2
  1276. package/dist/chunks/zh-cLXIKkZQ.mjs.map +0 -1
  1277. package/dist/chunks/zh-cZUtN871.mjs +0 -2
  1278. package/dist/chunks/zh-cZUtN871.mjs.map +0 -1
  1279. package/dist/chunks/zh-hcdnCGUp.mjs +0 -2
  1280. package/dist/chunks/zh-hcdnCGUp.mjs.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{c as t,d as e,i as n,o,p as r,u as l}from"./Document-r7vLOAGA.mjs";import{c as i,l as s,o as a,r as c,t as d,u}from"./Selection-HYoVFpAx.mjs";import{a as b}from"./TypeBrands-Ch9856Gb.mjs";import{r as p}from"./HTMLUtils-C6B4UT00.mjs";import{_ as h,s as m}from"./BlockInsertion-6rR9tIGP.mjs";import{i as f,t as v}from"./Decoration-ZeyVfwJB.mjs";import{a as g,o as x,s as w}from"./StyleRuntime-BAutwDZT.mjs";import{n as C}from"./TypedKeys-CA4bfw9O.mjs";import{a as I,i as y,s as k}from"./PluginHelpers-D4quRJ5a.mjs";import{t as S}from"./KeyboardNav-D0my3wuy.mjs";import{r as L}from"./PopupPositioning-DtUrY9bh.mjs";import{i as A}from"./ColorValidation-DAijTjG9.mjs";import{n as R,t as B}from"./ColorGrid-CXRdpP_n.mjs";function E(){const e=n(b("paragraph"),[t("")],l());return n(b("table_cell"),[e],l())}function T(t,n){const o=t.getNodePath(n);if(!o)return null;let r=null,l=null,i=null,s=null;for(const e of o){const n=t.getBlock(e);n&&("table"===n.type?(r=e,l=n):"table_row"===n.type?i=e:"table_cell"===n.type&&(s=e))}if("table_cell"===t.getBlock(n)?.type&&(s=n),!(r&&l&&s&&i))return null;const a=t.doc.children.findIndex(t=>t.id===r),c=e(l),d=c.findIndex(t=>t.id===i);if(-1===d)return null;const u=c[d];if(!u)return null;const b=e(u),p=b.findIndex(t=>t.id===s);if(-1===p)return null;const h=b.length,m=c.length;return{tableId:r,tableIndex:a,rowId:i,rowIndex:d,cellId:s,colIndex:p,totalRows:m,totalCols:h}}function M(t,n,o,r){const l=t.getBlock(n);if(!l)return null;const i=e(l)[o];return i?e(i)[r]?.id??null:null}function N(t,n){const o=t.getBlock(n);if(!o)return n;const r=e(o)[0];if(!r)return n;let l=r;for(;;){const t=e(l)[0];if(!t)return l.id;l=t}}function H(t,n){const o=t.getBlock(n);if(!o)return n;const r=e(o),l=r[r.length-1];if(!l)return n;let i=l;for(;;){const t=e(i),n=t[t.length-1];if(!n)return i.id;i=n}}function P(t,e){const n=t.getNodePath(e);if(!n)return!1;for(const o of n)if("table"===t.getBlock(o)?.type)return!0;return!1}var D={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"},z=/* #__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-jbplYWkC.mjs"),"./locales/de.ts":()=>import("./de-DN-e6G5A.mjs"),"./locales/es.ts":()=>import("./es-CM55WeEN.mjs"),"./locales/fr.ts":()=>import("./fr-C_2i5Ono.mjs"),"./locales/hi.ts":()=>import("./hi-C9fvG91d.mjs"),"./locales/pt.ts":()=>import("./pt-GqLw5tN0.mjs"),"./locales/ru.ts":()=>import("./ru-4g_qsaLr.mjs"),"./locales/zh.ts":()=>import("./zh-DeZP08HI.mjs")});async function $(t){return k(z,t,D)}var j=["#000000","#434343","#666666","#999999","#b7b7b7","#cccccc","#d9d9d9","#efefef","#980000","#cc0000","#e69138","#f1c232","#6aa84f","#45818e","#3c78d8","#3d85c6","#674ea7","#a64d79","#0b5394","#38761d"];function _(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??{},l=n;return t.transaction("command").setNodeAttr(r,l).setSelection(t.selection).build()}const l={...o.attrs,borderColor:n};return t.transaction("command").setNodeAttr(r,l).setSelection(t.selection).build()}function V(t,e,n=D){const o=t.getState();if(!u(o.selection))return!1;const r=T(o,o.selection.anchor.blockId);if(!r)return!1;const l=_(o,r.tableId,e);if(!l)return!1;t.dispatch(l);const i="none"===e?"none":R(e);return t.announce(n.announceBorderColorSet(i)),!0}function O(t,e=D){const n=t.getState();if(!u(n.selection))return!1;const o=T(n,n.selection.anchor.blockId);if(!o)return!1;const r=_(n,o.tableId,void 0);return!!r&&(t.dispatch(r),t.announce(e.announceBorderReset),!0)}function F(t,e){const n=t.getBlock(e);if(n)return n.attrs?.borderColor}function q(t,e,n,o,r=D){t.classList.add("notectl-color-picker");const l=F(e.getState(),n),i=document.createElement("button");i.type="button",i.className="notectl-color-picker__default",i.textContent=r.defaultColor,i.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),O(e,r),o()}),i.addEventListener("keydown",t=>{"Escape"===t.key&&(t.preventDefault(),o())}),t.appendChild(i);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(),V(e,"none",r),o()}),s.addEventListener("keydown",t=>{"Escape"===t.key&&(t.preventDefault(),o())}),t.appendChild(s),B(t,{colors:j,columns:5,ariaLabel:r.borderColorPicker,ariaLabelPrefix:"",activeColor:l??null,swatchLabel:r.borderSwatchLabel,titleAsName:!0,onSelect:t=>{V(e,t,r),o()},onClose:o})}function Z(t,o,r){const i=t.getBlock(o);if(!i)return null;const s=e(i),a=s[0]?e(s[0]).length:0;if(0===a)return null;const c=function(t){const e=[];for(let n=0;n<t;n++)e.push(E());return n(b("table_row"),e,l())}(a),u=t.transaction("command").insertNode([o],r,c),p=e(c)[0],h=p?e(p)[0]:void 0;return h?u.setSelection(d(h.id,0)):p&&u.setSelection(d(p.id,0)),u.build()}function K(t,n,o){const r=t.getBlock(n);if(!r)return null;const l=e(r),i=t.transaction("command");for(const e of l){const t=E();i.insertNode([n,e.id],o,t)}return i.setSelection(t.selection),i.build()}function Y(t,n,o,r=0){const l=t.getBlock(n);if(!l)return null;if(e(l).length<=1)return W(t,n);const i=t.transaction("command").removeNode([n],o),s=M(t,n,o>0?o-1:1,r);if(s){const e=N(t,s);i.setSelection(d(e,0))}return i.build()}function X(t,n,o,r=0){const l=t.getBlock(n);if(!l)return null;const i=e(l);if((i[0]?e(i[0]).length:0)<=1)return W(t,n);const s=t.transaction("command");for(let e=i.length-1;e>=0;e--){const t=i[e];t&&s.removeNode([n,t.id],o)}const a=M(t,n,r,o>0?o-1:1);if(a){const e=N(t,a);s.setSelection(d(e,0))}return s.build()}function W(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=o(l());return t.transaction("command").insertNode([],0,e).removeNode([],1).setSelection(d(e.id,0)).build()}const r=t.transaction("command").removeNode([],n),i=t.doc.children[n+1];if(i){const e=h(t,i.id,"start");if(e)return r.setSelection(e),r.build()}const s=t.doc.children[n-1];if(s){const e=h(t,s.id,"end");if(e)return r.setSelection(e),r.build()}return null}function U(t,o,r){const i=t.getState(),s=y(i);if(!s)return!1;const a=function(t,e){const o=l(),r=[];for(let i=0;i<t;i++){const t=[];for(let n=0;n<e;n++)t.push(E());r.push(n(b("table_row"),t,l()))}return n(b("table"),r,o)}(o,r),c=i.transaction("command");if(!m(i,c,s,a))return!1;const u=e(a)[0],p=u?e(u)[0]:void 0,h=p?e(p)[0]:void 0;return h?c.setSelection(d(h.id,0)):p&&c.setSelection(d(p.id,0)),t.dispatch(c.build()),!0}function G(t,e){const n=t.getState();if(!u(n.selection))return!1;const o=T(n,n.selection.anchor.blockId);if(!o)return!1;const r=Z(n,o.tableId,o.rowIndex+1);return!!r&&(t.dispatch(r),t.announce(e.announceRowInsertedBelow),!0)}function Q(t,e,n){const o=t.getState();if(!u(o.selection))return!1;const r=T(o,o.selection.anchor.blockId);if(!r)return!1;const l="left"===e?r.colIndex:r.colIndex+1,i=K(o,r.tableId,l);return!!i&&(t.dispatch(i),t.announce(n.announceColumnInserted(e)),!0)}function J(t,e){t.registerCommand("insertTable",()=>U(t,3,3)),t.registerCommand("addRowAbove",()=>function(t,e){const n=t.getState();if(!u(n.selection))return!1;const o=T(n,n.selection.anchor.blockId);if(!o)return!1;const r=Z(n,o.tableId,o.rowIndex);return!!r&&(t.dispatch(r),t.announce(e.announceRowInsertedAbove),!0)}(t,e)),t.registerCommand("addRowBelow",()=>G(t,e)),t.registerCommand("addColumnLeft",()=>function(t,e){return Q(t,"left",e)}(t,e)),t.registerCommand("addColumnRight",()=>function(t,e){return Q(t,"right",e)}(t,e)),t.registerCommand("deleteRow",()=>function(t,e){const n=t.getState();if(!u(n.selection))return!1;const o=T(n,n.selection.anchor.blockId);if(!o)return!1;const r=Y(n,o.tableId,o.rowIndex,o.colIndex);return!!r&&(t.dispatch(r),t.announce(e.announceRowDeleted),!0)}(t,e)),t.registerCommand("deleteColumn",()=>function(t,e){const n=t.getState();if(!u(n.selection))return!1;const o=T(n,n.selection.anchor.blockId);if(!o)return!1;const r=X(n,o.tableId,o.colIndex,o.rowIndex);return!!r&&(t.dispatch(r),t.announce(e.announceColumnDeleted),!0)}(t,e)),t.registerCommand("selectTable",()=>function(t){const e=t.getState(),n=e.selection;if(s(n))return"table"===e.getBlock(n.nodeId)?.type;if(i(n))return!1;const o=T(e,n.anchor.blockId);if(!o)return!1;const r=e.getNodePath(o.tableId);if(!r)return!1;const l=e.transaction("command").setSelection(c(o.tableId,r)).build();return t.dispatch(l),!0}(t)),t.registerCommand("deleteTable",()=>function(t,e){const n=t.getState(),o=function(t){if(s(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=T(t,t.selection.anchor.blockId);return e?{tableId:e.tableId}:null}(n);if(!o)return!1;const r=W(n,o.tableId);return!!r&&(t.dispatch(r),t.announce(e.announceTableDeleted),!0)}(t,e))}function tt(t,e,n,o,r,l=D,i){let s=!0,a=null,c=null;const d=document.createElement("div");d.className="notectl-table-context-menu",d.setAttribute("role","menu"),d.setAttribute("aria-label",l.tableActions),d.setAttribute("contenteditable","false");const u=[];let b=0;const p=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"}]}(l);for(const I of p){if("separator"===I.type){const t=document.createElement("div");t.setAttribute("role","separator"),d.appendChild(t);continue}const t=document.createElement("button");t.type="button",t.setAttribute("role","menuitem"),t.textContent=I.label,"submenu"===I.type&&(t.dataset.submenu=I.id,t.setAttribute("aria-haspopup","true"),t.setAttribute("aria-expanded","false")),"item"===I.type&&(t.dataset.command=I.command),t.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),t.addEventListener("click",n=>{n.stopPropagation(),"item"===I.type?(e.executeCommand(I.command),C()):"submenu"===I.type&&m(t)}),u.push(t),d.appendChild(t)}const h=document.createElement("div");function m(o){if(f(),o.setAttribute("aria-expanded","true"),i)c=i.open({anchor:o,position:"right",referenceNode:d,parent:{close:()=>C(),getElement:()=>d},onClose:()=>{c=null,a=null,v()},content:(t,r)=>{t.className="notectl-table-context-menu",t.setAttribute("contenteditable","false"),a=t,t.addEventListener("keydown",t=>{t.stopPropagation();const e="rtl"===getComputedStyle(d).direction?"ArrowRight":"ArrowLeft";t.key===e&&(t.preventDefault(),r(),o.focus())}),q(t,e,n,()=>C(),l)}});else{a=document.createElement("div"),a.className="notectl-table-context-menu",a.setAttribute("contenteditable","false"),a.addEventListener("keydown",t=>{t.stopPropagation();const e="rtl"===getComputedStyle(d).direction?"ArrowRight":"ArrowLeft";t.key===e&&(t.preventDefault(),f(),o.focus())}),q(a,e,n,()=>C(),l),t.appendChild(a);const r=d.getBoundingClientRect(),i="rtl"===getComputedStyle(d).direction;L(a,r,{position:"right",isRtl:i}),requestAnimationFrame(()=>{(a?.querySelector("button"))?.focus()})}}function f(){c?(c.close(),c=null,a=null):a&&(a.remove(),a=null),v()}function v(){for(const t of u)t.dataset.submenu&&t.setAttribute("aria-expanded","false")}h.className="notectl-table-context-menu__hint",h.setAttribute("aria-hidden","true"),h.textContent=l.menuKeyboardHint,d.appendChild(h),S(u,b),d.addEventListener("keydown",t=>{switch(t.stopPropagation(),t.key){case"Escape":return t.preventDefault(),void C();case"ArrowDown":return t.preventDefault(),b=(b+1)%u.length,S(u,b),void u[b]?.focus();case"ArrowUp":return t.preventDefault(),b=(b-1+u.length)%u.length,S(u,b),void u[b]?.focus();case"ArrowRight":case"ArrowLeft":{t.preventDefault();const e="rtl"===getComputedStyle(d).direction?"ArrowLeft":"ArrowRight";if(t.key===e){const t=u[b];t?.dataset.submenu&&m(t)}else f(),u[b]?.focus();return}case"Enter":case" ":{t.preventDefault();const n=u[b];if(!n)return;return void(n.dataset.submenu?m(n):n.dataset.command&&(e.executeCommand(n.dataset.command),C()))}case"Home":return t.preventDefault(),b=0,S(u,b),void u[b]?.focus();case"End":return t.preventDefault(),b=u.length-1,S(u,b),void u[b]?.focus()}}),L(d,o,{position:"below-start"}),t.appendChild(d),u[0]?.focus(),requestAnimationFrame(()=>{s&&u[0]&&u[0].focus()});const g=t=>{const e=t.composedPath();e.includes(d)||a&&e.includes(a)||C()};let x=null,w=!1;function C(){s&&(s=!1,f(),d.remove(),null!==x&&(clearTimeout(x),x=null),w&&(document.removeEventListener("mousedown",g,!0),w=!1),r?.())}return x=setTimeout(()=>{x=null,document.addEventListener("mousedown",g,!0),w=!0},0),{isOpen:()=>s,close:C,destroy:C}}var et=null;function nt(t,e){const n=t.getState();if(!u(n.selection))return!1;const o=n.selection,r=T(n,o.anchor.blockId);return!!r&&e(n,o,r)}function ot(t){return nt(t,(e,n,o)=>{const r=o.tableIndex+1;if(r>=e.doc.children.length)return!1;const l=e.doc.children[r];if(!l)return!1;const i=e.transaction("command").setSelection(d(l.id,0)).build();return t.dispatch(i),!0})}function rt(t,e,n,o){const r=t.getState(),l=M(r,e,n,o);if(!l)return!1;const i=N(r,l),s=r.transaction("command").setSelection(d(i,0)).build();return t.dispatch(s),!0}function lt(t,e,n,o){const l=t.getState(),i=M(l,e,n,o);if(!i)return!1;const s=H(l,i),a=l.getBlock(s);if(!a)return!1;const c=r(a),u=l.transaction("command").setSelection(d(s,c)).build();return t.dispatch(u),!0}function it(t,e){const n=t.getState(),o=n.getNodePath(e);if(!o)return!1;const r=n.transaction("input").setSelection(c(e,o)).build();return t.dispatch(r),!0}var st='<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 at(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 ct(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=at("ntbl-insert-btn",st,e);return n.appendChild(o),n}function dt(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=st,n.appendChild(o),n.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),n}function ut(t){const e=document.createElement("div");return e.className=t,e.setAttribute("contenteditable","false"),e.setAttribute("data-notectl-no-print",""),e}function bt(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 pt(t,e,n,o){const r=document.createElement("div");r.className=`ntbl-handle ${t}`,r.dataset.index=String(e);const l=at("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 l.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),o(e)}),r.appendChild(l),r}function ht(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}}var mt=class{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,l=null;for(const a of n){const t=Math.abs(e-a.position);t<r&&t<10&&(r=t,l=a)}let i=Number.POSITIVE_INFINITY,s=null;for(const a of o){const e=Math.abs(t-a.position);e<i&&e<10&&(i=e,s=a)}return l&&(!s||r<=i)?{type:"row",border:l}: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,n,o,r,l,i,s=D){if(this.container=t,this.tableEl=n,this.getState=r,this.dispatchFn=l,this.pluginContext=i??null,this.locale=s,this.tableId=o.id,this.numRows=e(o).length,this.numCols=this.countCols(o),this.colBar=ut("ntbl-col-bar"),this.rowBar=ut("ntbl-row-bar"),this.insertLineH=ct("horizontal",s.insertRow),this.insertLineV=ct("vertical",s.insertColumn),this.addRowZone=dt("ntbl-add-row",s.addRow),this.addColZone=dt("ntbl-add-col",s.addColumn),this.deleteTableBtn=at("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>',s.deleteTable),this.deleteTableBtn.setAttribute("data-notectl-no-print",""),i){const t=F(r(),this.tableId);this.borderColorBtn=function(t,e){const n=at("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",bt(o,e),n.appendChild(o),n}(s.borderColor,t),this.actionsBtn=function(t){const e=at("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}(s.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}(s.contextMenuHint),t.appendChild(this.contextHint),this.rebuildColHandles(),this.rebuildRowHandles(),this.bindEventListeners(),this.observer=new ResizeObserver(()=>{this.positionControls()}),this.observer.observe(n),requestAnimationFrame(()=>this.positionControls())}update(t){this.tableId=t.id;const n=e(t).length,o=this.countCols(t);if(n===this.numRows&&o===this.numCols||(this.numRows=n,this.numCols=o,this.rebuildColHandles(),this.rebuildRowHandles()),this.borderColorBtn){const e=this.borderColorBtn.querySelector(".ntbl-border-color-swatch");if(e){const n=t.attrs?.borderColor;bt(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(Z(this.getState(),this.tableId,this.activeRowIndex))}),e.addEventListener("click",()=>{this.activeColIndex>=0&&this.dispatchTransaction(K(this.getState(),this.tableId,this.activeColIndex))}),this.addRowZone.addEventListener("click",()=>{this.dispatchTransaction(Z(this.getState(),this.tableId,this.numRows))}),this.addColZone.addEventListener("click",()=>{this.dispatchTransaction(K(this.getState(),this.tableId,this.numCols))}),this.deleteTableBtn.addEventListener("click",()=>{this.dispatchTransaction(W(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=tt(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"),q(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 n=e(t);return n[0]?e(n[0]).length:0}positionControls(){!function(t,e,n){const o=t.children;if(0===o.length)return;const r=e/n;for(let l=0;l<o.length;l++){const t=o[l];x(t,{left:`${Math.round(r*l)}px`,width:`${Math.round(r)}px`})}w(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 l=0;for(let i=0;i<n.length;i++){const t=n[i],e=o[i];if(e){const n=e.offsetTop-r,o=e.offsetHeight;x(t,{top:`${n}px`,height:`${o}px`}),l=n+o}}w(t,"height",`${l}px`)}(this.rowBar,this.tableEl),function(t,e,n,o){const r=ht(n,o),l=n.offsetHeight,i=n.offsetWidth;x(t,{width:`${i}px`,left:`${r.left}px`}),x(e,{height:`${l}px`,top:`${r.top}px`})}(this.addRowZone,this.addColZone,this.tableEl,this.container)}showHorizontalLine(t){this.activeRowIndex=t.index;const e=ht(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=ht(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=pt("ntbl-col-handle",t,this.locale.deleteColumn,t=>{this.dispatchTransaction(X(this.getState(),this.tableId,t))});this.colBar.appendChild(e)}}rebuildRowHandles(){this.rowBar.innerHTML="";for(let t=0;t<this.numRows;t++){const e=pt("ntbl-row-handle",t,this.locale.deleteRow,t=>{this.dispatchTransaction(Y(this.getState(),this.tableId,t))});this.rowBar.appendChild(e)}}};function ft(t,e){"none"===e?(w(t,"--ntbl-border-color","transparent"),t.classList.add("notectl-table--borderless")):e?(w(t,"--ntbl-border-color",e),t.classList.remove("notectl-table--borderless")):(g(t,"--ntbl-border-color"),t.classList.remove("notectl-table--borderless"))}var vt=new C("tableSelection"),gt={maxPickerRows:8,maxPickerCols:8},xt="border-collapse: collapse; width: 100%; table-layout: fixed",wt="border: 1px solid var(--ntbl-bc, #d0d0d0); padding: 8px 12px; vertical-align: top",Ct=class{id="table";name="Table";priority=40;config;locale;selectionService=null;cleanupMouseSelection=null;context=null;constructor(t){this.config={...gt,...t}}async init(t){this.locale=await I(t,this.config.locale,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/* Border resolution order: per-table local override → theme component token → theme global token.\n * The inline --ntbl-border-color is set by the toolbar\'s "border color" action and must win\n * over the theme so per-table customizations remain visible after a theme switch.\n */\n.notectl-table td {\n\tborder: 1px solid var(--ntbl-border-color, var(--notectl-table-border, var(--notectl-border)));\n\tbackground: var(--notectl-table-cell-bg, transparent);\n\tpadding: 8px 12px;\n\tmin-width: 60px;\n\tvertical-align: top;\n\tmin-height: 1.6em;\n}\n\n.notectl-table th {\n\tborder: 1px solid var(--ntbl-border-color, var(--notectl-table-border, var(--notectl-border)));\n\tbackground: var(--notectl-table-header-bg, var(--notectl-surface-raised));\n\tpadding: 8px 12px;\n\tmin-width: 60px;\n\tvertical-align: top;\n\ttext-align: start;\n\tfont-weight: 600;\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\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-surface-raised);\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-primary-fg);\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-surface-raised);\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-surface-raised);\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-surface-raised);\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),J(t,this.locale),t.registerCommand("resetTableBorderColor",()=>O(t,this.locale)),function(t,e){t.registerKeymap({Tab:()=>function(t,e){return nt(t,(n,o,r)=>r.colIndex<r.totalCols-1?rt(t,r.tableId,r.rowIndex,r.colIndex+1):r.rowIndex<r.totalRows-1?rt(t,r.tableId,r.rowIndex+1,0):(G(t,e),!0))}(t,e),"Shift-Tab":()=>function(t){return nt(t,(e,n,o)=>o.colIndex>0?rt(t,o.tableId,o.rowIndex,o.colIndex-1):!(o.rowIndex>0)||rt(t,o.tableId,o.rowIndex-1,o.totalCols-1))}(t),Backspace:()=>function(t){return nt(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=N(e,o.cellId);return n.anchor.blockId===r&&it(t,o.tableId)})}(t),Delete:()=>function(t){return nt(t,(e,n,o)=>{if(!a(n))return!1;const l=e.getBlock(n.anchor.blockId);if(!l)return!1;const i=r(l);if(n.anchor.offset!==i)return!1;if(o.rowIndex!==o.totalRows-1||o.colIndex!==o.totalCols-1)return!1;const s=H(e,o.cellId);return n.anchor.blockId===s&&it(t,o.tableId)})}(t),ArrowDown:()=>function(t){return nt(t,(e,n,o)=>{const r=H(e,o.cellId);return n.anchor.blockId===r&&(o.rowIndex>=o.totalRows-1?ot(t):rt(t,o.tableId,o.rowIndex+1,o.colIndex))})}(t),ArrowUp:()=>function(t){return nt(t,(e,n,o)=>{const r=N(e,o.cellId);return n.anchor.blockId===r&&!(o.rowIndex<=0)&&rt(t,o.tableId,o.rowIndex-1,o.colIndex)})}(t),ArrowRight:()=>function(t){return nt(t,(e,n,o)=>{if(!a(n))return!1;const l=e.getBlock(n.anchor.blockId);if(!l)return!1;const i=r(l);if(n.anchor.offset!==i)return!1;const s=H(e,o.cellId);return n.anchor.blockId===s&&(o.colIndex<o.totalCols-1?rt(t,o.tableId,o.rowIndex,o.colIndex+1):!(o.rowIndex<o.totalRows-1)||rt(t,o.tableId,o.rowIndex+1,0))})}(t),ArrowLeft:()=>function(t){return nt(t,(e,n,o)=>{if(!a(n))return!1;if(0!==n.anchor.offset)return!1;const r=N(e,o.cellId);return n.anchor.blockId===r&&(o.colIndex>0?lt(t,o.tableId,o.rowIndex,o.colIndex-1):!(o.rowIndex>0)||lt(t,o.tableId,o.rowIndex-1,o.totalCols-1))})}(t),Escape:()=>ot(t),"Shift-F10":()=>function(t){return nt(t,(e,n,o)=>{const r=t.getContainer(),l=r.querySelector(`[data-block-id="${o.cellId}"]`);if(!l)return!1;const i=l.getBoundingClientRect(),s=new DOMRect(i.left+i.width/2,i.bottom,0,0),a=r.querySelector(`[data-block-id="${o.tableId}"].ntbl-container`)??r;return et?.close(),et=tt(a,t,o.tableId,s,()=>{et=null}),!0})}(t)},{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(),l=[],i=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=i;t<=s;t++)for(let n=a;n<=c;n++){const o=M(r,e.tableId,t,n);o&&l.push(o)}n=l,o=new Set(l)}const l={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(vt,l),l}(t)}onReady(){this.context&&this.selectionService&&(this.cleanupMouseSelection=function(t,e){const n=t.getContainer();let o=null,r=!1;function l(n){const l=n.target.closest("td[data-block-id]");if(!l)return o=null,r=!1,void e.setSelectedRange(null);if(n.shiftKey){if(o){const r=T(t.getState(),l.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=T(t.getState(),l.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 i(n){if(!r||!o)return;const l=n.target.closest("td[data-block-id]");if(!l)return;const i=T(t.getState(),l.getAttribute("data-block-id"));i&&i.tableId===o.tableId&&(i.rowIndex===o.row&&i.colIndex===o.col||(n.preventDefault(),e.setSelectedRange({tableId:o.tableId,fromRow:o.row,fromCol:o.col,toRow:i.rowIndex,toCol:i.colIndex})))}function s(){r=!1}return n.addEventListener("mousedown",l),n.addEventListener("mousemove",i),document.addEventListener("mouseup",s),()=>{n.removeEventListener("mousedown",l),n.removeEventListener("mousemove",i),document.removeEventListener("mouseup",s)}}(this.context,this.selectionService))}destroy(){this.cleanupMouseSelection?.(),this.cleanupMouseSelection=null,this.selectionService=null,this.context=null}decorations(t){if(!this.selectionService)return v.empty;if(!this.selectionService.getSelectedRange())return v.empty;const e=t.selection;if(!u(e)||!P(t,e.anchor.blockId))return this.selectionService.clearSelectionSilent(),v.empty;const n=this.selectionService.getSelectedCellIds();if(0===n.length)return v.empty;const o=[];for(const r of n)o.push(f(r,{class:"notectl-table-cell--selected"}));return v.create(o)}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.setAttribute("part","table"),e},toHTML(t,e,n){const o=t.attrs?.borderColor,r=function(t){return t?"none"===t?`${xt}; --ntbl-bc: transparent`:A(t)?`${xt}; --ntbl-bc: ${p(t)}`:xt:xt}(o);return`<table${n?.styleAttr(r)??` style="${r}"`}>${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.setAttribute("part","table-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","video","horizontal_rule"]},isolating:!0,toDOM(t){const e=document.createElement("td");return e.setAttribute("data-block-id",t.id),e.setAttribute("role","cell"),e.setAttribute("part","table-cell"),e},toHTML(t,e,n){const o=t.attrs?.colspan??1,r=t.attrs?.rowspan??1,l=[n?.styleAttr(wt)??` style="${wt}"`];return o>1&&l.push(` colspan="${o}"`),r>1&&l.push(` rowspan="${r}"`),`<td${l.join("")}>${e}</td>`},sanitize:{tags:["td"],attrs:["colspan","rowspan"]}})}registerNodeViews(t){t.getSchemaRegistry(),t.registerNodeView("table",function(t,n,o=D){return(t,r,l)=>{const i=document.createElement("div");i.className="ntbl-container",i.setAttribute("data-block-id",t.id),i.setAttribute("data-selectable","true");const s=document.createElement("div");s.className="notectl-table-wrapper";const a=document.createElement("table");a.className="notectl-table",a.setAttribute("role","table");const c=e(t),d=c.length,u=c[0]?e(c[0]).length:0;a.setAttribute("aria-label",o.tableAriaLabel(d,u)),a.setAttribute("aria-description",o.tableAriaDescription);const b=document.createElement("tbody");a.appendChild(b),s.appendChild(a),i.appendChild(s),ft(a,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,l,i){return new mt(t,e,n,o,r,l,i)}(i,a,t,r,l,n,o);let m=null,f=t.id;const v=t=>{if(!n)return;t.preventDefault(),t.stopPropagation(),m?.close();const e=new DOMRect(t.clientX,t.clientY,0,0);m=tt(i,n,f,e,()=>{m=null},o)};return a.addEventListener("contextmenu",v),{dom:i,contentDOM:b,update(t){if("table"!==t.type)return!1;f=t.id,i.setAttribute("data-block-id",t.id),i.setAttribute("data-selectable","true");const n=e(t),r=n.length,l=n[0]?e(n[0]).length:0;return a.setAttribute("aria-label",o.tableAriaLabel(r,l)),ft(a,t.attrs?.borderColor),h.update(t),!1},destroy(){m?.destroy(),a.removeEventListener("contextmenu",v),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,l=t.attrs?.rowspan??1;r>1&&(o.colSpan=r),l>1&&(o.rowSpan=l);const i=t.attrs?.align;return i&&"left"!==i&&w(o,"textAlign",i),{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)=>{U(t,e,n)}},isActive:t=>!!u(t.selection)&&P(t,t.selection.anchor.blockId)})}};export{vt as n,Ct as t};
2
+ //# sourceMappingURL=TablePlugin-CRp4qSZE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablePlugin-CRp4qSZE.mjs","names":[],"sources":["../../src/editor/styles/table.ts","../../src/plugins/table/TableHelpers.ts","../../src/plugins/table/TableLocale.ts","../../src/plugins/table/TableBorderColor.ts","../../src/plugins/table/TableCommands.ts","../../src/plugins/table/TableContextMenu.ts","../../src/plugins/table/TableNavigation.ts","../../src/plugins/table/TableControlsDOM.ts","../../src/plugins/table/TableControlsLayout.ts","../../src/plugins/table/TableControls.ts","../../src/plugins/table/TableNodeViews.ts","../../src/plugins/table/TableSelection.ts","../../src/plugins/table/TablePlugin.ts"],"sourcesContent":["/** Table styles — table layout, selection, context menu, controls, insert lines. */\nexport const TABLE_CSS = `\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/* Border resolution order: per-table local override → theme component token → theme global token.\n * The inline --ntbl-border-color is set by the toolbar's \"border color\" action and must win\n * over the theme so per-table customizations remain visible after a theme switch.\n */\n.notectl-table td {\n\tborder: 1px solid var(--ntbl-border-color, var(--notectl-table-border, var(--notectl-border)));\n\tbackground: var(--notectl-table-cell-bg, transparent);\n\tpadding: 8px 12px;\n\tmin-width: 60px;\n\tvertical-align: top;\n\tmin-height: 1.6em;\n}\n\n.notectl-table th {\n\tborder: 1px solid var(--ntbl-border-color, var(--notectl-table-border, var(--notectl-border)));\n\tbackground: var(--notectl-table-header-bg, var(--notectl-surface-raised));\n\tpadding: 8px 12px;\n\tmin-width: 60px;\n\tvertical-align: top;\n\ttext-align: start;\n\tfont-weight: 600;\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\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-surface-raised);\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-primary-fg);\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-surface-raised);\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-surface-raised);\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-surface-raised);\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`;\n","/**\n * Utility functions for table operations: creating table structures,\n * finding table context, and navigating cells.\n */\n\nimport {\n\ttype BlockNode,\n\ttype ChildNode,\n\tcreateBlockNode,\n\tcreateTextNode,\n\tgenerateBlockId,\n\tgetBlockChildren,\n} from '../../model/Document.js';\nimport type { BlockId, NodeTypeName } from '../../model/TypeBrands.js';\nimport { nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\n\n/** Context information about a cell within a table. */\nexport interface TableContext {\n\treadonly tableId: BlockId;\n\treadonly tableIndex: number;\n\treadonly rowId: BlockId;\n\treadonly rowIndex: number;\n\treadonly cellId: BlockId;\n\treadonly colIndex: number;\n\treadonly totalRows: number;\n\treadonly totalCols: number;\n}\n\n/** Creates a table BlockNode structure with the given dimensions. */\nexport function createTable(rows: number, cols: number): BlockNode {\n\tconst tableId: BlockId = generateBlockId();\n\tconst rowNodes: ChildNode[] = [];\n\n\tfor (let r = 0; r < rows; r++) {\n\t\tconst cellNodes: ChildNode[] = [];\n\t\tfor (let c = 0; c < cols; c++) {\n\t\t\tcellNodes.push(createTableCell());\n\t\t}\n\t\trowNodes.push(\n\t\t\tcreateBlockNode(nodeType('table_row') as NodeTypeName, cellNodes, generateBlockId()),\n\t\t);\n\t}\n\n\treturn createBlockNode(nodeType('table') as NodeTypeName, rowNodes, tableId);\n}\n\n/** Creates a single table row with the given number of cells. */\nexport function createTableRow(cols: number): BlockNode {\n\tconst cellNodes: ChildNode[] = [];\n\tfor (let c = 0; c < cols; c++) {\n\t\tcellNodes.push(createTableCell());\n\t}\n\treturn createBlockNode(nodeType('table_row') as NodeTypeName, cellNodes, generateBlockId());\n}\n\n/** Creates a single empty table cell containing a paragraph. */\nexport function createTableCell(): BlockNode {\n\tconst paragraph: BlockNode = createBlockNode(\n\t\tnodeType('paragraph') as NodeTypeName,\n\t\t[createTextNode('')],\n\t\tgenerateBlockId(),\n\t);\n\treturn createBlockNode(nodeType('table_cell') as NodeTypeName, [paragraph], generateBlockId());\n}\n\n/**\n * Finds table context for a given block ID.\n * Returns null if the block is not inside a table.\n */\nexport function findTableContext(state: EditorState, blockId: BlockId): TableContext | null {\n\tconst path = state.getNodePath(blockId);\n\tif (!path) return null;\n\n\t// Collect table, row, and cell in a single pass\n\tlet tableId: BlockId | null = null;\n\tlet tableNode: BlockNode | null = null;\n\tlet rowId: BlockId | null = null;\n\tlet cellId: BlockId | null = null;\n\n\tfor (const id of path) {\n\t\tconst node = state.getBlock(id as BlockId);\n\t\tif (!node) continue;\n\t\tif (node.type === 'table') {\n\t\t\ttableId = id as BlockId;\n\t\t\ttableNode = node;\n\t\t} else if (node.type === 'table_row') {\n\t\t\trowId = id as BlockId;\n\t\t} else if (node.type === 'table_cell') {\n\t\t\tcellId = id as BlockId;\n\t\t}\n\t}\n\n\t// If the block itself is a cell\n\tconst block = state.getBlock(blockId);\n\tif (block?.type === 'table_cell') {\n\t\tcellId = blockId;\n\t}\n\n\tif (!tableId || !tableNode || !cellId || !rowId) return null;\n\n\t// Find table index in document\n\tconst tableIndex: number = state.doc.children.findIndex((b) => b.id === tableId);\n\n\tconst rows: readonly BlockNode[] = getBlockChildren(tableNode);\n\tconst rowIndex: number = rows.findIndex((r) => r.id === rowId);\n\tif (rowIndex === -1) return null;\n\n\tconst rowNode: BlockNode | undefined = rows[rowIndex];\n\tif (!rowNode) return null;\n\tconst cells: readonly BlockNode[] = getBlockChildren(rowNode);\n\tconst colIndex: number = cells.findIndex((c) => c.id === cellId);\n\tif (colIndex === -1) return null;\n\n\tconst totalCols: number = cells.length;\n\tconst totalRows: number = rows.length;\n\n\treturn {\n\t\ttableId,\n\t\ttableIndex,\n\t\trowId,\n\t\trowIndex,\n\t\tcellId,\n\t\tcolIndex,\n\t\ttotalRows,\n\t\ttotalCols,\n\t};\n}\n\n/**\n * Gets the cell BlockId at the given row and column indices.\n * Returns null if out of bounds.\n */\nexport function getCellAt(\n\tstate: EditorState,\n\ttableId: BlockId,\n\trowIndex: number,\n\tcolIndex: number,\n): BlockId | null {\n\tconst table = state.getBlock(tableId);\n\tif (!table) return null;\n\n\tconst rows: readonly BlockNode[] = getBlockChildren(table);\n\tconst row: BlockNode | undefined = rows[rowIndex];\n\tif (!row) return null;\n\n\tconst cells: readonly BlockNode[] = getBlockChildren(row);\n\tconst cell: BlockNode | undefined = cells[colIndex];\n\treturn cell?.id ?? null;\n}\n\n/** Returns all cell IDs in a table in row-major order. */\nexport function getAllCellIds(state: EditorState, tableId: BlockId): readonly BlockId[] {\n\tconst table = state.getBlock(tableId);\n\tif (!table) return [];\n\n\tconst result: BlockId[] = [];\n\tconst rows: readonly BlockNode[] = getBlockChildren(table);\n\tfor (const row of rows) {\n\t\tconst cells: readonly BlockNode[] = getBlockChildren(row);\n\t\tfor (const cell of cells) {\n\t\t\tresult.push(cell.id);\n\t\t}\n\t}\n\treturn result;\n}\n\n/** Returns the first leaf-block ID inside a table cell (e.g. the paragraph). */\nexport function getFirstLeafInCell(state: EditorState, cellId: BlockId): BlockId {\n\tconst cell: BlockNode | undefined = state.getBlock(cellId);\n\tif (!cell) return cellId;\n\tconst blockChildren: readonly BlockNode[] = getBlockChildren(cell);\n\tconst first: BlockNode | undefined = blockChildren[0];\n\tif (!first) return cellId;\n\tlet current: BlockNode = first;\n\twhile (true) {\n\t\tconst children: readonly BlockNode[] = getBlockChildren(current);\n\t\tconst next: BlockNode | undefined = children[0];\n\t\tif (!next) return current.id;\n\t\tcurrent = next;\n\t}\n}\n\n/** Returns the last leaf-block ID inside a table cell. */\nexport function getLastLeafInCell(state: EditorState, cellId: BlockId): BlockId {\n\tconst cell: BlockNode | undefined = state.getBlock(cellId);\n\tif (!cell) return cellId;\n\tconst blockChildren: readonly BlockNode[] = getBlockChildren(cell);\n\tconst last: BlockNode | undefined = blockChildren[blockChildren.length - 1];\n\tif (!last) return cellId;\n\tlet current: BlockNode = last;\n\twhile (true) {\n\t\tconst children: readonly BlockNode[] = getBlockChildren(current);\n\t\tconst next: BlockNode | undefined = children[children.length - 1];\n\t\tif (!next) return current.id;\n\t\tcurrent = next;\n\t}\n}\n\n/** Checks whether a block is inside a table. */\nexport function isInsideTable(state: EditorState, blockId: BlockId): boolean {\n\tconst path = state.getNodePath(blockId);\n\tif (!path) return false;\n\n\tfor (const id of path) {\n\t\tconst node = state.getBlock(id as BlockId);\n\t\tif (node?.type === 'table') return true;\n\t}\n\treturn false;\n}\n","/**\n * Locale interface and default English locale for the TablePlugin.\n * Allows full i18n of all user-facing strings in the table feature.\n */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface TableLocale {\n\t// Context Menu\n\treadonly insertRowAbove: string;\n\treadonly insertRowBelow: string;\n\treadonly insertColumnLeft: string;\n\treadonly insertColumnRight: string;\n\treadonly deleteRow: string;\n\treadonly deleteColumn: string;\n\treadonly borderColorLabel: string;\n\treadonly deleteTable: string;\n\n\t// Menu A11y\n\treadonly tableActions: string;\n\treadonly menuKeyboardHint: string;\n\n\t// Controls\n\treadonly insertRow: string;\n\treadonly insertColumn: string;\n\treadonly addRow: string;\n\treadonly addColumn: string;\n\treadonly tableActionsHint: string;\n\treadonly contextMenuHint: string;\n\treadonly borderColor: string;\n\n\t// Border Color Picker\n\treadonly defaultColor: string;\n\treadonly noBorders: string;\n\treadonly borderColorPicker: string;\n\treadonly announceBorderColorSet: (colorName: string) => string;\n\treadonly announceBorderReset: string;\n\treadonly borderSwatchLabel: (colorName: string) => string;\n\n\t// Command Announcements\n\treadonly announceRowInsertedAbove: string;\n\treadonly announceRowInsertedBelow: string;\n\treadonly announceColumnInserted: (side: string) => string;\n\treadonly announceRowDeleted: string;\n\treadonly announceColumnDeleted: string;\n\treadonly announceTableDeleted: string;\n\n\t// Toolbar\n\treadonly insertTable: string;\n\n\t// NodeView ARIA\n\treadonly tableAriaLabel: (rows: number, cols: number) => string;\n\treadonly tableAriaDescription: string;\n}\n\n// --- Default English Locale ---\n\nexport const TABLE_LOCALE_EN: TableLocale = {\n\t// Context Menu\n\tinsertRowAbove: 'Insert Row Above',\n\tinsertRowBelow: 'Insert Row Below',\n\tinsertColumnLeft: 'Insert Column Left',\n\tinsertColumnRight: 'Insert Column Right',\n\tdeleteRow: 'Delete Row',\n\tdeleteColumn: 'Delete Column',\n\tborderColorLabel: 'Border Color...',\n\tdeleteTable: 'Delete Table',\n\n\t// Menu A11y\n\ttableActions: 'Table actions',\n\tmenuKeyboardHint: '\\u2191\\u2193 Navigate \\u00b7 Enter Select \\u00b7 Esc Close',\n\n\t// Controls\n\tinsertRow: 'Insert row',\n\tinsertColumn: 'Insert column',\n\taddRow: 'Add row',\n\taddColumn: 'Add column',\n\ttableActionsHint: 'Table actions (Right-click or Shift+F10)',\n\tcontextMenuHint: 'Right-click or Shift+F10 for table actions',\n\tborderColor: 'Border color',\n\n\t// Border Color Picker\n\tdefaultColor: 'Default',\n\tnoBorders: 'No borders',\n\tborderColorPicker: 'Border color picker',\n\tannounceBorderColorSet: (colorName: string) => `Table border color set to ${colorName}`,\n\tannounceBorderReset: 'Table borders reset to default',\n\tborderSwatchLabel: (colorName: string) => `Border ${colorName}`,\n\n\t// Command Announcements\n\tannounceRowInsertedAbove: 'Row inserted above',\n\tannounceRowInsertedBelow: 'Row inserted below',\n\tannounceColumnInserted: (side: string) => `Column inserted ${side}`,\n\tannounceRowDeleted: 'Row deleted',\n\tannounceColumnDeleted: 'Column deleted',\n\tannounceTableDeleted: 'Table deleted',\n\n\t// Toolbar\n\tinsertTable: 'Insert Table',\n\n\t// NodeView ARIA\n\ttableAriaLabel: (rows: number, cols: number) => `Table with ${rows} rows and ${cols} columns`,\n\ttableAriaDescription: 'Right-click or press Shift+F10 for table actions',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<TableLocale> = import.meta.glob<{\n\tdefault: TableLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadTableLocale(lang: string): Promise<TableLocale> {\n\treturn loadLocaleModule(localeModules, lang, TABLE_LOCALE_EN);\n}\n","/**\n * Border color commands, transaction builder, and accessible color picker\n * for table borders. Supports theme-default, custom hex, and borderless modes.\n * Delegates grid rendering to the shared ColorGrid module.\n */\n\nimport type { BlockAttrs } from '../../model/Document.js';\nimport { isTextSelection } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { renderColorGrid } from '../shared/ColorGrid.js';\nimport { getColorName } from '../shared/ColorNames.js';\nimport { findTableContext } from './TableHelpers.js';\nimport { TABLE_LOCALE_EN, type TableLocale } from './TableLocale.js';\n\n// --- Border Color Palette ---\n\n/** Subdued, border-appropriate colors: grays, earth tones, muted hues. */\nexport const BORDER_COLOR_PALETTE: readonly string[] = [\n\t'#000000',\n\t'#434343',\n\t'#666666',\n\t'#999999',\n\t'#b7b7b7',\n\t'#cccccc',\n\t'#d9d9d9',\n\t'#efefef',\n\t'#980000',\n\t'#cc0000',\n\t'#e69138',\n\t'#f1c232',\n\t'#6aa84f',\n\t'#45818e',\n\t'#3c78d8',\n\t'#3d85c6',\n\t'#674ea7',\n\t'#a64d79',\n\t'#0b5394',\n\t'#38761d',\n];\n\nconst COLUMNS = 5;\n\n// --- Transaction Builder ---\n\n/**\n * Builds a transaction that sets `borderColor` on a table node.\n * Preserves existing attributes (spread pattern).\n */\nexport function buildSetBorderColorTransaction(\n\tstate: EditorState,\n\ttableId: BlockId,\n\tborderColor: string | undefined,\n): Transaction | null {\n\tconst table = state.getBlock(tableId);\n\tif (!table || table.type !== 'table') return null;\n\n\tconst path = state.getNodePath(tableId);\n\tif (!path) return null;\n\n\tif (borderColor === undefined) {\n\t\t// Remove borderColor from attrs, keep everything else\n\t\tconst { borderColor: _, ...rest } = (table.attrs ?? {}) as Record<\n\t\t\tstring,\n\t\t\tstring | number | boolean\n\t\t>;\n\t\tconst cleaned: BlockAttrs = rest;\n\t\treturn state\n\t\t\t.transaction('command')\n\t\t\t.setNodeAttr(path, cleaned)\n\t\t\t.setSelection(state.selection)\n\t\t\t.build();\n\t}\n\n\tconst newAttrs: BlockAttrs = { ...table.attrs, borderColor };\n\treturn state\n\t\t.transaction('command')\n\t\t.setNodeAttr(path, newAttrs)\n\t\t.setSelection(state.selection)\n\t\t.build();\n}\n\n// --- Commands ---\n\n/** Sets the border color on the table surrounding the cursor. */\nexport function setTableBorderColor(\n\tcontext: PluginContext,\n\tcolor: string,\n\tlocale: TableLocale = TABLE_LOCALE_EN,\n): boolean {\n\tconst state = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\tconst tableCtx = findTableContext(state, state.selection.anchor.blockId);\n\tif (!tableCtx) return false;\n\n\tconst tr = buildSetBorderColorTransaction(state, tableCtx.tableId, color);\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\tconst colorName: string = color === 'none' ? 'none' : getColorName(color);\n\tcontext.announce(locale.announceBorderColorSet(colorName));\n\treturn true;\n}\n\n/** Resets the border color to theme default. */\nexport function resetTableBorderColor(\n\tcontext: PluginContext,\n\tlocale: TableLocale = TABLE_LOCALE_EN,\n): boolean {\n\tconst state = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\tconst tableCtx = findTableContext(state, state.selection.anchor.blockId);\n\tif (!tableCtx) return false;\n\n\tconst tr = buildSetBorderColorTransaction(state, tableCtx.tableId, undefined);\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\tcontext.announce(locale.announceBorderReset);\n\treturn true;\n}\n\n/** Reads the current border color from a table node. */\nexport function getTableBorderColor(state: EditorState, tableId: BlockId): string | undefined {\n\tconst table = state.getBlock(tableId);\n\tif (!table) return undefined;\n\treturn table.attrs?.borderColor as string | undefined;\n}\n\n// --- Border Color Picker ---\n\n/**\n * Renders an accessible border color picker into a container element.\n * Includes \"Default\", \"No borders\", and a WAI-ARIA grid of color swatches.\n */\nexport function renderBorderColorPicker(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\ttableId: BlockId,\n\tonClose: () => void,\n\tlocale: TableLocale = TABLE_LOCALE_EN,\n): void {\n\tcontainer.classList.add('notectl-color-picker');\n\n\tconst currentColor: string | undefined = getTableBorderColor(context.getState(), tableId);\n\n\t// --- Default button ---\n\tconst defaultBtn: HTMLButtonElement = document.createElement('button');\n\tdefaultBtn.type = 'button';\n\tdefaultBtn.className = 'notectl-color-picker__default';\n\tdefaultBtn.textContent = locale.defaultColor;\n\tdefaultBtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tresetTableBorderColor(context, locale);\n\t\tonClose();\n\t});\n\tdefaultBtn.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tonClose();\n\t\t}\n\t});\n\tcontainer.appendChild(defaultBtn);\n\n\t// --- No borders button ---\n\tconst noBordersBtn: HTMLButtonElement = document.createElement('button');\n\tnoBordersBtn.type = 'button';\n\tnoBordersBtn.className = 'notectl-color-picker__default';\n\tnoBordersBtn.textContent = locale.noBorders;\n\tnoBordersBtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tsetTableBorderColor(context, 'none', locale);\n\t\tonClose();\n\t});\n\tnoBordersBtn.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tonClose();\n\t\t}\n\t});\n\tcontainer.appendChild(noBordersBtn);\n\n\t// --- Color grid (delegated to shared ColorGrid) ---\n\trenderColorGrid(container, {\n\t\tcolors: BORDER_COLOR_PALETTE,\n\t\tcolumns: COLUMNS,\n\t\tariaLabel: locale.borderColorPicker,\n\t\tariaLabelPrefix: '',\n\t\tactiveColor: currentColor ?? null,\n\t\tswatchLabel: locale.borderSwatchLabel,\n\t\ttitleAsName: true,\n\t\tonSelect: (color: string) => {\n\t\t\tsetTableBorderColor(context, color, locale);\n\t\t\tonClose();\n\t\t},\n\t\tonClose,\n\t});\n}\n","/**\n * Table commands: insert table, add/remove rows and columns, delete table.\n * All commands are registered via PluginContext and operate through transactions.\n *\n * Shared transaction builders (`build*Transaction`) are pure functions that take\n * EditorState + explicit indices and return a Transaction or null. They are used\n * by both commands (via PluginContext) and controls (via getState/dispatch).\n */\n\nimport { insertBlockObjectOnOwnLine } from '../../commands/BlockInsertion.js';\nimport { createSelectionForBlockBoundary } from '../../commands/CommandHelpers.js';\nimport { createEmptyParagraph, generateBlockId, getBlockChildren } from '../../model/Document.js';\nimport {\n\tcreateCollapsedSelection,\n\tcreateNodeSelection,\n\tisGapCursor,\n\tisNodeSelection,\n\tisTextSelection,\n} from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { getSelectedBlockId } from '../shared/PluginHelpers.js';\nimport {\n\ttype TableContext,\n\tcreateTable,\n\tcreateTableCell,\n\tcreateTableRow,\n\tfindTableContext,\n\tgetCellAt,\n\tgetFirstLeafInCell,\n} from './TableHelpers.js';\nimport type { TableLocale } from './TableLocale.js';\n\n// --- Shared Transaction Builders ---\n\n/** Builds a transaction that inserts a new row at the given index. */\nexport function buildInsertRowTransaction(\n\tstate: EditorState,\n\ttableId: BlockId,\n\trowIndex: number,\n): Transaction | null {\n\tconst table = state.getBlock(tableId);\n\tif (!table) return null;\n\n\tconst rows = getBlockChildren(table);\n\tconst numCols: number = rows[0] ? getBlockChildren(rows[0]).length : 0;\n\tif (numCols === 0) return null;\n\n\tconst newRow = createTableRow(numCols);\n\tconst tr = state.transaction('command').insertNode([tableId], rowIndex, newRow);\n\n\tconst firstCell = getBlockChildren(newRow)[0];\n\tconst firstLeaf = firstCell ? getBlockChildren(firstCell)[0] : undefined;\n\tif (firstLeaf) {\n\t\ttr.setSelection(createCollapsedSelection(firstLeaf.id, 0));\n\t} else if (firstCell) {\n\t\ttr.setSelection(createCollapsedSelection(firstCell.id, 0));\n\t}\n\n\treturn tr.build();\n}\n\n/** Builds a transaction that inserts a new column at the given index. */\nexport function buildInsertColumnTransaction(\n\tstate: EditorState,\n\ttableId: BlockId,\n\tcolIndex: number,\n): Transaction | null {\n\tconst table = state.getBlock(tableId);\n\tif (!table) return null;\n\n\tconst rows = getBlockChildren(table);\n\tconst tr = state.transaction('command');\n\n\tfor (const row of rows) {\n\t\tconst newCell = createTableCell();\n\t\ttr.insertNode([tableId, row.id], colIndex, newCell);\n\t}\n\n\ttr.setSelection(state.selection);\n\treturn tr.build();\n}\n\n/**\n * Builds a transaction that deletes the row at the given index.\n * If it's the last row, delegates to `createDeleteTableTransaction`.\n * @param preferredCol Column index to place the cursor in after deletion (default 0).\n */\nexport function buildDeleteRowTransaction(\n\tstate: EditorState,\n\ttableId: BlockId,\n\trowIndex: number,\n\tpreferredCol = 0,\n): Transaction | null {\n\tconst table = state.getBlock(tableId);\n\tif (!table) return null;\n\n\tconst rows = getBlockChildren(table);\n\tif (rows.length <= 1) {\n\t\treturn createDeleteTableTransaction(state, tableId);\n\t}\n\n\tconst tr = state.transaction('command').removeNode([tableId], rowIndex);\n\n\tconst targetRow: number = rowIndex > 0 ? rowIndex - 1 : 1;\n\tconst cellId: BlockId | null = getCellAt(state, tableId, targetRow, preferredCol);\n\tif (cellId) {\n\t\tconst leafId: BlockId = getFirstLeafInCell(state, cellId);\n\t\ttr.setSelection(createCollapsedSelection(leafId, 0));\n\t}\n\n\treturn tr.build();\n}\n\n/**\n * Builds a transaction that deletes the column at the given index.\n * If it's the last column, delegates to `createDeleteTableTransaction`.\n * @param preferredRow Row index to place the cursor in after deletion (default 0).\n */\nexport function buildDeleteColumnTransaction(\n\tstate: EditorState,\n\ttableId: BlockId,\n\tcolIndex: number,\n\tpreferredRow = 0,\n): Transaction | null {\n\tconst table = state.getBlock(tableId);\n\tif (!table) return null;\n\n\tconst rows = getBlockChildren(table);\n\tconst numCols: number = rows[0] ? getBlockChildren(rows[0]).length : 0;\n\n\tif (numCols <= 1) {\n\t\treturn createDeleteTableTransaction(state, tableId);\n\t}\n\n\tconst tr = state.transaction('command');\n\n\tfor (let r: number = rows.length - 1; r >= 0; r--) {\n\t\tconst row = rows[r];\n\t\tif (!row) continue;\n\t\ttr.removeNode([tableId, row.id], colIndex);\n\t}\n\n\tconst targetCol: number = colIndex > 0 ? colIndex - 1 : 1;\n\tconst cellId: BlockId | null = getCellAt(state, tableId, preferredRow, targetCol);\n\tif (cellId) {\n\t\tconst leafId: BlockId = getFirstLeafInCell(state, cellId);\n\t\ttr.setSelection(createCollapsedSelection(leafId, 0));\n\t}\n\n\treturn tr.build();\n}\n\n/**\n * Creates a transaction that removes the given root-level table node.\n * Cursor placement prefers the next root block, then previous.\n * If the table is the only root block, it is replaced with an empty paragraph.\n */\nexport function createDeleteTableTransaction(\n\tstate: EditorState,\n\ttableId: BlockId,\n): Transaction | null {\n\tconst tableIndex: number = state.doc.children.findIndex((block) => block.id === tableId);\n\tif (tableIndex === -1) return null;\n\n\tif (state.doc.children.length === 1) {\n\t\tconst replacement = createEmptyParagraph(generateBlockId());\n\t\treturn state\n\t\t\t.transaction('command')\n\t\t\t.insertNode([], 0, replacement)\n\t\t\t.removeNode([], 1)\n\t\t\t.setSelection(createCollapsedSelection(replacement.id, 0))\n\t\t\t.build();\n\t}\n\n\tconst tr = state.transaction('command').removeNode([], tableIndex);\n\n\tconst nextRoot = state.doc.children[tableIndex + 1];\n\tif (nextRoot) {\n\t\tconst selection = createSelectionForBlockBoundary(state, nextRoot.id, 'start');\n\t\tif (selection) {\n\t\t\ttr.setSelection(selection);\n\t\t\treturn tr.build();\n\t\t}\n\t}\n\n\tconst prevRoot = state.doc.children[tableIndex - 1];\n\tif (prevRoot) {\n\t\tconst selection = createSelectionForBlockBoundary(state, prevRoot.id, 'end');\n\t\tif (selection) {\n\t\t\ttr.setSelection(selection);\n\t\t\treturn tr.build();\n\t\t}\n\t}\n\n\treturn null;\n}\n\n// --- Commands ---\n\ninterface TableDeletionTarget {\n\treadonly tableId: BlockId;\n}\n\n/**\n * Inserts a table with the given dimensions at the current cursor position.\n * Adds a paragraph after the table for cursor escape.\n * Moves cursor into the first cell.\n */\nexport function insertTable(context: PluginContext, rows: number, cols: number): boolean {\n\tconst state = context.getState();\n\tconst anchorBlockId = getSelectedBlockId(state);\n\tif (!anchorBlockId) return false;\n\n\tconst tableNode = createTable(rows, cols);\n\tconst builder = state.transaction('command');\n\tconst trailing = insertBlockObjectOnOwnLine(state, builder, anchorBlockId, tableNode);\n\tif (!trailing) return false;\n\n\t// Set cursor in first paragraph inside first cell\n\tconst firstRow = getBlockChildren(tableNode)[0];\n\tconst firstCell = firstRow ? getBlockChildren(firstRow)[0] : undefined;\n\tconst firstParagraph = firstCell ? getBlockChildren(firstCell)[0] : undefined;\n\n\tif (firstParagraph) {\n\t\tbuilder.setSelection(createCollapsedSelection(firstParagraph.id, 0));\n\t} else if (firstCell) {\n\t\tbuilder.setSelection(createCollapsedSelection(firstCell.id, 0));\n\t}\n\n\tcontext.dispatch(builder.build());\n\treturn true;\n}\n\n/** Adds a row above the current row. */\nexport function addRowAbove(context: PluginContext, locale: TableLocale): boolean {\n\tconst state = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\tconst tableCtx: TableContext | null = findTableContext(state, state.selection.anchor.blockId);\n\tif (!tableCtx) return false;\n\n\tconst tr = buildInsertRowTransaction(state, tableCtx.tableId, tableCtx.rowIndex);\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\tcontext.announce(locale.announceRowInsertedAbove);\n\treturn true;\n}\n\n/** Adds a row below the current row. */\nexport function addRowBelow(context: PluginContext, locale: TableLocale): boolean {\n\tconst state = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\tconst tableCtx: TableContext | null = findTableContext(state, state.selection.anchor.blockId);\n\tif (!tableCtx) return false;\n\n\tconst tr = buildInsertRowTransaction(state, tableCtx.tableId, tableCtx.rowIndex + 1);\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\tcontext.announce(locale.announceRowInsertedBelow);\n\treturn true;\n}\n\n/** Adds a column to the left of the current column. */\nexport function addColumnLeft(context: PluginContext, locale: TableLocale): boolean {\n\treturn addColumn(context, 'left', locale);\n}\n\n/** Adds a column to the right of the current column. */\nexport function addColumnRight(context: PluginContext, locale: TableLocale): boolean {\n\treturn addColumn(context, 'right', locale);\n}\n\nfunction addColumn(context: PluginContext, side: 'left' | 'right', locale: TableLocale): boolean {\n\tconst state = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\tconst tableCtx: TableContext | null = findTableContext(state, state.selection.anchor.blockId);\n\tif (!tableCtx) return false;\n\n\tconst insertColIndex: number = side === 'left' ? tableCtx.colIndex : tableCtx.colIndex + 1;\n\tconst tr = buildInsertColumnTransaction(state, tableCtx.tableId, insertColIndex);\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\tcontext.announce(locale.announceColumnInserted(side));\n\treturn true;\n}\n\n/** Deletes the current row. If it's the last row, deletes the entire table. */\nexport function deleteRow(context: PluginContext, locale: TableLocale): boolean {\n\tconst state = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\tconst tableCtx: TableContext | null = findTableContext(state, state.selection.anchor.blockId);\n\tif (!tableCtx) return false;\n\n\tconst tr = buildDeleteRowTransaction(\n\t\tstate,\n\t\ttableCtx.tableId,\n\t\ttableCtx.rowIndex,\n\t\ttableCtx.colIndex,\n\t);\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\tcontext.announce(locale.announceRowDeleted);\n\treturn true;\n}\n\n/** Deletes the current column. If it's the last column, deletes the entire table. */\nexport function deleteColumn(context: PluginContext, locale: TableLocale): boolean {\n\tconst state = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\tconst tableCtx: TableContext | null = findTableContext(state, state.selection.anchor.blockId);\n\tif (!tableCtx) return false;\n\n\tconst tr = buildDeleteColumnTransaction(\n\t\tstate,\n\t\ttableCtx.tableId,\n\t\ttableCtx.colIndex,\n\t\ttableCtx.rowIndex,\n\t);\n\tif (!tr) return false;\n\n\tcontext.dispatch(tr);\n\tcontext.announce(locale.announceColumnDeleted);\n\treturn true;\n}\n\n/** Deletes the entire table and moves cursor to surrounding block. */\nexport function deleteTable(context: PluginContext, locale: TableLocale): boolean {\n\tconst state = context.getState();\n\tconst target = resolveTableDeletionTarget(state);\n\tif (!target) return false;\n\n\tconst tr = createDeleteTableTransaction(state, target.tableId);\n\tif (!tr) return false;\n\tcontext.dispatch(tr);\n\tcontext.announce(locale.announceTableDeleted);\n\treturn true;\n}\n\n/** Selects the surrounding table as a node object. */\nexport function selectTable(context: PluginContext): boolean {\n\tconst state = context.getState();\n\tconst sel = state.selection;\n\n\tif (isNodeSelection(sel)) {\n\t\tconst selectedNode = state.getBlock(sel.nodeId);\n\t\treturn selectedNode?.type === 'table';\n\t}\n\tif (isGapCursor(sel)) return false;\n\n\tconst tableCtx: TableContext | null = findTableContext(state, sel.anchor.blockId);\n\tif (!tableCtx) return false;\n\n\tconst path = state.getNodePath(tableCtx.tableId);\n\tif (!path) return false;\n\n\tconst tr = state\n\t\t.transaction('command')\n\t\t.setSelection(createNodeSelection(tableCtx.tableId, path))\n\t\t.build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Registers all table commands on the given plugin context. */\nexport function registerTableCommands(context: PluginContext, locale: TableLocale): void {\n\tcontext.registerCommand('insertTable', () => insertTable(context, 3, 3));\n\tcontext.registerCommand('addRowAbove', () => addRowAbove(context, locale));\n\tcontext.registerCommand('addRowBelow', () => addRowBelow(context, locale));\n\tcontext.registerCommand('addColumnLeft', () => addColumnLeft(context, locale));\n\tcontext.registerCommand('addColumnRight', () => addColumnRight(context, locale));\n\tcontext.registerCommand('deleteRow', () => deleteRow(context, locale));\n\tcontext.registerCommand('deleteColumn', () => deleteColumn(context, locale));\n\tcontext.registerCommand('selectTable', () => selectTable(context));\n\tcontext.registerCommand('deleteTable', () => deleteTable(context, locale));\n}\n\nfunction resolveTableDeletionTarget(\n\tstate: ReturnType<PluginContext['getState']>,\n): TableDeletionTarget | null {\n\tif (isNodeSelection(state.selection)) {\n\t\tconst selectedNode = state.getBlock(state.selection.nodeId);\n\t\tif (selectedNode?.type !== 'table') return null;\n\t\treturn { tableId: selectedNode.id };\n\t}\n\tif (isGapCursor(state.selection)) return null;\n\n\tconst tableCtx: TableContext | null = findTableContext(state, state.selection.anchor.blockId);\n\tif (!tableCtx) return null;\n\n\treturn { tableId: tableCtx.tableId };\n}\n","/**\n * Accessible context menu for table operations.\n * Triggered via right-click, Shift-F10 keyboard shortcut, or table actions button.\n * Provides fully keyboard-navigable access to all table actions.\n * Delegates lifecycle to PopupManager when available, falls back to manual DOM.\n * Prevents key events from escaping to the editor via stopPropagation.\n */\n\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { applyRovingTabindex } from '../shared/KeyboardNav.js';\nimport type { PopupHandle, PopupManager } from '../shared/PopupManager.js';\nimport { positionPopup } from '../shared/PopupPositioning.js';\nimport { renderBorderColorPicker } from './TableBorderColor.js';\nimport { TABLE_LOCALE_EN, type TableLocale } from './TableLocale.js';\n\n// --- Types ---\n\nexport interface TableContextMenuHandle {\n\tisOpen(): boolean;\n\tclose(): void;\n\tdestroy(): void;\n}\n\ninterface MenuEntry {\n\treadonly label: string;\n\treadonly command: string;\n\treadonly type: 'item';\n}\n\ninterface MenuSeparator {\n\treadonly type: 'separator';\n}\n\ninterface MenuSubmenu {\n\treadonly label: string;\n\treadonly type: 'submenu';\n\treadonly id: string;\n}\n\ntype MenuDefinition = MenuEntry | MenuSeparator | MenuSubmenu;\n\n// --- Menu Structure ---\n\nfunction buildMenuItems(locale: TableLocale): readonly MenuDefinition[] {\n\treturn [\n\t\t{ type: 'item', label: locale.insertRowAbove, command: 'addRowAbove' },\n\t\t{ type: 'item', label: locale.insertRowBelow, command: 'addRowBelow' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'item', label: locale.insertColumnLeft, command: 'addColumnLeft' },\n\t\t{ type: 'item', label: locale.insertColumnRight, command: 'addColumnRight' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'item', label: locale.deleteRow, command: 'deleteRow' },\n\t\t{ type: 'item', label: locale.deleteColumn, command: 'deleteColumn' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'submenu', label: locale.borderColorLabel, id: 'borderColor' },\n\t\t{ type: 'separator' },\n\t\t{ type: 'item', label: locale.deleteTable, command: 'deleteTable' },\n\t];\n}\n\n// --- Factory ---\n\n/**\n * Creates and displays an accessible context menu for table operations.\n * Attaches to the provided container (shadow root or editor container).\n */\nexport function createTableContextMenu(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\ttableId: BlockId,\n\tanchorRect: DOMRect,\n\tonClosed?: () => void,\n\tlocale: TableLocale = TABLE_LOCALE_EN,\n\tpopupManager?: PopupManager,\n): TableContextMenuHandle {\n\tlet open = true;\n\tlet subPopup: HTMLDivElement | null = null;\n\tlet subHandle: PopupHandle | null = null;\n\n\t// --- Menu element ---\n\tconst menu: HTMLDivElement = document.createElement('div');\n\tmenu.className = 'notectl-table-context-menu';\n\tmenu.setAttribute('role', 'menu');\n\tmenu.setAttribute('aria-label', locale.tableActions);\n\tmenu.setAttribute('contenteditable', 'false');\n\n\t// --- Build menu items ---\n\tconst menuItems: HTMLButtonElement[] = [];\n\tlet focusedIndex = 0;\n\n\tconst menuDefs: readonly MenuDefinition[] = buildMenuItems(locale);\n\tfor (const def of menuDefs) {\n\t\tif (def.type === 'separator') {\n\t\t\tconst sep: HTMLDivElement = document.createElement('div');\n\t\t\tsep.setAttribute('role', 'separator');\n\t\t\tmenu.appendChild(sep);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.setAttribute('role', 'menuitem');\n\t\tbtn.textContent = def.label;\n\n\t\tif (def.type === 'submenu') {\n\t\t\tbtn.dataset.submenu = def.id;\n\t\t\tbtn.setAttribute('aria-haspopup', 'true');\n\t\t\tbtn.setAttribute('aria-expanded', 'false');\n\t\t}\n\n\t\tif (def.type === 'item') {\n\t\t\tbtn.dataset.command = def.command;\n\t\t}\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tbtn.addEventListener('click', (e: MouseEvent) => {\n\t\t\te.stopPropagation();\n\t\t\tif (def.type === 'item') {\n\t\t\t\tcontext.executeCommand(def.command);\n\t\t\t\tclose();\n\t\t\t} else if (def.type === 'submenu') {\n\t\t\t\topenSubmenu(btn);\n\t\t\t}\n\t\t});\n\n\t\tmenuItems.push(btn);\n\t\tmenu.appendChild(btn);\n\t}\n\n\t// --- Keyboard hint ---\n\tconst hint: HTMLDivElement = document.createElement('div');\n\thint.className = 'notectl-table-context-menu__hint';\n\thint.setAttribute('aria-hidden', 'true');\n\thint.textContent = locale.menuKeyboardHint;\n\tmenu.appendChild(hint);\n\n\tapplyRovingTabindex(menuItems, focusedIndex);\n\n\t// --- Keyboard navigation ---\n\tmenu.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\te.stopPropagation();\n\n\t\tswitch (e.key) {\n\t\t\tcase 'Escape':\n\t\t\t\te.preventDefault();\n\t\t\t\tclose();\n\t\t\t\treturn;\n\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tfocusedIndex = (focusedIndex + 1) % menuItems.length;\n\t\t\t\tapplyRovingTabindex(menuItems, focusedIndex);\n\t\t\t\tmenuItems[focusedIndex]?.focus();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tfocusedIndex = (focusedIndex - 1 + menuItems.length) % menuItems.length;\n\t\t\t\tapplyRovingTabindex(menuItems, focusedIndex);\n\t\t\t\tmenuItems[focusedIndex]?.focus();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowLeft': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst menuDir: string = getComputedStyle(menu).direction;\n\t\t\t\tconst openKey: string = menuDir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n\t\t\t\tif (e.key === openKey) {\n\t\t\t\t\tconst item = menuItems[focusedIndex];\n\t\t\t\t\tif (item?.dataset.submenu) {\n\t\t\t\t\t\topenSubmenu(item);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcloseSubmenu();\n\t\t\t\t\tmenuItems[focusedIndex]?.focus();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst item = menuItems[focusedIndex];\n\t\t\t\tif (!item) return;\n\t\t\t\tif (item.dataset.submenu) {\n\t\t\t\t\topenSubmenu(item);\n\t\t\t\t} else if (item.dataset.command) {\n\t\t\t\t\tcontext.executeCommand(item.dataset.command);\n\t\t\t\t\tclose();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase 'Home': {\n\t\t\t\te.preventDefault();\n\t\t\t\tfocusedIndex = 0;\n\t\t\t\tapplyRovingTabindex(menuItems, focusedIndex);\n\t\t\t\tmenuItems[focusedIndex]?.focus();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase 'End': {\n\t\t\t\te.preventDefault();\n\t\t\t\tfocusedIndex = menuItems.length - 1;\n\t\t\t\tapplyRovingTabindex(menuItems, focusedIndex);\n\t\t\t\tmenuItems[focusedIndex]?.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t});\n\n\t// --- Submenu handling ---\n\tfunction openSubmenu(trigger: HTMLButtonElement): void {\n\t\tcloseSubmenu();\n\t\ttrigger.setAttribute('aria-expanded', 'true');\n\n\t\tif (popupManager) {\n\t\t\tconst menuHandle: PopupHandle = {\n\t\t\t\tclose: () => close(),\n\t\t\t\tgetElement: () => menu,\n\t\t\t};\n\n\t\t\tsubHandle = popupManager.open({\n\t\t\t\tanchor: trigger,\n\t\t\t\tposition: 'right',\n\t\t\t\treferenceNode: menu,\n\t\t\t\tparent: menuHandle,\n\t\t\t\tonClose: () => {\n\t\t\t\t\tsubHandle = null;\n\t\t\t\t\tsubPopup = null;\n\t\t\t\t\tresetSubmenuTriggers();\n\t\t\t\t},\n\t\t\t\tcontent: (popup: HTMLElement, closeSub: () => void) => {\n\t\t\t\t\tpopup.className = 'notectl-table-context-menu';\n\t\t\t\t\tpopup.setAttribute('contenteditable', 'false');\n\t\t\t\t\tsubPopup = popup as HTMLDivElement;\n\n\t\t\t\t\tpopup.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tconst popupIsRtl: boolean = getComputedStyle(menu).direction === 'rtl';\n\t\t\t\t\t\tconst backKey: string = popupIsRtl ? 'ArrowRight' : 'ArrowLeft';\n\t\t\t\t\t\tif (e.key === backKey) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tcloseSub();\n\t\t\t\t\t\t\ttrigger.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\trenderBorderColorPicker(popup, context, tableId, () => close(), locale);\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tsubPopup = document.createElement('div');\n\t\t\tsubPopup.className = 'notectl-table-context-menu';\n\t\t\tsubPopup.setAttribute('contenteditable', 'false');\n\n\t\t\tsubPopup.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tconst menuIsRtl: boolean = getComputedStyle(menu).direction === 'rtl';\n\t\t\t\tconst closeKey: string = menuIsRtl ? 'ArrowRight' : 'ArrowLeft';\n\t\t\t\tif (e.key === closeKey) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tcloseSubmenu();\n\t\t\t\t\ttrigger.focus();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\trenderBorderColorPicker(subPopup, context, tableId, () => close(), locale);\n\n\t\t\tcontainer.appendChild(subPopup);\n\n\t\t\tconst menuRect: DOMRect = menu.getBoundingClientRect();\n\t\t\tconst isRtl: boolean = getComputedStyle(menu).direction === 'rtl';\n\t\t\tpositionPopup(subPopup, menuRect, { position: 'right', isRtl });\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst firstFocusable = subPopup?.querySelector('button') as HTMLElement | null;\n\t\t\t\tfirstFocusable?.focus();\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction closeSubmenu(): void {\n\t\tif (subHandle) {\n\t\t\tsubHandle.close();\n\t\t\tsubHandle = null;\n\t\t\tsubPopup = null;\n\t\t} else if (subPopup) {\n\t\t\tsubPopup.remove();\n\t\t\tsubPopup = null;\n\t\t}\n\t\tresetSubmenuTriggers();\n\t}\n\n\tfunction resetSubmenuTriggers(): void {\n\t\tfor (const item of menuItems) {\n\t\t\tif (item.dataset.submenu) {\n\t\t\t\titem.setAttribute('aria-expanded', 'false');\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Positioning & append ---\n\tpositionPopup(menu, anchorRect, { position: 'below-start' });\n\tcontainer.appendChild(menu);\n\n\t// Focus first item immediately and via rAF as backup\n\tmenuItems[0]?.focus();\n\trequestAnimationFrame(() => {\n\t\tif (open && menuItems[0]) {\n\t\t\tmenuItems[0].focus();\n\t\t}\n\t});\n\n\t// --- Click outside ---\n\tconst onClickOutside = (e: MouseEvent): void => {\n\t\tconst path: EventTarget[] = e.composedPath();\n\t\tif (path.includes(menu) || (subPopup && path.includes(subPopup))) {\n\t\t\treturn;\n\t\t}\n\t\tclose();\n\t};\n\tlet outsideClickTimer: ReturnType<typeof setTimeout> | null = null;\n\tlet outsideListenerAttached = false;\n\toutsideClickTimer = setTimeout(() => {\n\t\toutsideClickTimer = null;\n\t\tdocument.addEventListener('mousedown', onClickOutside, true);\n\t\toutsideListenerAttached = true;\n\t}, 0);\n\n\t// --- Close function ---\n\tfunction close(): void {\n\t\tif (!open) return;\n\t\topen = false;\n\t\tcloseSubmenu();\n\t\tmenu.remove();\n\t\tif (outsideClickTimer !== null) {\n\t\t\tclearTimeout(outsideClickTimer);\n\t\t\toutsideClickTimer = null;\n\t\t}\n\t\tif (outsideListenerAttached) {\n\t\t\tdocument.removeEventListener('mousedown', onClickOutside, true);\n\t\t\toutsideListenerAttached = false;\n\t\t}\n\t\tonClosed?.();\n\t}\n\n\treturn {\n\t\tisOpen: () => open,\n\t\tclose,\n\t\tdestroy: close,\n\t};\n}\n","/**\n * Keyboard navigation handlers for table cells.\n * Handles Tab, Shift-Tab, arrow keys, Enter, Backspace, Delete, and Escape.\n */\n\nimport { getBlockLength } from '../../model/Document.js';\nimport type { Keymap } from '../../model/Keymap.js';\nimport {\n\ttype Selection,\n\tcreateCollapsedSelection,\n\tcreateNodeSelection,\n\tisCollapsed,\n\tisTextSelection,\n} from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { addRowBelow } from './TableCommands.js';\nimport { type TableContextMenuHandle, createTableContextMenu } from './TableContextMenu.js';\nimport {\n\ttype TableContext,\n\tfindTableContext,\n\tgetCellAt,\n\tgetFirstLeafInCell,\n\tgetLastLeafInCell,\n} from './TableHelpers.js';\nimport type { TableLocale } from './TableLocale.js';\n\n/** Tracks the active context menu for Shift-F10 (one at a time). */\nlet activeContextMenu: TableContextMenuHandle | null = null;\n\n/** Registers all table navigation keymaps. */\nexport function registerTableKeymaps(context: PluginContext, locale: TableLocale): void {\n\tconst keymap: Keymap = {\n\t\tTab: () => handleTab(context, locale),\n\t\t'Shift-Tab': () => handleShiftTab(context),\n\t\tBackspace: () => handleBackspace(context),\n\t\tDelete: () => handleDelete(context),\n\t\tArrowDown: () => handleArrowDown(context),\n\t\tArrowUp: () => handleArrowUp(context),\n\t\tArrowRight: () => handleArrowRight(context),\n\t\tArrowLeft: () => handleArrowLeft(context),\n\t\tEscape: () => handleEscape(context),\n\t\t'Shift-F10': () => handleContextMenu(context),\n\t};\n\n\tcontext.registerKeymap(keymap, { priority: 'context' });\n}\n\n/**\n * Guards against NodeSelection and resolves TableContext.\n * Passes the narrowed text Selection to the handler, avoiding re-narrowing.\n * Returns false (not handled) if the cursor is not inside a table.\n */\nfunction withTableContext(\n\tcontext: PluginContext,\n\thandler: (state: EditorState, sel: Selection, tableCtx: TableContext) => boolean,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tif (!isTextSelection(state.selection)) return false;\n\tconst sel: Selection = state.selection;\n\tconst tableCtx: TableContext | null = findTableContext(state, sel.anchor.blockId);\n\tif (!tableCtx) return false;\n\treturn handler(state, sel, tableCtx);\n}\n\n/** Tab: move to next cell. At end of table, add a new row. */\nfunction handleTab(context: PluginContext, locale: TableLocale): boolean {\n\treturn withTableContext(context, (_state, _sel, tableCtx) => {\n\t\tif (tableCtx.colIndex < tableCtx.totalCols - 1) {\n\t\t\treturn moveToCellAndSelect(\n\t\t\t\tcontext,\n\t\t\t\ttableCtx.tableId,\n\t\t\t\ttableCtx.rowIndex,\n\t\t\t\ttableCtx.colIndex + 1,\n\t\t\t);\n\t\t}\n\n\t\tif (tableCtx.rowIndex < tableCtx.totalRows - 1) {\n\t\t\treturn moveToCellAndSelect(context, tableCtx.tableId, tableCtx.rowIndex + 1, 0);\n\t\t}\n\n\t\taddRowBelow(context, locale);\n\t\treturn true;\n\t});\n}\n\n/** Shift-Tab: move to previous cell. At start of table, stay put. */\nfunction handleShiftTab(context: PluginContext): boolean {\n\treturn withTableContext(context, (_state, _sel, tableCtx) => {\n\t\tif (tableCtx.colIndex > 0) {\n\t\t\treturn moveToCellAndSelect(\n\t\t\t\tcontext,\n\t\t\t\ttableCtx.tableId,\n\t\t\t\ttableCtx.rowIndex,\n\t\t\t\ttableCtx.colIndex - 1,\n\t\t\t);\n\t\t}\n\n\t\tif (tableCtx.rowIndex > 0) {\n\t\t\treturn moveToCellAndSelect(\n\t\t\t\tcontext,\n\t\t\t\ttableCtx.tableId,\n\t\t\t\ttableCtx.rowIndex - 1,\n\t\t\t\ttableCtx.totalCols - 1,\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\n/** Backspace at deletion-boundary: select table node (first step of 2-step delete). */\nfunction handleBackspace(context: PluginContext): boolean {\n\treturn withTableContext(context, (state, sel, tableCtx) => {\n\t\tif (!isCollapsed(sel)) return false;\n\t\tif (sel.anchor.offset !== 0) return false;\n\n\t\tconst isAtDeletionBoundary: boolean = tableCtx.rowIndex === 0 && tableCtx.colIndex === 0;\n\t\tif (!isAtDeletionBoundary) return false;\n\n\t\tconst firstLeaf: BlockId = getFirstLeafInCell(state, tableCtx.cellId);\n\t\tif (sel.anchor.blockId !== firstLeaf) return false;\n\n\t\treturn selectTableNode(context, tableCtx.tableId);\n\t});\n}\n\n/** Delete at deletion-boundary: select table node (first step of 2-step delete). */\nfunction handleDelete(context: PluginContext): boolean {\n\treturn withTableContext(context, (state, sel, tableCtx) => {\n\t\tif (!isCollapsed(sel)) return false;\n\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block) return false;\n\n\t\tconst blockLen: number = getBlockLength(block);\n\t\tif (sel.anchor.offset !== blockLen) return false;\n\n\t\tconst isAtDeletionBoundary: boolean =\n\t\t\ttableCtx.rowIndex === tableCtx.totalRows - 1 && tableCtx.colIndex === tableCtx.totalCols - 1;\n\t\tif (!isAtDeletionBoundary) return false;\n\n\t\tconst lastLeaf: BlockId = getLastLeafInCell(state, tableCtx.cellId);\n\t\tif (sel.anchor.blockId !== lastLeaf) return false;\n\n\t\treturn selectTableNode(context, tableCtx.tableId);\n\t});\n}\n\n/** ArrowDown: move to same column in next row. */\nfunction handleArrowDown(context: PluginContext): boolean {\n\treturn withTableContext(context, (state, sel, tableCtx) => {\n\t\tconst lastLeaf: BlockId = getLastLeafInCell(state, tableCtx.cellId);\n\t\tif (sel.anchor.blockId !== lastLeaf) return false;\n\n\t\tif (tableCtx.rowIndex >= tableCtx.totalRows - 1) {\n\t\t\treturn handleEscape(context);\n\t\t}\n\n\t\treturn moveToCellAndSelect(context, tableCtx.tableId, tableCtx.rowIndex + 1, tableCtx.colIndex);\n\t});\n}\n\n/** ArrowUp: move to same column in previous row. */\nfunction handleArrowUp(context: PluginContext): boolean {\n\treturn withTableContext(context, (state, sel, tableCtx) => {\n\t\tconst firstLeaf: BlockId = getFirstLeafInCell(state, tableCtx.cellId);\n\t\tif (sel.anchor.blockId !== firstLeaf) return false;\n\n\t\tif (tableCtx.rowIndex <= 0) return false;\n\n\t\treturn moveToCellAndSelect(context, tableCtx.tableId, tableCtx.rowIndex - 1, tableCtx.colIndex);\n\t});\n}\n\n/** ArrowRight at cell end: move to next cell. */\nfunction handleArrowRight(context: PluginContext): boolean {\n\treturn withTableContext(context, (state, sel, tableCtx) => {\n\t\tif (!isCollapsed(sel)) return false;\n\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block) return false;\n\n\t\tconst blockLen: number = getBlockLength(block);\n\t\tif (sel.anchor.offset !== blockLen) return false;\n\n\t\tconst lastLeaf: BlockId = getLastLeafInCell(state, tableCtx.cellId);\n\t\tif (sel.anchor.blockId !== lastLeaf) return false;\n\n\t\tif (tableCtx.colIndex < tableCtx.totalCols - 1) {\n\t\t\treturn moveToCellAndSelect(\n\t\t\t\tcontext,\n\t\t\t\ttableCtx.tableId,\n\t\t\t\ttableCtx.rowIndex,\n\t\t\t\ttableCtx.colIndex + 1,\n\t\t\t);\n\t\t}\n\n\t\tif (tableCtx.rowIndex < tableCtx.totalRows - 1) {\n\t\t\treturn moveToCellAndSelect(context, tableCtx.tableId, tableCtx.rowIndex + 1, 0);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\n/** ArrowLeft at cell start: move to previous cell. */\nfunction handleArrowLeft(context: PluginContext): boolean {\n\treturn withTableContext(context, (state, sel, tableCtx) => {\n\t\tif (!isCollapsed(sel)) return false;\n\t\tif (sel.anchor.offset !== 0) return false;\n\n\t\tconst firstLeaf: BlockId = getFirstLeafInCell(state, tableCtx.cellId);\n\t\tif (sel.anchor.blockId !== firstLeaf) return false;\n\n\t\tif (tableCtx.colIndex > 0) {\n\t\t\treturn moveToCellAtEnd(context, tableCtx.tableId, tableCtx.rowIndex, tableCtx.colIndex - 1);\n\t\t}\n\n\t\tif (tableCtx.rowIndex > 0) {\n\t\t\treturn moveToCellAtEnd(\n\t\t\t\tcontext,\n\t\t\t\ttableCtx.tableId,\n\t\t\t\ttableCtx.rowIndex - 1,\n\t\t\t\ttableCtx.totalCols - 1,\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\n/** Escape: move cursor to the paragraph after the table. */\nfunction handleEscape(context: PluginContext): boolean {\n\treturn withTableContext(context, (state, _sel, tableCtx) => {\n\t\tconst nextIndex: number = tableCtx.tableIndex + 1;\n\t\tif (nextIndex >= state.doc.children.length) return false;\n\n\t\tconst nextBlock = state.doc.children[nextIndex];\n\t\tif (!nextBlock) return false;\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setSelection(createCollapsedSelection(nextBlock.id, 0))\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t});\n}\n\n/** Shift-F10: open context menu at current cell. */\nfunction handleContextMenu(context: PluginContext): boolean {\n\treturn withTableContext(context, (_state, _sel, tableCtx) => {\n\t\tconst container: HTMLElement = context.getContainer();\n\n\t\t// Find the cell element in the DOM\n\t\tconst cellEl = container.querySelector(\n\t\t\t`[data-block-id=\"${tableCtx.cellId}\"]`,\n\t\t) as HTMLElement | null;\n\t\tif (!cellEl) return false;\n\n\t\tconst cellRect: DOMRect = cellEl.getBoundingClientRect();\n\t\tconst anchorRect: DOMRect = new DOMRect(\n\t\t\tcellRect.left + cellRect.width / 2,\n\t\t\tcellRect.bottom,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\n\t\t// Find the table container to append the menu\n\t\tconst tableContainer = container.querySelector(\n\t\t\t`[data-block-id=\"${tableCtx.tableId}\"].ntbl-container`,\n\t\t) as HTMLElement | null;\n\n\t\tconst menuContainer: HTMLElement = tableContainer ?? container;\n\n\t\tactiveContextMenu?.close();\n\t\tactiveContextMenu = createTableContextMenu(\n\t\t\tmenuContainer,\n\t\t\tcontext,\n\t\t\ttableCtx.tableId,\n\t\t\tanchorRect,\n\t\t\t() => {\n\t\t\t\tactiveContextMenu = null;\n\t\t\t},\n\t\t);\n\n\t\treturn true;\n\t});\n}\n\n// --- Cell navigation helpers ---\n\n/** Moves cursor to the start of a cell (first leaf block inside). */\nfunction moveToCellAndSelect(\n\tcontext: PluginContext,\n\ttableId: BlockId,\n\trowIndex: number,\n\tcolIndex: number,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tconst cellId: BlockId | null = getCellAt(state, tableId, rowIndex, colIndex);\n\tif (!cellId) return false;\n\n\tconst leafId: BlockId = getFirstLeafInCell(state, cellId);\n\tconst tr = state.transaction('command').setSelection(createCollapsedSelection(leafId, 0)).build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Moves cursor to the end of a cell (last leaf block inside, for ArrowLeft). */\nfunction moveToCellAtEnd(\n\tcontext: PluginContext,\n\ttableId: BlockId,\n\trowIndex: number,\n\tcolIndex: number,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tconst cellId: BlockId | null = getCellAt(state, tableId, rowIndex, colIndex);\n\tif (!cellId) return false;\n\n\tconst leafId: BlockId = getLastLeafInCell(state, cellId);\n\tconst leaf = state.getBlock(leafId);\n\tif (!leaf) return false;\n\n\tconst leafLen: number = getBlockLength(leaf);\n\tconst tr = state\n\t\t.transaction('command')\n\t\t.setSelection(createCollapsedSelection(leafId, leafLen))\n\t\t.build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Switches current selection to a table NodeSelection. */\nfunction selectTableNode(context: PluginContext, tableId: BlockId): boolean {\n\tconst state: EditorState = context.getState();\n\tconst path = state.getNodePath(tableId);\n\tif (!path) return false;\n\n\tconst tr = state.transaction('input').setSelection(createNodeSelection(tableId, path)).build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n","/**\n * Pure DOM factory functions for table controls.\n * No state logic — only element creation and CSS class assignment.\n */\n\nimport { setStyleProperties } from '../../style/StyleRuntime.js';\n\n// --- SVG Icons ---\n\nexport const PLUS_SVG: string =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" ' +\n\t'viewBox=\"0 0 12 12\" fill=\"none\">' +\n\t'<path d=\"M6 1v10M1 6h10\" stroke=\"currentColor\" ' +\n\t'stroke-width=\"1.8\" stroke-linecap=\"round\"/></svg>';\n\nexport const DELETE_SVG: string =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" ' +\n\t'viewBox=\"0 0 10 10\" fill=\"none\">' +\n\t'<path d=\"M2 2l6 6M8 2l-6 6\" stroke=\"currentColor\" ' +\n\t'stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>';\n\nexport const TABLE_DELETE_SVG: string =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" ' +\n\t'viewBox=\"0 0 24 24\" fill=\"none\">' +\n\t'<path d=\"M9 3h6m-9 4h12M10 11v6m4-6v6m-9 3h14l-1-13H6L5 20z\" ' +\n\t'stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" ' +\n\t'stroke-linejoin=\"round\"/></svg>';\n\n// --- DOM Factories ---\n\n/** Creates a button with standard table-control setup (mousedown prevention, ARIA). */\nexport function createButton(\n\tclassName: string,\n\tinnerHTML: string,\n\ttitle: string,\n): HTMLButtonElement {\n\tconst btn: HTMLButtonElement = document.createElement('button');\n\tbtn.className = className;\n\tbtn.innerHTML = innerHTML;\n\tbtn.title = title;\n\tbtn.type = 'button';\n\tbtn.setAttribute('aria-label', title);\n\tbtn.setAttribute('contenteditable', 'false');\n\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t});\n\treturn btn;\n}\n\n/** Builds the insert-line element (horizontal or vertical) with a plus-icon button. */\nexport function buildInsertLine(\n\torientation: 'horizontal' | 'vertical',\n\tlabel: string,\n): HTMLDivElement {\n\tconst line: HTMLDivElement = document.createElement('div');\n\tline.className = `ntbl-insert-line ntbl-insert-line--${orientation}`;\n\tline.setAttribute('contenteditable', 'false');\n\tline.setAttribute('data-notectl-no-print', '');\n\n\tconst btn: HTMLButtonElement = createButton('ntbl-insert-btn', PLUS_SVG, label);\n\tline.appendChild(btn);\n\n\treturn line;\n}\n\n/** Builds a zone-button for adding rows or columns at the table edge. */\nexport function buildAddButton(className: string, title: string): HTMLButtonElement {\n\tconst btn: HTMLButtonElement = document.createElement('button');\n\tbtn.className = `ntbl-add-zone ${className}`;\n\tbtn.type = 'button';\n\tbtn.setAttribute('contenteditable', 'false');\n\tbtn.setAttribute('aria-label', title);\n\tbtn.setAttribute('data-notectl-no-print', '');\n\tbtn.title = title;\n\n\tconst icon: HTMLSpanElement = document.createElement('span');\n\ticon.className = 'ntbl-add-icon';\n\ticon.innerHTML = PLUS_SVG;\n\tbtn.appendChild(icon);\n\n\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t});\n\n\treturn btn;\n}\n\n/** Builds a handle-bar container (for column or row handles). */\nexport function buildHandleBar(className: string): HTMLDivElement {\n\tconst bar: HTMLDivElement = document.createElement('div');\n\tbar.className = className;\n\tbar.setAttribute('contenteditable', 'false');\n\tbar.setAttribute('data-notectl-no-print', '');\n\treturn bar;\n}\n\n/** SVG icon for kebab menu (three vertical dots). */\nexport const ACTIONS_SVG: string =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" ' +\n\t'viewBox=\"0 0 24 24\" fill=\"currentColor\">' +\n\t'<circle cx=\"12\" cy=\"5\" r=\"2\"/>' +\n\t'<circle cx=\"12\" cy=\"12\" r=\"2\"/>' +\n\t'<circle cx=\"12\" cy=\"19\" r=\"2\"/></svg>';\n\n/** Builds the table actions button (kebab menu icon). */\nexport function buildActionsButton(label: string): HTMLButtonElement {\n\tconst btn: HTMLButtonElement = createButton('ntbl-actions-btn', ACTIONS_SVG, label);\n\tbtn.setAttribute('data-notectl-no-print', '');\n\treturn btn;\n}\n\n/** Builds the context menu discovery hint shown on first focus. */\nexport function buildContextHint(label: string): HTMLDivElement {\n\tconst hint: HTMLDivElement = document.createElement('div');\n\thint.className = 'ntbl-context-hint';\n\thint.setAttribute('aria-hidden', 'true');\n\thint.setAttribute('contenteditable', 'false');\n\thint.setAttribute('data-notectl-no-print', '');\n\thint.textContent = label;\n\treturn hint;\n}\n\n/** SVG icon for border/grid. */\nexport const BORDER_COLOR_SVG: string =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" ' +\n\t'viewBox=\"0 0 24 24\" fill=\"none\">' +\n\t'<path d=\"M3 3h18v18H3V3zm0 6h18M3 15h18M9 3v18M15 3v18\" ' +\n\t'stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>';\n\n/** Builds the border color button with a color indicator swatch. */\nexport function buildBorderColorButton(label: string, currentColor?: string): HTMLButtonElement {\n\tconst btn: HTMLButtonElement = createButton('ntbl-border-color-btn', BORDER_COLOR_SVG, label);\n\tbtn.setAttribute('data-notectl-no-print', '');\n\n\tconst swatch: HTMLSpanElement = document.createElement('span');\n\tswatch.className = 'ntbl-border-color-swatch';\n\tupdateBorderColorSwatch(swatch, currentColor);\n\tbtn.appendChild(swatch);\n\n\treturn btn;\n}\n\n/** Updates the swatch indicator to reflect the current border color. */\nexport function updateBorderColorSwatch(swatch: HTMLElement, color?: string): void {\n\tif (color === 'none') {\n\t\tsetStyleProperties(swatch, {\n\t\t\tbackgroundColor: 'transparent',\n\t\t\tborder: '1px dashed rgba(128,128,128,0.4)',\n\t\t});\n\t} else if (color) {\n\t\tsetStyleProperties(swatch, {\n\t\t\tbackgroundColor: color,\n\t\t\tborder: '1px solid rgba(0,0,0,0.15)',\n\t\t});\n\t} else {\n\t\tsetStyleProperties(swatch, {\n\t\t\tbackgroundColor: 'var(--notectl-border)',\n\t\t\tborder: '1px solid rgba(0,0,0,0.15)',\n\t\t});\n\t}\n}\n\n/** Builds a single column or row handle with a delete button. */\nexport function buildHandle(\n\tclassName: string,\n\tindex: number,\n\tdeleteLabel: string,\n\tonDelete: (idx: number) => void,\n): HTMLDivElement {\n\tconst handle: HTMLDivElement = document.createElement('div');\n\thandle.className = `ntbl-handle ${className}`;\n\thandle.dataset.index = String(index);\n\n\tconst deleteBtn: HTMLButtonElement = createButton('ntbl-handle-delete', DELETE_SVG, deleteLabel);\n\tdeleteBtn.addEventListener('click', (e: MouseEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tonDelete(index);\n\t});\n\thandle.appendChild(deleteBtn);\n\n\treturn handle;\n}\n","/**\n * Measurement and positioning logic for table controls.\n * All functions are pure (take numeric/DOM inputs, return structured results).\n */\n\nimport { setStyleProperties, setStyleProperty } from '../../style/StyleRuntime.js';\n\n// --- Types ---\n\nexport interface BorderInfo {\n\treadonly position: number;\n\treadonly index: number;\n}\n\nexport interface NearestBorderResult {\n\treadonly type: 'row' | 'col' | 'none';\n\treadonly border: BorderInfo | null;\n}\n\n// --- Constants ---\n\nexport const BORDER_THRESHOLD: number = 10;\n\n// --- Offset ---\n\n/** Returns the table's offset relative to the container (walks offsetParent chain). */\nexport function getTableOffset(\n\ttableEl: HTMLElement,\n\tcontainer: HTMLElement,\n): { top: number; left: number } {\n\tlet top = 0;\n\tlet left = 0;\n\tlet el: HTMLElement | null = tableEl;\n\twhile (el && el !== container) {\n\t\ttop += el.offsetTop;\n\t\tleft += el.offsetLeft;\n\t\tel = el.offsetParent as HTMLElement | null;\n\t}\n\treturn { top, left };\n}\n\n// --- Border Measurement ---\n\n/** Measures the Y-positions of inter-row borders (between adjacent <tr> elements). */\nexport function measureRowBorders(tableEl: HTMLTableElement): BorderInfo[] {\n\tconst trs: NodeListOf<HTMLTableRowElement> = tableEl.querySelectorAll(':scope > tbody > tr');\n\tconst tableTop: number = tableEl.offsetTop;\n\tconst borders: BorderInfo[] = [];\n\n\tfor (let i = 1; i < trs.length; i++) {\n\t\tconst tr: HTMLTableRowElement | undefined = trs[i];\n\t\tif (!tr) continue;\n\t\tborders.push({\n\t\t\tposition: tr.offsetTop - tableTop,\n\t\t\tindex: i,\n\t\t});\n\t}\n\n\treturn borders;\n}\n\n/** Measures the X-positions of inter-column borders (evenly spaced). */\nexport function measureColBorders(tableWidth: number, numCols: number): BorderInfo[] {\n\tif (numCols <= 1) return [];\n\n\tconst colWidth: number = tableWidth / numCols;\n\tconst borders: BorderInfo[] = [];\n\n\tfor (let i = 1; i < numCols; i++) {\n\t\tborders.push({\n\t\t\tposition: Math.round(colWidth * i),\n\t\t\tindex: i,\n\t\t});\n\t}\n\n\treturn borders;\n}\n\n// --- Positioning ---\n\n/** Positions column handles evenly across the table width. */\nexport function positionColHandles(\n\tcolBar: HTMLDivElement,\n\ttableWidth: number,\n\tnumCols: number,\n): void {\n\tconst handles: HTMLCollection = colBar.children;\n\tif (handles.length === 0) return;\n\n\tconst colWidth: number = tableWidth / numCols;\n\n\tfor (let i = 0; i < handles.length; i++) {\n\t\tconst h = handles[i] as HTMLElement;\n\t\tsetStyleProperties(h, {\n\t\t\tleft: `${Math.round(colWidth * i)}px`,\n\t\t\twidth: `${Math.round(colWidth)}px`,\n\t\t});\n\t}\n\n\tsetStyleProperty(colBar, 'width', `${tableWidth}px`);\n}\n\n/** Positions row handles to match actual <tr> offsets and heights. */\nexport function positionRowHandles(rowBar: HTMLDivElement, tableEl: HTMLTableElement): void {\n\tconst handles: HTMLCollection = rowBar.children;\n\tif (handles.length === 0) return;\n\n\tconst trs: NodeListOf<HTMLTableRowElement> = tableEl.querySelectorAll(':scope > tbody > tr');\n\tconst tableTop: number = tableEl.offsetTop;\n\tlet totalHeight = 0;\n\n\tfor (let i = 0; i < handles.length; i++) {\n\t\tconst h = handles[i] as HTMLElement;\n\t\tconst tr: HTMLTableRowElement | undefined = trs[i];\n\t\tif (tr) {\n\t\t\tconst top: number = tr.offsetTop - tableTop;\n\t\t\tconst height: number = tr.offsetHeight;\n\t\t\tsetStyleProperties(h, {\n\t\t\t\ttop: `${top}px`,\n\t\t\t\theight: `${height}px`,\n\t\t\t});\n\t\t\ttotalHeight = top + height;\n\t\t}\n\t}\n\n\tsetStyleProperty(rowBar, 'height', `${totalHeight}px`);\n}\n\n/** Positions add-row and add-column buttons at the table edges. */\nexport function positionAddButtons(\n\taddRowZone: HTMLElement,\n\taddColZone: HTMLElement,\n\ttableEl: HTMLElement,\n\tcontainer: HTMLElement,\n): void {\n\tconst offset = getTableOffset(tableEl, container);\n\tconst tableHeight: number = tableEl.offsetHeight;\n\tconst tableWidth: number = tableEl.offsetWidth;\n\n\tsetStyleProperties(addRowZone, {\n\t\twidth: `${tableWidth}px`,\n\t\tleft: `${offset.left}px`,\n\t});\n\n\tsetStyleProperties(addColZone, {\n\t\theight: `${tableHeight}px`,\n\t\ttop: `${offset.top}px`,\n\t});\n}\n\n// --- Border Detection ---\n\n/**\n * Finds the nearest row or column border to the given mouse position.\n * Returns which border is closest (within threshold), preferring the nearer one.\n */\nexport function findNearestBorder(\n\tx: number,\n\ty: number,\n\trowBorders: readonly BorderInfo[],\n\tcolBorders: readonly BorderInfo[],\n): NearestBorderResult {\n\tlet nearestRowDist: number = Number.POSITIVE_INFINITY;\n\tlet nearestRowBorder: BorderInfo | null = null;\n\n\tfor (const border of rowBorders) {\n\t\tconst dist: number = Math.abs(y - border.position);\n\t\tif (dist < nearestRowDist && dist < BORDER_THRESHOLD) {\n\t\t\tnearestRowDist = dist;\n\t\t\tnearestRowBorder = border;\n\t\t}\n\t}\n\n\tlet nearestColDist: number = Number.POSITIVE_INFINITY;\n\tlet nearestColBorder: BorderInfo | null = null;\n\n\tfor (const border of colBorders) {\n\t\tconst dist: number = Math.abs(x - border.position);\n\t\tif (dist < nearestColDist && dist < BORDER_THRESHOLD) {\n\t\t\tnearestColDist = dist;\n\t\t\tnearestColBorder = border;\n\t\t}\n\t}\n\n\tif (nearestRowBorder && (!nearestColBorder || nearestRowDist <= nearestColDist)) {\n\t\treturn { type: 'row', border: nearestRowBorder };\n\t}\n\n\tif (nearestColBorder) {\n\t\treturn { type: 'col', border: nearestColBorder };\n\t}\n\n\treturn { type: 'none', border: null };\n}\n","/**\n * Interactive table controls orchestrator.\n * Wires DOM elements (from TableControlsDOM) with layout logic (from TableControlsLayout)\n * and shared transaction builders (from TableCommands) to produce the interactive overlay.\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport { getBlockChildren } from '../../model/Document.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport { setStyleProperties } from '../../style/StyleRuntime.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { getTableBorderColor, renderBorderColorPicker } from './TableBorderColor.js';\nimport {\n\tbuildDeleteColumnTransaction,\n\tbuildDeleteRowTransaction,\n\tbuildInsertColumnTransaction,\n\tbuildInsertRowTransaction,\n\tcreateDeleteTableTransaction,\n} from './TableCommands.js';\nimport { type TableContextMenuHandle, createTableContextMenu } from './TableContextMenu.js';\nimport {\n\tTABLE_DELETE_SVG,\n\tbuildActionsButton,\n\tbuildAddButton,\n\tbuildBorderColorButton,\n\tbuildContextHint,\n\tbuildHandle,\n\tbuildHandleBar,\n\tbuildInsertLine,\n\tcreateButton,\n\tupdateBorderColorSwatch,\n} from './TableControlsDOM.js';\nimport {\n\tBORDER_THRESHOLD,\n\ttype BorderInfo,\n\tfindNearestBorder,\n\tgetTableOffset,\n\tmeasureColBorders,\n\tmeasureRowBorders,\n\tpositionAddButtons,\n\tpositionColHandles,\n\tpositionRowHandles,\n} from './TableControlsLayout.js';\nimport { TABLE_LOCALE_EN, type TableLocale } from './TableLocale.js';\n\n// --- Types ---\n\nexport interface TableControlsHandle {\n\tupdate(node: BlockNode): void;\n\tdestroy(): void;\n}\n\n// --- Class ---\n\nclass TableControls implements TableControlsHandle {\n\tprivate tableId: BlockId;\n\tprivate numRows: number;\n\tprivate numCols: number;\n\tprivate activeRowIndex = -1;\n\tprivate activeColIndex = -1;\n\n\tprivate readonly colBar: HTMLDivElement;\n\tprivate readonly rowBar: HTMLDivElement;\n\tprivate readonly insertLineH: HTMLDivElement;\n\tprivate readonly insertLineV: HTMLDivElement;\n\tprivate readonly addRowZone: HTMLButtonElement;\n\tprivate readonly addColZone: HTMLButtonElement;\n\tprivate readonly deleteTableBtn: HTMLButtonElement;\n\tprivate readonly borderColorBtn: HTMLButtonElement | null;\n\tprivate readonly actionsBtn: HTMLButtonElement | null;\n\tprivate readonly contextHint: HTMLDivElement;\n\tprivate readonly observer: ResizeObserver;\n\tprivate borderColorPopup: HTMLDivElement | null = null;\n\tprivate activeContextMenu: TableContextMenuHandle | null = null;\n\n\tprivate readonly container: HTMLElement;\n\tprivate readonly tableEl: HTMLTableElement;\n\tprivate readonly getState: () => EditorState;\n\tprivate readonly dispatchFn: (tr: Transaction) => void;\n\tprivate readonly pluginContext: PluginContext | null;\n\tprivate readonly locale: TableLocale;\n\n\tprivate readonly onMouseMove = (e: MouseEvent): void => {\n\t\tconst tableRect: DOMRect = this.tableEl.getBoundingClientRect();\n\t\tconst x: number = e.clientX - tableRect.left;\n\t\tconst y: number = e.clientY - tableRect.top;\n\n\t\tconst inTable: boolean =\n\t\t\tx >= -BORDER_THRESHOLD &&\n\t\t\tx <= tableRect.width + BORDER_THRESHOLD &&\n\t\t\ty >= -BORDER_THRESHOLD &&\n\t\t\ty <= tableRect.height + BORDER_THRESHOLD;\n\n\t\tif (!inTable) {\n\t\t\tthis.hideInsertLines();\n\t\t\treturn;\n\t\t}\n\n\t\tconst rowBorders: BorderInfo[] = measureRowBorders(this.tableEl);\n\t\tconst colBorders: BorderInfo[] = measureColBorders(this.tableEl.offsetWidth, this.numCols);\n\t\tconst result = findNearestBorder(x, y, rowBorders, colBorders);\n\n\t\tif (result.type === 'row' && result.border) {\n\t\t\tthis.showHorizontalLine(result.border);\n\t\t\tthis.hideVerticalLine();\n\t\t} else if (result.type === 'col' && result.border) {\n\t\t\tthis.showVerticalLine(result.border);\n\t\t\tthis.hideHorizontalLine();\n\t\t} else {\n\t\t\tthis.hideInsertLines();\n\t\t}\n\t};\n\n\tprivate readonly onMouseLeave = (): void => {\n\t\tthis.hideInsertLines();\n\t};\n\n\tconstructor(\n\t\tcontainer: HTMLElement,\n\t\ttableEl: HTMLTableElement,\n\t\tinitialNode: BlockNode,\n\t\tgetState: () => EditorState,\n\t\tdispatch: (tr: Transaction) => void,\n\t\tpluginContext?: PluginContext,\n\t\tlocale: TableLocale = TABLE_LOCALE_EN,\n\t) {\n\t\tthis.container = container;\n\t\tthis.tableEl = tableEl;\n\t\tthis.getState = getState;\n\t\tthis.dispatchFn = dispatch;\n\t\tthis.pluginContext = pluginContext ?? null;\n\t\tthis.locale = locale;\n\n\t\tthis.tableId = initialNode.id;\n\t\tthis.numRows = getBlockChildren(initialNode).length;\n\t\tthis.numCols = this.countCols(initialNode);\n\n\t\t// Create DOM elements\n\t\tthis.colBar = buildHandleBar('ntbl-col-bar');\n\t\tthis.rowBar = buildHandleBar('ntbl-row-bar');\n\t\tthis.insertLineH = buildInsertLine('horizontal', locale.insertRow);\n\t\tthis.insertLineV = buildInsertLine('vertical', locale.insertColumn);\n\t\tthis.addRowZone = buildAddButton('ntbl-add-row', locale.addRow);\n\t\tthis.addColZone = buildAddButton('ntbl-add-col', locale.addColumn);\n\t\tthis.deleteTableBtn = createButton(\n\t\t\t'ntbl-delete-table-btn',\n\t\t\tTABLE_DELETE_SVG,\n\t\t\tlocale.deleteTable,\n\t\t);\n\t\tthis.deleteTableBtn.setAttribute('data-notectl-no-print', '');\n\n\t\t// Border color button and actions button (only when plugin context available)\n\t\tif (pluginContext) {\n\t\t\tconst currentColor: string | undefined = getTableBorderColor(getState(), this.tableId);\n\t\t\tthis.borderColorBtn = buildBorderColorButton(locale.borderColor, currentColor);\n\t\t\tthis.actionsBtn = buildActionsButton(locale.tableActionsHint);\n\t\t} else {\n\t\t\tthis.borderColorBtn = null;\n\t\t\tthis.actionsBtn = null;\n\t\t}\n\n\t\tcontainer.append(\n\t\t\tthis.colBar,\n\t\t\tthis.rowBar,\n\t\t\tthis.insertLineH,\n\t\t\tthis.insertLineV,\n\t\t\tthis.addRowZone,\n\t\t\tthis.addColZone,\n\t\t\tthis.deleteTableBtn,\n\t\t);\n\t\tif (this.borderColorBtn) {\n\t\t\tcontainer.appendChild(this.borderColorBtn);\n\t\t}\n\t\tif (this.actionsBtn) {\n\t\t\tcontainer.appendChild(this.actionsBtn);\n\t\t}\n\n\t\tthis.contextHint = buildContextHint(locale.contextMenuHint);\n\t\tcontainer.appendChild(this.contextHint);\n\n\t\tthis.rebuildColHandles();\n\t\tthis.rebuildRowHandles();\n\t\tthis.bindEventListeners();\n\n\t\tthis.observer = new ResizeObserver(() => {\n\t\t\tthis.positionControls();\n\t\t});\n\t\tthis.observer.observe(tableEl);\n\t\trequestAnimationFrame(() => this.positionControls());\n\t}\n\n\tupdate(node: BlockNode): void {\n\t\tthis.tableId = node.id;\n\t\tconst newRows: number = getBlockChildren(node).length;\n\t\tconst newCols: number = this.countCols(node);\n\n\t\tif (newRows !== this.numRows || newCols !== this.numCols) {\n\t\t\tthis.numRows = newRows;\n\t\t\tthis.numCols = newCols;\n\t\t\tthis.rebuildColHandles();\n\t\t\tthis.rebuildRowHandles();\n\t\t}\n\n\t\t// Update border color swatch\n\t\tif (this.borderColorBtn) {\n\t\t\tconst swatch = this.borderColorBtn.querySelector('.ntbl-border-color-swatch');\n\t\t\tif (swatch) {\n\t\t\t\tconst color: string | undefined = node.attrs?.borderColor as string | undefined;\n\t\t\t\tupdateBorderColorSwatch(swatch as HTMLElement, color);\n\t\t\t}\n\t\t}\n\n\t\trequestAnimationFrame(() => this.positionControls());\n\t}\n\n\tdestroy(): void {\n\t\tthis.activeContextMenu?.destroy();\n\t\tthis.closeBorderColorPopup();\n\t\tthis.observer.disconnect();\n\t\tthis.container.removeEventListener('mousemove', this.onMouseMove);\n\t\tthis.container.removeEventListener('mouseleave', this.onMouseLeave);\n\t\tthis.colBar.remove();\n\t\tthis.rowBar.remove();\n\t\tthis.insertLineH.remove();\n\t\tthis.insertLineV.remove();\n\t\tthis.addRowZone.remove();\n\t\tthis.addColZone.remove();\n\t\tthis.deleteTableBtn.remove();\n\t\tthis.borderColorBtn?.remove();\n\t\tthis.actionsBtn?.remove();\n\t\tthis.contextHint.remove();\n\t}\n\n\tprivate bindEventListeners(): void {\n\t\tconst insertBtnH = this.insertLineH.querySelector('.ntbl-insert-btn') as HTMLButtonElement;\n\t\tconst insertBtnV = this.insertLineV.querySelector('.ntbl-insert-btn') as HTMLButtonElement;\n\n\t\tinsertBtnH.addEventListener('click', () => {\n\t\t\tif (this.activeRowIndex >= 0) {\n\t\t\t\tthis.dispatchTransaction(\n\t\t\t\t\tbuildInsertRowTransaction(this.getState(), this.tableId, this.activeRowIndex),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tinsertBtnV.addEventListener('click', () => {\n\t\t\tif (this.activeColIndex >= 0) {\n\t\t\t\tthis.dispatchTransaction(\n\t\t\t\t\tbuildInsertColumnTransaction(this.getState(), this.tableId, this.activeColIndex),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tthis.addRowZone.addEventListener('click', () => {\n\t\t\tthis.dispatchTransaction(\n\t\t\t\tbuildInsertRowTransaction(this.getState(), this.tableId, this.numRows),\n\t\t\t);\n\t\t});\n\n\t\tthis.addColZone.addEventListener('click', () => {\n\t\t\tthis.dispatchTransaction(\n\t\t\t\tbuildInsertColumnTransaction(this.getState(), this.tableId, this.numCols),\n\t\t\t);\n\t\t});\n\n\t\tthis.deleteTableBtn.addEventListener('click', () => {\n\t\t\tthis.dispatchTransaction(createDeleteTableTransaction(this.getState(), this.tableId));\n\t\t});\n\n\t\tif (this.borderColorBtn && this.pluginContext) {\n\t\t\tconst ctx = this.pluginContext;\n\t\t\tthis.borderColorBtn.addEventListener('click', () => {\n\t\t\t\tthis.toggleBorderColorPopup(ctx);\n\t\t\t});\n\t\t}\n\n\t\tif (this.actionsBtn && this.pluginContext) {\n\t\t\tconst ctx = this.pluginContext;\n\t\t\tthis.actionsBtn.addEventListener('click', () => {\n\t\t\t\tthis.openActionsMenu(ctx);\n\t\t\t});\n\t\t}\n\n\t\tthis.container.addEventListener('mousemove', this.onMouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.onMouseLeave);\n\t}\n\n\tprivate openActionsMenu(context: PluginContext): void {\n\t\tif (this.activeContextMenu?.isOpen()) {\n\t\t\tthis.activeContextMenu.close();\n\t\t\tthis.activeContextMenu = null;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.actionsBtn) return;\n\n\t\tconst rect: DOMRect = this.actionsBtn.getBoundingClientRect();\n\t\tconst anchorRect: DOMRect = new DOMRect(rect.left, rect.bottom + 4, 0, 0);\n\n\t\tthis.activeContextMenu = createTableContextMenu(\n\t\t\tthis.container,\n\t\t\tcontext,\n\t\t\tthis.tableId,\n\t\t\tanchorRect,\n\t\t\t() => {\n\t\t\t\tthis.activeContextMenu = null;\n\t\t\t},\n\t\t\tthis.locale,\n\t\t);\n\t}\n\n\tprivate toggleBorderColorPopup(context: PluginContext): void {\n\t\tif (this.borderColorPopup) {\n\t\t\tthis.closeBorderColorPopup();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.borderColorPopup = document.createElement('div');\n\t\tthis.borderColorPopup.className = 'notectl-table-context-menu';\n\t\tsetStyleProperties(this.borderColorPopup, {\n\t\t\tposition: 'absolute',\n\t\t\ttop: '24px',\n\t\t\tleft: '24px',\n\t\t\tzIndex: '10000',\n\t\t});\n\t\tthis.borderColorPopup.setAttribute('contenteditable', 'false');\n\n\t\trenderBorderColorPicker(\n\t\t\tthis.borderColorPopup,\n\t\t\tcontext,\n\t\t\tthis.tableId,\n\t\t\t() => {\n\t\t\t\tthis.closeBorderColorPopup();\n\t\t\t},\n\t\t\tthis.locale,\n\t\t);\n\n\t\tthis.container.appendChild(this.borderColorPopup);\n\t}\n\n\tprivate closeBorderColorPopup(): void {\n\t\tif (this.borderColorPopup) {\n\t\t\tthis.borderColorPopup.remove();\n\t\t\tthis.borderColorPopup = null;\n\t\t}\n\t}\n\n\tprivate dispatchTransaction(tr: Transaction | null): void {\n\t\tif (tr) this.dispatchFn(tr);\n\t}\n\n\tprivate countCols(node: BlockNode): number {\n\t\tconst rows = getBlockChildren(node);\n\t\treturn rows[0] ? getBlockChildren(rows[0]).length : 0;\n\t}\n\n\tprivate positionControls(): void {\n\t\tpositionColHandles(this.colBar, this.tableEl.offsetWidth, this.numCols);\n\t\tpositionRowHandles(this.rowBar, this.tableEl);\n\t\tpositionAddButtons(this.addRowZone, this.addColZone, this.tableEl, this.container);\n\t}\n\n\tprivate showHorizontalLine(border: BorderInfo): void {\n\t\tthis.activeRowIndex = border.index;\n\t\tconst offset = getTableOffset(this.tableEl, this.container);\n\t\tsetStyleProperties(this.insertLineH, {\n\t\t\ttop: `${offset.top + border.position - 1}px`,\n\t\t\tleft: `${offset.left}px`,\n\t\t\twidth: `${this.tableEl.offsetWidth}px`,\n\t\t});\n\t\tthis.insertLineH.classList.add('ntbl-insert-line--visible');\n\t}\n\n\tprivate showVerticalLine(border: BorderInfo): void {\n\t\tthis.activeColIndex = border.index;\n\t\tconst offset = getTableOffset(this.tableEl, this.container);\n\t\tsetStyleProperties(this.insertLineV, {\n\t\t\tleft: `${offset.left + border.position - 1}px`,\n\t\t\ttop: `${offset.top}px`,\n\t\t\theight: `${this.tableEl.offsetHeight}px`,\n\t\t});\n\t\tthis.insertLineV.classList.add('ntbl-insert-line--visible');\n\t}\n\n\tprivate hideInsertLines(): void {\n\t\tthis.hideHorizontalLine();\n\t\tthis.hideVerticalLine();\n\t}\n\n\tprivate hideHorizontalLine(): void {\n\t\tthis.insertLineH.classList.remove('ntbl-insert-line--visible');\n\t\tthis.activeRowIndex = -1;\n\t}\n\n\tprivate hideVerticalLine(): void {\n\t\tthis.insertLineV.classList.remove('ntbl-insert-line--visible');\n\t\tthis.activeColIndex = -1;\n\t}\n\n\tprivate rebuildColHandles(): void {\n\t\tthis.colBar.innerHTML = '';\n\t\tfor (let i = 0; i < this.numCols; i++) {\n\t\t\tconst handle: HTMLDivElement = buildHandle(\n\t\t\t\t'ntbl-col-handle',\n\t\t\t\ti,\n\t\t\t\tthis.locale.deleteColumn,\n\t\t\t\t(idx: number) => {\n\t\t\t\t\tthis.dispatchTransaction(\n\t\t\t\t\t\tbuildDeleteColumnTransaction(this.getState(), this.tableId, idx),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t);\n\t\t\tthis.colBar.appendChild(handle);\n\t\t}\n\t}\n\n\tprivate rebuildRowHandles(): void {\n\t\tthis.rowBar.innerHTML = '';\n\t\tfor (let i = 0; i < this.numRows; i++) {\n\t\t\tconst handle: HTMLDivElement = buildHandle(\n\t\t\t\t'ntbl-row-handle',\n\t\t\t\ti,\n\t\t\t\tthis.locale.deleteRow,\n\t\t\t\t(idx: number) => {\n\t\t\t\t\tthis.dispatchTransaction(buildDeleteRowTransaction(this.getState(), this.tableId, idx));\n\t\t\t\t},\n\t\t\t);\n\t\t\tthis.rowBar.appendChild(handle);\n\t\t}\n\t}\n}\n\n// --- Factory ---\n\n/** Creates table controls for the given table element. */\nexport function createTableControls(\n\tcontainer: HTMLElement,\n\ttableEl: HTMLTableElement,\n\tinitialNode: BlockNode,\n\tgetState: () => EditorState,\n\tdispatch: (tr: Transaction) => void,\n\tpluginContext?: PluginContext,\n\tlocale?: TableLocale,\n): TableControlsHandle {\n\treturn new TableControls(\n\t\tcontainer,\n\t\ttableEl,\n\t\tinitialNode,\n\t\tgetState,\n\t\tdispatch,\n\t\tpluginContext,\n\t\tlocale,\n\t);\n}\n","/**\n * NodeViewFactories for table, table_row, and table_cell.\n * Provides custom DOM rendering with proper HTML table elements and ARIA.\n * The table NodeView includes interactive controls for row/column management.\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport { getBlockChildren } from '../../model/Document.js';\nimport type { SchemaRegistry } from '../../model/SchemaRegistry.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport { removeStyleProperty, setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { NodeView, NodeViewFactory } from '../../view/NodeView.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { type TableContextMenuHandle, createTableContextMenu } from './TableContextMenu.js';\nimport { type TableControlsHandle, createTableControls } from './TableControls.js';\nimport { TABLE_LOCALE_EN, type TableLocale } from './TableLocale.js';\n\n/**\n * Creates a NodeViewFactory for the table node type.\n * Renders as outer container with controls + table + tbody.\n */\nexport function createTableNodeViewFactory(\n\t_registry: SchemaRegistry,\n\tpluginContext?: PluginContext,\n\tlocale: TableLocale = TABLE_LOCALE_EN,\n): NodeViewFactory {\n\treturn (\n\t\tnode: BlockNode,\n\t\tgetState: () => EditorState,\n\t\tdispatch: (tr: Transaction) => void,\n\t): NodeView => {\n\t\t// Outer container: holds controls + wrapper\n\t\tconst container: HTMLDivElement = document.createElement('div');\n\t\tcontainer.className = 'ntbl-container';\n\t\tcontainer.setAttribute('data-block-id', node.id);\n\t\tcontainer.setAttribute('data-selectable', 'true');\n\n\t\t// Table wrapper: provides overflow scrolling\n\t\tconst wrapper: HTMLDivElement = document.createElement('div');\n\t\twrapper.className = 'notectl-table-wrapper';\n\n\t\tconst table: HTMLTableElement = document.createElement('table');\n\t\ttable.className = 'notectl-table';\n\t\ttable.setAttribute('role', 'table');\n\n\t\tconst rows: readonly BlockNode[] = getBlockChildren(node);\n\t\tconst totalRows: number = rows.length;\n\t\tconst totalCols: number = rows[0] ? getBlockChildren(rows[0]).length : 0;\n\t\ttable.setAttribute('aria-label', locale.tableAriaLabel(totalRows, totalCols));\n\t\ttable.setAttribute('aria-description', locale.tableAriaDescription);\n\n\t\tconst tbody: HTMLTableSectionElement = document.createElement('tbody');\n\t\ttable.appendChild(tbody);\n\t\twrapper.appendChild(table);\n\t\tcontainer.appendChild(wrapper);\n\n\t\t// Apply border color CSS variable from node attrs\n\t\tapplyBorderColor(table, node.attrs?.borderColor as string | undefined);\n\n\t\t// Live region for screen reader announcements\n\t\tconst liveRegion: HTMLDivElement = document.createElement('div');\n\t\tliveRegion.className = 'notectl-sr-only';\n\t\tliveRegion.setAttribute('aria-live', 'polite');\n\t\tliveRegion.setAttribute('aria-atomic', 'true');\n\t\tcontainer.appendChild(liveRegion);\n\n\t\t// Initialize interactive controls\n\t\tconst controls: TableControlsHandle = createTableControls(\n\t\t\tcontainer,\n\t\t\ttable,\n\t\t\tnode,\n\t\t\tgetState,\n\t\t\tdispatch,\n\t\t\tpluginContext,\n\t\t\tlocale,\n\t\t);\n\n\t\t// Context menu on right-click\n\t\tlet activeContextMenu: TableContextMenuHandle | null = null;\n\t\tlet currentTableId = node.id;\n\n\t\tconst onContextMenu = (e: MouseEvent): void => {\n\t\t\tif (!pluginContext) return;\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tactiveContextMenu?.close();\n\n\t\t\tconst rect: DOMRect = new DOMRect(e.clientX, e.clientY, 0, 0);\n\t\t\tactiveContextMenu = createTableContextMenu(\n\t\t\t\tcontainer,\n\t\t\t\tpluginContext,\n\t\t\t\tcurrentTableId,\n\t\t\t\trect,\n\t\t\t\t() => {\n\t\t\t\t\tactiveContextMenu = null;\n\t\t\t\t},\n\t\t\t\tlocale,\n\t\t\t);\n\t\t};\n\t\ttable.addEventListener('contextmenu', onContextMenu);\n\n\t\treturn {\n\t\t\tdom: container,\n\t\t\tcontentDOM: tbody,\n\t\t\tupdate(updatedNode: BlockNode): boolean {\n\t\t\t\tif (updatedNode.type !== 'table') return false;\n\t\t\t\tcurrentTableId = updatedNode.id;\n\t\t\t\tcontainer.setAttribute('data-block-id', updatedNode.id);\n\t\t\t\tcontainer.setAttribute('data-selectable', 'true');\n\t\t\t\tconst updatedRows: readonly BlockNode[] = getBlockChildren(updatedNode);\n\t\t\t\tconst newTotalRows: number = updatedRows.length;\n\t\t\t\tconst newTotalCols: number = updatedRows[0] ? getBlockChildren(updatedRows[0]).length : 0;\n\t\t\t\ttable.setAttribute('aria-label', locale.tableAriaLabel(newTotalRows, newTotalCols));\n\n\t\t\t\t// Update border color CSS variable\n\t\t\t\tapplyBorderColor(table, updatedNode.attrs?.borderColor as string | undefined);\n\n\t\t\t\t// Update controls to reflect new structure\n\t\t\t\tcontrols.update(updatedNode);\n\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tdestroy(): void {\n\t\t\t\tactiveContextMenu?.destroy();\n\t\t\t\ttable.removeEventListener('contextmenu', onContextMenu);\n\t\t\t\tcontrols.destroy();\n\t\t\t},\n\t\t\tselectNode(): void {\n\t\t\t\tcontainer.classList.add('notectl-table--selected');\n\t\t\t},\n\t\t\tdeselectNode(): void {\n\t\t\t\tcontainer.classList.remove('notectl-table--selected');\n\t\t\t},\n\t\t};\n\t};\n}\n\n/** Applies border color CSS variable and borderless class to a table element. */\nfunction applyBorderColor(table: HTMLTableElement, borderColor: string | undefined): void {\n\tif (borderColor === 'none') {\n\t\tsetStyleProperty(table, '--ntbl-border-color', 'transparent');\n\t\ttable.classList.add('notectl-table--borderless');\n\t} else if (borderColor) {\n\t\tsetStyleProperty(table, '--ntbl-border-color', borderColor);\n\t\ttable.classList.remove('notectl-table--borderless');\n\t} else {\n\t\tremoveStyleProperty(table, '--ntbl-border-color');\n\t\ttable.classList.remove('notectl-table--borderless');\n\t}\n}\n\n/**\n * Creates a NodeViewFactory for the table_row node type.\n * Renders as `<tr role=\"row\">`.\n */\nexport function createTableRowNodeViewFactory(_registry: SchemaRegistry): NodeViewFactory {\n\treturn (\n\t\tnode: BlockNode,\n\t\t_getState: () => EditorState,\n\t\t_dispatch: (tr: Transaction) => void,\n\t): NodeView => {\n\t\tconst tr: HTMLTableRowElement = document.createElement('tr');\n\t\ttr.setAttribute('data-block-id', node.id);\n\t\ttr.setAttribute('role', 'row');\n\n\t\treturn {\n\t\t\tdom: tr,\n\t\t\tcontentDOM: tr,\n\t\t\tupdate(updatedNode: BlockNode): boolean {\n\t\t\t\tif (updatedNode.type !== 'table_row') return false;\n\t\t\t\ttr.setAttribute('data-block-id', updatedNode.id);\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tdestroy(): void {\n\t\t\t\t// No cleanup needed\n\t\t\t},\n\t\t};\n\t};\n}\n\n/**\n * Creates a NodeViewFactory for the table_cell node type.\n * Renders as `<td role=\"cell\">` with text content rendered inside.\n */\nexport function createTableCellNodeViewFactory(_registry: SchemaRegistry): NodeViewFactory {\n\treturn (\n\t\tnode: BlockNode,\n\t\t_getState: () => EditorState,\n\t\t_dispatch: (tr: Transaction) => void,\n\t): NodeView => {\n\t\tconst td: HTMLTableCellElement = document.createElement('td');\n\t\ttd.setAttribute('data-block-id', node.id);\n\t\ttd.setAttribute('role', 'cell');\n\n\t\tconst colspan: number = (node.attrs?.colspan as number | undefined) ?? 1;\n\t\tconst rowspan: number = (node.attrs?.rowspan as number | undefined) ?? 1;\n\t\tif (colspan > 1) td.colSpan = colspan;\n\t\tif (rowspan > 1) td.rowSpan = rowspan;\n\n\t\t// Apply alignment from AlignmentPlugin's patched attribute\n\t\tconst align: string | undefined = node.attrs?.align as string | undefined;\n\t\tif (align && align !== 'left') {\n\t\t\tsetStyleProperty(td, 'textAlign', align);\n\t\t}\n\n\t\treturn {\n\t\t\tdom: td,\n\t\t\tcontentDOM: td,\n\t\t\tupdate(updatedNode: BlockNode): boolean {\n\t\t\t\tif (updatedNode.type !== 'table_cell') return false;\n\t\t\t\ttd.setAttribute('data-block-id', updatedNode.id);\n\n\t\t\t\tconst newColspan: number = (updatedNode.attrs?.colspan as number | undefined) ?? 1;\n\t\t\t\tconst newRowspan: number = (updatedNode.attrs?.rowspan as number | undefined) ?? 1;\n\t\t\t\tif (newColspan > 1) {\n\t\t\t\t\ttd.colSpan = newColspan;\n\t\t\t\t} else {\n\t\t\t\t\ttd.removeAttribute('colspan');\n\t\t\t\t}\n\t\t\t\tif (newRowspan > 1) {\n\t\t\t\t\ttd.rowSpan = newRowspan;\n\t\t\t\t} else {\n\t\t\t\t\ttd.removeAttribute('rowspan');\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tdestroy(): void {\n\t\t\t\t// No cleanup needed\n\t\t\t},\n\t\t};\n\t};\n}\n","/**\n * Multi-cell selection service for tables.\n * Tracks selected cell range and provides IDs for bulk formatting.\n */\n\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { ServiceKey } from '../Plugin.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { findTableContext, getCellAt } from './TableHelpers.js';\n\n/** Rectangular range of cells within a table. */\nexport interface CellRange {\n\treadonly tableId: BlockId;\n\treadonly fromRow: number;\n\treadonly fromCol: number;\n\treadonly toRow: number;\n\treadonly toCol: number;\n}\n\n/** Service for managing multi-cell selection. */\nexport interface TableSelectionService {\n\tgetSelectedRange(): CellRange | null;\n\tsetSelectedRange(range: CellRange | null): void;\n\t/** Clears selection state without dispatching a transaction (for use in decorations). */\n\tclearSelectionSilent(): void;\n\tgetSelectedCellIds(): readonly BlockId[];\n\tisSelected(cellId: BlockId): boolean;\n}\n\nexport const TableSelectionServiceKey = new ServiceKey<TableSelectionService>('tableSelection');\n\n/** Creates and registers the TableSelectionService. */\nexport function createTableSelectionService(context: PluginContext): TableSelectionService {\n\tlet selectedRange: CellRange | null = null;\n\tlet cachedCellIds: readonly BlockId[] = [];\n\tlet cachedCellIdSet: Set<BlockId> = new Set();\n\n\tfunction updateCache(): void {\n\t\tif (!selectedRange) {\n\t\t\tcachedCellIds = [];\n\t\t\tcachedCellIdSet = new Set();\n\t\t\treturn;\n\t\t}\n\n\t\tconst state: EditorState = context.getState();\n\t\tconst ids: BlockId[] = [];\n\n\t\tconst minRow: number = Math.min(selectedRange.fromRow, selectedRange.toRow);\n\t\tconst maxRow: number = Math.max(selectedRange.fromRow, selectedRange.toRow);\n\t\tconst minCol: number = Math.min(selectedRange.fromCol, selectedRange.toCol);\n\t\tconst maxCol: number = Math.max(selectedRange.fromCol, selectedRange.toCol);\n\n\t\tfor (let r = minRow; r <= maxRow; r++) {\n\t\t\tfor (let c = minCol; c <= maxCol; c++) {\n\t\t\t\tconst cellId: BlockId | null = getCellAt(state, selectedRange.tableId, r, c);\n\t\t\t\tif (cellId) ids.push(cellId);\n\t\t\t}\n\t\t}\n\n\t\tcachedCellIds = ids;\n\t\tcachedCellIdSet = new Set(ids);\n\t}\n\n\tconst service: TableSelectionService = {\n\t\tgetSelectedRange(): CellRange | null {\n\t\t\treturn selectedRange;\n\t\t},\n\n\t\tsetSelectedRange(range: CellRange | null): void {\n\t\t\tselectedRange = range;\n\t\t\tupdateCache();\n\t\t\tconst state: EditorState = context.getState();\n\t\t\tcontext.dispatch(state.transaction('api').setSelection(state.selection).build());\n\t\t},\n\n\t\tclearSelectionSilent(): void {\n\t\t\tselectedRange = null;\n\t\t\tupdateCache();\n\t\t},\n\n\t\tgetSelectedCellIds(): readonly BlockId[] {\n\t\t\treturn cachedCellIds;\n\t\t},\n\n\t\tisSelected(cellId: BlockId): boolean {\n\t\t\treturn cachedCellIdSet.has(cellId);\n\t\t},\n\t};\n\n\tcontext.registerService(TableSelectionServiceKey, service);\n\treturn service;\n}\n\n/**\n * Installs mouse handlers for multi-cell selection on the editor container.\n * Returns a cleanup function.\n */\nexport function installMouseSelection(\n\tcontext: PluginContext,\n\tservice: TableSelectionService,\n): () => void {\n\tconst container: HTMLElement = context.getContainer();\n\tlet anchorCell: { tableId: BlockId; row: number; col: number } | null = null;\n\tlet isDragging = false;\n\n\tfunction handleMouseDown(e: MouseEvent): void {\n\t\tconst target = e.target as HTMLElement;\n\t\tconst cellEl: HTMLElement | null = target.closest('td[data-block-id]');\n\t\tif (!cellEl) {\n\t\t\tanchorCell = null;\n\t\t\tisDragging = false;\n\t\t\tservice.setSelectedRange(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!e.shiftKey) {\n\t\t\t// Clear any existing multi-cell selection before starting a new anchor\n\t\t\tservice.setSelectedRange(null);\n\t\t\t// Start new selection anchor\n\t\t\tconst state: EditorState = context.getState();\n\t\t\tconst cellId = cellEl.getAttribute('data-block-id') as BlockId;\n\t\t\tconst tableCtx = findTableContext(state, cellId);\n\t\t\tif (!tableCtx) {\n\t\t\t\tanchorCell = null;\n\t\t\t\tisDragging = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tanchorCell = {\n\t\t\t\ttableId: tableCtx.tableId,\n\t\t\t\trow: tableCtx.rowIndex,\n\t\t\t\tcol: tableCtx.colIndex,\n\t\t\t};\n\t\t\tisDragging = true;\n\t\t\t// Don't set range yet — wait for mousemove to avoid interfering with clicks\n\t\t} else if (anchorCell) {\n\t\t\t// Shift-click: extend selection\n\t\t\tconst state: EditorState = context.getState();\n\t\t\tconst cellId = cellEl.getAttribute('data-block-id') as BlockId;\n\t\t\tconst tableCtx = findTableContext(state, cellId);\n\t\t\tif (!tableCtx || tableCtx.tableId !== anchorCell.tableId) {\n\t\t\t\tanchorCell = null;\n\t\t\t\tservice.setSelectedRange(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\t\t\tservice.setSelectedRange({\n\t\t\t\ttableId: anchorCell.tableId,\n\t\t\t\tfromRow: anchorCell.row,\n\t\t\t\tfromCol: anchorCell.col,\n\t\t\t\ttoRow: tableCtx.rowIndex,\n\t\t\t\ttoCol: tableCtx.colIndex,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction handleMouseMove(e: MouseEvent): void {\n\t\tif (!isDragging || !anchorCell) return;\n\n\t\tconst target = e.target as HTMLElement;\n\t\tconst cellEl: HTMLElement | null = target.closest('td[data-block-id]');\n\t\tif (!cellEl) return;\n\n\t\tconst state: EditorState = context.getState();\n\t\tconst cellId = cellEl.getAttribute('data-block-id') as BlockId;\n\t\tconst tableCtx = findTableContext(state, cellId);\n\t\tif (!tableCtx || tableCtx.tableId !== anchorCell.tableId) return;\n\n\t\t// Only set range if we've moved to a different cell\n\t\tif (tableCtx.rowIndex !== anchorCell.row || tableCtx.colIndex !== anchorCell.col) {\n\t\t\te.preventDefault();\n\t\t\tservice.setSelectedRange({\n\t\t\t\ttableId: anchorCell.tableId,\n\t\t\t\tfromRow: anchorCell.row,\n\t\t\t\tfromCol: anchorCell.col,\n\t\t\t\ttoRow: tableCtx.rowIndex,\n\t\t\t\ttoCol: tableCtx.colIndex,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction handleMouseUp(): void {\n\t\tisDragging = false;\n\t}\n\n\tcontainer.addEventListener('mousedown', handleMouseDown);\n\tcontainer.addEventListener('mousemove', handleMouseMove);\n\tdocument.addEventListener('mouseup', handleMouseUp);\n\n\treturn () => {\n\t\tcontainer.removeEventListener('mousedown', handleMouseDown);\n\t\tcontainer.removeEventListener('mousemove', handleMouseMove);\n\t\tdocument.removeEventListener('mouseup', handleMouseUp);\n\t};\n}\n","/**\n * TablePlugin: registers table, table_row, and table_cell node types\n * with NodeSpecs, NodeViews, commands, keyboard navigation, toolbar\n * grid picker, multi-cell selection, and context menu.\n */\n\nimport type { Decoration, DecorationSet } from '../../decorations/Decoration.js';\nimport { node as nodeDecoration } from '../../decorations/Decoration.js';\nimport { DecorationSet as DecorationSetClass } from '../../decorations/Decoration.js';\nimport { TABLE_CSS } from '../../editor/styles/table.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { HTMLExportContext } from '../../model/NodeSpec.js';\nimport { isTextSelection } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isValidHexColor } from '../shared/ColorValidation.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { resetTableBorderColor } from './TableBorderColor.js';\nimport { insertTable, registerTableCommands } from './TableCommands.js';\nimport { isInsideTable } from './TableHelpers.js';\nimport { TABLE_LOCALE_EN, type TableLocale, loadTableLocale } from './TableLocale.js';\nimport { registerTableKeymaps } from './TableNavigation.js';\nimport {\n\tcreateTableCellNodeViewFactory,\n\tcreateTableNodeViewFactory,\n\tcreateTableRowNodeViewFactory,\n} from './TableNodeViews.js';\nimport {\n\ttype TableSelectionService,\n\tcreateTableSelectionService,\n\tinstallMouseSelection,\n} from './TableSelection.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\ttable: { borderColor?: string };\n\t\ttable_row: Record<string, never>;\n\t\ttable_cell: { colspan?: number; rowspan?: number };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface TableConfig {\n\t/** Maximum rows in grid picker. Defaults to 8. */\n\treadonly maxPickerRows?: number;\n\t/** Maximum columns in grid picker. Defaults to 8. */\n\treadonly maxPickerCols?: number;\n\t/** Locale for all user-facing strings. Defaults to English. */\n\treadonly locale?: TableLocale;\n}\n\nconst DEFAULT_CONFIG: TableConfig = {\n\tmaxPickerRows: 8,\n\tmaxPickerCols: 8,\n};\n\n// --- SVG Icon ---\n\nconst TABLE_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">' +\n\t'<path d=\"M3 3h18v18H3V3zm2 2v4h6V5H5zm8 0v4h6V5h-6zm-8 6v4h6v-4H5z' +\n\t'm8 0v4h6v-4h-6zm-8 6v4h6v-4H5zm8 0v4h6v-4h-6z\"/></svg>';\n\n// --- Serialization Constants ---\n\nconst DEFAULT_BORDER_COLOR = '#d0d0d0';\nconst TABLE_BASE_STYLE = 'border-collapse: collapse; width: 100%; table-layout: fixed';\nconst CELL_STYLE = `border: 1px solid var(--ntbl-bc, ${DEFAULT_BORDER_COLOR}); padding: 8px 12px; vertical-align: top`;\n\n// --- Serialization Helpers ---\n\n/** Builds the inline `style` attribute value for the `<table>` element. */\nfunction buildTableStyle(borderColor: string | undefined): string {\n\tif (!borderColor) return TABLE_BASE_STYLE;\n\tif (borderColor === 'none') {\n\t\treturn `${TABLE_BASE_STYLE}; --ntbl-bc: transparent`;\n\t}\n\tif (isValidHexColor(borderColor)) {\n\t\treturn `${TABLE_BASE_STYLE}; --ntbl-bc: ${escapeHTML(borderColor)}`;\n\t}\n\treturn TABLE_BASE_STYLE;\n}\n\n// --- Plugin ---\n\nexport class TablePlugin implements Plugin {\n\treadonly id = 'table';\n\treadonly name = 'Table';\n\treadonly priority = 40;\n\n\tprivate readonly config: TableConfig;\n\tprivate locale!: TableLocale;\n\tprivate selectionService: TableSelectionService | null = null;\n\tprivate cleanupMouseSelection: (() => void) | null = null;\n\tprivate context: PluginContext | null = null;\n\n\tconstructor(config?: Partial<TableConfig>) {\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\tTABLE_LOCALE_EN,\n\t\t\tloadTableLocale,\n\t\t);\n\t\tcontext.registerStyleSheet(TABLE_CSS);\n\t\tthis.context = context;\n\n\t\tthis.registerNodeSpecs(context);\n\t\tthis.registerNodeViews(context);\n\t\tregisterTableCommands(context, this.locale);\n\t\tcontext.registerCommand('resetTableBorderColor', () =>\n\t\t\tresetTableBorderColor(context, this.locale),\n\t\t);\n\t\tregisterTableKeymaps(context, this.locale);\n\t\tthis.registerToolbarItem(context);\n\t\tthis.selectionService = createTableSelectionService(context);\n\t}\n\n\tonReady(): void {\n\t\tif (this.context && this.selectionService) {\n\t\t\tthis.cleanupMouseSelection = installMouseSelection(this.context, this.selectionService);\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tthis.cleanupMouseSelection?.();\n\t\tthis.cleanupMouseSelection = null;\n\t\tthis.selectionService = null;\n\t\tthis.context = null;\n\t}\n\n\tdecorations(state: EditorState): DecorationSet {\n\t\tif (!this.selectionService) return DecorationSetClass.empty;\n\n\t\tconst range = this.selectionService.getSelectedRange();\n\t\tif (!range) return DecorationSetClass.empty;\n\n\t\t// Side effect: clear stale selection when cursor leaves the table.\n\t\t// Uses clearSelectionSilent() (no dispatch) to avoid re-entrancy,\n\t\t// since decorations() runs inside the update cycle.\n\t\tconst sel = state.selection;\n\t\tif (!isTextSelection(sel) || !isInsideTable(state, sel.anchor.blockId)) {\n\t\t\tthis.selectionService.clearSelectionSilent();\n\t\t\treturn DecorationSetClass.empty;\n\t\t}\n\n\t\tconst cellIds: readonly BlockId[] = this.selectionService.getSelectedCellIds();\n\t\tif (cellIds.length === 0) return DecorationSetClass.empty;\n\n\t\tconst decorations: Decoration[] = [];\n\t\tfor (const cellId of cellIds) {\n\t\t\tdecorations.push(nodeDecoration(cellId, { class: 'notectl-table-cell--selected' }));\n\t\t}\n\n\t\treturn DecorationSetClass.create(decorations);\n\t}\n\n\tprivate registerNodeSpecs(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'table',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['table_row'], min: 1 },\n\t\t\tisolating: true,\n\t\t\tselectable: true,\n\t\t\ttoDOM(node) {\n\t\t\t\tconst wrapper: HTMLDivElement = document.createElement('div');\n\t\t\t\twrapper.className = 'notectl-table-wrapper';\n\t\t\t\twrapper.setAttribute('data-block-id', node.id);\n\t\t\t\twrapper.setAttribute('part', 'table');\n\t\t\t\treturn wrapper;\n\t\t\t},\n\t\t\ttoHTML(node, content, ctx?: HTMLExportContext) {\n\t\t\t\tconst borderColor: string | undefined = node.attrs?.borderColor as string | undefined;\n\t\t\t\tconst style: string = buildTableStyle(borderColor);\n\t\t\t\tconst attr: string = ctx?.styleAttr(style) ?? ` style=\"${style}\"`;\n\t\t\t\treturn `<table${attr}>${content}</table>`;\n\t\t\t},\n\t\t\tsanitize: { tags: ['table', 'tbody'] },\n\t\t});\n\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'table_row',\n\t\t\tgroup: 'table_content',\n\t\t\tcontent: { allow: ['table_cell'], min: 1 },\n\t\t\ttoDOM(node) {\n\t\t\t\tconst tr: HTMLTableRowElement = document.createElement('tr');\n\t\t\t\ttr.setAttribute('data-block-id', node.id);\n\t\t\t\ttr.setAttribute('role', 'row');\n\t\t\t\ttr.setAttribute('part', 'table-row');\n\t\t\t\treturn tr;\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<tr>${content}</tr>`;\n\t\t\t},\n\t\t\tsanitize: { tags: ['tr'] },\n\t\t});\n\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'table_cell',\n\t\t\tgroup: 'table_content',\n\t\t\tcontent: {\n\t\t\t\tallow: [\n\t\t\t\t\t'paragraph',\n\t\t\t\t\t'list_item',\n\t\t\t\t\t'heading',\n\t\t\t\t\t'blockquote',\n\t\t\t\t\t'image',\n\t\t\t\t\t'video',\n\t\t\t\t\t'horizontal_rule',\n\t\t\t\t],\n\t\t\t},\n\t\t\tisolating: true,\n\t\t\ttoDOM(node) {\n\t\t\t\tconst td: HTMLTableCellElement = document.createElement('td');\n\t\t\t\ttd.setAttribute('data-block-id', node.id);\n\t\t\t\ttd.setAttribute('role', 'cell');\n\t\t\t\ttd.setAttribute('part', 'table-cell');\n\t\t\t\treturn td;\n\t\t\t},\n\t\t\ttoHTML(node, content, ctx?: HTMLExportContext) {\n\t\t\t\tconst colspan: number = (node.attrs?.colspan as number) ?? 1;\n\t\t\t\tconst rowspan: number = (node.attrs?.rowspan as number) ?? 1;\n\t\t\t\tconst styleAttr: string = ctx?.styleAttr(CELL_STYLE) ?? ` style=\"${CELL_STYLE}\"`;\n\t\t\t\tconst attrs: string[] = [styleAttr];\n\t\t\t\tif (colspan > 1) attrs.push(` colspan=\"${colspan}\"`);\n\t\t\t\tif (rowspan > 1) attrs.push(` rowspan=\"${rowspan}\"`);\n\t\t\t\treturn `<td${attrs.join('')}>${content}</td>`;\n\t\t\t},\n\t\t\tsanitize: { tags: ['td'], attrs: ['colspan', 'rowspan'] },\n\t\t});\n\t}\n\n\tprivate registerNodeViews(context: PluginContext): void {\n\t\tconst registry = context.getSchemaRegistry();\n\n\t\tcontext.registerNodeView('table', createTableNodeViewFactory(registry, context, this.locale));\n\t\tcontext.registerNodeView('table_row', createTableRowNodeViewFactory(registry));\n\t\tcontext.registerNodeView('table_cell', createTableCellNodeViewFactory(registry));\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst maxRows: number = this.config.maxPickerRows ?? 8;\n\t\tconst maxCols: number = this.config.maxPickerCols ?? 8;\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'table',\n\t\t\tgroup: 'insert',\n\t\t\ticon: TABLE_ICON,\n\t\t\tlabel: this.locale.insertTable,\n\t\t\ttooltip: this.locale.insertTable,\n\t\t\tcommand: 'insertTable',\n\t\t\tpopupType: 'gridPicker',\n\t\t\tpopupConfig: {\n\t\t\t\tmaxRows,\n\t\t\t\tmaxCols,\n\t\t\t\tonSelect: (rows: number, cols: number) => {\n\t\t\t\t\tinsertTable(context, rows, cols);\n\t\t\t\t},\n\t\t\t},\n\t\t\tisActive: (state: EditorState) => {\n\t\t\t\tif (!isTextSelection(state.selection)) return false;\n\t\t\t\treturn isInsideTable(state, state.selection.anchor.blockId);\n\t\t\t},\n\t\t});\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,s as o}from"./PluginHelpers-D4quRJ5a.mjs";import{a as r,t}from"./ColorValidation-DAijTjG9.mjs";import{t as a}from"./InlineStyleMarkSpec-4R6DC7ij.mjs";import{t as s}from"./color-picker-C9B2rYw-.mjs";import{a as l,i as c,t as i}from"./ColorPickerPopup-C_74bqid.mjs";var f={label:"Text Color",tooltip:"Text Color",resetLabel:"Default",ariaLabelPrefix:"Text color"},m=/* #__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-Dcl3kgtd.mjs"),"./locales/de.ts":()=>import("./de-DHs9i4af.mjs"),"./locales/es.ts":()=>import("./es-DHxdoEzR.mjs"),"./locales/fr.ts":()=>import("./fr-SbpHNrQ-.mjs"),"./locales/hi.ts":()=>import("./hi-By8YwVIX.mjs"),"./locales/pt.ts":()=>import("./pt-DgfMoLWR.mjs"),"./locales/ru.ts":()=>import("./ru-C-APN_dm.mjs"),"./locales/zh.ts":()=>import("./zh-CYV-db-K.mjs")});async function d(e){return o(m,e,f)}var p=["#000000","#434343","#666666","#999999","#b7b7b7","#cccccc","#d9d9d9","#efefef","#f3f3f3","#ffffff","#980000","#ff0000","#ff9900","#ffff00","#00ff00","#00ffff","#4a86e8","#0000ff","#9900ff","#ff00ff","#e6b8af","#f4cccc","#fce5cd","#fff2cc","#d9ead3","#d0e0e3","#c9daf8","#cfe2f3","#d9d2e9","#ead1dc","#dd7e6b","#ea9999","#f9cb9c","#ffe599","#b6d7a8","#a2c4c9","#a4c2f4","#9fc5e8","#b4a7d6","#d5a6bd","#cc4125","#e06666","#f6b26b","#ffd966","#93c47d","#76a5af","#6d9eeb","#6fa8dc","#8e7cc3","#c27ba0","#a61c00","#cc0000","#e69138","#f1c232","#6aa84f","#45818e","#3c78d8","#3d85c6","#674ea7","#a64d79","#85200c","#990000","#b45f06","#bf9000","#38761d","#134f5c","#1155cc","#0b5394","#351c75","#741b47"],n=class{id="textColor";name="Text Color";priority=23;config;colors;locale;constructor(e){this.config={...e},this.colors=r(e?.colors,p,"TextColorPlugin")}async init(o){this.locale=await e(o,this.config.locale,f,d),o.registerStyleSheet(s),this.registerMarkSpec(o),this.registerCommands(o),this.registerToolbarItem(o)}registerMarkSpec(e){e.registerMarkSpec(a({type:"textColor",rank:5,valueAttr:"color",domStyleProperty:"color",cssProperty:"color",validate:t,validateOnParse:!0}))}registerCommands(e){e.registerCommand("removeTextColor",()=>l(e,e.getState(),"textColor"))}registerToolbarItem(e){const o=['<svg xmlns="http://www.w3.org/2000/svg"',' viewBox="0 0 24 24">','<path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/>','<rect x="3" y="19.5" width="18" height="3"',' rx="0.5" fill="#e53935"/>',"</svg>"].join("");e.registerToolbarItem({id:"textColor",group:"format",icon:o,label:this.locale.label,tooltip:this.locale.tooltip,command:"removeTextColor",popupType:"custom",renderPopup:(e,o,r)=>{i(e,o,{markType:"textColor",colors:this.colors,columns:10,resetLabel:this.locale.resetLabel,resetCommand:"removeTextColor",ariaLabelPrefix:this.locale.ariaLabelPrefix,onClose:r})},isActive:e=>c(e,"textColor")})}};export{f as n,d as r,n as t};
2
+ //# sourceMappingURL=TextColorPlugin-CViEiYZk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextColorPlugin-CViEiYZk.mjs","names":[],"sources":["../../src/plugins/text-color/TextColorLocale.ts","../../src/plugins/text-color/TextColorPalette.ts","../../src/plugins/text-color/TextColorPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the TextColorPlugin. */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface TextColorLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n\treadonly resetLabel: string;\n\treadonly ariaLabelPrefix: string;\n}\n\n// --- Default English Locale ---\n\nexport const TEXT_COLOR_LOCALE_EN: TextColorLocale = {\n\tlabel: 'Text Color',\n\ttooltip: 'Text Color',\n\tresetLabel: 'Default',\n\tariaLabelPrefix: 'Text color',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<TextColorLocale> = import.meta.glob<{\n\tdefault: TextColorLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadTextColorLocale(lang: string): Promise<TextColorLocale> {\n\treturn loadLocaleModule(localeModules, lang, TEXT_COLOR_LOCALE_EN);\n}\n","/**\n * Default text-color palette (Google Docs style: 10 columns x 7 rows).\n * Used by TextColorPlugin when no `colors` override is provided.\n */\nexport const COLOR_PALETTE: readonly string[] = [\n\t// Row 1 — dark\n\t'#000000',\n\t'#434343',\n\t'#666666',\n\t'#999999',\n\t'#b7b7b7',\n\t'#cccccc',\n\t'#d9d9d9',\n\t'#efefef',\n\t'#f3f3f3',\n\t'#ffffff',\n\t// Row 2 — vivid\n\t'#980000',\n\t'#ff0000',\n\t'#ff9900',\n\t'#ffff00',\n\t'#00ff00',\n\t'#00ffff',\n\t'#4a86e8',\n\t'#0000ff',\n\t'#9900ff',\n\t'#ff00ff',\n\t// Row 3 — light 3\n\t'#e6b8af',\n\t'#f4cccc',\n\t'#fce5cd',\n\t'#fff2cc',\n\t'#d9ead3',\n\t'#d0e0e3',\n\t'#c9daf8',\n\t'#cfe2f3',\n\t'#d9d2e9',\n\t'#ead1dc',\n\t// Row 4 — light 2\n\t'#dd7e6b',\n\t'#ea9999',\n\t'#f9cb9c',\n\t'#ffe599',\n\t'#b6d7a8',\n\t'#a2c4c9',\n\t'#a4c2f4',\n\t'#9fc5e8',\n\t'#b4a7d6',\n\t'#d5a6bd',\n\t// Row 5 — light 1\n\t'#cc4125',\n\t'#e06666',\n\t'#f6b26b',\n\t'#ffd966',\n\t'#93c47d',\n\t'#76a5af',\n\t'#6d9eeb',\n\t'#6fa8dc',\n\t'#8e7cc3',\n\t'#c27ba0',\n\t// Row 6 — dark 1\n\t'#a61c00',\n\t'#cc0000',\n\t'#e69138',\n\t'#f1c232',\n\t'#6aa84f',\n\t'#45818e',\n\t'#3c78d8',\n\t'#3d85c6',\n\t'#674ea7',\n\t'#a64d79',\n\t// Row 7 — dark 2\n\t'#85200c',\n\t'#990000',\n\t'#b45f06',\n\t'#bf9000',\n\t'#38761d',\n\t'#134f5c',\n\t'#1155cc',\n\t'#0b5394',\n\t'#351c75',\n\t'#741b47',\n];\n","/**\n * TextColorPlugin: registers a text color mark with attrs,\n * toolbar button with a color picker popup, and removeTextColor command.\n */\n\nimport { COLOR_PICKER_CSS } from '../../editor/styles/color-picker.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isColorMarkActive, removeColorMark } from '../shared/ColorMarkOperations.js';\nimport { renderColorPickerPopup } from '../shared/ColorPickerPopup.js';\nimport { isValidCSSColor, resolveColors } from '../shared/ColorValidation.js';\nimport { createInlineStyleMarkSpec } from '../shared/InlineStyleMarkSpec.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport {\n\tTEXT_COLOR_LOCALE_EN,\n\ttype TextColorLocale,\n\tloadTextColorLocale,\n} from './TextColorLocale.js';\nimport { COLOR_PALETTE } from './TextColorPalette.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\ttextColor: { color: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface TextColorConfig {\n\t/**\n\t * Restricts the color picker to a specific set of hex colors.\n\t * Each value must be a valid hex color code (`#RGB` or `#RRGGBB`).\n\t * Duplicates are removed automatically (case-insensitive).\n\t * When omitted, the full default palette is shown.\n\t */\n\treadonly colors?: readonly string[];\n\treadonly locale?: TextColorLocale;\n}\n\n// --- Plugin ---\n\nexport class TextColorPlugin implements Plugin {\n\treadonly id = 'textColor';\n\treadonly name = 'Text Color';\n\treadonly priority = 23;\n\n\tprivate readonly config: TextColorConfig;\n\tprivate readonly colors: readonly string[];\n\tprivate locale!: TextColorLocale;\n\n\tconstructor(config?: Partial<TextColorConfig>) {\n\t\tthis.config = { ...config };\n\t\tthis.colors = resolveColors(config?.colors, COLOR_PALETTE, 'TextColorPlugin');\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\tTEXT_COLOR_LOCALE_EN,\n\t\t\tloadTextColorLocale,\n\t\t);\n\n\t\tcontext.registerStyleSheet(COLOR_PICKER_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec(\n\t\t\tcreateInlineStyleMarkSpec({\n\t\t\t\ttype: 'textColor',\n\t\t\t\trank: 5,\n\t\t\t\tvalueAttr: 'color',\n\t\t\t\tdomStyleProperty: 'color',\n\t\t\t\tcssProperty: 'color',\n\t\t\t\tvalidate: isValidCSSColor,\n\t\t\t\tvalidateOnParse: true,\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeTextColor', () => {\n\t\t\treturn removeColorMark(context, context.getState(), 'textColor');\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst pathD =\n\t\t\t'M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2z' + 'm-1.38 9L12 5.67 14.38 12H9.62z';\n\t\tconst icon: string = [\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\"',\n\t\t\t' viewBox=\"0 0 24 24\">',\n\t\t\t`<path d=\"${pathD}\"/>`,\n\t\t\t'<rect x=\"3\" y=\"19.5\" width=\"18\" height=\"3\"',\n\t\t\t' rx=\"0.5\" fill=\"#e53935\"/>',\n\t\t\t'</svg>',\n\t\t].join('');\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'textColor',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeTextColor',\n\t\t\tpopupType: 'custom',\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderColorPickerPopup(container, ctx, {\n\t\t\t\t\tmarkType: 'textColor',\n\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\tcolumns: 10,\n\t\t\t\t\tresetLabel: this.locale.resetLabel,\n\t\t\t\t\tresetCommand: 'removeTextColor',\n\t\t\t\t\tariaLabelPrefix: this.locale.ariaLabelPrefix,\n\t\t\t\t\tonClose,\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (state: EditorState) => isColorMarkActive(state, 'textColor'),\n\t\t});\n\t}\n}\n"],"mappings":"sRAeA,IAAa,EAAwC,CACpD,MAAO,aACP,QAAS,aACT,WAAY,UACZ,gBAAiB,cAKZ,iBAAkD,OAAA,OAAA,CAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,qBAAA,kBAAA,IAAA,OAAA,uBAIxD,eAAsB,EAAoB,GACzC,OAAO,EAAiB,EAAe,EAAM,EAC9C,CC1BA,IAAa,EAAmC,CAE/C,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAEA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WCtCY,EAAb,MACC,GAAc,YACd,KAAgB,aAChB,SAAoB,GAEpB,OACA,OACA,OAEA,WAAA,CAAY,GACX,KAAK,OAAS,IAAK,GACnB,KAAK,OAAS,EAAc,GAAQ,OAAQ,EAAe,kBAC5D,CAEA,UAAM,CAAK,GACV,KAAK,aAAe,EACnB,EACA,KAAK,OAAO,OACZ,EACA,GAGD,EAAQ,mBAAmB,GAC3B,KAAK,iBAAiB,GACtB,KAAK,iBAAiB,GACtB,KAAK,oBAAoB,EAC1B,CAEA,gBAAA,CAAyB,GACxB,EAAQ,iBACP,EAA0B,CACzB,KAAM,YACN,KAAM,EACN,UAAW,QACX,iBAAkB,QAClB,YAAa,QACb,SAAU,EACV,iBAAiB,IAGpB,CAEA,gBAAA,CAAyB,GACxB,EAAQ,gBAAgB,kBAAA,IAChB,EAAgB,EAAS,EAAQ,WAAY,aAEtD,CAEA,mBAAA,CAA4B,GAG3B,MAAM,EAAe,CACpB,0CACA,wBACA,gGACA,6CACA,6BACA,UACC,KAAK,IAEP,EAAQ,oBAAoB,CAC3B,GAAI,YACJ,MAAO,SACP,OACA,MAAO,KAAK,OAAO,MACnB,QAAS,KAAK,OAAO,QACrB,QAAS,kBACT,UAAW,SACX,YAAA,CAAc,EAAW,EAAK,KAC7B,EAAuB,EAAW,EAAK,CACtC,SAAU,YACV,OAAQ,KAAK,OACb,QAAS,GACT,WAAY,KAAK,OAAO,WACxB,aAAc,kBACd,gBAAiB,KAAK,OAAO,gBAC7B,aAGF,SAAW,GAAuB,EAAkB,EAAO,cAE7D"}
@@ -0,0 +1,2 @@
1
+ import{h as t,n as e,p as r}from"./Document-r7vLOAGA.mjs";import{t as n}from"./TextDirectionService-OFOU6r_s.mjs";import{n as i,r as o,t as s}from"./DirectionDetection-C7XE0nxW.mjs";function c(t,e,r){const n=t.getNodePath(e.id);if(n)return{type:"setNodeAttr",path:n,attrs:{...e.attrs,dir:r},previousAttrs:e.attrs}}function a(n,i,a,d){const u=i.getBlock(n.blockId);if(!u||!a.has(u.type))return;if("auto"!==o(u)&&r(u)>0)return;const f=t(u),p=e(u,n.offset),l=s(f.slice(0,p)+n.text+f.slice(p));if(!l)return;const h=c(i,u,l);h&&d.push(h)}function d(r,n,i,a){const d=n.getBlock(r.blockId);if(!d||!i.has(d.type))return;const u=o(d);if("auto"===u)return;const f=t(d),p=e(d,r.from),l=e(d,r.to),h=f.slice(0,p)+f.slice(l);if(0===h.length){const t=c(n,d,"auto");return void(t&&a.push(t))}const g=s(h);if(!g||g===u)return;const m=c(n,d,g);m&&a.push(m)}var u={autoDetect:!0,inherit:!0,preserve:!0},f=class{id="text-direction-auto";name="Text Direction Auto-detect";priority=93;dependencies=["text-direction"];config;constructor(t){this.config={...u,...t}}init(e){const r=e.getService(n);if(!r)throw new Error("TextDirectionAutoPlugin requires TextDirectionPlugin to be registered first.");const{directableTypes:o}=r;this.config.preserve&&function(t,e){t.registerMiddleware((t,r,n)=>{let i=!1;const o=t.steps.map(t=>{if("setBlockType"!==t.type)return t;if(!e.has(t.nodeType))return t;const r=t.previousAttrs?.dir;return r&&"auto"!==r?(i=!0,{...t,attrs:{...t.attrs,dir:r}}):t});n(i?{...t,steps:o}:t)},{name:"text-direction:preserve-dir"})}(e,o),this.config.autoDetect&&function(t,e){t.registerMiddleware((t,r,n)=>{const i=function(t){const e=/* @__PURE__ */new Set;for(const r of t)if("setBlockType"===r.type)e.add(r.blockId);else if("setNodeAttr"===r.type){const t=r.path[r.path.length-1];t&&e.add(t)}return e}(t.steps),o=[];for(const s of t.steps)if("insertText"===s.type){if(i.has(s.blockId))continue;a(s,r,e,o)}else if("deleteText"===s.type){if(i.has(s.blockId))continue;d(s,r,e,o)}n(o.length>0?{...t,steps:[...t.steps,...o]}:t)},{name:"text-direction:auto-detect"})}(e,o),this.config.inherit&&function(e,r){e.registerMiddleware((e,n,o)=>{let c=!1;const a=e.steps.map(e=>{if("insertNode"!==e.type)return e;if(!r.has(e.node.type))return e;if("auto"!==String(e.node.attrs?.dir??"auto"))return e;const o=t(e.node);if(o.length>0){const t=s(o);if(t)return c=!0,{...e,node:{...e.node,attrs:{...e.node.attrs,dir:t}}}}const a=i(n,e.parentPath,e.index);return a&&"auto"!==a?(c=!0,{...e,node:{...e.node,attrs:{...e.node.attrs,dir:a}}}):e});o(c?{...e,steps:a}:e)},{name:"text-direction:inherit-dir"})}(e,o)}};export{f as t};
2
+ //# sourceMappingURL=TextDirectionAutoPlugin-CzWJjrvG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextDirectionAutoPlugin-CzWJjrvG.mjs","names":[],"sources":["../../src/plugins/text-direction-auto/TextDirectionAutoMiddleware.ts","../../src/plugins/text-direction-auto/TextDirectionAutoPlugin.ts"],"sourcesContent":["/**\n * Middleware registrations for the TextDirectionAutoPlugin.\n *\n * Three independent middlewares that all operate on the block-level `dir`\n * attribute owned by the {@link TextDirectionPlugin}:\n *\n * - **preserveDir**: keeps `dir` when another plugin replaces a block's\n * attrs (e.g. `setBlockType` paragraph → heading).\n * - **autoDetect**: on `insertText` / `deleteText`, detects direction from\n * the first strong directional character and updates `dir`.\n * - **inheritDir**: on `insertNode`, inherits the new block's `dir` from\n * the nearest sibling (or auto-detects from inserted text content).\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport { blockOffsetToTextOffset, getBlockLength, getBlockText } from '../../model/Document.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Step } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\nimport {\n\tdetectTextDirection,\n\tfindSiblingDirection,\n\tgetBlockDir,\n} from '../text-direction/DirectionDetection.js';\nimport type { TextDirection } from '../text-direction/TextDirectionService.js';\n\nexport function registerPreserveDirMiddleware(\n\tcontext: PluginContext,\n\tdirectableTypes: ReadonlySet<string>,\n): void {\n\tcontext.registerMiddleware(\n\t\t(tr, _state, next) => {\n\t\t\tlet patched = false;\n\n\t\t\tconst patchedSteps = tr.steps.map((step) => {\n\t\t\t\tif (step.type !== 'setBlockType') return step;\n\t\t\t\tif (!directableTypes.has(step.nodeType)) return step;\n\n\t\t\t\tconst prevDir = step.previousAttrs?.dir;\n\t\t\t\tif (!prevDir || prevDir === 'auto') return step;\n\n\t\t\t\tpatched = true;\n\t\t\t\treturn {\n\t\t\t\t\t...step,\n\t\t\t\t\tattrs: { ...step.attrs, dir: prevDir },\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tnext(patched ? { ...tr, steps: patchedSteps } : tr);\n\t\t},\n\t\t{ name: 'text-direction:preserve-dir' },\n\t);\n}\n\nexport function registerAutoDetectMiddleware(\n\tcontext: PluginContext,\n\tdirectableTypes: ReadonlySet<string>,\n): void {\n\tcontext.registerMiddleware(\n\t\t(tr, state, next) => {\n\t\t\tconst attrTouched: ReadonlySet<string> = collectAttrTouchedBlocks(tr.steps);\n\t\t\tconst extraSteps: Step[] = [];\n\n\t\t\tfor (const step of tr.steps) {\n\t\t\t\tif (step.type === 'insertText') {\n\t\t\t\t\tif (attrTouched.has(step.blockId)) continue;\n\t\t\t\t\thandleInsertText(step, state, directableTypes, extraSteps);\n\t\t\t\t} else if (step.type === 'deleteText') {\n\t\t\t\t\tif (attrTouched.has(step.blockId)) continue;\n\t\t\t\t\thandleDeleteText(step, state, directableTypes, extraSteps);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (extraSteps.length > 0) {\n\t\t\t\tnext({ ...tr, steps: [...tr.steps, ...extraSteps] });\n\t\t\t} else {\n\t\t\t\tnext(tr);\n\t\t\t}\n\t\t},\n\t\t{ name: 'text-direction:auto-detect' },\n\t);\n}\n\n/**\n * Collects IDs of blocks whose attrs are already mutated by `setBlockType`\n * or `setNodeAttr` steps in the transaction. The auto-detect pass must skip\n * these blocks: its `setNodeAttr` is built from a pre-transaction snapshot\n * and would clobber freshly written attrs (full-replace step semantics).\n */\nfunction collectAttrTouchedBlocks(steps: readonly Step[]): ReadonlySet<string> {\n\tconst touched: Set<string> = new Set();\n\tfor (const step of steps) {\n\t\tif (step.type === 'setBlockType') {\n\t\t\ttouched.add(step.blockId);\n\t\t} else if (step.type === 'setNodeAttr') {\n\t\t\tconst blockId: string | undefined = step.path[step.path.length - 1];\n\t\t\tif (blockId) touched.add(blockId);\n\t\t}\n\t}\n\treturn touched;\n}\n\nfunction buildDirChangeStep(\n\tstate: EditorState,\n\tblock: BlockNode,\n\tdir: TextDirection | 'auto',\n): Step | undefined {\n\tconst path = state.getNodePath(block.id);\n\tif (!path) return undefined;\n\n\treturn {\n\t\ttype: 'setNodeAttr',\n\t\tpath,\n\t\tattrs: { ...block.attrs, dir },\n\t\tpreviousAttrs: block.attrs,\n\t};\n}\n\nfunction handleInsertText(\n\tstep: Extract<Step, { type: 'insertText' }>,\n\tstate: EditorState,\n\tdirectableTypes: ReadonlySet<string>,\n\textraSteps: Step[],\n): void {\n\tconst block = state.getBlock(step.blockId);\n\tif (!block || !directableTypes.has(block.type)) return;\n\n\tif (getBlockDir(block) !== 'auto' && getBlockLength(block) > 0) return;\n\n\tconst existingText: string = getBlockText(block);\n\tconst textOffset: number = blockOffsetToTextOffset(block, step.offset);\n\tconst textAfter: string =\n\t\texistingText.slice(0, textOffset) + step.text + existingText.slice(textOffset);\n\n\tconst detected: TextDirection | null = detectTextDirection(textAfter);\n\tif (!detected) return;\n\n\tconst dirStep: Step | undefined = buildDirChangeStep(state, block, detected);\n\tif (dirStep) extraSteps.push(dirStep);\n}\n\nfunction handleDeleteText(\n\tstep: Extract<Step, { type: 'deleteText' }>,\n\tstate: EditorState,\n\tdirectableTypes: ReadonlySet<string>,\n\textraSteps: Step[],\n): void {\n\tconst block = state.getBlock(step.blockId);\n\tif (!block || !directableTypes.has(block.type)) return;\n\n\tconst currentDir: TextDirection = getBlockDir(block);\n\tif (currentDir === 'auto') return;\n\n\tconst existingText: string = getBlockText(block);\n\tconst fromText: number = blockOffsetToTextOffset(block, step.from);\n\tconst toText: number = blockOffsetToTextOffset(block, step.to);\n\tconst textAfter: string = existingText.slice(0, fromText) + existingText.slice(toText);\n\n\tif (textAfter.length === 0) {\n\t\tconst dirStep: Step | undefined = buildDirChangeStep(state, block, 'auto');\n\t\tif (dirStep) extraSteps.push(dirStep);\n\t\treturn;\n\t}\n\n\tconst detected: TextDirection | null = detectTextDirection(textAfter);\n\tif (!detected || detected === currentDir) return;\n\n\tconst dirStep: Step | undefined = buildDirChangeStep(state, block, detected);\n\tif (dirStep) extraSteps.push(dirStep);\n}\n\nexport function registerInheritDirMiddleware(\n\tcontext: PluginContext,\n\tdirectableTypes: ReadonlySet<string>,\n): void {\n\tcontext.registerMiddleware(\n\t\t(tr, state, next) => {\n\t\t\tlet patched = false;\n\n\t\t\tconst patchedSteps = tr.steps.map((step) => {\n\t\t\t\tif (step.type !== 'insertNode') return step;\n\t\t\t\tif (!directableTypes.has(step.node.type)) return step;\n\n\t\t\t\tconst newDir: string = String(step.node.attrs?.dir ?? 'auto');\n\t\t\t\tif (newDir !== 'auto') return step;\n\n\t\t\t\tconst nodeText: string = getBlockText(step.node);\n\t\t\t\tif (nodeText.length > 0) {\n\t\t\t\t\tconst detected: TextDirection | null = detectTextDirection(nodeText);\n\t\t\t\t\tif (detected) {\n\t\t\t\t\t\tpatched = true;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...step,\n\t\t\t\t\t\t\tnode: {\n\t\t\t\t\t\t\t\t...step.node,\n\t\t\t\t\t\t\t\tattrs: { ...step.node.attrs, dir: detected },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst siblingDir: string | undefined = findSiblingDirection(\n\t\t\t\t\tstate,\n\t\t\t\t\tstep.parentPath,\n\t\t\t\t\tstep.index,\n\t\t\t\t);\n\t\t\t\tif (!siblingDir || siblingDir === 'auto') return step;\n\n\t\t\t\tpatched = true;\n\t\t\t\treturn {\n\t\t\t\t\t...step,\n\t\t\t\t\tnode: {\n\t\t\t\t\t\t...step.node,\n\t\t\t\t\t\tattrs: { ...step.node.attrs, dir: siblingDir },\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tnext(patched ? { ...tr, steps: patchedSteps } : tr);\n\t\t},\n\t\t{ name: 'text-direction:inherit-dir' },\n\t);\n}\n","/**\n * Text direction auto-detection / inheritance / preservation plugin.\n *\n * Registers three transaction middlewares that keep block-level `dir`\n * attributes in sync with content changes. Strictly requires\n * {@link TextDirectionPlugin} (declared via `dependencies`) — without it,\n * the patched `dir` attribute does not exist on NodeSpecs and the\n * `directableTypes` service is unavailable.\n */\n\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { TEXT_DIRECTION_SERVICE_KEY } from '../text-direction/TextDirectionService.js';\nimport {\n\tregisterAutoDetectMiddleware,\n\tregisterInheritDirMiddleware,\n\tregisterPreserveDirMiddleware,\n} from './TextDirectionAutoMiddleware.js';\n\nexport interface TextDirectionAutoConfig {\n\t/**\n\t * Whether to register the auto-detect middleware (insertText / deleteText).\n\t * @default true\n\t */\n\treadonly autoDetect?: boolean;\n\t/**\n\t * Whether to register the inherit-dir middleware (insertNode).\n\t * @default true\n\t */\n\treadonly inherit?: boolean;\n\t/**\n\t * Whether to register the preserve-dir middleware (setBlockType).\n\t * @default true\n\t */\n\treadonly preserve?: boolean;\n}\n\nconst DEFAULT_CONFIG: Required<TextDirectionAutoConfig> = {\n\tautoDetect: true,\n\tinherit: true,\n\tpreserve: true,\n};\n\nexport class TextDirectionAutoPlugin implements Plugin {\n\treadonly id = 'text-direction-auto';\n\treadonly name = 'Text Direction Auto-detect';\n\treadonly priority = 93;\n\treadonly dependencies = ['text-direction'] as const;\n\n\tprivate readonly config: Required<TextDirectionAutoConfig>;\n\n\tconstructor(config?: TextDirectionAutoConfig) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tconst service = context.getService(TEXT_DIRECTION_SERVICE_KEY);\n\t\tif (!service) {\n\t\t\tthrow new Error(\n\t\t\t\t'TextDirectionAutoPlugin requires TextDirectionPlugin to be registered first.',\n\t\t\t);\n\t\t}\n\n\t\tconst { directableTypes } = service;\n\n\t\tif (this.config.preserve) {\n\t\t\tregisterPreserveDirMiddleware(context, directableTypes);\n\t\t}\n\t\tif (this.config.autoDetect) {\n\t\t\tregisterAutoDetectMiddleware(context, directableTypes);\n\t\t}\n\t\tif (this.config.inherit) {\n\t\t\tregisterInheritDirMiddleware(context, directableTypes);\n\t\t}\n\t}\n}\n"],"mappings":"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"}