@notectl/core 2.1.3 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1476) 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-Uv6EXaH1.mjs +2 -0
  19. package/dist/chunks/CodeBlockPlugin-Uv6EXaH1.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-CyT1Li7_.mjs +2 -0
  27. package/dist/chunks/Commands-CyT1Li7_.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-UA-9tRpY.mjs +2 -0
  45. package/dist/chunks/FormulaPlugin-UA-9tRpY.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-BkgoJkjC.mjs +2 -0
  53. package/dist/chunks/HardBreakPlugin-BkgoJkjC.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-D3QulApr.mjs +2 -0
  63. package/dist/chunks/InlineCodePlugin-D3QulApr.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-Db8ir_z2.mjs +2 -0
  103. package/dist/chunks/SimpleMark-Db8ir_z2.mjs.map +1 -0
  104. package/dist/chunks/SmartPastePlugin-Db1RcNJf.mjs +2 -0
  105. package/dist/chunks/SmartPastePlugin-Db1RcNJf.mjs.map +1 -0
  106. package/dist/chunks/StrikethroughPlugin-Bsg7Ma4I.mjs +2 -0
  107. package/dist/chunks/StrikethroughPlugin-Bsg7Ma4I.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-ChEga-b_.mjs +2 -0
  111. package/dist/chunks/SuperSubPlugin-ChEga-b_.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-Db5SCNOF.mjs +2 -0
  125. package/dist/chunks/TextFormattingPlugin-Db5SCNOF.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--GEBZ2xU.mjs +2 -0
  363. package/dist/chunks/full--GEBZ2xU.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-C5Lblp2i.mjs +2 -0
  529. package/dist/chunks/src-C5Lblp2i.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/AttributedMarkCommands.d.ts.map +1 -1
  585. package/dist/commands/BlockInsertion.d.ts +74 -0
  586. package/dist/commands/BlockInsertion.d.ts.map +1 -1
  587. package/dist/commands/CommandHelpers.d.ts +12 -0
  588. package/dist/commands/CommandHelpers.d.ts.map +1 -1
  589. package/dist/commands/Commands.d.ts.map +1 -1
  590. package/dist/commands/ContainerCommands.d.ts +24 -0
  591. package/dist/commands/ContainerCommands.d.ts.map +1 -0
  592. package/dist/commands/CursorMarks.d.ts +13 -0
  593. package/dist/commands/CursorMarks.d.ts.map +1 -0
  594. package/dist/commands/GapCursorCommands.d.ts.map +1 -1
  595. package/dist/commands/MarkCommands.d.ts.map +1 -1
  596. package/dist/commands/NodeSelectionCommands.d.ts +10 -2
  597. package/dist/commands/NodeSelectionCommands.d.ts.map +1 -1
  598. package/dist/commands/PasteCommand.d.ts.map +1 -1
  599. package/dist/commands/SelectionDeletion.d.ts +25 -0
  600. package/dist/commands/SelectionDeletion.d.ts.map +1 -0
  601. package/dist/editor/ContentSerializer.d.ts +1 -1
  602. package/dist/editor/ContentSerializer.d.ts.map +1 -1
  603. package/dist/editor/NotectlEditor.d.ts +10 -5
  604. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  605. package/dist/editor/styles/list.d.ts +1 -1
  606. package/dist/editor/styles/list.d.ts.map +1 -1
  607. package/dist/fonts.d.ts +11 -0
  608. package/dist/fonts.d.ts.map +1 -1
  609. package/dist/fonts.mjs +1 -1
  610. package/dist/full.d.ts +2 -0
  611. package/dist/full.d.ts.map +1 -1
  612. package/dist/full.mjs +1 -1
  613. package/dist/html.d.ts +1 -1
  614. package/dist/html.d.ts.map +1 -1
  615. package/dist/html.mjs +1 -1
  616. package/dist/index.d.ts +1 -1
  617. package/dist/index.d.ts.map +1 -1
  618. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  619. package/dist/input/HTMLParser.d.ts +3 -0
  620. package/dist/input/HTMLParser.d.ts.map +1 -1
  621. package/dist/input/KeyDescriptor.d.ts +40 -0
  622. package/dist/input/KeyDescriptor.d.ts.map +1 -0
  623. package/dist/input/KeyboardHandler.d.ts +17 -5
  624. package/dist/input/KeyboardHandler.d.ts.map +1 -1
  625. package/dist/input/PasteHTMLHandler.d.ts +1 -1
  626. package/dist/input/PasteHTMLHandler.d.ts.map +1 -1
  627. package/dist/input/PasteRichBlockHandler.d.ts +23 -4
  628. package/dist/input/PasteRichBlockHandler.d.ts.map +1 -1
  629. package/dist/input/SelectionDocument.d.ts.map +1 -1
  630. package/dist/model/ContentSlice.d.ts +6 -7
  631. package/dist/model/ContentSlice.d.ts.map +1 -1
  632. package/dist/model/Document.d.ts +36 -2
  633. package/dist/model/Document.d.ts.map +1 -1
  634. package/dist/model/GraphemeUtils.d.ts +8 -2
  635. package/dist/model/GraphemeUtils.d.ts.map +1 -1
  636. package/dist/model/MarkSpec.d.ts +6 -0
  637. package/dist/model/MarkSpec.d.ts.map +1 -1
  638. package/dist/model/NodeResolver.d.ts +11 -0
  639. package/dist/model/NodeResolver.d.ts.map +1 -1
  640. package/dist/model/Schema.d.ts +6 -0
  641. package/dist/model/Schema.d.ts.map +1 -1
  642. package/dist/model/SchemaRegistry.d.ts.map +1 -1
  643. package/dist/notectl-core.mjs +1 -1
  644. package/dist/notectl-core.umd.js +1 -1
  645. package/dist/notectl-core.umd.js.map +1 -1
  646. package/dist/plugins/PluginContextFactory.d.ts.map +1 -1
  647. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
  648. package/dist/plugins/alignment.mjs +1 -1
  649. package/dist/plugins/bidi-isolation/BidiIsolationPlugin.d.ts.map +1 -1
  650. package/dist/plugins/bidi-isolation.mjs +1 -1
  651. package/dist/plugins/blockquote/BlockquoteKeyboardHandlers.d.ts +1 -1
  652. package/dist/plugins/blockquote/BlockquoteKeyboardHandlers.d.ts.map +1 -1
  653. package/dist/plugins/blockquote/BlockquotePlugin.d.ts +13 -3
  654. package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -1
  655. package/dist/plugins/blockquote.mjs +1 -1
  656. package/dist/plugins/caret-navigation.mjs +1 -1
  657. package/dist/plugins/code-block/AutoPairController.d.ts +50 -0
  658. package/dist/plugins/code-block/AutoPairController.d.ts.map +1 -0
  659. package/dist/plugins/code-block/CodeBlockDecorations.d.ts +16 -0
  660. package/dist/plugins/code-block/CodeBlockDecorations.d.ts.map +1 -0
  661. package/dist/plugins/code-block/CodeBlockHighlighting.d.ts +10 -0
  662. package/dist/plugins/code-block/CodeBlockHighlighting.d.ts.map +1 -0
  663. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -1
  664. package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -1
  665. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +1 -35
  666. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  667. package/dist/plugins/code-block/CodeBlockSchema.d.ts +11 -0
  668. package/dist/plugins/code-block/CodeBlockSchema.d.ts.map +1 -0
  669. package/dist/plugins/code-block/TokenCache.d.ts +21 -0
  670. package/dist/plugins/code-block/TokenCache.d.ts.map +1 -0
  671. package/dist/plugins/code-block.mjs +1 -1
  672. package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
  673. package/dist/plugins/font-size/FontSizeOperations.d.ts +7 -3
  674. package/dist/plugins/font-size/FontSizeOperations.d.ts.map +1 -1
  675. package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
  676. package/dist/plugins/font-size.mjs +1 -1
  677. package/dist/plugins/font.mjs +1 -1
  678. package/dist/plugins/formula/DisplayMathNodeSpec.d.ts +5 -0
  679. package/dist/plugins/formula/DisplayMathNodeSpec.d.ts.map +1 -0
  680. package/dist/plugins/formula/DisplayMathNodeView.d.ts +12 -0
  681. package/dist/plugins/formula/DisplayMathNodeView.d.ts.map +1 -0
  682. package/dist/plugins/formula/FormulaCommands.d.ts +49 -0
  683. package/dist/plugins/formula/FormulaCommands.d.ts.map +1 -0
  684. package/dist/plugins/formula/FormulaEditTrigger.d.ts +12 -0
  685. package/dist/plugins/formula/FormulaEditTrigger.d.ts.map +1 -0
  686. package/dist/plugins/formula/FormulaEditorMount.d.ts +19 -0
  687. package/dist/plugins/formula/FormulaEditorMount.d.ts.map +1 -0
  688. package/dist/plugins/formula/FormulaInputRules.d.ts +4 -0
  689. package/dist/plugins/formula/FormulaInputRules.d.ts.map +1 -0
  690. package/dist/plugins/formula/FormulaLocale.d.ts +51 -0
  691. package/dist/plugins/formula/FormulaLocale.d.ts.map +1 -0
  692. package/dist/plugins/formula/FormulaOverlay.d.ts +38 -0
  693. package/dist/plugins/formula/FormulaOverlay.d.ts.map +1 -0
  694. package/dist/plugins/formula/FormulaPasteInterceptor.d.ts +19 -0
  695. package/dist/plugins/formula/FormulaPasteInterceptor.d.ts.map +1 -0
  696. package/dist/plugins/formula/FormulaPlugin.d.ts +22 -0
  697. package/dist/plugins/formula/FormulaPlugin.d.ts.map +1 -0
  698. package/dist/plugins/formula/FormulaRendering.d.ts +18 -0
  699. package/dist/plugins/formula/FormulaRendering.d.ts.map +1 -0
  700. package/dist/plugins/formula/FormulaSerialization.d.ts +17 -0
  701. package/dist/plugins/formula/FormulaSerialization.d.ts.map +1 -0
  702. package/dist/plugins/formula/FormulaStyles.d.ts +12 -0
  703. package/dist/plugins/formula/FormulaStyles.d.ts.map +1 -0
  704. package/dist/plugins/formula/FormulaToolbar.d.ts +5 -0
  705. package/dist/plugins/formula/FormulaToolbar.d.ts.map +1 -0
  706. package/dist/plugins/formula/FormulaTypes.d.ts +64 -0
  707. package/dist/plugins/formula/FormulaTypes.d.ts.map +1 -0
  708. package/dist/plugins/formula/InlineMathNodeSpec.d.ts +5 -0
  709. package/dist/plugins/formula/InlineMathNodeSpec.d.ts.map +1 -0
  710. package/dist/plugins/formula/MathFont.d.ts +4 -0
  711. package/dist/plugins/formula/MathFont.d.ts.map +1 -0
  712. package/dist/plugins/formula/MathFontFace.d.ts +4 -0
  713. package/dist/plugins/formula/MathFontFace.d.ts.map +1 -0
  714. package/dist/plugins/formula/index.d.ts +14 -0
  715. package/dist/plugins/formula/index.d.ts.map +1 -0
  716. package/dist/plugins/formula/latex/LatexParser.d.ts +8 -0
  717. package/dist/plugins/formula/latex/LatexParser.d.ts.map +1 -0
  718. package/dist/plugins/formula/latex/LatexParserTypes.d.ts +61 -0
  719. package/dist/plugins/formula/latex/LatexParserTypes.d.ts.map +1 -0
  720. package/dist/plugins/formula/latex/LatexSymbols.d.ts +87 -0
  721. package/dist/plugins/formula/latex/LatexSymbols.d.ts.map +1 -0
  722. package/dist/plugins/formula/latex/LatexToMathML.d.ts +33 -0
  723. package/dist/plugins/formula/latex/LatexToMathML.d.ts.map +1 -0
  724. package/dist/plugins/formula/latex/LatexTokenizer.d.ts +45 -0
  725. package/dist/plugins/formula/latex/LatexTokenizer.d.ts.map +1 -0
  726. package/dist/plugins/formula/latex/MathAlphabet.d.ts +42 -0
  727. package/dist/plugins/formula/latex/MathAlphabet.d.ts.map +1 -0
  728. package/dist/plugins/formula/latex/handlers/Accents.d.ts +6 -0
  729. package/dist/plugins/formula/latex/handlers/Accents.d.ts.map +1 -0
  730. package/dist/plugins/formula/latex/handlers/Delimiters.d.ts +12 -0
  731. package/dist/plugins/formula/latex/handlers/Delimiters.d.ts.map +1 -0
  732. package/dist/plugins/formula/latex/handlers/Environments.d.ts +9 -0
  733. package/dist/plugins/formula/latex/handlers/Environments.d.ts.map +1 -0
  734. package/dist/plugins/formula/latex/handlers/Fonts.d.ts +6 -0
  735. package/dist/plugins/formula/latex/handlers/Fonts.d.ts.map +1 -0
  736. package/dist/plugins/formula/latex/handlers/Spacing.d.ts +13 -0
  737. package/dist/plugins/formula/latex/handlers/Spacing.d.ts.map +1 -0
  738. package/dist/plugins/formula/latex/handlers/Structures.d.ts +19 -0
  739. package/dist/plugins/formula/latex/handlers/Structures.d.ts.map +1 -0
  740. package/dist/plugins/formula/latex/index.d.ts +11 -0
  741. package/dist/plugins/formula/latex/index.d.ts.map +1 -0
  742. package/dist/plugins/formula/locales/ar.d.ts +4 -0
  743. package/dist/plugins/formula/locales/ar.d.ts.map +1 -0
  744. package/dist/plugins/formula/locales/de.d.ts +4 -0
  745. package/dist/plugins/formula/locales/de.d.ts.map +1 -0
  746. package/dist/plugins/formula/locales/es.d.ts +4 -0
  747. package/dist/plugins/formula/locales/es.d.ts.map +1 -0
  748. package/dist/plugins/formula/locales/fr.d.ts +4 -0
  749. package/dist/plugins/formula/locales/fr.d.ts.map +1 -0
  750. package/dist/plugins/formula/locales/hi.d.ts +4 -0
  751. package/dist/plugins/formula/locales/hi.d.ts.map +1 -0
  752. package/dist/plugins/formula/locales/pt.d.ts +4 -0
  753. package/dist/plugins/formula/locales/pt.d.ts.map +1 -0
  754. package/dist/plugins/formula/locales/ru.d.ts +4 -0
  755. package/dist/plugins/formula/locales/ru.d.ts.map +1 -0
  756. package/dist/plugins/formula/locales/zh.d.ts +4 -0
  757. package/dist/plugins/formula/locales/zh.d.ts.map +1 -0
  758. package/dist/plugins/formula/math-field/MathField.d.ts +45 -0
  759. package/dist/plugins/formula/math-field/MathField.d.ts.map +1 -0
  760. package/dist/plugins/formula/math-field/MathFieldTypes.d.ts +73 -0
  761. package/dist/plugins/formula/math-field/MathFieldTypes.d.ts.map +1 -0
  762. package/dist/plugins/formula/math-field/MathPalette.d.ts +16 -0
  763. package/dist/plugins/formula/math-field/MathPalette.d.ts.map +1 -0
  764. package/dist/plugins/formula/math-field/MathPaletteData.d.ts +21 -0
  765. package/dist/plugins/formula/math-field/MathPaletteData.d.ts.map +1 -0
  766. package/dist/plugins/formula/math-field/index.d.ts +9 -0
  767. package/dist/plugins/formula/math-field/index.d.ts.map +1 -0
  768. package/dist/plugins/formula/mathml/MathMLBuilder.d.ts +58 -0
  769. package/dist/plugins/formula/mathml/MathMLBuilder.d.ts.map +1 -0
  770. package/dist/plugins/formula/mathml/MathMLDocument.d.ts +67 -0
  771. package/dist/plugins/formula/mathml/MathMLDocument.d.ts.map +1 -0
  772. package/dist/plugins/formula/mathml/MathMLSanitize.d.ts +15 -0
  773. package/dist/plugins/formula/mathml/MathMLSanitize.d.ts.map +1 -0
  774. package/dist/plugins/formula/mathml/index.d.ts +8 -0
  775. package/dist/plugins/formula/mathml/index.d.ts.map +1 -0
  776. package/dist/plugins/formula.mjs +1 -0
  777. package/dist/plugins/gap-cursor.mjs +1 -1
  778. package/dist/plugins/hard-break.mjs +1 -1
  779. package/dist/plugins/heading.mjs +1 -1
  780. package/dist/plugins/highlight/HighlightPalette.d.ts +7 -0
  781. package/dist/plugins/highlight/HighlightPalette.d.ts.map +1 -0
  782. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  783. package/dist/plugins/highlight.mjs +1 -1
  784. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
  785. package/dist/plugins/horizontal-rule.mjs +1 -1
  786. package/dist/plugins/image/ImageCommands.d.ts.map +1 -1
  787. package/dist/plugins/image/ImageNodeView.d.ts.map +1 -1
  788. package/dist/plugins/image.mjs +1 -1
  789. package/dist/plugins/inline-code/InlineCodePlugin.d.ts +1 -4
  790. package/dist/plugins/inline-code/InlineCodePlugin.d.ts.map +1 -1
  791. package/dist/plugins/inline-code.mjs +1 -1
  792. package/dist/plugins/language.mjs +1 -1
  793. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  794. package/dist/plugins/link.mjs +1 -1
  795. package/dist/plugins/list/ListCommands.d.ts +16 -3
  796. package/dist/plugins/list/ListCommands.d.ts.map +1 -1
  797. package/dist/plugins/list/ListLocale.d.ts +6 -0
  798. package/dist/plugins/list/ListLocale.d.ts.map +1 -1
  799. package/dist/plugins/list/ListMarker.d.ts +14 -0
  800. package/dist/plugins/list/ListMarker.d.ts.map +1 -0
  801. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  802. package/dist/plugins/list/locales/ar.d.ts.map +1 -1
  803. package/dist/plugins/list/locales/de.d.ts.map +1 -1
  804. package/dist/plugins/list/locales/es.d.ts.map +1 -1
  805. package/dist/plugins/list/locales/fr.d.ts.map +1 -1
  806. package/dist/plugins/list/locales/hi.d.ts.map +1 -1
  807. package/dist/plugins/list/locales/pt.d.ts.map +1 -1
  808. package/dist/plugins/list/locales/ru.d.ts.map +1 -1
  809. package/dist/plugins/list/locales/zh.d.ts.map +1 -1
  810. package/dist/plugins/list.mjs +1 -1
  811. package/dist/plugins/print.mjs +1 -1
  812. package/dist/plugins/shared/InlineStyleMarkSpec.d.ts +22 -0
  813. package/dist/plugins/shared/InlineStyleMarkSpec.d.ts.map +1 -0
  814. package/dist/plugins/shared/NodeSpecPatching.d.ts +16 -0
  815. package/dist/plugins/shared/NodeSpecPatching.d.ts.map +1 -0
  816. package/dist/plugins/shared/PluginHelpers.d.ts +8 -0
  817. package/dist/plugins/shared/PluginHelpers.d.ts.map +1 -1
  818. package/dist/plugins/shared/PopupManager.d.ts.map +1 -1
  819. package/dist/plugins/shared/PopupPositioning.d.ts +20 -0
  820. package/dist/plugins/shared/PopupPositioning.d.ts.map +1 -1
  821. package/dist/plugins/shared/SimpleMark.d.ts +22 -0
  822. package/dist/plugins/shared/SimpleMark.d.ts.map +1 -0
  823. package/dist/plugins/shared.mjs +1 -1
  824. package/dist/plugins/smart-paste.mjs +1 -1
  825. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts +0 -4
  826. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -1
  827. package/dist/plugins/strikethrough.mjs +1 -1
  828. package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -1
  829. package/dist/plugins/super-sub.mjs +1 -1
  830. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  831. package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
  832. package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
  833. package/dist/plugins/table.mjs +1 -1
  834. package/dist/plugins/text-color/TextColorPalette.d.ts +6 -0
  835. package/dist/plugins/text-color/TextColorPalette.d.ts.map +1 -0
  836. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  837. package/dist/plugins/text-color.mjs +1 -1
  838. package/dist/plugins/text-direction/TextDirectionPlugin.d.ts.map +1 -1
  839. package/dist/plugins/text-direction-auto.mjs +1 -1
  840. package/dist/plugins/text-direction.mjs +1 -1
  841. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -1
  842. package/dist/plugins/text-formatting.mjs +1 -1
  843. package/dist/plugins/toolbar/ToolbarPopupController.d.ts.map +1 -1
  844. package/dist/plugins/toolbar.mjs +1 -1
  845. package/dist/plugins/video/VideoCommands.d.ts +62 -0
  846. package/dist/plugins/video/VideoCommands.d.ts.map +1 -0
  847. package/dist/plugins/video/VideoEditOverlay.d.ts +30 -0
  848. package/dist/plugins/video/VideoEditOverlay.d.ts.map +1 -0
  849. package/dist/plugins/video/VideoEmbedPrompt.d.ts +18 -0
  850. package/dist/plugins/video/VideoEmbedPrompt.d.ts.map +1 -0
  851. package/dist/plugins/video/VideoFacade.d.ts +46 -0
  852. package/dist/plugins/video/VideoFacade.d.ts.map +1 -0
  853. package/dist/plugins/video/VideoLocale.d.ts +53 -0
  854. package/dist/plugins/video/VideoLocale.d.ts.map +1 -0
  855. package/dist/plugins/video/VideoNodeSpec.d.ts +24 -0
  856. package/dist/plugins/video/VideoNodeSpec.d.ts.map +1 -0
  857. package/dist/plugins/video/VideoNodeView.d.ts +16 -0
  858. package/dist/plugins/video/VideoNodeView.d.ts.map +1 -0
  859. package/dist/plugins/video/VideoPasteInterceptor.d.ts +9 -0
  860. package/dist/plugins/video/VideoPasteInterceptor.d.ts.map +1 -0
  861. package/dist/plugins/video/VideoPlugin.d.ts +31 -0
  862. package/dist/plugins/video/VideoPlugin.d.ts.map +1 -0
  863. package/dist/plugins/video/VideoPopup.d.ts +28 -0
  864. package/dist/plugins/video/VideoPopup.d.ts.map +1 -0
  865. package/dist/plugins/video/VideoPopupStyles.d.ts +3 -0
  866. package/dist/plugins/video/VideoPopupStyles.d.ts.map +1 -0
  867. package/dist/plugins/video/VideoProviders.d.ts +98 -0
  868. package/dist/plugins/video/VideoProviders.d.ts.map +1 -0
  869. package/dist/plugins/video/VideoResize.d.ts +35 -0
  870. package/dist/plugins/video/VideoResize.d.ts.map +1 -0
  871. package/dist/plugins/video/VideoSanitizeHook.d.ts +23 -0
  872. package/dist/plugins/video/VideoSanitizeHook.d.ts.map +1 -0
  873. package/dist/plugins/video/VideoSelectionToolbar.d.ts +20 -0
  874. package/dist/plugins/video/VideoSelectionToolbar.d.ts.map +1 -0
  875. package/dist/plugins/video/VideoStyles.d.ts +3 -0
  876. package/dist/plugins/video/VideoStyles.d.ts.map +1 -0
  877. package/dist/plugins/video/VideoTypes.d.ts +102 -0
  878. package/dist/plugins/video/VideoTypes.d.ts.map +1 -0
  879. package/dist/plugins/video/VideoViewHelpers.d.ts +13 -0
  880. package/dist/plugins/video/VideoViewHelpers.d.ts.map +1 -0
  881. package/dist/plugins/video/index.d.ts +6 -0
  882. package/dist/plugins/video/index.d.ts.map +1 -0
  883. package/dist/plugins/video/locales/ar.d.ts +4 -0
  884. package/dist/plugins/video/locales/ar.d.ts.map +1 -0
  885. package/dist/plugins/video/locales/de.d.ts +4 -0
  886. package/dist/plugins/video/locales/de.d.ts.map +1 -0
  887. package/dist/plugins/video/locales/es.d.ts +4 -0
  888. package/dist/plugins/video/locales/es.d.ts.map +1 -0
  889. package/dist/plugins/video/locales/fr.d.ts +4 -0
  890. package/dist/plugins/video/locales/fr.d.ts.map +1 -0
  891. package/dist/plugins/video/locales/hi.d.ts +4 -0
  892. package/dist/plugins/video/locales/hi.d.ts.map +1 -0
  893. package/dist/plugins/video/locales/pt.d.ts +4 -0
  894. package/dist/plugins/video/locales/pt.d.ts.map +1 -0
  895. package/dist/plugins/video/locales/ru.d.ts +4 -0
  896. package/dist/plugins/video/locales/ru.d.ts.map +1 -0
  897. package/dist/plugins/video/locales/zh.d.ts +4 -0
  898. package/dist/plugins/video/locales/zh.d.ts.map +1 -0
  899. package/dist/plugins/video.mjs +1 -0
  900. package/dist/presets/FullPreset.d.ts +1 -1
  901. package/dist/presets/FullPreset.d.ts.map +1 -1
  902. package/dist/presets/PresetTypes.d.ts +4 -0
  903. package/dist/presets/PresetTypes.d.ts.map +1 -1
  904. package/dist/presets/full.mjs +1 -1
  905. package/dist/presets/minimal.mjs +1 -1
  906. package/dist/presets.mjs +1 -1
  907. package/dist/serialization/CSSClassCollector.d.ts.map +1 -1
  908. package/dist/serialization/ContentHTMLTypes.d.ts +19 -1
  909. package/dist/serialization/ContentHTMLTypes.d.ts.map +1 -1
  910. package/dist/serialization/DocumentParser.d.ts.map +1 -1
  911. package/dist/serialization/DocumentSerializer.d.ts +3 -3
  912. package/dist/serialization/DocumentSerializer.d.ts.map +1 -1
  913. package/dist/serialization/HTMLWhitespace.d.ts +22 -0
  914. package/dist/serialization/HTMLWhitespace.d.ts.map +1 -0
  915. package/dist/serialization/MarkSerializer.d.ts.map +1 -1
  916. package/dist/serialization/index.d.ts +1 -1
  917. package/dist/serialization/index.d.ts.map +1 -1
  918. package/dist/state/BlockTreeOps.d.ts +8 -1
  919. package/dist/state/BlockTreeOps.d.ts.map +1 -1
  920. package/dist/state/EditorState.d.ts.map +1 -1
  921. package/dist/state/InlineContentOps.d.ts +5 -3
  922. package/dist/state/InlineContentOps.d.ts.map +1 -1
  923. package/dist/state/NavigationQueries.d.ts +11 -0
  924. package/dist/state/NavigationQueries.d.ts.map +1 -1
  925. package/dist/state/StepInversion.d.ts.map +1 -1
  926. package/dist/state/StepMaps.d.ts.map +1 -1
  927. package/dist/state/Steps.d.ts +20 -3
  928. package/dist/state/Steps.d.ts.map +1 -1
  929. package/dist/state/TransactionBuilder.d.ts +3 -3
  930. package/dist/state/TransactionBuilder.d.ts.map +1 -1
  931. package/dist/test/TestUtils.d.ts +3 -1
  932. package/dist/test/TestUtils.d.ts.map +1 -1
  933. package/dist/view/CaretNavigation.d.ts.map +1 -1
  934. package/dist/view/SelectionSync.d.ts.map +1 -1
  935. package/dist/view/ViewMovementCommands.d.ts.map +1 -1
  936. package/package.json +423 -400
  937. package/dist/chunks/AlignmentPlugin-CjmLXGsv.mjs +0 -2
  938. package/dist/chunks/AlignmentPlugin-CjmLXGsv.mjs.map +0 -1
  939. package/dist/chunks/AttrRegistry-cXq6uQK2.mjs +0 -2
  940. package/dist/chunks/AttrRegistry-cXq6uQK2.mjs.map +0 -1
  941. package/dist/chunks/AttributedMarkCommands-Ctt_1xRD.mjs +0 -2
  942. package/dist/chunks/AttributedMarkCommands-Ctt_1xRD.mjs.map +0 -1
  943. package/dist/chunks/BidiIsolationPlugin-q3zoofgZ.mjs +0 -2
  944. package/dist/chunks/BidiIsolationPlugin-q3zoofgZ.mjs.map +0 -1
  945. package/dist/chunks/BlockInsertion-4QmiYRMo.mjs +0 -2
  946. package/dist/chunks/BlockInsertion-4QmiYRMo.mjs.map +0 -1
  947. package/dist/chunks/BlockTypePickerRegistry-DgI_LlNO.mjs +0 -2
  948. package/dist/chunks/BlockTypePickerRegistry-DgI_LlNO.mjs.map +0 -1
  949. package/dist/chunks/BlockquotePlugin-BTsDYB3K.mjs +0 -2
  950. package/dist/chunks/BlockquotePlugin-BTsDYB3K.mjs.map +0 -1
  951. package/dist/chunks/CaretNavigationPlugin-BFBov4H7.mjs +0 -2
  952. package/dist/chunks/CaretNavigationPlugin-BFBov4H7.mjs.map +0 -1
  953. package/dist/chunks/CodeBlockPlugin-o0Aoq9Nu.mjs +0 -2
  954. package/dist/chunks/CodeBlockPlugin-o0Aoq9Nu.mjs.map +0 -1
  955. package/dist/chunks/ColorGrid-U5NtjqyV.mjs +0 -2
  956. package/dist/chunks/ColorGrid-U5NtjqyV.mjs.map +0 -1
  957. package/dist/chunks/ColorPickerPopup-BYSMUZZx.mjs +0 -2
  958. package/dist/chunks/ColorPickerPopup-BYSMUZZx.mjs.map +0 -1
  959. package/dist/chunks/ColorValidation-3viVw_tK.mjs +0 -2
  960. package/dist/chunks/ColorValidation-3viVw_tK.mjs.map +0 -1
  961. package/dist/chunks/CommandHelpers-BqHfwW7i.mjs +0 -2
  962. package/dist/chunks/CommandHelpers-BqHfwW7i.mjs.map +0 -1
  963. package/dist/chunks/Commands-BC_EPIEx.mjs +0 -2
  964. package/dist/chunks/Commands-BC_EPIEx.mjs.map +0 -1
  965. package/dist/chunks/Decoration-BeTkTHRO.mjs +0 -2
  966. package/dist/chunks/Decoration-BeTkTHRO.mjs.map +0 -1
  967. package/dist/chunks/DirectionDetection-kAewerPz.mjs +0 -2
  968. package/dist/chunks/DirectionDetection-kAewerPz.mjs.map +0 -1
  969. package/dist/chunks/DirectionIcons-BQHHAEYU.mjs +0 -2
  970. package/dist/chunks/DirectionIcons-BQHHAEYU.mjs.map +0 -1
  971. package/dist/chunks/Document-DJmYYuBx.mjs +0 -2
  972. package/dist/chunks/Document-DJmYYuBx.mjs.map +0 -1
  973. package/dist/chunks/DocumentParser-D2hn-48i.mjs +0 -2
  974. package/dist/chunks/DocumentParser-D2hn-48i.mjs.map +0 -1
  975. package/dist/chunks/DomUtils-RKbAVBQz.mjs +0 -2
  976. package/dist/chunks/DomUtils-RKbAVBQz.mjs.map +0 -1
  977. package/dist/chunks/FontPlugin-TmUrcVn1.mjs +0 -2
  978. package/dist/chunks/FontPlugin-TmUrcVn1.mjs.map +0 -1
  979. package/dist/chunks/FontSizePlugin-Bwui7gLI.mjs +0 -2
  980. package/dist/chunks/FontSizePlugin-Bwui7gLI.mjs.map +0 -1
  981. package/dist/chunks/GapCursorNavigation-BEO5L2-O.mjs +0 -2
  982. package/dist/chunks/GapCursorNavigation-BEO5L2-O.mjs.map +0 -1
  983. package/dist/chunks/GapCursorPlugin-BiZQyVrJ.mjs +0 -2
  984. package/dist/chunks/GapCursorPlugin-BiZQyVrJ.mjs.map +0 -1
  985. package/dist/chunks/HTMLUtils-brwcaufP.mjs +0 -2
  986. package/dist/chunks/HTMLUtils-brwcaufP.mjs.map +0 -1
  987. package/dist/chunks/HardBreakPlugin-Dj4pkSk-.mjs +0 -2
  988. package/dist/chunks/HardBreakPlugin-Dj4pkSk-.mjs.map +0 -1
  989. package/dist/chunks/HeadingPlugin-D8xIRk25.mjs +0 -2
  990. package/dist/chunks/HeadingPlugin-D8xIRk25.mjs.map +0 -1
  991. package/dist/chunks/HighlightPlugin-CNX7lup0.mjs +0 -2
  992. package/dist/chunks/HighlightPlugin-CNX7lup0.mjs.map +0 -1
  993. package/dist/chunks/HorizontalRulePlugin-D-ZjKGDv.mjs +0 -2
  994. package/dist/chunks/HorizontalRulePlugin-D-ZjKGDv.mjs.map +0 -1
  995. package/dist/chunks/ImagePlugin-DwL8i3pO.mjs +0 -2
  996. package/dist/chunks/ImagePlugin-DwL8i3pO.mjs.map +0 -1
  997. package/dist/chunks/InlineCodePlugin-BpXNuKAa.mjs +0 -2
  998. package/dist/chunks/InlineCodePlugin-BpXNuKAa.mjs.map +0 -1
  999. package/dist/chunks/KeyboardNav-BZIHDPDV.mjs +0 -2
  1000. package/dist/chunks/KeyboardNav-BZIHDPDV.mjs.map +0 -1
  1001. package/dist/chunks/LinkPlugin-BK15pc0u.mjs +0 -2
  1002. package/dist/chunks/LinkPlugin-BK15pc0u.mjs.map +0 -1
  1003. package/dist/chunks/ListPlugin-B5ihlVNx.mjs +0 -2
  1004. package/dist/chunks/ListPlugin-B5ihlVNx.mjs.map +0 -1
  1005. package/dist/chunks/NavigationQueries-DhptdQBe.mjs +0 -2
  1006. package/dist/chunks/NavigationQueries-DhptdQBe.mjs.map +0 -1
  1007. package/dist/chunks/NodeSelectionCommands-DenSYOfB.mjs +0 -2
  1008. package/dist/chunks/NodeSelectionCommands-DenSYOfB.mjs.map +0 -1
  1009. package/dist/chunks/Platform-D9TRT4Mn.mjs +0 -2
  1010. package/dist/chunks/Platform-D9TRT4Mn.mjs.map +0 -1
  1011. package/dist/chunks/PluginHelpers-BZphovwz.mjs +0 -2
  1012. package/dist/chunks/PluginHelpers-BZphovwz.mjs.map +0 -1
  1013. package/dist/chunks/PopupKeyboardPatterns-CgUM5kPf.mjs +0 -2
  1014. package/dist/chunks/PopupKeyboardPatterns-CgUM5kPf.mjs.map +0 -1
  1015. package/dist/chunks/PopupManager-B5SHhDsx.mjs +0 -2
  1016. package/dist/chunks/PopupManager-B5SHhDsx.mjs.map +0 -1
  1017. package/dist/chunks/PopupPositioning-BfahfPOm.mjs +0 -2
  1018. package/dist/chunks/PopupPositioning-BfahfPOm.mjs.map +0 -1
  1019. package/dist/chunks/PrintPlugin-CckjtZ9B.mjs +0 -2
  1020. package/dist/chunks/PrintPlugin-CckjtZ9B.mjs.map +0 -1
  1021. package/dist/chunks/PrintTypes-Ci3XW_s8.mjs +0 -2
  1022. package/dist/chunks/PrintTypes-Ci3XW_s8.mjs.map +0 -1
  1023. package/dist/chunks/RangeIterator-ZooGMxGy.mjs +0 -2
  1024. package/dist/chunks/RangeIterator-ZooGMxGy.mjs.map +0 -1
  1025. package/dist/chunks/Selection-aeiSsvhe.mjs +0 -2
  1026. package/dist/chunks/Selection-aeiSsvhe.mjs.map +0 -1
  1027. package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs +0 -2
  1028. package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs.map +0 -1
  1029. package/dist/chunks/SmartPastePlugin-B_zi9WT9.mjs +0 -2
  1030. package/dist/chunks/SmartPastePlugin-B_zi9WT9.mjs.map +0 -1
  1031. package/dist/chunks/StrikethroughPlugin-2XDKYefG.mjs +0 -2
  1032. package/dist/chunks/StrikethroughPlugin-2XDKYefG.mjs.map +0 -1
  1033. package/dist/chunks/StyleRuntime-D3d1XFFe.mjs +0 -2
  1034. package/dist/chunks/StyleRuntime-D3d1XFFe.mjs.map +0 -1
  1035. package/dist/chunks/SuperSubPlugin-6gdrjKZv.mjs +0 -2
  1036. package/dist/chunks/SuperSubPlugin-6gdrjKZv.mjs.map +0 -1
  1037. package/dist/chunks/SyntaxTokenTypes-DZwhanGO.mjs +0 -2
  1038. package/dist/chunks/SyntaxTokenTypes-DZwhanGO.mjs.map +0 -1
  1039. package/dist/chunks/TablePlugin-DW78Y4pB.mjs +0 -2
  1040. package/dist/chunks/TablePlugin-DW78Y4pB.mjs.map +0 -1
  1041. package/dist/chunks/TextColorPlugin-CgHro45N.mjs +0 -2
  1042. package/dist/chunks/TextColorPlugin-CgHro45N.mjs.map +0 -1
  1043. package/dist/chunks/TextDirectionAutoPlugin-C88ZeXJo.mjs +0 -2
  1044. package/dist/chunks/TextDirectionAutoPlugin-C88ZeXJo.mjs.map +0 -1
  1045. package/dist/chunks/TextDirectionPlugin-BTTqrWbL.mjs +0 -2
  1046. package/dist/chunks/TextDirectionPlugin-BTTqrWbL.mjs.map +0 -1
  1047. package/dist/chunks/TextDirectionService-DzuOMFm8.mjs +0 -2
  1048. package/dist/chunks/TextDirectionService-DzuOMFm8.mjs.map +0 -1
  1049. package/dist/chunks/TextFormattingPlugin-BD4Qlpls.mjs +0 -2
  1050. package/dist/chunks/TextFormattingPlugin-BD4Qlpls.mjs.map +0 -1
  1051. package/dist/chunks/ToolbarPlugin-D5_-gWmH.mjs +0 -2
  1052. package/dist/chunks/ToolbarPlugin-D5_-gWmH.mjs.map +0 -1
  1053. package/dist/chunks/TypeBrands-BZDKMjR-.mjs +0 -2
  1054. package/dist/chunks/TypeBrands-BZDKMjR-.mjs.map +0 -1
  1055. package/dist/chunks/TypedKeys-CU7aToqY.mjs +0 -2
  1056. package/dist/chunks/TypedKeys-CU7aToqY.mjs.map +0 -1
  1057. package/dist/chunks/WordBoundary-Cz2bSRAU.mjs +0 -2
  1058. package/dist/chunks/WordBoundary-Cz2bSRAU.mjs.map +0 -1
  1059. package/dist/chunks/XmlDetector-DM-Vv-XW.mjs +0 -2
  1060. package/dist/chunks/XmlDetector-DM-Vv-XW.mjs.map +0 -1
  1061. package/dist/chunks/XmlPatterns-B-V-mHF4.mjs +0 -2
  1062. package/dist/chunks/XmlPatterns-B-V-mHF4.mjs.map +0 -1
  1063. package/dist/chunks/XmlSupport-Dr1S1HN9.mjs +0 -2
  1064. package/dist/chunks/XmlSupport-Dr1S1HN9.mjs.map +0 -1
  1065. package/dist/chunks/ar-4r3DgNTY.mjs +0 -2
  1066. package/dist/chunks/ar-4r3DgNTY.mjs.map +0 -1
  1067. package/dist/chunks/ar-7EtzKNIe.mjs +0 -2
  1068. package/dist/chunks/ar-7EtzKNIe.mjs.map +0 -1
  1069. package/dist/chunks/ar-B2pDI_LT.mjs +0 -2
  1070. package/dist/chunks/ar-B2pDI_LT.mjs.map +0 -1
  1071. package/dist/chunks/ar-BV6-zQd7.mjs +0 -2
  1072. package/dist/chunks/ar-BV6-zQd7.mjs.map +0 -1
  1073. package/dist/chunks/ar-BaCL4Bzy.mjs +0 -2
  1074. package/dist/chunks/ar-BaCL4Bzy.mjs.map +0 -1
  1075. package/dist/chunks/ar-BdGHrLSw.mjs +0 -2
  1076. package/dist/chunks/ar-BdGHrLSw.mjs.map +0 -1
  1077. package/dist/chunks/ar-BwYDKOvO.mjs +0 -2
  1078. package/dist/chunks/ar-BwYDKOvO.mjs.map +0 -1
  1079. package/dist/chunks/ar-C5eLSf71.mjs +0 -2
  1080. package/dist/chunks/ar-C5eLSf71.mjs.map +0 -1
  1081. package/dist/chunks/ar-CEUn6f7s.mjs +0 -2
  1082. package/dist/chunks/ar-CEUn6f7s.mjs.map +0 -1
  1083. package/dist/chunks/ar-CGYb1t6O.mjs +0 -2
  1084. package/dist/chunks/ar-CGYb1t6O.mjs.map +0 -1
  1085. package/dist/chunks/ar-CjK36QZ9.mjs +0 -2
  1086. package/dist/chunks/ar-CjK36QZ9.mjs.map +0 -1
  1087. package/dist/chunks/ar-D9jfC3WF.mjs +0 -2
  1088. package/dist/chunks/ar-D9jfC3WF.mjs.map +0 -1
  1089. package/dist/chunks/ar-DFeA_UxF.mjs +0 -2
  1090. package/dist/chunks/ar-DFeA_UxF.mjs.map +0 -1
  1091. package/dist/chunks/ar-DMuawOHV.mjs +0 -2
  1092. package/dist/chunks/ar-DMuawOHV.mjs.map +0 -1
  1093. package/dist/chunks/ar-DV30sa3s.mjs +0 -2
  1094. package/dist/chunks/ar-DV30sa3s.mjs.map +0 -1
  1095. package/dist/chunks/ar-DWwG54pa.mjs +0 -2
  1096. package/dist/chunks/ar-DWwG54pa.mjs.map +0 -1
  1097. package/dist/chunks/ar-DcJbUbml.mjs +0 -2
  1098. package/dist/chunks/ar-DcJbUbml.mjs.map +0 -1
  1099. package/dist/chunks/ar-DelI54_I.mjs +0 -2
  1100. package/dist/chunks/ar-DelI54_I.mjs.map +0 -1
  1101. package/dist/chunks/ar-DmqFnvxC.mjs +0 -2
  1102. package/dist/chunks/ar-DmqFnvxC.mjs.map +0 -1
  1103. package/dist/chunks/ar-DpEHjBUk.mjs +0 -2
  1104. package/dist/chunks/ar-DpEHjBUk.mjs.map +0 -1
  1105. package/dist/chunks/ar-EnfTpUuB.mjs +0 -2
  1106. package/dist/chunks/ar-EnfTpUuB.mjs.map +0 -1
  1107. package/dist/chunks/ar-ZHVy9O4c.mjs +0 -2
  1108. package/dist/chunks/ar-ZHVy9O4c.mjs.map +0 -1
  1109. package/dist/chunks/ar-_7aFyBGi.mjs +0 -2
  1110. package/dist/chunks/ar-_7aFyBGi.mjs.map +0 -1
  1111. package/dist/chunks/ar-l75rG_xT.mjs +0 -2
  1112. package/dist/chunks/ar-l75rG_xT.mjs.map +0 -1
  1113. package/dist/chunks/ar-qU1PohHA.mjs +0 -2
  1114. package/dist/chunks/ar-qU1PohHA.mjs.map +0 -1
  1115. package/dist/chunks/color-picker-BTex2Cfu.mjs +0 -2
  1116. package/dist/chunks/color-picker-BTex2Cfu.mjs.map +0 -1
  1117. package/dist/chunks/de-BDfimoiQ.mjs +0 -2
  1118. package/dist/chunks/de-BDfimoiQ.mjs.map +0 -1
  1119. package/dist/chunks/de-BSkOdXQZ.mjs +0 -2
  1120. package/dist/chunks/de-BSkOdXQZ.mjs.map +0 -1
  1121. package/dist/chunks/de-BooQr0-C.mjs +0 -2
  1122. package/dist/chunks/de-BooQr0-C.mjs.map +0 -1
  1123. package/dist/chunks/de-ByvLzlOc.mjs +0 -2
  1124. package/dist/chunks/de-ByvLzlOc.mjs.map +0 -1
  1125. package/dist/chunks/de-C03n6uR5.mjs +0 -2
  1126. package/dist/chunks/de-C03n6uR5.mjs.map +0 -1
  1127. package/dist/chunks/de-C0TfkuUd.mjs +0 -2
  1128. package/dist/chunks/de-C0TfkuUd.mjs.map +0 -1
  1129. package/dist/chunks/de-C0khkRSC.mjs +0 -2
  1130. package/dist/chunks/de-C0khkRSC.mjs.map +0 -1
  1131. package/dist/chunks/de-C4IW4BVo.mjs +0 -2
  1132. package/dist/chunks/de-C4IW4BVo.mjs.map +0 -1
  1133. package/dist/chunks/de-CDSG9CMy.mjs +0 -2
  1134. package/dist/chunks/de-CDSG9CMy.mjs.map +0 -1
  1135. package/dist/chunks/de-CkIwUE6R.mjs +0 -2
  1136. package/dist/chunks/de-CkIwUE6R.mjs.map +0 -1
  1137. package/dist/chunks/de-CmJ9oOiP.mjs +0 -2
  1138. package/dist/chunks/de-CmJ9oOiP.mjs.map +0 -1
  1139. package/dist/chunks/de-CrjOjB4F.mjs +0 -2
  1140. package/dist/chunks/de-CrjOjB4F.mjs.map +0 -1
  1141. package/dist/chunks/de-D5_uflBY.mjs +0 -2
  1142. package/dist/chunks/de-D5_uflBY.mjs.map +0 -1
  1143. package/dist/chunks/de-DH5zRyrS.mjs +0 -2
  1144. package/dist/chunks/de-DH5zRyrS.mjs.map +0 -1
  1145. package/dist/chunks/de-DJqgaz5N.mjs +0 -2
  1146. package/dist/chunks/de-DJqgaz5N.mjs.map +0 -1
  1147. package/dist/chunks/de-DMiAi5QJ.mjs +0 -2
  1148. package/dist/chunks/de-DMiAi5QJ.mjs.map +0 -1
  1149. package/dist/chunks/de-DT6VbHNl.mjs +0 -2
  1150. package/dist/chunks/de-DT6VbHNl.mjs.map +0 -1
  1151. package/dist/chunks/de-DbqObFs9.mjs +0 -2
  1152. package/dist/chunks/de-DbqObFs9.mjs.map +0 -1
  1153. package/dist/chunks/de-Dl0svzeh.mjs +0 -2
  1154. package/dist/chunks/de-Dl0svzeh.mjs.map +0 -1
  1155. package/dist/chunks/de-DzMY3LLH.mjs +0 -2
  1156. package/dist/chunks/de-DzMY3LLH.mjs.map +0 -1
  1157. package/dist/chunks/de-JGuzWRyC.mjs +0 -2
  1158. package/dist/chunks/de-JGuzWRyC.mjs.map +0 -1
  1159. package/dist/chunks/de-MOHX9tl7.mjs +0 -2
  1160. package/dist/chunks/de-MOHX9tl7.mjs.map +0 -1
  1161. package/dist/chunks/de-mtjvG1Li.mjs +0 -2
  1162. package/dist/chunks/de-mtjvG1Li.mjs.map +0 -1
  1163. package/dist/chunks/de-oNyi0r7G.mjs +0 -2
  1164. package/dist/chunks/de-oNyi0r7G.mjs.map +0 -1
  1165. package/dist/chunks/de-y5fJdnH9.mjs +0 -2
  1166. package/dist/chunks/de-y5fJdnH9.mjs.map +0 -1
  1167. package/dist/chunks/es-B-V14ELw.mjs +0 -2
  1168. package/dist/chunks/es-B-V14ELw.mjs.map +0 -1
  1169. package/dist/chunks/es-Bf6WRo_H.mjs +0 -2
  1170. package/dist/chunks/es-Bf6WRo_H.mjs.map +0 -1
  1171. package/dist/chunks/es-Bw9vJu_M.mjs +0 -2
  1172. package/dist/chunks/es-Bw9vJu_M.mjs.map +0 -1
  1173. package/dist/chunks/es-CCdE3xXm.mjs +0 -2
  1174. package/dist/chunks/es-CCdE3xXm.mjs.map +0 -1
  1175. package/dist/chunks/es-CDoZMS8v.mjs +0 -2
  1176. package/dist/chunks/es-CDoZMS8v.mjs.map +0 -1
  1177. package/dist/chunks/es-CO1hBMDj.mjs +0 -2
  1178. package/dist/chunks/es-CO1hBMDj.mjs.map +0 -1
  1179. package/dist/chunks/es-CU2TUgK3.mjs +0 -2
  1180. package/dist/chunks/es-CU2TUgK3.mjs.map +0 -1
  1181. package/dist/chunks/es-CXeJJ2r1.mjs +0 -2
  1182. package/dist/chunks/es-CXeJJ2r1.mjs.map +0 -1
  1183. package/dist/chunks/es-Cc337sYN.mjs +0 -2
  1184. package/dist/chunks/es-Cc337sYN.mjs.map +0 -1
  1185. package/dist/chunks/es-Ck88JtiM.mjs +0 -2
  1186. package/dist/chunks/es-Ck88JtiM.mjs.map +0 -1
  1187. package/dist/chunks/es-CmOFsz0P.mjs +0 -2
  1188. package/dist/chunks/es-CmOFsz0P.mjs.map +0 -1
  1189. package/dist/chunks/es-CpcUYxtO.mjs +0 -2
  1190. package/dist/chunks/es-CpcUYxtO.mjs.map +0 -1
  1191. package/dist/chunks/es-Cqp8LgVd.mjs +0 -2
  1192. package/dist/chunks/es-Cqp8LgVd.mjs.map +0 -1
  1193. package/dist/chunks/es-CsK826Q8.mjs +0 -2
  1194. package/dist/chunks/es-CsK826Q8.mjs.map +0 -1
  1195. package/dist/chunks/es-D7wyE736.mjs +0 -2
  1196. package/dist/chunks/es-D7wyE736.mjs.map +0 -1
  1197. package/dist/chunks/es-DGCoEaRB.mjs +0 -2
  1198. package/dist/chunks/es-DGCoEaRB.mjs.map +0 -1
  1199. package/dist/chunks/es-DPsoXXVT.mjs +0 -2
  1200. package/dist/chunks/es-DPsoXXVT.mjs.map +0 -1
  1201. package/dist/chunks/es-Df2ocRb2.mjs +0 -2
  1202. package/dist/chunks/es-Df2ocRb2.mjs.map +0 -1
  1203. package/dist/chunks/es-DgVSWMPU.mjs +0 -2
  1204. package/dist/chunks/es-DgVSWMPU.mjs.map +0 -1
  1205. package/dist/chunks/es-Dltvy1GA.mjs +0 -2
  1206. package/dist/chunks/es-Dltvy1GA.mjs.map +0 -1
  1207. package/dist/chunks/es-DtElbzrQ.mjs +0 -2
  1208. package/dist/chunks/es-DtElbzrQ.mjs.map +0 -1
  1209. package/dist/chunks/es-ERjP_b2h.mjs +0 -2
  1210. package/dist/chunks/es-ERjP_b2h.mjs.map +0 -1
  1211. package/dist/chunks/es-SN8M8vXY.mjs +0 -2
  1212. package/dist/chunks/es-SN8M8vXY.mjs.map +0 -1
  1213. package/dist/chunks/es-domW6tKg.mjs +0 -2
  1214. package/dist/chunks/es-domW6tKg.mjs.map +0 -1
  1215. package/dist/chunks/es-luS_ivBE.mjs +0 -2
  1216. package/dist/chunks/es-luS_ivBE.mjs.map +0 -1
  1217. package/dist/chunks/fonts-DVgoAAns.mjs +0 -2
  1218. package/dist/chunks/fonts-DVgoAAns.mjs.map +0 -1
  1219. package/dist/chunks/fr-BPa6RyuB.mjs +0 -2
  1220. package/dist/chunks/fr-BPa6RyuB.mjs.map +0 -1
  1221. package/dist/chunks/fr-BYK62vy-.mjs +0 -2
  1222. package/dist/chunks/fr-BYK62vy-.mjs.map +0 -1
  1223. package/dist/chunks/fr-BZH71A1g.mjs +0 -2
  1224. package/dist/chunks/fr-BZH71A1g.mjs.map +0 -1
  1225. package/dist/chunks/fr-BomQM4Qz.mjs +0 -2
  1226. package/dist/chunks/fr-BomQM4Qz.mjs.map +0 -1
  1227. package/dist/chunks/fr-BujOdWeE.mjs +0 -2
  1228. package/dist/chunks/fr-BujOdWeE.mjs.map +0 -1
  1229. package/dist/chunks/fr-C6BCt-Fk.mjs +0 -2
  1230. package/dist/chunks/fr-C6BCt-Fk.mjs.map +0 -1
  1231. package/dist/chunks/fr-C8NXcJOp.mjs +0 -2
  1232. package/dist/chunks/fr-C8NXcJOp.mjs.map +0 -1
  1233. package/dist/chunks/fr-C8aNnvoW.mjs +0 -2
  1234. package/dist/chunks/fr-C8aNnvoW.mjs.map +0 -1
  1235. package/dist/chunks/fr-C8jqjdbQ.mjs +0 -2
  1236. package/dist/chunks/fr-C8jqjdbQ.mjs.map +0 -1
  1237. package/dist/chunks/fr-Cg97syqs.mjs +0 -2
  1238. package/dist/chunks/fr-Cg97syqs.mjs.map +0 -1
  1239. package/dist/chunks/fr-CiT36QA9.mjs +0 -2
  1240. package/dist/chunks/fr-CiT36QA9.mjs.map +0 -1
  1241. package/dist/chunks/fr-D3Ho_0MV.mjs +0 -2
  1242. package/dist/chunks/fr-D3Ho_0MV.mjs.map +0 -1
  1243. package/dist/chunks/fr-DA37dDuJ.mjs +0 -2
  1244. package/dist/chunks/fr-DA37dDuJ.mjs.map +0 -1
  1245. package/dist/chunks/fr-DK9dc8bZ.mjs +0 -2
  1246. package/dist/chunks/fr-DK9dc8bZ.mjs.map +0 -1
  1247. package/dist/chunks/fr-DNA_bC6X.mjs +0 -2
  1248. package/dist/chunks/fr-DNA_bC6X.mjs.map +0 -1
  1249. package/dist/chunks/fr-DPXU2MTy.mjs +0 -2
  1250. package/dist/chunks/fr-DPXU2MTy.mjs.map +0 -1
  1251. package/dist/chunks/fr-DZCsB6H7.mjs +0 -2
  1252. package/dist/chunks/fr-DZCsB6H7.mjs.map +0 -1
  1253. package/dist/chunks/fr-Dd8f28BD.mjs +0 -2
  1254. package/dist/chunks/fr-Dd8f28BD.mjs.map +0 -1
  1255. package/dist/chunks/fr-DmCLgc4F.mjs +0 -2
  1256. package/dist/chunks/fr-DmCLgc4F.mjs.map +0 -1
  1257. package/dist/chunks/fr-DtEXB4RG.mjs +0 -2
  1258. package/dist/chunks/fr-DtEXB4RG.mjs.map +0 -1
  1259. package/dist/chunks/fr-FvGvPlqS.mjs +0 -2
  1260. package/dist/chunks/fr-FvGvPlqS.mjs.map +0 -1
  1261. package/dist/chunks/fr-V3LUcmFE.mjs +0 -2
  1262. package/dist/chunks/fr-V3LUcmFE.mjs.map +0 -1
  1263. package/dist/chunks/fr-eiqXGNgf.mjs +0 -2
  1264. package/dist/chunks/fr-eiqXGNgf.mjs.map +0 -1
  1265. package/dist/chunks/fr-fEWGSNI2.mjs +0 -2
  1266. package/dist/chunks/fr-fEWGSNI2.mjs.map +0 -1
  1267. package/dist/chunks/fr-w23c3SBW.mjs +0 -2
  1268. package/dist/chunks/fr-w23c3SBW.mjs.map +0 -1
  1269. package/dist/chunks/full-yocxIDB8.mjs +0 -2
  1270. package/dist/chunks/full-yocxIDB8.mjs.map +0 -1
  1271. package/dist/chunks/hi-4Xqp7mZC.mjs +0 -2
  1272. package/dist/chunks/hi-4Xqp7mZC.mjs.map +0 -1
  1273. package/dist/chunks/hi-8Eu7f89Y.mjs +0 -2
  1274. package/dist/chunks/hi-8Eu7f89Y.mjs.map +0 -1
  1275. package/dist/chunks/hi-BA9PP8mL.mjs +0 -2
  1276. package/dist/chunks/hi-BA9PP8mL.mjs.map +0 -1
  1277. package/dist/chunks/hi-BLCjECcV.mjs +0 -2
  1278. package/dist/chunks/hi-BLCjECcV.mjs.map +0 -1
  1279. package/dist/chunks/hi-BX9P0764.mjs +0 -2
  1280. package/dist/chunks/hi-BX9P0764.mjs.map +0 -1
  1281. package/dist/chunks/hi-BakCaBYh.mjs +0 -2
  1282. package/dist/chunks/hi-BakCaBYh.mjs.map +0 -1
  1283. package/dist/chunks/hi-BoITZeVd.mjs +0 -2
  1284. package/dist/chunks/hi-BoITZeVd.mjs.map +0 -1
  1285. package/dist/chunks/hi-C3BvlTfV.mjs +0 -2
  1286. package/dist/chunks/hi-C3BvlTfV.mjs.map +0 -1
  1287. package/dist/chunks/hi-C5HGb5IH.mjs +0 -2
  1288. package/dist/chunks/hi-C5HGb5IH.mjs.map +0 -1
  1289. package/dist/chunks/hi-CIpo_sTL.mjs +0 -2
  1290. package/dist/chunks/hi-CIpo_sTL.mjs.map +0 -1
  1291. package/dist/chunks/hi-CWRofsw7.mjs +0 -2
  1292. package/dist/chunks/hi-CWRofsw7.mjs.map +0 -1
  1293. package/dist/chunks/hi-C_eipolR.mjs +0 -2
  1294. package/dist/chunks/hi-C_eipolR.mjs.map +0 -1
  1295. package/dist/chunks/hi-ClaAWR5y.mjs +0 -2
  1296. package/dist/chunks/hi-ClaAWR5y.mjs.map +0 -1
  1297. package/dist/chunks/hi-Cn2ywhVT.mjs +0 -2
  1298. package/dist/chunks/hi-Cn2ywhVT.mjs.map +0 -1
  1299. package/dist/chunks/hi-CrsqMuKk.mjs +0 -2
  1300. package/dist/chunks/hi-CrsqMuKk.mjs.map +0 -1
  1301. package/dist/chunks/hi-D-iC4Hvv.mjs +0 -2
  1302. package/dist/chunks/hi-D-iC4Hvv.mjs.map +0 -1
  1303. package/dist/chunks/hi-DEN9a54c.mjs +0 -2
  1304. package/dist/chunks/hi-DEN9a54c.mjs.map +0 -1
  1305. package/dist/chunks/hi-DK9HmINW.mjs +0 -2
  1306. package/dist/chunks/hi-DK9HmINW.mjs.map +0 -1
  1307. package/dist/chunks/hi-DOnHDEqt.mjs +0 -2
  1308. package/dist/chunks/hi-DOnHDEqt.mjs.map +0 -1
  1309. package/dist/chunks/hi-DY0SGobQ.mjs +0 -2
  1310. package/dist/chunks/hi-DY0SGobQ.mjs.map +0 -1
  1311. package/dist/chunks/hi-FSXMWIXU.mjs +0 -2
  1312. package/dist/chunks/hi-FSXMWIXU.mjs.map +0 -1
  1313. package/dist/chunks/hi-JroSY-2k.mjs +0 -2
  1314. package/dist/chunks/hi-JroSY-2k.mjs.map +0 -1
  1315. package/dist/chunks/hi-WDIZzgAJ.mjs +0 -2
  1316. package/dist/chunks/hi-WDIZzgAJ.mjs.map +0 -1
  1317. package/dist/chunks/hi-fLLnVGix.mjs +0 -2
  1318. package/dist/chunks/hi-fLLnVGix.mjs.map +0 -1
  1319. package/dist/chunks/hi-f_MCrd2N.mjs +0 -2
  1320. package/dist/chunks/hi-f_MCrd2N.mjs.map +0 -1
  1321. package/dist/chunks/minimal-BL3kgYy-.mjs +0 -2
  1322. package/dist/chunks/minimal-BL3kgYy-.mjs.map +0 -1
  1323. package/dist/chunks/pt-206lqjCP.mjs +0 -2
  1324. package/dist/chunks/pt-206lqjCP.mjs.map +0 -1
  1325. package/dist/chunks/pt-B5wz6m3c.mjs +0 -2
  1326. package/dist/chunks/pt-B5wz6m3c.mjs.map +0 -1
  1327. package/dist/chunks/pt-B6KMxxw4.mjs +0 -2
  1328. package/dist/chunks/pt-B6KMxxw4.mjs.map +0 -1
  1329. package/dist/chunks/pt-BCg3YzEh.mjs +0 -2
  1330. package/dist/chunks/pt-BCg3YzEh.mjs.map +0 -1
  1331. package/dist/chunks/pt-BFr-zfd2.mjs +0 -2
  1332. package/dist/chunks/pt-BFr-zfd2.mjs.map +0 -1
  1333. package/dist/chunks/pt-BG1fIcHV.mjs +0 -2
  1334. package/dist/chunks/pt-BG1fIcHV.mjs.map +0 -1
  1335. package/dist/chunks/pt-Bhytb-k2.mjs +0 -2
  1336. package/dist/chunks/pt-Bhytb-k2.mjs.map +0 -1
  1337. package/dist/chunks/pt-Bjb6_1gI.mjs +0 -2
  1338. package/dist/chunks/pt-Bjb6_1gI.mjs.map +0 -1
  1339. package/dist/chunks/pt-BzQagqFt.mjs +0 -2
  1340. package/dist/chunks/pt-BzQagqFt.mjs.map +0 -1
  1341. package/dist/chunks/pt-C2rlfcQ4.mjs +0 -2
  1342. package/dist/chunks/pt-C2rlfcQ4.mjs.map +0 -1
  1343. package/dist/chunks/pt-C4xLSFYA.mjs +0 -2
  1344. package/dist/chunks/pt-C4xLSFYA.mjs.map +0 -1
  1345. package/dist/chunks/pt-CBxnU7dE.mjs +0 -2
  1346. package/dist/chunks/pt-CBxnU7dE.mjs.map +0 -1
  1347. package/dist/chunks/pt-CMXLiIJ3.mjs +0 -2
  1348. package/dist/chunks/pt-CMXLiIJ3.mjs.map +0 -1
  1349. package/dist/chunks/pt-Cn2yMIyR.mjs +0 -2
  1350. package/dist/chunks/pt-Cn2yMIyR.mjs.map +0 -1
  1351. package/dist/chunks/pt-DAh8UqJa.mjs +0 -2
  1352. package/dist/chunks/pt-DAh8UqJa.mjs.map +0 -1
  1353. package/dist/chunks/pt-DLe58Npz.mjs +0 -2
  1354. package/dist/chunks/pt-DLe58Npz.mjs.map +0 -1
  1355. package/dist/chunks/pt-D_DXzKyU.mjs +0 -2
  1356. package/dist/chunks/pt-D_DXzKyU.mjs.map +0 -1
  1357. package/dist/chunks/pt-DhC7TYvg.mjs +0 -2
  1358. package/dist/chunks/pt-DhC7TYvg.mjs.map +0 -1
  1359. package/dist/chunks/pt-Dl18NLl1.mjs +0 -2
  1360. package/dist/chunks/pt-Dl18NLl1.mjs.map +0 -1
  1361. package/dist/chunks/pt-Dz2YeCP4.mjs +0 -2
  1362. package/dist/chunks/pt-Dz2YeCP4.mjs.map +0 -1
  1363. package/dist/chunks/pt-GfM-nxvv.mjs +0 -2
  1364. package/dist/chunks/pt-GfM-nxvv.mjs.map +0 -1
  1365. package/dist/chunks/pt-PjsDW8WW.mjs +0 -2
  1366. package/dist/chunks/pt-PjsDW8WW.mjs.map +0 -1
  1367. package/dist/chunks/pt-X-M5uPLn.mjs +0 -2
  1368. package/dist/chunks/pt-X-M5uPLn.mjs.map +0 -1
  1369. package/dist/chunks/pt-appBsYpC.mjs +0 -2
  1370. package/dist/chunks/pt-appBsYpC.mjs.map +0 -1
  1371. package/dist/chunks/pt-i9ZFEE69.mjs +0 -2
  1372. package/dist/chunks/pt-i9ZFEE69.mjs.map +0 -1
  1373. package/dist/chunks/ru-B8HSQCj5.mjs +0 -2
  1374. package/dist/chunks/ru-B8HSQCj5.mjs.map +0 -1
  1375. package/dist/chunks/ru-BAOr7UOh.mjs +0 -2
  1376. package/dist/chunks/ru-BAOr7UOh.mjs.map +0 -1
  1377. package/dist/chunks/ru-BIV3iuR9.mjs +0 -2
  1378. package/dist/chunks/ru-BIV3iuR9.mjs.map +0 -1
  1379. package/dist/chunks/ru-BMJRGir6.mjs +0 -2
  1380. package/dist/chunks/ru-BMJRGir6.mjs.map +0 -1
  1381. package/dist/chunks/ru-BO59Tir1.mjs +0 -2
  1382. package/dist/chunks/ru-BO59Tir1.mjs.map +0 -1
  1383. package/dist/chunks/ru-BRnZSWPo.mjs +0 -2
  1384. package/dist/chunks/ru-BRnZSWPo.mjs.map +0 -1
  1385. package/dist/chunks/ru-Bf546sX_.mjs +0 -2
  1386. package/dist/chunks/ru-Bf546sX_.mjs.map +0 -1
  1387. package/dist/chunks/ru-Bfjq7sha.mjs +0 -2
  1388. package/dist/chunks/ru-Bfjq7sha.mjs.map +0 -1
  1389. package/dist/chunks/ru-Bm8utWf9.mjs +0 -2
  1390. package/dist/chunks/ru-Bm8utWf9.mjs.map +0 -1
  1391. package/dist/chunks/ru-BmneOLgh.mjs +0 -2
  1392. package/dist/chunks/ru-BmneOLgh.mjs.map +0 -1
  1393. package/dist/chunks/ru-Byrj1o3C.mjs +0 -2
  1394. package/dist/chunks/ru-Byrj1o3C.mjs.map +0 -1
  1395. package/dist/chunks/ru-C8ftQh9b.mjs +0 -2
  1396. package/dist/chunks/ru-C8ftQh9b.mjs.map +0 -1
  1397. package/dist/chunks/ru-CNjcfDD9.mjs +0 -2
  1398. package/dist/chunks/ru-CNjcfDD9.mjs.map +0 -1
  1399. package/dist/chunks/ru-Ccya5aSC.mjs +0 -2
  1400. package/dist/chunks/ru-Ccya5aSC.mjs.map +0 -1
  1401. package/dist/chunks/ru-Cd-mH9wa.mjs +0 -2
  1402. package/dist/chunks/ru-Cd-mH9wa.mjs.map +0 -1
  1403. package/dist/chunks/ru-CeZe9jTZ.mjs +0 -2
  1404. package/dist/chunks/ru-CeZe9jTZ.mjs.map +0 -1
  1405. package/dist/chunks/ru-Cl03u8Q0.mjs +0 -2
  1406. package/dist/chunks/ru-Cl03u8Q0.mjs.map +0 -1
  1407. package/dist/chunks/ru-CoCIIElm.mjs +0 -2
  1408. package/dist/chunks/ru-CoCIIElm.mjs.map +0 -1
  1409. package/dist/chunks/ru-CzUyZZmy.mjs +0 -2
  1410. package/dist/chunks/ru-CzUyZZmy.mjs.map +0 -1
  1411. package/dist/chunks/ru-D3fRdonc.mjs +0 -2
  1412. package/dist/chunks/ru-D3fRdonc.mjs.map +0 -1
  1413. package/dist/chunks/ru-Ddy9ONaX.mjs +0 -2
  1414. package/dist/chunks/ru-Ddy9ONaX.mjs.map +0 -1
  1415. package/dist/chunks/ru-Dgcyz845.mjs +0 -2
  1416. package/dist/chunks/ru-Dgcyz845.mjs.map +0 -1
  1417. package/dist/chunks/ru-DnIXvlfL.mjs +0 -2
  1418. package/dist/chunks/ru-DnIXvlfL.mjs.map +0 -1
  1419. package/dist/chunks/ru-DyBnSwCM.mjs +0 -2
  1420. package/dist/chunks/ru-DyBnSwCM.mjs.map +0 -1
  1421. package/dist/chunks/ru-i27SgAts.mjs +0 -2
  1422. package/dist/chunks/ru-i27SgAts.mjs.map +0 -1
  1423. package/dist/chunks/src-DfK2_MVH.mjs +0 -2
  1424. package/dist/chunks/src-DfK2_MVH.mjs.map +0 -1
  1425. package/dist/chunks/zh-6QoY3dY_.mjs +0 -2
  1426. package/dist/chunks/zh-6QoY3dY_.mjs.map +0 -1
  1427. package/dist/chunks/zh-9WLieF9N.mjs +0 -2
  1428. package/dist/chunks/zh-9WLieF9N.mjs.map +0 -1
  1429. package/dist/chunks/zh-B0VaFyeQ.mjs +0 -2
  1430. package/dist/chunks/zh-B0VaFyeQ.mjs.map +0 -1
  1431. package/dist/chunks/zh-B4pfqHD3.mjs +0 -2
  1432. package/dist/chunks/zh-B4pfqHD3.mjs.map +0 -1
  1433. package/dist/chunks/zh-BpaN1Nmc.mjs +0 -2
  1434. package/dist/chunks/zh-BpaN1Nmc.mjs.map +0 -1
  1435. package/dist/chunks/zh-BqCL2eZf.mjs +0 -2
  1436. package/dist/chunks/zh-BqCL2eZf.mjs.map +0 -1
  1437. package/dist/chunks/zh-Bvgb-e4z.mjs +0 -2
  1438. package/dist/chunks/zh-Bvgb-e4z.mjs.map +0 -1
  1439. package/dist/chunks/zh-C2by0u64.mjs +0 -2
  1440. package/dist/chunks/zh-C2by0u64.mjs.map +0 -1
  1441. package/dist/chunks/zh-C4Ia0Zrx.mjs +0 -2
  1442. package/dist/chunks/zh-C4Ia0Zrx.mjs.map +0 -1
  1443. package/dist/chunks/zh-CBHCLph7.mjs +0 -2
  1444. package/dist/chunks/zh-CBHCLph7.mjs.map +0 -1
  1445. package/dist/chunks/zh-CBJQlvWb.mjs +0 -2
  1446. package/dist/chunks/zh-CBJQlvWb.mjs.map +0 -1
  1447. package/dist/chunks/zh-CBNSrvly.mjs +0 -2
  1448. package/dist/chunks/zh-CBNSrvly.mjs.map +0 -1
  1449. package/dist/chunks/zh-CKEh4EwR.mjs +0 -2
  1450. package/dist/chunks/zh-CKEh4EwR.mjs.map +0 -1
  1451. package/dist/chunks/zh-CN8KiZ9v.mjs +0 -2
  1452. package/dist/chunks/zh-CN8KiZ9v.mjs.map +0 -1
  1453. package/dist/chunks/zh-CRJMQ4dT.mjs +0 -2
  1454. package/dist/chunks/zh-CRJMQ4dT.mjs.map +0 -1
  1455. package/dist/chunks/zh-CSg0qxe0.mjs +0 -2
  1456. package/dist/chunks/zh-CSg0qxe0.mjs.map +0 -1
  1457. package/dist/chunks/zh-CX7Bx0ia.mjs +0 -2
  1458. package/dist/chunks/zh-CX7Bx0ia.mjs.map +0 -1
  1459. package/dist/chunks/zh-CvlL1G9n.mjs +0 -2
  1460. package/dist/chunks/zh-CvlL1G9n.mjs.map +0 -1
  1461. package/dist/chunks/zh-DBKn0pzM.mjs +0 -2
  1462. package/dist/chunks/zh-DBKn0pzM.mjs.map +0 -1
  1463. package/dist/chunks/zh-DLOng8d-.mjs +0 -2
  1464. package/dist/chunks/zh-DLOng8d-.mjs.map +0 -1
  1465. package/dist/chunks/zh-DLVkXfcI.mjs +0 -2
  1466. package/dist/chunks/zh-DLVkXfcI.mjs.map +0 -1
  1467. package/dist/chunks/zh-DuaKGwyq.mjs +0 -2
  1468. package/dist/chunks/zh-DuaKGwyq.mjs.map +0 -1
  1469. package/dist/chunks/zh-KUnAhArn.mjs +0 -2
  1470. package/dist/chunks/zh-KUnAhArn.mjs.map +0 -1
  1471. package/dist/chunks/zh-wVp_7rfC.mjs +0 -2
  1472. package/dist/chunks/zh-wVp_7rfC.mjs.map +0 -1
  1473. package/dist/chunks/zh-z2wm3EA5.mjs +0 -2
  1474. package/dist/chunks/zh-z2wm3EA5.mjs.map +0 -1
  1475. package/dist/input/InternalClipboard.d.ts +0 -13
  1476. package/dist/input/InternalClipboard.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormulaPlugin-UA-9tRpY.mjs","names":[],"sources":["../../src/plugins/formula/mathml/MathMLBuilder.ts","../../src/plugins/formula/mathml/MathMLDocument.ts","../../src/plugins/formula/FormulaRendering.ts","../../src/plugins/formula/FormulaSerialization.ts","../../src/plugins/formula/FormulaTypes.ts","../../src/plugins/formula/mathml/MathMLSanitize.ts","../../src/plugins/formula/DisplayMathNodeSpec.ts","../../src/plugins/formula/DisplayMathNodeView.ts","../../src/plugins/formula/FormulaEditTrigger.ts","../../src/plugins/formula/FormulaCommands.ts","../../src/plugins/formula/latex/LatexParserTypes.ts","../../src/plugins/formula/latex/LatexSymbols.ts","../../src/plugins/formula/latex/LatexTokenizer.ts","../../src/plugins/formula/latex/handlers/Accents.ts","../../src/plugins/formula/latex/handlers/Environments.ts","../../src/plugins/formula/latex/handlers/Spacing.ts","../../src/plugins/formula/latex/handlers/Delimiters.ts","../../src/plugins/formula/latex/MathAlphabet.ts","../../src/plugins/formula/latex/handlers/Fonts.ts","../../src/plugins/formula/latex/handlers/Structures.ts","../../src/plugins/formula/latex/LatexParser.ts","../../src/plugins/formula/latex/LatexToMathML.ts","../../src/plugins/formula/FormulaInputRules.ts","../../src/plugins/formula/FormulaLocale.ts","../../src/plugins/formula/math-field/MathPalette.ts","../../src/plugins/formula/math-field/MathField.ts","../../src/plugins/formula/math-field/MathPaletteData.ts","../../src/plugins/formula/FormulaEditorMount.ts","../../src/plugins/formula/FormulaOverlay.ts","../../src/plugins/formula/FormulaPasteInterceptor.ts","../../src/plugins/formula/FormulaStyles.ts","../../src/plugins/formula/FormulaToolbar.ts","../../src/plugins/formula/InlineMathNodeSpec.ts","../../src/plugins/formula/MathFontFace.ts","../../src/plugins/formula/FormulaPlugin.ts"],"sourcesContent":["/**\n * String builders for Presentation MathML.\n *\n * Layer A (framework-agnostic, zero notectl imports). Produces MathML markup as\n * plain strings — DOM-free, so it is fully unit-testable under happy-dom and\n * matches the string storage format (D-3). The LaTeX converter composes these\n * helpers to emit a single presentation root element.\n */\n\nexport type MathMLAttrs = Readonly<Record<string, string | number | boolean>>;\n\nconst TEXT_ESCAPES: Readonly<Record<string, string>> = {\n\t'&': '&amp;',\n\t'<': '&lt;',\n\t'>': '&gt;',\n};\n\nconst ATTR_ESCAPES: Readonly<Record<string, string>> = {\n\t'&': '&amp;',\n\t'<': '&lt;',\n\t'>': '&gt;',\n\t'\"': '&quot;',\n};\n\n/** Escapes a string for use as MathML element text content. */\nexport function escapeText(text: string): string {\n\treturn text.replace(/[&<>]/g, (c) => TEXT_ESCAPES[c] ?? c);\n}\n\n/** Escapes a string for use inside a double-quoted attribute value. */\nexport function escapeAttr(value: string): string {\n\treturn value.replace(/[&<>\"]/g, (c) => ATTR_ESCAPES[c] ?? c);\n}\n\nfunction serializeAttrs(attrs?: MathMLAttrs): string {\n\tif (!attrs) return '';\n\tlet out = '';\n\tfor (const [key, value] of Object.entries(attrs)) {\n\t\tif (value === false || value === undefined || value === null) continue;\n\t\tif (value === true) {\n\t\t\tout += ` ${key}=\"true\"`;\n\t\t\tcontinue;\n\t\t}\n\t\tout += ` ${key}=\"${escapeAttr(String(value))}\"`;\n\t}\n\treturn out;\n}\n\n/** Builds an arbitrary MathML element from a tag, raw-markup children, and attrs. */\nexport function element(tag: string, children: string, attrs?: MathMLAttrs): string {\n\treturn `<${tag}${serializeAttrs(attrs)}>${children}</${tag}>`;\n}\n\n/** Builds a self-closing-style empty MathML element (e.g. `<mspace …></mspace>`). */\nexport function emptyElement(tag: string, attrs?: MathMLAttrs): string {\n\treturn `<${tag}${serializeAttrs(attrs)}></${tag}>`;\n}\n\n/** Identifier (variable/function name). Text is escaped. */\nexport function mi(text: string, attrs?: MathMLAttrs): string {\n\treturn element('mi', escapeText(text), attrs);\n}\n\n/** Number literal. Text is escaped. */\nexport function mn(text: string, attrs?: MathMLAttrs): string {\n\treturn element('mn', escapeText(text), attrs);\n}\n\n/** Operator (incl. fences, big operators). Text is escaped. */\nexport function mo(op: string, attrs?: MathMLAttrs): string {\n\treturn element('mo', escapeText(op), attrs);\n}\n\n/** Literal text run. Text is escaped. */\nexport function mtext(text: string, attrs?: MathMLAttrs): string {\n\treturn element('mtext', escapeText(text), attrs);\n}\n\n/** Horizontal/vertical spacing element. */\nexport function mspace(attrs: MathMLAttrs): string {\n\treturn emptyElement('mspace', attrs);\n}\n\n/** Groups a sequence of raw-markup children into a single row element. */\nexport function mrow(children: string, attrs?: MathMLAttrs): string {\n\treturn element('mrow', children, attrs);\n}\n\n/** Wraps children in an `<mrow>` only when grouping is needed (more than one root). */\nexport function group(children: readonly string[]): string {\n\tif (children.length === 0) return '';\n\tif (children.length === 1) return children[0] ?? '';\n\treturn mrow(children.join(''));\n}\n\n/** Fraction. `linethickness=\"0\"` renders a binomial-style stack. */\nexport function mfrac(numerator: string, denominator: string, attrs?: MathMLAttrs): string {\n\treturn element('mfrac', `${numerator}${denominator}`, attrs);\n}\n\n/** Square root. */\nexport function msqrt(radicand: string): string {\n\treturn element('msqrt', radicand);\n}\n\n/** N-th root: radicand with an explicit index. */\nexport function mroot(radicand: string, index: string): string {\n\treturn element('mroot', `${radicand}${index}`);\n}\n\n/** Superscript. */\nexport function msup(base: string, sup: string): string {\n\treturn element('msup', `${base}${sup}`);\n}\n\n/** Subscript. */\nexport function msub(base: string, sub: string): string {\n\treturn element('msub', `${base}${sub}`);\n}\n\n/** Combined sub- and superscript. */\nexport function msubsup(base: string, sub: string, sup: string): string {\n\treturn element('msubsup', `${base}${sub}${sup}`);\n}\n\n/** Overscript (e.g. hat, bar, overbrace). */\nexport function mover(base: string, over: string, attrs?: MathMLAttrs): string {\n\treturn element('mover', `${base}${over}`, attrs);\n}\n\n/** Underscript. */\nexport function munder(base: string, under: string, attrs?: MathMLAttrs): string {\n\treturn element('munder', `${base}${under}`, attrs);\n}\n\n/** Combined under- and overscript (e.g. limits on a big operator). */\nexport function munderover(base: string, under: string, over: string): string {\n\treturn element('munderover', `${base}${under}${over}`);\n}\n\n/** Table cell. */\nexport function mtd(content: string): string {\n\treturn element('mtd', content);\n}\n\n/** Table row from already-built cells. */\nexport function mtr(cells: readonly string[]): string {\n\treturn element('mtr', cells.map(mtd).join(''));\n}\n\n/** Table from a grid of cell-content strings. */\nexport function mtable(rows: readonly (readonly string[])[], attrs?: MathMLAttrs): string {\n\treturn element('mtable', rows.map(mtr).join(''), attrs);\n}\n\n/** Styled subtree (e.g. forced display style, script level). */\nexport function mstyle(children: string, attrs: MathMLAttrs): string {\n\treturn element('mstyle', children, attrs);\n}\n","/**\n * Canonical `<math>` document contract for the formula plugin.\n *\n * Layer A (framework-agnostic, zero notectl imports). The canonical stored form\n * of a formula is a complete `<math>` string carrying its LaTeX source as a TeX\n * annotation, so it is self-contained, screen-reader-ready, directly\n * serializable to HTML, and round-trips losslessly for re-editing (D-3).\n *\n * <math display=\"inline|block\">\n * <semantics>\n * {presentation}\n * <annotation encoding=\"application/x-tex\">{latex}</annotation>\n * </semantics>\n * </math>\n *\n * When no LaTeX source is available the `<semantics>`/`<annotation>` wrapper is\n * omitted and the presentation MathML is the direct child of `<math>`.\n */\n\nimport { escapeAttr, escapeText } from './MathMLBuilder.js';\n\n/** The MathML namespace URI. */\nexport const MATHML_NS = 'http://www.w3.org/1998/Math/MathML';\n\n/** Encoding used for the embedded LaTeX annotation (KaTeX/MathJax convention). */\nexport const TEX_ANNOTATION_ENCODING = 'application/x-tex';\n\n/** Parts that compose a canonical `<math>` document. */\nexport interface MathMLDocumentParts {\n\t/** Presentation MathML: a single root element (e.g. `<mrow>…</mrow>`). */\n\treadonly presentation: string;\n\t/** Whether this is display (block) or inline math. */\n\treadonly display: boolean;\n\t/** LaTeX source; stored as a TeX annotation for lossless re-editing. */\n\treadonly latex?: string;\n\t/** Human-readable fallback label, rendered as the native `alttext`. */\n\treadonly alt?: string;\n}\n\nconst ENTITY_UNESCAPES: Readonly<Record<string, string>> = {\n\t'&amp;': '&',\n\t'&lt;': '<',\n\t'&gt;': '>',\n\t'&quot;': '\"',\n\t'&apos;': \"'\",\n\t'&#39;': \"'\",\n};\n\nfunction unescapeEntities(text: string): string {\n\treturn text.replace(/&(?:amp|lt|gt|quot|apos|#39);/g, (m) => ENTITY_UNESCAPES[m] ?? m);\n}\n\n/** Assembles the canonical `<math>` string from its parts. */\nexport function buildMathML(parts: MathMLDocumentParts): string {\n\tconst display: string = parts.display ? 'block' : 'inline';\n\tconst altAttr: string = parts.alt ? ` alttext=\"${escapeAttr(parts.alt)}\"` : '';\n\tconst hasLatex: boolean = parts.latex !== undefined && parts.latex !== '';\n\tconst tex: string = escapeText(parts.latex ?? '');\n\tconst annotation = `<annotation encoding=\"${TEX_ANNOTATION_ENCODING}\">${tex}</annotation>`;\n\tconst body: string = hasLatex\n\t\t? `<semantics>${parts.presentation}${annotation}</semantics>`\n\t\t: parts.presentation;\n\treturn `<math display=\"${display}\"${altAttr}>${body}</math>`;\n}\n\n/** Reads the embedded LaTeX source from a `<math>` string, if present. */\nexport function extractTexAnnotation(mathml: string): string | undefined {\n\tconst match: RegExpMatchArray | null = mathml.match(\n\t\t/<annotation\\b[^>]*\\bencoding=[\"']application\\/x-tex[\"'][^>]*>([\\s\\S]*?)<\\/annotation>/i,\n\t);\n\tif (!match || match[1] === undefined) return undefined;\n\treturn unescapeEntities(match[1]).trim();\n}\n\n/** Returns true when the `<math>` root declares `display=\"block\"`. */\nexport function isDisplayMath(mathml: string): boolean {\n\treturn /<math\\b[^>]*\\bdisplay=[\"']block[\"']/i.test(mathml);\n}\n\n/** Returns the first complete `<math>…</math>` fragment in an HTML string. */\nexport function findMathElement(html: string): string | undefined {\n\treturn findAllMathElements(html)[0];\n}\n\n/** Returns every complete `<math>…</math>` fragment in an HTML string, in order. */\nexport function findAllMathElements(html: string): string[] {\n\tconst matches: RegExpMatchArray[] = [...html.matchAll(/<math\\b[^>]*>[\\s\\S]*?<\\/math>/gi)];\n\treturn matches.map((m) => m[0]);\n}\n\n/**\n * Strips editor-internal `data-block-id` attributes from a `<math>` string so the\n * stored canonical MathML stays clean. The document serializer injects block ids\n * into each block's first opening tag, which for a bare `<math>` is the math root\n * itself; that id must never become part of the persisted formula markup (it would\n * also suppress re-injection of the block's current id on the next serialization).\n */\nexport function stripBlockIds(mathml: string): string {\n\treturn mathml.replace(/^(<math\\b[^>]*?)\\s+data-block-id=(?:\"[^\"]*\"|'[^']*')/i, '$1');\n}\n\n/** Returns the canonical `<math>` with its `alttext` set to the given label. */\nexport function withAlttext(mathml: string, alt: string): string {\n\tconst stripped: string = mathml.replace(/^(<math\\b[^>]*?)\\s+alttext=[\"'][^\"']*[\"']/i, '$1');\n\tif (!alt) return stripped;\n\treturn stripped.replace(/^<math\\b/i, `<math alttext=\"${escapeAttr(alt)}\"`);\n}\n\n/**\n * Strips any `mathsize` attribute from the root `<math>` so the canonical stored\n * markup never carries a baked-in font size; the size lives solely in the node's\n * `fontSize` attribute (single source of truth). Mirrors {@link stripBlockIds}.\n */\nexport function stripMathsize(mathml: string): string {\n\treturn mathml.replace(/^(<math\\b[^>]*?)\\s+mathsize=(?:\"[^\"]*\"|'[^']*')/i, '$1');\n}\n\n/**\n * Returns the canonical `<math>` with its native `mathsize` set to `size`, the\n * idiomatic MathML way to scale a whole formula. Any existing `mathsize` is\n * replaced; an empty `size` clears it. Mirrors {@link withAlttext} so a\n * toolbar-set size that was never baked into the markup still serializes (#160).\n */\nexport function withMathsize(mathml: string, size: string): string {\n\tconst stripped: string = stripMathsize(mathml);\n\tif (!size) return stripped;\n\treturn stripped.replace(/^<math\\b/i, `<math mathsize=\"${escapeAttr(size)}\"`);\n}\n","/**\n * Shared rendering helpers for formula nodes. Turns the stored canonical\n * `<math>` string into live DOM. Used by both the inline node spec and the\n * display-math node view, so they stay consistent.\n *\n * Setting `innerHTML` with a `<math>` string makes the HTML fragment parser\n * place it in the MathML namespace (verified in Chromium). The stored value is\n * always trusted: it is either produced by our own converter or sanitized on\n * the paste path before storage.\n */\n\nimport type { FormulaAttrs } from './FormulaTypes.js';\nimport { withAlttext } from './mathml/MathMLDocument.js';\n\nconst MATH_TAG_PATTERN = /<math[\\s>]/i;\n\n/** Returns the canonical `<math>` markup with its `alttext` set from `alt`. */\nexport function mathMarkup(attrs: FormulaAttrs): string {\n\tif (!MATH_TAG_PATTERN.test(attrs.mathml)) return '';\n\treturn withAlttext(attrs.mathml, attrs.alt);\n}\n\n/**\n * Renders the formula into `host`. On malformed/empty MathML it falls back to\n * the LaTeX source (or the alt label) as plain text so a formula is never\n * silently invisible.\n */\nexport function renderFormulaInto(host: HTMLElement, attrs: FormulaAttrs): void {\n\tconst markup: string = mathMarkup(attrs);\n\tif (markup) {\n\t\thost.innerHTML = markup;\n\t\treturn;\n\t}\n\thost.textContent = attrs.latex || attrs.alt || '⊡';\n}\n\n/**\n * Applies the node's optional `fontSize` attribute to the host as a CSS\n * `font-size`. MathML scales with the inherited font size, so this resizes the\n * whole formula. An empty/missing value clears any previously set size.\n */\nexport function setFormulaFontSize(\n\thost: HTMLElement,\n\tattrs: Readonly<Record<string, unknown>> | undefined,\n): void {\n\tconst fontSize: string = typeof attrs?.fontSize === 'string' ? attrs.fontSize : '';\n\thost.style.fontSize = fontSize;\n}\n\n/** Reads formula attributes from a model node's raw attrs, with safe defaults. */\nexport function readFormulaAttrs(\n\tattrs: Readonly<Record<string, unknown>> | undefined,\n): FormulaAttrs {\n\treturn {\n\t\tmathml: typeof attrs?.mathml === 'string' ? attrs.mathml : '',\n\t\tlatex: typeof attrs?.latex === 'string' ? attrs.latex : '',\n\t\talt: typeof attrs?.alt === 'string' ? attrs.alt : '',\n\t\tfontSize: typeof attrs?.fontSize === 'string' ? attrs.fontSize : '',\n\t};\n}\n","/**\n * HTML serialization glue shared by the inline and display math node specs, so\n * both round-trip identically (issue #160).\n *\n * A formula's font size is stored as a node `fontSize` attribute. It is written\n * to HTML as the native MathML `mathsize` attribute on the `<math>` root (the\n * idiomatic way to scale a formula) and read back from there. This makes the\n * size survive `getContentHTML()` and also captures sized math pasted from\n * external tools (KaTeX, MathJax, Word all emit `mathsize`).\n */\n\nimport { isValidCSSFontSize } from '../shared/ColorValidation.js';\nimport { mathMarkup } from './FormulaRendering.js';\nimport type { FormulaAttrs } from './FormulaTypes.js';\nimport {\n\textractTexAnnotation,\n\tstripBlockIds,\n\tstripMathsize,\n\twithMathsize,\n} from './mathml/MathMLDocument.js';\n\n/**\n * The exportable `<math>` HTML for a formula, with its font size carried as the\n * native `mathsize` attribute. Returns `''` when the formula has no valid markup.\n */\nexport function formulaToHTMLString(attrs: FormulaAttrs): string {\n\tconst markup: string = mathMarkup(attrs);\n\tif (!markup) return markup;\n\treturn withMathsize(markup, isValidCSSFontSize(attrs.fontSize) ? attrs.fontSize : '');\n}\n\n/** The validated CSS font size carried by a `<math>` element's `mathsize`, or `''`. */\nexport function readFormulaFontSize(el: Element): string {\n\tconst raw: string = el.getAttribute('mathsize') ?? '';\n\treturn isValidCSSFontSize(raw) ? raw : '';\n}\n\n/**\n * Reads canonical formula attributes (`mathml`, `latex`, `alt`, `fontSize`) from\n * a `<math>` element. Returns `false` when the element's display kind does not\n * match `expectDisplay`, so the inline spec yields to the display spec and vice\n * versa. The `mathsize` is lifted into `fontSize` and stripped from the stored\n * `mathml` (single source of truth).\n */\nexport function parseFormulaElement(\n\tel: HTMLElement,\n\texpectDisplay: boolean,\n): Record<string, string> | false {\n\tif ((el.getAttribute('display') === 'block') !== expectDisplay) return false;\n\tconst mathml: string = stripMathsize(stripBlockIds(el.outerHTML));\n\treturn {\n\t\tmathml,\n\t\tlatex: extractTexAnnotation(mathml) ?? '',\n\t\talt: el.getAttribute('alttext') ?? '',\n\t\tfontSize: readFormulaFontSize(el),\n\t};\n}\n","/**\n * Shared types, attribute registry augmentation, and configuration for the\n * formula plugin (inline + display math). Layer B (notectl glue).\n */\n\nimport type { FontDefinition } from '../font/FontPlugin.js';\nimport type { FormulaLocale } from './FormulaLocale.js';\n\n/** Inline math node type name (atomic InlineNode, width 1, contenteditable=false). */\nexport const INLINE_MATH_TYPE = 'math_inline';\n\n/** Display math node type name (selectable void block on its own line). */\nexport const DISPLAY_MATH_TYPE = 'math_display';\n\n/**\n * Attributes stored on every formula node. The canonical `mathml` carries the\n * LaTeX source as a TeX annotation; `latex` duplicates it for cheap re-editing\n * and `alt` is the accessible fallback label (rendered as native `alttext`).\n */\nexport interface FormulaAttrs {\n\treadonly mathml: string;\n\treadonly latex: string;\n\treadonly alt: string;\n\t/** CSS font-size for the whole formula (e.g. `'24px'`); empty string inherits. */\n\treadonly fontSize: string;\n}\n\n// --- Attribute Registry Augmentation (typed, branded) ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface InlineNodeAttrRegistry {\n\t\tmath_inline: { mathml: string; latex: string; alt: string; fontSize: string };\n\t}\n\tinterface NodeAttrRegistry {\n\t\tmath_display: { mathml: string; latex: string; alt: string; fontSize: string };\n\t}\n}\n\n// --- Keyboard Bindings ---\n\nexport interface FormulaKeymap {\n\t/** Insert/open an inline formula. */\n\treadonly insertInline?: string | null;\n\t/** Insert/open a display (block) formula. */\n\treadonly insertDisplay?: string | null;\n}\n\nexport const DEFAULT_FORMULA_KEYMAP: Readonly<Record<keyof FormulaKeymap, string>> = {\n\tinsertInline: 'Mod-Shift-E',\n\tinsertDisplay: 'Mod-Shift-M',\n};\n\n/** Preset px sizes offered by the formula editor's size control. */\nexport const DEFAULT_FORMULA_FONT_SIZES: readonly number[] = [12, 16, 20, 24, 32, 40, 48, 64, 96];\n\n// --- Configuration ---\n\nexport interface FormulaPluginConfig {\n\t/** Locale override for user-facing strings. */\n\treadonly locale?: FormulaLocale;\n\t/** Keyboard shortcut overrides. */\n\treadonly keymap?: FormulaKeymap;\n\t/**\n\t * Preset px sizes shown in the formula editor's size control. Pass an empty\n\t * array to hide the control. Defaults to {@link DEFAULT_FORMULA_FONT_SIZES}.\n\t */\n\treadonly fontSizes?: readonly number[];\n\t/**\n\t * Optional OpenType MATH font, registered as `@font-face` for correct\n\t * stretchy rendering in Chromium. Import `NOTECTL_MATH_FONT` from\n\t * `@notectl/core/fonts`. Opt-in to keep the font payload out of the bundle.\n\t */\n\treadonly mathFont?: FontDefinition;\n}\n\nexport const DEFAULT_FORMULA_CONFIG: FormulaPluginConfig = {};\n","/**\n * MathML tag and attribute allowlists for DOMPurify sanitization.\n *\n * Layer A (framework-agnostic, zero notectl imports). These constants feed the\n * `sanitize` config of the formula node specs so pasted/serialized `<math>`\n * survives the editor's additive DOMPurify allowlist.\n *\n * Verified in a real browser (Chromium): passing these as `ALLOWED_TAGS` /\n * `ALLOWED_ATTR` preserves MathML through `DOMPurify.sanitize()`.\n */\n\n/** MathML element names allowed through sanitization. */\nexport const MATHML_TAGS: readonly string[] = [\n\t'math',\n\t'semantics',\n\t'annotation',\n\t// NOTE: `annotation-xml` is deliberately NOT allowed. Our converter never\n\t// emits it (the TeX source rides in a plain `<annotation>`), and\n\t// `<annotation-xml encoding=\"text/html\">` is an HTML integration point — the\n\t// classic MathML mutation-XSS surface once the stored string is re-parsed via\n\t// `innerHTML`. Excluding it removes the surface entirely with no feature loss.\n\t'mrow',\n\t'mi',\n\t'mn',\n\t'mo',\n\t'mtext',\n\t'ms',\n\t'mspace',\n\t'mfrac',\n\t'msqrt',\n\t'mroot',\n\t'msup',\n\t'msub',\n\t'msubsup',\n\t'mover',\n\t'munder',\n\t'munderover',\n\t'mmultiscripts',\n\t'mprescripts',\n\t'none',\n\t'mtable',\n\t'mtr',\n\t'mlabeledtr',\n\t'mtd',\n\t'mpadded',\n\t'mphantom',\n\t'mstyle',\n\t'merror',\n\t'menclose',\n\t'mfenced',\n\t'maction',\n];\n\n/** MathML attributes allowed through sanitization (DOMPurify allows attrs globally). */\nexport const MATHML_ATTRS: readonly string[] = [\n\t'display',\n\t'encoding',\n\t'mathvariant',\n\t'mathsize',\n\t'mathcolor',\n\t'mathbackground',\n\t'displaystyle',\n\t'scriptlevel',\n\t'scriptminsize',\n\t'scriptsizemultiplier',\n\t'stretchy',\n\t'symmetric',\n\t'largeop',\n\t'movablelimits',\n\t'accent',\n\t'accentunder',\n\t'form',\n\t'fence',\n\t'separator',\n\t'lspace',\n\t'rspace',\n\t'voffset',\n\t'minsize',\n\t'maxsize',\n\t'linethickness',\n\t'columnalign',\n\t'rowalign',\n\t'columnspacing',\n\t'rowspacing',\n\t'columnlines',\n\t'rowlines',\n\t'columnspan',\n\t'rowspan',\n\t'align',\n\t'open',\n\t'close',\n\t'separators',\n\t'notation',\n\t'alttext',\n\t'depth',\n\t'width',\n\t'height',\n];\n","/**\n * Display math node spec: a selectable void block rendering native `<math\n * display=\"block\">` on its own line. Mirrors the inline spec's serialization\n * and sanitize, but as a block-level node (reference: horizontal-rule + image).\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport type { NodeSpec } from '../../model/NodeSpec.js';\nimport { createBlockElement } from '../../view/DomUtils.js';\nimport { readFormulaAttrs, renderFormulaInto, setFormulaFontSize } from './FormulaRendering.js';\nimport { formulaToHTMLString, parseFormulaElement } from './FormulaSerialization.js';\nimport { DISPLAY_MATH_TYPE } from './FormulaTypes.js';\nimport { MATHML_ATTRS, MATHML_TAGS } from './mathml/MathMLSanitize.js';\n\n/** Builds the display math `NodeSpec` (selectable void block). */\nexport function createDisplayMathNodeSpec(): NodeSpec<typeof DISPLAY_MATH_TYPE> {\n\treturn {\n\t\ttype: DISPLAY_MATH_TYPE,\n\t\tgroup: 'block',\n\t\tisVoid: true,\n\t\tselectable: true,\n\t\tattrs: {\n\t\t\tmathml: { default: '' },\n\t\t\tlatex: { default: '' },\n\t\t\talt: { default: '' },\n\t\t\tfontSize: { default: '' },\n\t\t},\n\t\ttoDOM(node): HTMLElement {\n\t\t\tconst host: HTMLElement = createBlockElement('div', node.id);\n\t\t\thost.className = 'notectl-math notectl-math--display';\n\t\t\thost.setAttribute('data-void', 'true');\n\t\t\thost.setAttribute('data-selectable', 'true');\n\t\t\trenderFormulaInto(host, readFormulaAttrs(node.attrs));\n\t\t\tsetFormulaFontSize(host, node.attrs);\n\t\t\treturn host;\n\t\t},\n\t\ttoHTML(node: BlockNode): string {\n\t\t\treturn formulaToHTMLString(readFormulaAttrs(node.attrs));\n\t\t},\n\t\tparseHTML: [\n\t\t\t{\n\t\t\t\ttag: 'math',\n\t\t\t\tgetAttrs: (el: HTMLElement): Record<string, unknown> | false =>\n\t\t\t\t\tparseFormulaElement(el, true),\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: [...MATHML_TAGS], attrs: [...MATHML_ATTRS] },\n\t};\n}\n","/**\n * NodeView for display math: renders the block, shows a selection ring when the\n * void block is node-selected (keyboard via gap-cursor, or mouse), and opens the\n * edit overlay on double-click. Mirrors the image plugin's selection pattern.\n */\n\nimport type { BlockNode } from '../../model/Document.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport { createBlockElement } from '../../view/DomUtils.js';\nimport type { NodeView, NodeViewFactory } from '../../view/NodeView.js';\nimport { readFormulaAttrs, renderFormulaInto, setFormulaFontSize } from './FormulaRendering.js';\nimport { DISPLAY_MATH_TYPE } from './FormulaTypes.js';\n\n/** Dependencies the display-math NodeView needs from the plugin (Layer B) glue. */\nexport interface DisplayMathNodeViewDeps {\n\t/** Opens the edit overlay for the display formula at `blockId`. */\n\treadonly onEdit: (blockId: BlockId, rect: DOMRect) => void;\n\t/** Announces (to screen readers) that a display formula became selected. */\n\treadonly onSelect: () => void;\n}\n\n/** Builds a NodeView factory for display math, wiring double-click to edit and selection announcements. */\nexport function createDisplayMathNodeViewFactory(deps: DisplayMathNodeViewDeps): NodeViewFactory {\n\treturn (node: BlockNode): NodeView => {\n\t\tlet currentId: BlockId = node.id;\n\t\tlet selected = false;\n\t\tconst dom: HTMLElement = createBlockElement('div', node.id);\n\t\tdom.className = 'notectl-math notectl-math--display';\n\t\tdom.setAttribute('data-void', 'true');\n\t\tdom.setAttribute('data-selectable', 'true');\n\t\trenderFormulaInto(dom, readFormulaAttrs(node.attrs));\n\t\tsetFormulaFontSize(dom, node.attrs);\n\n\t\tdom.addEventListener('dblclick', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\tdeps.onEdit(currentId, dom.getBoundingClientRect());\n\t\t});\n\n\t\treturn {\n\t\t\tdom,\n\t\t\tcontentDOM: null,\n\t\t\tupdate(updated: BlockNode): boolean {\n\t\t\t\tif (updated.type !== DISPLAY_MATH_TYPE) return false;\n\t\t\t\tcurrentId = updated.id;\n\t\t\t\tdom.setAttribute('data-block-id', updated.id);\n\t\t\t\trenderFormulaInto(dom, readFormulaAttrs(updated.attrs));\n\t\t\t\tsetFormulaFontSize(dom, updated.attrs);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tselectNode(): void {\n\t\t\t\tdom.classList.add('notectl-math--selected');\n\t\t\t\t// Reconcile can re-assert selection on the same node; announce only on\n\t\t\t\t// the transition into selection so screen-reader users are not spammed.\n\t\t\t\tif (selected) return;\n\t\t\t\tselected = true;\n\t\t\t\tdeps.onSelect();\n\t\t\t},\n\t\t\tdeselectNode(): void {\n\t\t\t\tdom.classList.remove('notectl-math--selected');\n\t\t\t\tselected = false;\n\t\t\t},\n\t\t};\n\t};\n}\n","/**\n * Helpers that map a clicked/selected/adjacent formula in the DOM or model back\n * to a {@link FormulaEditTarget} the overlay can edit. Inline DOM→offset mapping\n * reuses the editor's own `domPositionToState` resolver rather than re-deriving it.\n */\n\nimport { getInlineChildren, isInlineNode, walkInlineContent } from '../../model/Document.js';\nimport { isCollapsed, isNodeSelection, isTextSelection } from '../../model/Selection.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport { domPositionToState } from '../../view/SelectionSync.js';\nimport type { FormulaEditTarget } from './FormulaOverlay.js';\nimport { readFormulaAttrs } from './FormulaRendering.js';\nimport { DISPLAY_MATH_TYPE, type FormulaAttrs, INLINE_MATH_TYPE } from './FormulaTypes.js';\n\n/** Returns the inline math node's attributes at `offset` within a block, if any. */\nfunction inlineMathAt(state: EditorState, blockId: BlockId, offset: number): FormulaAttrs | null {\n\tconst block = state.getBlock(blockId);\n\tif (!block) return null;\n\tfor (const { child, from } of walkInlineContent(getInlineChildren(block))) {\n\t\tif (from === offset && isInlineNode(child) && child.inlineType === INLINE_MATH_TYPE) {\n\t\t\treturn readFormulaAttrs(child.attrs);\n\t\t}\n\t}\n\treturn null;\n}\n\n/** Builds an edit target from a clicked inline math element. */\nexport function inlineEditTargetFromElement(\n\tcontainer: HTMLElement,\n\telement: HTMLElement,\n\tstate: EditorState,\n): FormulaEditTarget | null {\n\tconst pos = domPositionToState(container, element, 0);\n\tif (!pos) return null;\n\tconst attrs = inlineMathAt(state, pos.blockId, pos.offset);\n\tif (!attrs) return null;\n\treturn {\n\t\tkind: 'inline',\n\t\tblockId: pos.blockId,\n\t\toffset: pos.offset,\n\t\tlatex: attrs.latex,\n\t\talt: attrs.alt,\n\t\tfontSize: attrs.fontSize,\n\t\trect: element.getBoundingClientRect(),\n\t};\n}\n\n/** Builds an edit target for a display math block. */\nexport function displayEditTarget(\n\tstate: EditorState,\n\tblockId: BlockId,\n\trect: DOMRect | null,\n): FormulaEditTarget | null {\n\tconst block = state.getBlock(blockId);\n\tif (!block || block.type !== DISPLAY_MATH_TYPE) return null;\n\tconst attrs = readFormulaAttrs(block.attrs);\n\tconst path = state.getNodePath(blockId) ?? [blockId];\n\treturn {\n\t\tkind: 'display',\n\t\tpath,\n\t\tlatex: attrs.latex,\n\t\talt: attrs.alt,\n\t\tfontSize: attrs.fontSize,\n\t\trect,\n\t};\n}\n\n/** When the collapsed caret sits next to an inline formula, returns its edit target. */\nexport function adjacentInlineEditTarget(state: EditorState): FormulaEditTarget | null {\n\tconst sel = state.selection;\n\tif (!isTextSelection(sel) || !isCollapsed(sel)) return null;\n\tconst blockId = sel.anchor.blockId;\n\tconst block = state.getBlock(blockId);\n\tif (!block) return null;\n\tconst cursor = sel.anchor.offset;\n\tfor (const { child, from, to } of walkInlineContent(getInlineChildren(block))) {\n\t\tif (!isInlineNode(child) || child.inlineType !== INLINE_MATH_TYPE) continue;\n\t\tif (to === cursor || from === cursor) {\n\t\t\tconst attrs = readFormulaAttrs(child.attrs);\n\t\t\treturn {\n\t\t\t\tkind: 'inline',\n\t\t\t\tblockId,\n\t\t\t\toffset: from,\n\t\t\t\tlatex: attrs.latex,\n\t\t\t\talt: attrs.alt,\n\t\t\t\tfontSize: attrs.fontSize,\n\t\t\t\trect: null,\n\t\t\t};\n\t\t}\n\t}\n\treturn null;\n}\n\n/** Returns the selected display-math block id when a NodeSelection targets one. */\nexport function selectedDisplayBlockId(state: EditorState): BlockId | null {\n\tconst sel = state.selection;\n\tif (!isNodeSelection(sel)) return null;\n\tconst block = state.getBlock(sel.nodeId);\n\tif (!block || block.type !== DISPLAY_MATH_TYPE) return null;\n\treturn sel.nodeId;\n}\n","/**\n * Insert/update commands for formula nodes. These take already-built canonical\n * attributes (`mathml` + `latex` + `alt`); the authoring UI and input rules are\n * responsible for producing them via the LaTeX converter. Undo/redo come for\n * free from the transaction system.\n */\n\nimport { insertBlockObjectsOnOwnLines } from '../../commands/BlockInsertion.js';\nimport { resolveInsertPoint } from '../../commands/CommandHelpers.js';\nimport { addDeleteSelectionSteps } from '../../commands/Commands.js';\nimport { createBlockNode, createInlineNode } from '../../model/Document.js';\nimport {\n\tcreateCollapsedSelection,\n\tcreateNodeSelection,\n\tisCollapsed,\n\tisTextSelection,\n} from '../../model/Selection.js';\nimport { type BlockId, inlineType, nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction, TransactionBuilder } from '../../state/Transaction.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { getSelectedBlockId } from '../shared/PluginHelpers.js';\nimport type { FormulaLocale } from './FormulaLocale.js';\nimport { DISPLAY_MATH_TYPE, type FormulaAttrs, INLINE_MATH_TYPE } from './FormulaTypes.js';\nimport type { MathFieldResult } from './math-field/index.js';\n\nfunction toNodeAttrs(attrs: FormulaAttrs): Record<string, string> {\n\treturn { mathml: attrs.mathml, latex: attrs.latex, alt: attrs.alt, fontSize: attrs.fontSize };\n}\n\n/**\n * Builds a transaction inserting one or more inline math nodes at the cursor,\n * replacing any range selection. The nodes are placed back to back in document\n * order, the cursor lands after the last one. Used both for a single inline\n * formula and for pasting a run of standalone inline formulas (#159).\n */\nexport function buildInsertInlineFormulasTr(\n\tstate: EditorState,\n\tformulas: readonly FormulaAttrs[],\n): Transaction | null {\n\tconst sel = state.selection;\n\tif (formulas.length === 0 || !isTextSelection(sel)) return null;\n\n\tconst builder = state.transaction('command');\n\n\tconst landingId: BlockId | undefined = isCollapsed(sel)\n\t\t? undefined\n\t\t: addDeleteSelectionSteps(state, builder);\n\n\tlet targetId: BlockId;\n\tlet offset: number;\n\tif (landingId) {\n\t\ttargetId = landingId;\n\t\toffset = 0;\n\t} else {\n\t\tconst insertPoint = resolveInsertPoint(sel, state.getBlockOrder());\n\t\ttargetId = insertPoint.blockId;\n\t\toffset = insertPoint.offset;\n\t}\n\n\tfor (const attrs of formulas) {\n\t\tbuilder.insertInlineNode(\n\t\t\ttargetId,\n\t\t\toffset,\n\t\t\tcreateInlineNode(inlineType(INLINE_MATH_TYPE), toNodeAttrs(attrs)),\n\t\t);\n\t\toffset += 1;\n\t}\n\tbuilder.setSelection(createCollapsedSelection(targetId, offset));\n\n\treturn builder.build();\n}\n\n/** Builds a transaction inserting an inline math node at the cursor (replacing a range). */\nexport function buildInsertInlineMathTr(\n\tstate: EditorState,\n\tattrs: FormulaAttrs,\n): Transaction | null {\n\treturn buildInsertInlineFormulasTr(state, [attrs]);\n}\n\n/**\n * Appends the steps that place a display-math block, followed by a trailing empty\n * paragraph, at top-level index `insertAt`, then selects the new block. Shared by\n * the insert command and the `$$…$$` input rule so a display equation always has\n * a paragraph after it and both entry points behave identically.\n */\nexport function appendDisplayMathSteps(\n\tbuilder: TransactionBuilder,\n\tinsertAt: number,\n\tattrs: FormulaAttrs,\n): void {\n\tconst block = createBlockNode(nodeType(DISPLAY_MATH_TYPE), [], undefined, toNodeAttrs(attrs));\n\tconst trailing = createBlockNode(nodeType('paragraph'));\n\tbuilder\n\t\t.insertNode([], insertAt, block)\n\t\t.insertNode([], insertAt + 1, trailing)\n\t\t.setSelection(createNodeSelection(block.id, []));\n}\n\n/**\n * Builds a transaction placing one or more display math blocks on their own\n * lines at the cursor, sharing a single trailing paragraph; the last block is\n * node-selected. Used both for a single display formula and for pasting a run of\n * standalone formulas where at least one is display (#159).\n */\nexport function buildInsertDisplayFormulasTr(\n\tstate: EditorState,\n\tformulas: readonly FormulaAttrs[],\n): Transaction | null {\n\tconst anchorId: BlockId | undefined = getSelectedBlockId(state);\n\tif (formulas.length === 0 || !anchorId) return null;\n\n\tconst blocks = formulas.map((attrs) =>\n\t\tcreateBlockNode(nodeType(DISPLAY_MATH_TYPE), [], undefined, toNodeAttrs(attrs)),\n\t);\n\tconst builder: TransactionBuilder = state.transaction('command');\n\tconst trailing = insertBlockObjectsOnOwnLines(state, builder, anchorId, blocks);\n\tif (!trailing) return null;\n\n\tconst last = blocks[blocks.length - 1];\n\tif (!last) return null;\n\tbuilder.setSelection(createNodeSelection(last.id, []));\n\treturn builder.build();\n}\n\n/** Builds a transaction placing a display math block on its own line at the cursor. */\nexport function buildInsertDisplayMathTr(\n\tstate: EditorState,\n\tattrs: FormulaAttrs,\n): Transaction | null {\n\treturn buildInsertDisplayFormulasTr(state, [attrs]);\n}\n\n/** Inserts an inline math node at the current cursor, replacing any range selection. */\nexport function insertInlineMath(context: PluginContext, attrs: FormulaAttrs): boolean {\n\tconst tr = buildInsertInlineMathTr(context.getState(), attrs);\n\tif (!tr) return false;\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Inserts a display (block) math node on its own line after the current block. */\nexport function insertDisplayMath(context: PluginContext, attrs: FormulaAttrs): boolean {\n\tconst tr = buildInsertDisplayMathTr(context.getState(), attrs);\n\tif (!tr) return false;\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Updates the attributes of the inline math node at the given position. */\nexport function updateInlineMath(\n\tcontext: PluginContext,\n\tblockId: BlockId,\n\toffset: number,\n\tattrs: FormulaAttrs,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tconst tr = state\n\t\t.transaction('command')\n\t\t.setInlineNodeAttr(blockId, offset, toNodeAttrs(attrs))\n\t\t.build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Updates the attributes of the display math block at the given path. */\nexport function updateDisplayMath(\n\tcontext: PluginContext,\n\tpath: readonly BlockId[],\n\tattrs: FormulaAttrs,\n): boolean {\n\tconst state: EditorState = context.getState();\n\tconst tr = state.transaction('command').setNodeAttr(path, toNodeAttrs(attrs)).build();\n\tcontext.dispatch(tr);\n\treturn true;\n}\n\n/** Maps a committed math-field result onto formula node attributes. */\nexport function resultToFormulaAttrs(result: MathFieldResult): FormulaAttrs {\n\treturn {\n\t\tmathml: result.mathml,\n\t\tlatex: result.latex,\n\t\talt: result.alt,\n\t\tfontSize: result.fontSize,\n\t};\n}\n\n/**\n * Inserts a freshly committed formula at the selection — a display block or an\n * inline node per the field's toggle — and announces it. Shared by the toolbar\n * popup and the floating overlay so the insert-commit path is defined once.\n */\nexport function commitInsertFormula(\n\tcontext: PluginContext,\n\tlocale: FormulaLocale,\n\tresult: MathFieldResult,\n): void {\n\tconst attrs: FormulaAttrs = resultToFormulaAttrs(result);\n\tif (result.display) insertDisplayMath(context, attrs);\n\telse insertInlineMath(context, attrs);\n\tcontext.announce(locale.inserted);\n}\n","/**\n * Shared types for the LaTeX recursive-descent parser.\n *\n * Layer A (framework-agnostic, zero notectl imports). Defines the atom model\n * (the unit of the parse, carrying its MathML markup plus metadata needed for\n * script and limit placement) and the parser-facing interfaces used by the\n * per-category command handlers.\n */\n\nimport type { SymbolKind } from './LatexSymbols.js';\nimport type { LatexError } from './LatexToMathML.js';\nimport type { Token } from './LatexTokenizer.js';\n\n/**\n * A single parsed atom. The parser accumulates a list of these per group so\n * `^`/`_`/`'` can attach to the *preceding* atom and big-operator limit\n * placement can key off the atom's kind.\n */\nexport interface Atom {\n\t/** The MathML markup for this atom (already built via the builder). */\n\treadonly node: string;\n\t/** Symbol kind, when the atom came from a known symbol; drives limits. */\n\treadonly kind?: SymbolKind;\n\t/** True when this atom is a big operator that takes movable limits. */\n\treadonly bigOp?: boolean;\n\t/** True for integral-family operators, whose limits stay as side scripts. */\n\treadonly intLike?: boolean;\n}\n\n/** Builds a plain ordinary atom from finished markup. */\nexport function atom(node: string, kind?: SymbolKind): Atom {\n\treturn kind === undefined ? { node } : { node, kind };\n}\n\n/**\n * Builds a big-operator atom (∑, ∫, lim, …) that accepts movable limits.\n * `intLike` marks integral-family operators whose limits stay as side scripts\n * even in display mode (standard typographic convention).\n */\nexport function bigOpAtom(node: string, kind: SymbolKind, intLike = false): Atom {\n\treturn { node, kind, bigOp: true, intLike };\n}\n\n/**\n * Parser surface exposed to per-category command handlers. Keeps handlers free\n * of the concrete parser class so they stay small and independently testable.\n */\nexport interface ParserApi {\n\t/** Whether display (block) style is active; affects limit placement. */\n\treadonly display: boolean;\n\t/** Returns the next token without consuming it, or undefined at EOF. */\n\tpeek(): Token | undefined;\n\t/** Consumes and returns the next token, or undefined at EOF. */\n\tnext(): Token | undefined;\n\t/**\n\t * Parses one mandatory argument (a `{...}` group or a single token) and\n\t * returns its MathML markup. At EOF returns `''` (graceful recovery).\n\t */\n\tparseArgument(): string;\n\t/**\n\t * Parses an optional bracketed argument `[...]` if present, returning its\n\t * markup, or undefined when the next token is not `[`.\n\t */\n\tparseOptionalArgument(): string | undefined;\n\t/**\n\t * Parses one mandatory argument as literal source text (no math markup),\n\t * used by `\\text`/`\\operatorname`. At EOF returns `''`.\n\t */\n\tparseRawArgument(): string;\n\t/**\n\t * Parses tokens until the matching group close (or a custom stop), returning\n\t * the assembled atoms. Used for environment cells and delimiter bodies.\n\t */\n\tparseAtomsUntil(stop: (token: Token) => boolean): readonly Atom[];\n\t/** Records a recoverable error. */\n\terror(err: LatexError): void;\n}\n","/**\n * LaTeX symbol and command lookup tables for the zero-dependency converter.\n *\n * Layer A (framework-agnostic, zero notectl imports). Maps each supported LaTeX\n * command to the real Unicode character it produces plus a `kind` that drives\n * the choice of MathML element (`mi` vs `mo`, stretchy fences, big-operator\n * limit placement, upright function names).\n *\n * Supported commands by category (curated subset):\n *\n * - Greek letters (lowercase): \\alpha \\beta \\gamma \\delta \\epsilon \\varepsilon\n * \\zeta \\eta \\theta \\vartheta \\iota \\kappa \\lambda \\mu \\nu \\xi \\pi \\varpi \\rho\n * \\varrho \\sigma \\varsigma \\tau \\upsilon \\phi \\varphi \\chi \\psi \\omega\n * - Greek letters (uppercase): \\Gamma \\Delta \\Theta \\Lambda \\Xi \\Pi \\Sigma\n * \\Upsilon \\Phi \\Psi \\Omega\n * - Named functions (upright mi): \\sin \\cos \\tan \\cot \\sec \\csc \\sinh \\cosh\n * \\tanh \\coth \\arcsin \\arccos \\arctan \\log \\ln \\lg \\exp \\deg \\det \\dim \\hom\n * \\ker \\arg \\Pr\n * - Big operators with limits: \\sum \\prod \\coprod \\int \\iint \\iiint \\oint\n * \\bigcup \\bigcap \\bigsqcup \\bigvee \\bigwedge \\bigoplus \\bigotimes \\bigodot\n * \\biguplus \\lim \\limsup \\liminf \\max \\min \\sup \\inf \\gcd \\injlim \\projlim\n * - Binary operators: \\times \\div \\pm \\mp \\cdot \\ast \\star \\circ \\bullet \\oplus\n * \\ominus \\otimes \\oslash \\odot \\cap \\cup \\uplus \\sqcap \\sqcup \\wedge \\vee\n * \\setminus \\wr \\diamond \\bigtriangleup \\bigtriangledown \\triangleleft\n * \\triangleright \\amalg \\dagger \\ddagger \\cdot\n * - Relations: \\leq \\le \\geq \\ge \\neq \\ne \\equiv \\sim \\simeq \\cong \\approx\n * \\propto \\prec \\succ \\preceq \\succeq \\ll \\gg \\subset \\supset \\subseteq\n * \\supseteq \\sqsubseteq \\sqsupseteq \\in \\ni \\notin \\mid \\parallel \\perp\n * \\models \\vdash \\dashv \\doteq \\asymp \\bowtie \\smile \\frown \\lll \\ggg \\ne\n * \\subsetneq \\supsetneq\n * - Arrows: \\leftarrow \\rightarrow \\to \\gets \\leftrightarrow \\Leftarrow\n * \\Rightarrow \\Leftrightarrow \\mapsto \\longrightarrow \\longleftarrow\n * \\longleftrightarrow \\Longrightarrow \\Longleftarrow \\Longleftrightarrow\n * \\uparrow \\downarrow \\updownarrow \\nearrow \\searrow \\swarrow \\nwarrow\n * \\hookleftarrow \\hookrightarrow \\rightharpoonup \\rightharpoondown\n * \\leftharpoonup \\leftharpoondown \\implies \\iff \\nleftarrow \\nrightarrow\n * - Delimiters (used bare and by \\left/\\right): ( ) [ ] \\{ \\} \\langle \\rangle\n * \\lceil \\rceil \\lfloor \\rfloor \\lvert \\rvert \\lVert \\rVert \\vert \\Vert\n * \\lbrace \\rbrace \\lbrack \\rbrack \\| \\backslash\n * - Misc ordinary symbols: \\infty \\partial \\nabla \\forall \\exists \\nexists\n * \\emptyset \\varnothing \\aleph \\hbar \\ell \\Re \\Im \\wp \\prime \\angle \\triangle\n * \\neg \\lnot \\top \\bot \\flat \\natural \\sharp \\clubsuit \\diamondsuit\n * \\heartsuit \\spadesuit \\surd \\cdots \\ldots \\vdots \\ddots \\dots \\dotsb\n * \\square \\blacksquare \\bigstar \\complement \\degree \\checkmark\n * - Punctuation operators: \\colon \\cdotp \\ldotp\n *\n * Accents, fonts/styles, spacing, fractions, roots, big-op limit logic, and\n * environments are handled in the parser, not these tables.\n */\n\n/** How a symbol maps onto MathML markup. */\nexport enum SymbolKind {\n\t/** Ordinary atom: rendered as `<mi>` (variable-like). */\n\tOrdinary = 'ordinary',\n\t/** Binary operator: `<mo>` (e.g. + × ∪). */\n\tBinary = 'binary',\n\t/** Relation: `<mo>` (e.g. = ≤ ∈). */\n\tRelation = 'relation',\n\t/** Arrow: `<mo>`, treated like a relation for spacing. */\n\tArrow = 'arrow',\n\t/** Opening fence: `<mo fence=\"true\">`. */\n\tOpen = 'open',\n\t/** Closing fence: `<mo fence=\"true\">`. */\n\tClose = 'close',\n\t/** Named function (e.g. sin, log): upright multi-letter `<mi>`. */\n\tFunction = 'function',\n\t/** Big operator with limits (e.g. ∑ ∫ lim): `<mo>` with movable limits. */\n\tBigOp = 'bigop',\n\t/** Punctuation: `<mo>` (e.g. comma-like separators). */\n\tPunct = 'punct',\n}\n\n/** A resolved symbol: the Unicode glyph plus how to render it. */\nexport interface SymbolEntry {\n\t/** The literal Unicode character(s); never pre-escaped (the builder escapes). */\n\treadonly char: string;\n\t/** How the symbol maps onto a MathML element. */\n\treadonly kind: SymbolKind;\n}\n\nfunction entry(char: string, kind: SymbolKind): SymbolEntry {\n\treturn { char, kind };\n}\n\nconst O = SymbolKind.Ordinary;\nconst B = SymbolKind.Binary;\nconst R = SymbolKind.Relation;\nconst A = SymbolKind.Arrow;\nconst FN = SymbolKind.Function;\nconst BIG = SymbolKind.BigOp;\nconst P = SymbolKind.Punct;\n\nconst GREEK: Readonly<Record<string, SymbolEntry>> = {\n\talpha: entry('α', O),\n\tbeta: entry('β', O),\n\tgamma: entry('γ', O),\n\tdelta: entry('δ', O),\n\tepsilon: entry('ϵ', O),\n\tvarepsilon: entry('ε', O),\n\tzeta: entry('ζ', O),\n\teta: entry('η', O),\n\ttheta: entry('θ', O),\n\tvartheta: entry('ϑ', O),\n\tiota: entry('ι', O),\n\tkappa: entry('κ', O),\n\tlambda: entry('λ', O),\n\tmu: entry('μ', O),\n\tnu: entry('ν', O),\n\txi: entry('ξ', O),\n\tomicron: entry('ο', O),\n\tpi: entry('π', O),\n\tvarpi: entry('ϖ', O),\n\trho: entry('ρ', O),\n\tvarrho: entry('ϱ', O),\n\tsigma: entry('σ', O),\n\tvarsigma: entry('ς', O),\n\ttau: entry('τ', O),\n\tupsilon: entry('υ', O),\n\tphi: entry('ϕ', O),\n\tvarphi: entry('φ', O),\n\tchi: entry('χ', O),\n\tpsi: entry('ψ', O),\n\tomega: entry('ω', O),\n\tGamma: entry('Γ', O),\n\tDelta: entry('Δ', O),\n\tTheta: entry('Θ', O),\n\tLambda: entry('Λ', O),\n\tXi: entry('Ξ', O),\n\tPi: entry('Π', O),\n\tSigma: entry('Σ', O),\n\tUpsilon: entry('Υ', O),\n\tPhi: entry('Φ', O),\n\tPsi: entry('Ψ', O),\n\tOmega: entry('Ω', O),\n};\n\nconst FUNCTIONS: Readonly<Record<string, SymbolEntry>> = {\n\tsin: entry('sin', FN),\n\tcos: entry('cos', FN),\n\ttan: entry('tan', FN),\n\tcot: entry('cot', FN),\n\tsec: entry('sec', FN),\n\tcsc: entry('csc', FN),\n\tsinh: entry('sinh', FN),\n\tcosh: entry('cosh', FN),\n\ttanh: entry('tanh', FN),\n\tcoth: entry('coth', FN),\n\tarcsin: entry('arcsin', FN),\n\tarccos: entry('arccos', FN),\n\tarctan: entry('arctan', FN),\n\tlog: entry('log', FN),\n\tln: entry('ln', FN),\n\tlg: entry('lg', FN),\n\texp: entry('exp', FN),\n\tdeg: entry('deg', FN),\n\tdet: entry('det', FN),\n\tdim: entry('dim', FN),\n\thom: entry('hom', FN),\n\tker: entry('ker', FN),\n\targ: entry('arg', FN),\n\tPr: entry('Pr', FN),\n};\n\nconst BIG_OPS: Readonly<Record<string, SymbolEntry>> = {\n\tsum: entry('∑', BIG),\n\tprod: entry('∏', BIG),\n\tcoprod: entry('∐', BIG),\n\tint: entry('∫', BIG),\n\tiint: entry('∬', BIG),\n\tiiint: entry('∭', BIG),\n\toint: entry('∮', BIG),\n\tbigcup: entry('⋃', BIG),\n\tbigcap: entry('⋂', BIG),\n\tbigsqcup: entry('⨆', BIG),\n\tbigvee: entry('⋁', BIG),\n\tbigwedge: entry('⋀', BIG),\n\tbigoplus: entry('⨁', BIG),\n\tbigotimes: entry('⨂', BIG),\n\tbigodot: entry('⨀', BIG),\n\tbiguplus: entry('⨄', BIG),\n\tlim: entry('lim', BIG),\n\tlimsup: entry('lim sup', BIG),\n\tliminf: entry('lim inf', BIG),\n\tinjlim: entry('inj lim', BIG),\n\tprojlim: entry('proj lim', BIG),\n\tmax: entry('max', BIG),\n\tmin: entry('min', BIG),\n\tsup: entry('sup', BIG),\n\tinf: entry('inf', BIG),\n\tgcd: entry('gcd', BIG),\n};\n\nconst BINARY_OPS: Readonly<Record<string, SymbolEntry>> = {\n\ttimes: entry('×', B),\n\tdiv: entry('÷', B),\n\tpm: entry('±', B),\n\tmp: entry('∓', B),\n\tcdot: entry('⋅', B),\n\tast: entry('∗', B),\n\tstar: entry('⋆', B),\n\tcirc: entry('∘', B),\n\tbullet: entry('∙', B),\n\toplus: entry('⊕', B),\n\tominus: entry('⊖', B),\n\totimes: entry('⊗', B),\n\toslash: entry('⊘', B),\n\todot: entry('⊙', B),\n\tcap: entry('∩', B),\n\tcup: entry('∪', B),\n\tuplus: entry('⊎', B),\n\tsqcap: entry('⊓', B),\n\tsqcup: entry('⊔', B),\n\twedge: entry('∧', B),\n\tland: entry('∧', B),\n\tvee: entry('∨', B),\n\tlor: entry('∨', B),\n\tsetminus: entry('∖', B),\n\twr: entry('≀', B),\n\tdiamond: entry('⋄', B),\n\tbigtriangleup: entry('△', B),\n\tbigtriangledown: entry('▽', B),\n\ttriangleleft: entry('◁', B),\n\ttriangleright: entry('▷', B),\n\tamalg: entry('⨿', B),\n\tdagger: entry('†', B),\n\tddagger: entry('‡', B),\n};\n\nconst RELATIONS: Readonly<Record<string, SymbolEntry>> = {\n\tleq: entry('≤', R),\n\tle: entry('≤', R),\n\tgeq: entry('≥', R),\n\tge: entry('≥', R),\n\tneq: entry('≠', R),\n\tne: entry('≠', R),\n\tequiv: entry('≡', R),\n\tsim: entry('∼', R),\n\tsimeq: entry('≃', R),\n\tcong: entry('≅', R),\n\tapprox: entry('≈', R),\n\tpropto: entry('∝', R),\n\tprec: entry('≺', R),\n\tsucc: entry('≻', R),\n\tpreceq: entry('⪯', R),\n\tsucceq: entry('⪰', R),\n\tll: entry('≪', R),\n\tgg: entry('≫', R),\n\tlll: entry('⋘', R),\n\tggg: entry('⋙', R),\n\tsubset: entry('⊂', R),\n\tsupset: entry('⊃', R),\n\tsubseteq: entry('⊆', R),\n\tsupseteq: entry('⊇', R),\n\tsubsetneq: entry('⊊', R),\n\tsupsetneq: entry('⊋', R),\n\tsqsubseteq: entry('⊑', R),\n\tsqsupseteq: entry('⊒', R),\n\tin: entry('∈', R),\n\tni: entry('∋', R),\n\tnotin: entry('∉', R),\n\tmid: entry('∣', R),\n\tparallel: entry('∥', R),\n\tperp: entry('⊥', R),\n\tmodels: entry('⊨', R),\n\tvdash: entry('⊢', R),\n\tdashv: entry('⊣', R),\n\tdoteq: entry('≐', R),\n\tasymp: entry('≍', R),\n\tbowtie: entry('⋈', R),\n\tsmile: entry('⌣', R),\n\tfrown: entry('⌢', R),\n};\n\nconst ARROWS: Readonly<Record<string, SymbolEntry>> = {\n\tleftarrow: entry('←', A),\n\tgets: entry('←', A),\n\trightarrow: entry('→', A),\n\tto: entry('→', A),\n\tleftrightarrow: entry('↔', A),\n\tLeftarrow: entry('⇐', A),\n\tRightarrow: entry('⇒', A),\n\tLeftrightarrow: entry('⇔', A),\n\tmapsto: entry('↦', A),\n\tlongrightarrow: entry('⟶', A),\n\tlongleftarrow: entry('⟵', A),\n\tlongleftrightarrow: entry('⟷', A),\n\tLongrightarrow: entry('⟹', A),\n\tLongleftarrow: entry('⟸', A),\n\tLongleftrightarrow: entry('⟺', A),\n\timplies: entry('⟹', A),\n\tiff: entry('⟺', A),\n\tuparrow: entry('↑', A),\n\tdownarrow: entry('↓', A),\n\tupdownarrow: entry('↕', A),\n\tnearrow: entry('↗', A),\n\tsearrow: entry('↘', A),\n\tswarrow: entry('↙', A),\n\tnwarrow: entry('↖', A),\n\thookleftarrow: entry('↩', A),\n\thookrightarrow: entry('↪', A),\n\trightharpoonup: entry('⇀', A),\n\trightharpoondown: entry('⇁', A),\n\tleftharpoonup: entry('↼', A),\n\tleftharpoondown: entry('↽', A),\n\tnleftarrow: entry('↚', A),\n\tnrightarrow: entry('↛', A),\n};\n\nconst DELIMITERS: Readonly<Record<string, SymbolEntry>> = {\n\tlangle: entry('⟨', SymbolKind.Open),\n\trangle: entry('⟩', SymbolKind.Close),\n\tlceil: entry('⌈', SymbolKind.Open),\n\trceil: entry('⌉', SymbolKind.Close),\n\tlfloor: entry('⌊', SymbolKind.Open),\n\trfloor: entry('⌋', SymbolKind.Close),\n\tlbrace: entry('{', SymbolKind.Open),\n\trbrace: entry('}', SymbolKind.Close),\n\tlbrack: entry('[', SymbolKind.Open),\n\trbrack: entry(']', SymbolKind.Close),\n\tlvert: entry('|', SymbolKind.Open),\n\trvert: entry('|', SymbolKind.Close),\n\tlVert: entry('‖', SymbolKind.Open),\n\trVert: entry('‖', SymbolKind.Close),\n\tvert: entry('|', SymbolKind.Relation),\n\tVert: entry('‖', SymbolKind.Relation),\n\tbackslash: entry('\\\\', O),\n};\n\nconst MISC: Readonly<Record<string, SymbolEntry>> = {\n\tinfty: entry('∞', O),\n\tpartial: entry('∂', O),\n\tnabla: entry('∇', O),\n\tforall: entry('∀', O),\n\texists: entry('∃', O),\n\tnexists: entry('∄', O),\n\temptyset: entry('∅', O),\n\tvarnothing: entry('∅', O),\n\taleph: entry('ℵ', O),\n\tbeth: entry('ℶ', O),\n\thbar: entry('ℏ', O),\n\tell: entry('ℓ', O),\n\tRe: entry('ℜ', O),\n\tIm: entry('ℑ', O),\n\twp: entry('℘', O),\n\tprime: entry('′', O),\n\tangle: entry('∠', O),\n\tmeasuredangle: entry('∡', O),\n\ttriangle: entry('△', O),\n\tneg: entry('¬', O),\n\tlnot: entry('¬', O),\n\ttop: entry('⊤', O),\n\tbot: entry('⊥', O),\n\tflat: entry('♭', O),\n\tnatural: entry('♮', O),\n\tsharp: entry('♯', O),\n\tclubsuit: entry('♣', O),\n\tdiamondsuit: entry('♢', O),\n\theartsuit: entry('♡', O),\n\tspadesuit: entry('♠', O),\n\tsurd: entry('√', O),\n\tcomplement: entry('∁', O),\n\tsquare: entry('□', O),\n\tblacksquare: entry('■', O),\n\tbigstar: entry('★', O),\n\tcheckmark: entry('✓', O),\n\tdegree: entry('°', O),\n\tcdots: entry('⋯', O),\n\tldots: entry('…', O),\n\tdots: entry('…', O),\n\tdotsb: entry('⋯', O),\n\tvdots: entry('⋮', O),\n\tddots: entry('⋱', O),\n};\n\nconst PUNCT: Readonly<Record<string, SymbolEntry>> = {\n\tcolon: entry(':', P),\n\tcdotp: entry('·', P),\n\tldotp: entry('.', P),\n};\n\n/** All symbol commands merged into a single lookup table. */\nexport const SYMBOLS: Readonly<Record<string, SymbolEntry>> = {\n\t...GREEK,\n\t...FUNCTIONS,\n\t...BIG_OPS,\n\t...BINARY_OPS,\n\t...RELATIONS,\n\t...ARROWS,\n\t...DELIMITERS,\n\t...MISC,\n\t...PUNCT,\n};\n\n/** Returns the symbol entry for a command name (without the leading backslash). */\nexport function lookupSymbol(name: string): SymbolEntry | undefined {\n\treturn SYMBOLS[name];\n}\n\n/** Maps a single literal delimiter character to its fence kind, if it is one. */\nconst DELIMITER_CHARS: Readonly<Record<string, SymbolEntry>> = {\n\t'(': entry('(', SymbolKind.Open),\n\t')': entry(')', SymbolKind.Close),\n\t'[': entry('[', SymbolKind.Open),\n\t']': entry(']', SymbolKind.Close),\n\t'|': entry('|', SymbolKind.Relation),\n\t'/': entry('/', O),\n};\n\n/**\n * Resolves a delimiter spec (as used after `\\left`/`\\right`) to its glyph.\n * Accepts literal chars, the `.` null delimiter, and delimiter commands.\n */\nexport function resolveDelimiter(spec: string): SymbolEntry | undefined {\n\tif (spec === '.') return entry('', O);\n\tif (spec.startsWith('\\\\')) {\n\t\tconst name: string = spec.slice(1);\n\t\tif (name === '{') return entry('{', SymbolKind.Open);\n\t\tif (name === '}') return entry('}', SymbolKind.Close);\n\t\tif (name === '|') return entry('‖', SymbolKind.Relation);\n\t\tif (name === '\\\\') return entry('\\\\', O);\n\t\treturn DELIMITERS[name];\n\t}\n\treturn DELIMITER_CHARS[spec];\n}\n","/**\n * LaTeX math-mode tokenizer for the zero-dependency converter.\n *\n * Layer A (framework-agnostic, zero notectl imports). Splits a LaTeX source\n * string into a flat token list the parser consumes. Pure string work, no DOM.\n */\n\n/** The lexical category of a token. */\nexport enum TokenType {\n\t/** A `\\name` command or control symbol (e.g. `\\frac`, `\\,`, `\\{`). */\n\tCommand = 'command',\n\t/** Group open `{`. */\n\tGroupOpen = 'groupOpen',\n\t/** Group close `}`. */\n\tGroupClose = 'groupClose',\n\t/** Superscript marker `^`. */\n\tSuperscript = 'superscript',\n\t/** Subscript marker `_`. */\n\tSubscript = 'subscript',\n\t/** Prime marker `'`. */\n\tPrime = 'prime',\n\t/** Alignment tab `&` (matrix/cases cell separator). */\n\tAmpersand = 'ampersand',\n\t/** Row break `\\\\` (matrix/cases row separator). */\n\tRowBreak = 'rowBreak',\n\t/** A non-breaking space `~`. */\n\tNbSpace = 'nbSpace',\n\t/** A run of digits (and a trailing decimal point group). */\n\tNumber = 'number',\n\t/** A single ordinary character (letter, punctuation, operator char). */\n\tChar = 'char',\n}\n\n/** A single lexical token with its source position. */\nexport interface Token {\n\t/** The lexical category. */\n\treadonly type: TokenType;\n\t/** The raw value: command name without backslash, or the literal char(s). */\n\treadonly value: string;\n\t/** Zero-based index in the source where the token starts. */\n\treadonly position: number;\n}\n\n/** Single-character control symbols that form a one-char command after `\\`. */\nconst CONTROL_SYMBOLS: ReadonlySet<string> = new Set([\n\t'{',\n\t'}',\n\t'%',\n\t'$',\n\t'#',\n\t'&',\n\t'_',\n\t',',\n\t':',\n\t';',\n\t'!',\n\t' ',\n\t'|',\n\t'\\\\',\n\t'.',\n\t'/',\n\t\"'\",\n\t'~',\n\t'^',\n]);\n\nfunction isLetter(ch: string): boolean {\n\treturn (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');\n}\n\nfunction isDigit(ch: string): boolean {\n\treturn ch >= '0' && ch <= '9';\n}\n\nfunction isWhitespace(ch: string): boolean {\n\treturn ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r';\n}\n\nfunction token(type: TokenType, value: string, position: number): Token {\n\treturn { type, value, position };\n}\n\nfunction readCommand(src: string, start: number): Token {\n\tconst next: string | undefined = src[start + 1];\n\t// Control symbol: backslash followed by a single non-letter (e.g. \\{ \\, \\\\).\n\tif (next !== undefined && !isLetter(next)) {\n\t\tif (next === '\\\\') return token(TokenType.RowBreak, '\\\\', start);\n\t\treturn token(TokenType.Command, next, start);\n\t}\n\t// Lettered command: backslash followed by one or more letters.\n\tlet end: number = start + 1;\n\twhile (end < src.length) {\n\t\tconst ch: string | undefined = src[end];\n\t\tif (ch === undefined || !isLetter(ch)) break;\n\t\tend += 1;\n\t}\n\treturn token(TokenType.Command, src.slice(start + 1, end), start);\n}\n\nfunction readNumber(src: string, start: number): Token {\n\tlet end: number = start;\n\twhile (end < src.length) {\n\t\tconst ch: string | undefined = src[end];\n\t\tif (ch === undefined || !isDigit(ch)) break;\n\t\tend += 1;\n\t}\n\t// Absorb a decimal point that is immediately followed by another digit.\n\tif (src[end] === '.' && src[end + 1] !== undefined && isDigit(src[end + 1] ?? '')) {\n\t\tend += 1;\n\t\twhile (end < src.length) {\n\t\t\tconst ch: string | undefined = src[end];\n\t\t\tif (ch === undefined || !isDigit(ch)) break;\n\t\t\tend += 1;\n\t\t}\n\t}\n\treturn token(TokenType.Number, src.slice(start, end), start);\n}\n\n/** Tokenizes a LaTeX math string. Never throws; unknown chars become `Char`. */\nexport function tokenize(src: string): readonly Token[] {\n\tconst tokens: Token[] = [];\n\tlet i = 0;\n\twhile (i < src.length) {\n\t\tconst ch: string = src[i] ?? '';\n\t\tif (ch === '\\\\') {\n\t\t\tconst cmd: Token = readCommand(src, i);\n\t\t\ttokens.push(cmd);\n\t\t\t// Advance past the backslash and the command body.\n\t\t\ti += cmd.type === TokenType.RowBreak ? 2 : Math.max(1, cmd.value.length) + 1;\n\t\t\t// Swallow whitespace after a lettered command (single- or multi-letter),\n\t\t\t// e.g. `\\alpha x` → `\\alpha`,`x`; not after a control symbol like `\\,`.\n\t\t\tif (cmd.type === TokenType.Command && isLetter(cmd.value[0] ?? '')) {\n\t\t\t\twhile (i < src.length && isWhitespace(src[i] ?? '')) i += 1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (isDigit(ch)) {\n\t\t\tconst num: Token = readNumber(src, i);\n\t\t\ttokens.push(num);\n\t\t\ti += num.value.length;\n\t\t\tcontinue;\n\t\t}\n\t\tif (isWhitespace(ch)) {\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tconst simple: Token | undefined = simpleToken(ch, i);\n\t\tif (simple) tokens.push(simple);\n\t\ti += 1;\n\t}\n\treturn tokens;\n}\n\nfunction simpleToken(ch: string, position: number): Token | undefined {\n\tswitch (ch) {\n\t\tcase '{':\n\t\t\treturn token(TokenType.GroupOpen, ch, position);\n\t\tcase '}':\n\t\t\treturn token(TokenType.GroupClose, ch, position);\n\t\tcase '^':\n\t\t\treturn token(TokenType.Superscript, ch, position);\n\t\tcase '_':\n\t\t\treturn token(TokenType.Subscript, ch, position);\n\t\tcase \"'\":\n\t\t\treturn token(TokenType.Prime, ch, position);\n\t\tcase '&':\n\t\t\treturn token(TokenType.Ampersand, ch, position);\n\t\tcase '~':\n\t\t\treturn token(TokenType.NbSpace, ch, position);\n\t\tdefault:\n\t\t\treturn token(TokenType.Char, ch, position);\n\t}\n}\n\n/** True when a one-character command body is a recognized control symbol. */\nexport function isControlSymbol(value: string): boolean {\n\treturn value.length === 1 && CONTROL_SYMBOLS.has(value);\n}\n","/**\n * Accent and over/under-brace command handlers.\n *\n * Layer A (framework-agnostic, zero notectl imports). Each handler consumes one\n * argument and wraps it in an `mover`/`munder` with the right combining glyph.\n */\n\nimport { mo, mover, munder } from '../../mathml/index.js';\nimport { atom } from '../LatexParserTypes.js';\nimport type { Atom, ParserApi } from '../LatexParserTypes.js';\n\ninterface AccentSpec {\n\t/** The combining/standalone glyph drawn over or under the base. */\n\treadonly glyph: string;\n\t/** Whether the accent sits below (true) or above (false) the base. */\n\treadonly under: boolean;\n\t/** Whether the glyph stretches to the base width (braces, wide accents). */\n\treadonly stretchy: boolean;\n}\n\nfunction over(glyph: string, stretchy: boolean): AccentSpec {\n\treturn { glyph, under: false, stretchy };\n}\n\nfunction under(glyph: string, stretchy: boolean): AccentSpec {\n\treturn { glyph, under: true, stretchy };\n}\n\nconst ACCENTS: Readonly<Record<string, AccentSpec>> = {\n\that: over('^', false),\n\twidehat: over('^', true),\n\tcheck: over('ˇ', false),\n\ttilde: over('~', false),\n\twidetilde: over('~', true),\n\tbar: over('‾', false),\n\toverline: over('‾', true),\n\tvec: over('→', false),\n\toverrightarrow: over('→', true),\n\toverleftarrow: over('←', true),\n\toverleftrightarrow: over('↔', true),\n\tdot: over('˙', false),\n\tddot: over('¨', false),\n\tdddot: over('⃛', false),\n\tacute: over('´', false),\n\tgrave: over('`', false),\n\tbreve: over('˘', false),\n\tmathring: over('˚', false),\n\toverbrace: over('⏞', true),\n\tunderline: under('_', true),\n\tunderbrace: under('⏟', true),\n\tunderrightarrow: under('→', true),\n\tunderleftarrow: under('←', true),\n};\n\n/** Returns true when `name` is an accent/brace command. */\nexport function isAccent(name: string): boolean {\n\treturn name in ACCENTS;\n}\n\n/** Parses an accent command's argument and returns the accented atom. */\nexport function parseAccent(name: string, api: ParserApi): Atom {\n\tconst spec: AccentSpec | undefined = ACCENTS[name];\n\tif (!spec) return atom('');\n\tconst base: string = api.parseArgument();\n\tconst mark: string = mo(spec.glyph, { stretchy: spec.stretchy });\n\tconst attrs: Readonly<Record<string, boolean>> = spec.under\n\t\t? { accentunder: true }\n\t\t: { accent: true };\n\tconst built: string = spec.under ? munder(base, mark, attrs) : mover(base, mark, attrs);\n\treturn atom(built);\n}\n","/**\n * `\\begin{env}…\\end{env}` environment handlers (matrices, cases, aligned).\n *\n * Layer A (framework-agnostic, zero notectl imports). Splits the body into rows\n * (on `\\\\`) and cells (on `&`), builds an `mtable`, and wraps it in the fences\n * the environment implies (pmatrix → (), bmatrix → [], cases → brace, …).\n */\n\nimport { mo, mrow, mtable } from '../../mathml/index.js';\nimport { atom } from '../LatexParserTypes.js';\nimport type { Atom, ParserApi } from '../LatexParserTypes.js';\nimport { TokenType } from '../LatexTokenizer.js';\nimport type { Token } from '../LatexTokenizer.js';\n\ninterface EnvSpec {\n\t/** Opening fence glyph, or '' for none. */\n\treadonly open: string;\n\t/** Closing fence glyph, or '' for none. */\n\treadonly close: string;\n\t/** Default column alignment for the table. */\n\treadonly columnalign?: string;\n}\n\nconst ENVIRONMENTS: Readonly<Record<string, EnvSpec>> = {\n\tmatrix: { open: '', close: '' },\n\tpmatrix: { open: '(', close: ')' },\n\tbmatrix: { open: '[', close: ']' },\n\tBmatrix: { open: '{', close: '}' },\n\tvmatrix: { open: '|', close: '|' },\n\tVmatrix: { open: '‖', close: '‖' },\n\tcases: { open: '{', close: '', columnalign: 'left' },\n\taligned: { open: '', close: '', columnalign: 'right left' },\n\talign: { open: '', close: '', columnalign: 'right left' },\n\tgathered: { open: '', close: '', columnalign: 'center' },\n\tsmallmatrix: { open: '', close: '' },\n};\n\n/** Returns true when `name` is a supported environment. */\nexport function isEnvironment(name: string): boolean {\n\treturn name in ENVIRONMENTS || name === 'array';\n}\n\n/**\n * Parses an environment body up to its `\\end{...}` and returns the table atom.\n * `name` is the environment name captured from `\\begin{name}`.\n */\nexport function parseEnvironment(name: string, api: ParserApi): Atom {\n\tif (name === 'array') {\n\t\t// `array` carries an optional position arg then a mandatory `{cols}`\n\t\t// column spec, e.g. `\\begin{array}[t]{cc}`. Both are discarded.\n\t\tapi.parseOptionalArgument();\n\t\tapi.parseRawArgument();\n\t}\n\tconst rows: string[][] = collectRows(name, api);\n\tconst cellRows: string[][] = rows.map((row) => row.map((cell) => cell));\n\tconst spec: EnvSpec = ENVIRONMENTS[name] ?? { open: '', close: '' };\n\tconst tableAttrs: Readonly<Record<string, string>> | undefined = spec.columnalign\n\t\t? { columnalign: spec.columnalign }\n\t\t: undefined;\n\tconst table: string = mtable(cellRows, tableAttrs);\n\tif (!spec.open && !spec.close) return atom(table);\n\tconst open: string = spec.open ? mo(spec.open, { stretchy: true, fence: true }) : '';\n\tconst close: string = spec.close ? mo(spec.close, { stretchy: true, fence: true }) : '';\n\treturn atom(mrow(`${open}${table}${close}`));\n}\n\nfunction collectRows(envName: string, api: ParserApi): string[][] {\n\tconst rows: string[][] = [];\n\tlet current: string[] = [];\n\tlet cell: string[] = [];\n\tconst flushCell = (): void => {\n\t\tcurrent.push(mrow(cell.join('')));\n\t\tcell = [];\n\t};\n\tconst flushRow = (): void => {\n\t\tflushCell();\n\t\trows.push(current);\n\t\tcurrent = [];\n\t};\n\twhile (true) {\n\t\tconst tok: Token | undefined = api.peek();\n\t\tif (tok === undefined) {\n\t\t\tapi.error({ message: `Unterminated environment \\\\begin{${envName}}` });\n\t\t\tbreak;\n\t\t}\n\t\tif (isEnd(tok)) {\n\t\t\tapi.next();\n\t\t\tapi.parseRawArgument(); // consume {envName}\n\t\t\tbreak;\n\t\t}\n\t\tif (tok.type === TokenType.Ampersand) {\n\t\t\tapi.next();\n\t\t\tflushCell();\n\t\t\tcontinue;\n\t\t}\n\t\tif (tok.type === TokenType.RowBreak) {\n\t\t\tapi.next();\n\t\t\tflushRow();\n\t\t\tcontinue;\n\t\t}\n\t\tif (tok.type === TokenType.GroupClose) {\n\t\t\t// A stray '}' has no matching '{' in the environment body. Consume it and\n\t\t\t// record the mismatch (mirrors parseTopLevel) so the loop always advances;\n\t\t\t// `parseAtomsUntil` stops on '}' without consuming it, so skipping this\n\t\t\t// guard would spin forever on the same token.\n\t\t\tapi.next();\n\t\t\tapi.error({ message: 'Unmatched brace', position: tok.position });\n\t\t\tcontinue;\n\t\t}\n\t\tconst atoms: readonly Atom[] = api.parseAtomsUntil(isCellBoundary);\n\t\tcell.push(...atoms.map((a) => a.node));\n\t}\n\t// Flush the trailing row unless it is an empty artifact of a final `\\\\`.\n\tif (cell.length > 0 || current.length > 0) flushRow();\n\tif (rows.length === 0) rows.push(['']);\n\treturn rows;\n}\n\nfunction isEnd(tok: Token): boolean {\n\treturn tok.type === TokenType.Command && tok.value === 'end';\n}\n\nfunction isCellBoundary(tok: Token): boolean {\n\treturn (\n\t\ttok.type === TokenType.Ampersand ||\n\t\ttok.type === TokenType.RowBreak ||\n\t\t(tok.type === TokenType.Command && tok.value === 'end')\n\t);\n}\n","/**\n * Spacing command handlers (`\\,`, `\\quad`, `~`, …).\n *\n * Layer A (framework-agnostic, zero notectl imports). Each maps to an `mspace`\n * with an explicit width in `em`; `\\!` yields a negative thin space.\n */\n\nimport { mspace } from '../../mathml/index.js';\n\nconst SPACE_WIDTHS: Readonly<Record<string, string>> = {\n\t',': '0.167em',\n\t':': '0.222em',\n\t';': '0.278em',\n\t'!': '-0.167em',\n\t' ': '0.25em',\n\tquad: '1em',\n\tqquad: '2em',\n\tthinspace: '0.167em',\n\tmedspace: '0.222em',\n\tthickspace: '0.278em',\n\tnegthinspace: '-0.167em',\n\tnegmedspace: '-0.222em',\n\tnegthickspace: '-0.278em',\n\tenspace: '0.5em',\n};\n\n/** Returns true when `name` is a spacing command. */\nexport function isSpacing(name: string): boolean {\n\treturn name in SPACE_WIDTHS;\n}\n\n/** Returns the `mspace` markup for a spacing command, or undefined if unknown. */\nexport function spacingMarkup(name: string): string | undefined {\n\tconst width: string | undefined = SPACE_WIDTHS[name];\n\tif (width === undefined) return undefined;\n\treturn mspace({ width });\n}\n\n/** The non-breaking-space (`~`) markup. */\nexport function nbSpaceMarkup(): string {\n\treturn mspace({ width: '0.25em' });\n}\n","/**\n * Handlers for delimiter and stacking commands: `\\left…\\right`, `\\begin…\\end`,\n * `\\substack`, and `\\pmod`.\n *\n * Layer A (framework-agnostic, zero notectl imports). These operate purely\n * through the `ParserApi` surface, so they stay decoupled from the parser core.\n */\n\nimport { element, group, mo, mrow, mtext } from '../../mathml/index.js';\nimport { atom } from '../LatexParserTypes.js';\nimport type { Atom, ParserApi } from '../LatexParserTypes.js';\nimport { resolveDelimiter } from '../LatexSymbols.js';\nimport type { SymbolEntry } from '../LatexSymbols.js';\nimport { TokenType } from '../LatexTokenizer.js';\nimport type { Token } from '../LatexTokenizer.js';\nimport { isEnvironment, parseEnvironment } from './Environments.js';\nimport { nbSpaceMarkup } from './Spacing.js';\n\n/** Parses `\\left<delim> … \\right<delim>` into a stretchy-fenced group. */\nexport function parseLeftRight(api: ParserApi): Atom {\n\tconst openEntry: SymbolEntry | undefined = resolveDelimiter(readDelimiterSpec(api));\n\tconst body: readonly Atom[] = api.parseAtomsUntil(isRight);\n\tconst closeTok: Token | undefined = api.peek();\n\tlet closeSpec = '.';\n\tif (closeTok !== undefined && isRight(closeTok)) {\n\t\tapi.next();\n\t\tcloseSpec = readDelimiterSpec(api);\n\t} else {\n\t\tapi.error({ message: 'Unmatched \\\\left' });\n\t}\n\tconst closeEntry: SymbolEntry | undefined = resolveDelimiter(closeSpec);\n\tconst open: string = fenceMarkup(openEntry);\n\tconst close: string = fenceMarkup(closeEntry);\n\treturn atom(group([open, ...body.map((a) => a.node), close]));\n}\n\n/** Handles a stray `\\right`: consumes its delimiter and records the mismatch. */\nexport function parseStrayRight(api: ParserApi, position: number): Atom {\n\treadDelimiterSpec(api);\n\tapi.error({ message: 'Unmatched \\\\right', position });\n\treturn atom(group([]));\n}\n\n/** Parses `\\begin{env} … \\end{env}`, dispatching to the environment builder. */\nexport function parseBegin(api: ParserApi): Atom {\n\tconst envName: string = api.parseRawArgument();\n\tif (!isEnvironment(envName)) {\n\t\tapi.error({ message: 'Unknown environment', command: envName });\n\t\treturn atom(element('merror', mtext(envName)));\n\t}\n\treturn parseEnvironment(envName, api);\n}\n\n/** Parses `\\substack{a \\\\ b}` into a single-column stacked table. */\nexport function parseSubstack(api: ParserApi): Atom {\n\texpectGroupOpen(api);\n\tconst rows: string[] = [];\n\tlet cell: string[] = [];\n\twhile (true) {\n\t\tconst tok: Token | undefined = api.peek();\n\t\tif (tok === undefined || tok.type === TokenType.GroupClose) break;\n\t\tif (tok.type === TokenType.RowBreak) {\n\t\t\tapi.next();\n\t\t\trows.push(group(cell));\n\t\t\tcell = [];\n\t\t\tcontinue;\n\t\t}\n\t\tconst atoms: readonly Atom[] = api.parseAtomsUntil((t) => t.type === TokenType.RowBreak);\n\t\tcell.push(...atoms.map((a) => a.node));\n\t}\n\tconsumeGroupClose(api);\n\trows.push(group(cell));\n\tconst body: string = rows.map((r) => element('mtr', element('mtd', r))).join('');\n\treturn atom(element('mtable', body));\n}\n\n/** Parses `\\pmod{n}` into a parenthesized `(mod n)`, wrapped in one mrow. */\nexport function parsePmod(api: ParserApi): Atom {\n\tconst arg: string = api.parseArgument();\n\tconst open: string = mo('(', { fence: true });\n\tconst close: string = mo(')', { fence: true });\n\tconst body = `${open}${mtext('mod')}${nbSpaceMarkup()}${arg}${close}`;\n\treturn atom(mrow(body));\n}\n\nfunction isRight(tok: Token): boolean {\n\treturn tok.type === TokenType.Command && tok.value === 'right';\n}\n\nfunction readDelimiterSpec(api: ParserApi): string {\n\tconst tok: Token | undefined = api.next();\n\tif (tok === undefined) return '.';\n\tif (tok.type === TokenType.Command) return `\\\\${tok.value}`;\n\treturn tok.value;\n}\n\nfunction fenceMarkup(entry: SymbolEntry | undefined): string {\n\t// Null delimiter (\\left. / \\right.): emit nothing; group() joins it away.\n\tif (!entry || entry.char === '') return '';\n\treturn mo(entry.char, { fence: true, stretchy: true });\n}\n\nfunction expectGroupOpen(api: ParserApi): void {\n\tconst tok: Token | undefined = api.peek();\n\tif (tok !== undefined && tok.type === TokenType.GroupOpen) api.next();\n}\n\nfunction consumeGroupClose(api: ParserApi): void {\n\tconst tok: Token | undefined = api.peek();\n\tif (tok !== undefined && tok.type === TokenType.GroupClose) api.next();\n}\n","/**\n * Unicode \"Mathematical Alphanumeric Symbols\" mapping for math-alphabet fonts.\n *\n * Layer A (framework-agnostic, zero notectl imports). Chromium's MathML Core has\n * dropped support for most `mathvariant` values (double-struck, script, fraktur,\n * bold, …), so wrapping a letter in `<mstyle mathvariant=\"…\">` no longer renders\n * the styled glyph. Instead — exactly like KaTeX's MathML output — each ASCII\n * letter/digit is remapped to its dedicated codepoint in the Mathematical\n * Alphanumeric Symbols block (U+1D400…U+1D7FF) and emitted as a literal glyph.\n *\n * The block has well-known \"holes\": a handful of letters live in the older\n * Letterlike Symbols block (U+2100…) instead of the contiguous range, so the\n * per-style tables list those exceptions explicitly.\n */\n\nimport { mi, mn } from '../mathml/index.js';\n\n/** A math-alphabet font style backed by a Unicode symbol block. */\nexport type MathAlphabetStyle =\n\t| 'double-struck'\n\t| 'script'\n\t| 'fraktur'\n\t| 'bold'\n\t| 'italic'\n\t| 'sans-serif'\n\t| 'monospace';\n\n/** Per-style codepoint bases plus the Letterlike-Symbols holes for that style. */\ninterface StyleTable {\n\t/** Codepoint of the styled uppercase 'A', start of the contiguous A–Z run. */\n\treadonly upperBase: number;\n\t/** Codepoint of the styled lowercase 'a', start of the contiguous a–z run. */\n\treadonly lowerBase: number;\n\t/** Codepoint of the styled '0', start of the contiguous 0–9 run, if any. */\n\treadonly digitBase?: number;\n\t/** Letters whose styled glyph lives outside the contiguous block. */\n\treadonly holes: Readonly<Record<string, number>>;\n}\n\nconst NO_HOLES: Readonly<Record<string, number>> = {};\n\nconst TABLES: Readonly<Record<MathAlphabetStyle, StyleTable>> = {\n\t'double-struck': {\n\t\tupperBase: 0x1d538,\n\t\tlowerBase: 0x1d552,\n\t\tdigitBase: 0x1d7d8,\n\t\tholes: {\n\t\t\tC: 0x2102,\n\t\t\tH: 0x210d,\n\t\t\tN: 0x2115,\n\t\t\tP: 0x2119,\n\t\t\tQ: 0x211a,\n\t\t\tR: 0x211d,\n\t\t\tZ: 0x2124,\n\t\t},\n\t},\n\tscript: {\n\t\tupperBase: 0x1d49c,\n\t\tlowerBase: 0x1d4b6,\n\t\tholes: {\n\t\t\tB: 0x212c,\n\t\t\tE: 0x2130,\n\t\t\tF: 0x2131,\n\t\t\tH: 0x210b,\n\t\t\tI: 0x2110,\n\t\t\tL: 0x2112,\n\t\t\tM: 0x2133,\n\t\t\tR: 0x211b,\n\t\t\te: 0x212f,\n\t\t\tg: 0x210a,\n\t\t\to: 0x2134,\n\t\t},\n\t},\n\tfraktur: {\n\t\tupperBase: 0x1d504,\n\t\tlowerBase: 0x1d51e,\n\t\tholes: {\n\t\t\tC: 0x212d,\n\t\t\tH: 0x210c,\n\t\t\tI: 0x2111,\n\t\t\tR: 0x211c,\n\t\t\tZ: 0x2128,\n\t\t},\n\t},\n\tbold: {\n\t\tupperBase: 0x1d400,\n\t\tlowerBase: 0x1d41a,\n\t\tdigitBase: 0x1d7ce,\n\t\tholes: NO_HOLES,\n\t},\n\titalic: {\n\t\tupperBase: 0x1d434,\n\t\tlowerBase: 0x1d44e,\n\t\tholes: { h: 0x210e },\n\t},\n\t'sans-serif': {\n\t\tupperBase: 0x1d5a0,\n\t\tlowerBase: 0x1d5ba,\n\t\tdigitBase: 0x1d7e2,\n\t\tholes: NO_HOLES,\n\t},\n\tmonospace: {\n\t\tupperBase: 0x1d670,\n\t\tlowerBase: 0x1d68a,\n\t\tdigitBase: 0x1d7f6,\n\t\tholes: NO_HOLES,\n\t},\n};\n\nfunction isUpper(ch: string): boolean {\n\treturn ch >= 'A' && ch <= 'Z';\n}\n\nfunction isLower(ch: string): boolean {\n\treturn ch >= 'a' && ch <= 'z';\n}\n\nfunction isDigit(ch: string): boolean {\n\treturn ch >= '0' && ch <= '9';\n}\n\n/**\n * Maps a single ASCII letter/digit to its styled Unicode glyph for `style`.\n *\n * Returns the literal glyph string (a single astral code point built with\n * `String.fromCodePoint`), or `null` when there is no mapping — i.e. the\n * character is not an A–Z / a–z / 0–9, or the style has no digit block (so\n * digits keep their ASCII form, e.g. under italic). Callers fall back to the\n * plain character on `null`.\n */\nexport function mathAlphaChar(ch: string, style: MathAlphabetStyle): string | null {\n\tif (ch.length !== 1) return null;\n\tconst table: StyleTable = TABLES[style];\n\tconst hole: number | undefined = table.holes[ch];\n\tif (hole !== undefined) return String.fromCodePoint(hole);\n\tif (isUpper(ch)) return String.fromCodePoint(table.upperBase + (ch.charCodeAt(0) - 65));\n\tif (isLower(ch)) return String.fromCodePoint(table.lowerBase + (ch.charCodeAt(0) - 97));\n\tif (isDigit(ch) && table.digitBase !== undefined) {\n\t\treturn String.fromCodePoint(table.digitBase + (ch.charCodeAt(0) - 48));\n\t}\n\treturn null;\n}\n\n/** Matches the inner text of a leaf `<mi>`/`<mn>` element (no nested tags). */\nconst LEAF_TEXT = /<(mi|mn)>([^<]*)<\\/\\1>/g;\n/** Matches a leaf `<mi>` element that carries no attributes. */\nconst BARE_MI = /<mi>([^<]*)<\\/mi>/g;\n\n/**\n * Remaps every ASCII letter/digit in the leaf identifiers/numbers of `markup`\n * to its styled Unicode glyph, rebuilding the element so the glyph renders in\n * engines without `mathvariant` support. Characters with no mapping (operators,\n * spaces, already-styled symbols, digits under a digit-less style) are left\n * untouched, which lets `\\mathbb{+}` pass the `+` through unchanged.\n */\nexport function applyMathAlphabet(markup: string, style: MathAlphabetStyle): string {\n\treturn markup.replace(LEAF_TEXT, (_match, tag: string, text: string) => {\n\t\tconst mapped: string = remapText(text, style);\n\t\treturn tag === 'mn' ? mn(mapped) : mi(mapped);\n\t});\n}\n\nfunction remapText(text: string, style: MathAlphabetStyle): string {\n\tlet out = '';\n\tfor (const ch of text) {\n\t\tout += mathAlphaChar(ch, style) ?? ch;\n\t}\n\treturn out;\n}\n\n/**\n * Forces upright rendering for `\\mathrm`: adds `mathvariant=\"normal\"` to every\n * bare leaf `<mi>` so multi-letter content stays upright even in engines that\n * dropped `mathvariant` on `<mstyle>`. `normal` is the one variant value MathML\n * Core retained on `<mi>`. Numbers and operators already render upright.\n */\nexport function applyUprightIdentifiers(markup: string): string {\n\treturn markup.replace(BARE_MI, (_match, text: string) => mi(text, { mathvariant: 'normal' }));\n}\n","/**\n * Font/style command handlers (`\\mathbb`, `\\text`, `\\operatorname`, …).\n *\n * Layer A (framework-agnostic, zero notectl imports). Math-alphabet commands\n * (`\\mathbb`, `\\mathcal`, …) remap their ASCII letters/digits to the dedicated\n * Unicode \"Mathematical Alphanumeric Symbols\" glyphs (see `MathAlphabet`), since\n * Chromium's MathML Core dropped `mathvariant`; `\\mathrm` forces upright\n * identifiers; text commands emit upright `mtext` from the raw argument source.\n */\n\nimport { mi, mstyle, mtext } from '../../mathml/index.js';\nimport { atom } from '../LatexParserTypes.js';\nimport type { Atom, ParserApi } from '../LatexParserTypes.js';\nimport {\n\ttype MathAlphabetStyle,\n\tapplyMathAlphabet,\n\tapplyUprightIdentifiers,\n} from '../MathAlphabet.js';\n\n/** Alphabet-variant commands mapped to a Unicode symbol block (no `mathvariant`). */\nconst ALPHABET_STYLES: Readonly<Record<string, MathAlphabetStyle>> = {\n\tmathbb: 'double-struck',\n\tmathcal: 'script',\n\tmathscr: 'script',\n\tmathfrak: 'fraktur',\n\tmathbf: 'bold',\n\tmathit: 'italic',\n\tmathsf: 'sans-serif',\n\tmathtt: 'monospace',\n};\n\n/** Variant commands still emitted via `mathvariant` (no dedicated glyph block). */\nconst VARIANTS: Readonly<Record<string, string>> = {\n\tboldsymbol: 'bold-italic',\n\tbm: 'bold-italic',\n};\n\n/** Commands whose single argument is rendered as upright literal text. */\nconst TEXT_COMMANDS: Readonly<Record<string, string | undefined>> = {\n\ttext: undefined,\n\ttextnormal: 'normal',\n\ttextrm: 'normal',\n\ttextbf: 'bold',\n\ttextit: 'italic',\n\ttextsf: 'sans-serif',\n\ttexttt: 'monospace',\n\tmbox: undefined,\n};\n\n/** Returns true when `name` is a font/style or text command. */\nexport function isFontCommand(name: string): boolean {\n\treturn (\n\t\tname in ALPHABET_STYLES ||\n\t\tname in VARIANTS ||\n\t\tname in TEXT_COMMANDS ||\n\t\tname === 'mathrm' ||\n\t\tname === 'operatorname'\n\t);\n}\n\n/** Parses a font/style/text command and returns the styled atom. */\nexport function parseFontCommand(name: string, api: ParserApi): Atom {\n\tif (name === 'operatorname') {\n\t\treturn atom(mi(api.parseRawArgument(), { mathvariant: 'normal' }));\n\t}\n\tif (name in TEXT_COMMANDS) {\n\t\tconst variant: string | undefined = TEXT_COMMANDS[name];\n\t\tconst raw: string = api.parseRawArgument();\n\t\treturn atom(variant ? mtext(raw, { mathvariant: variant }) : mtext(raw));\n\t}\n\tconst alphabet: MathAlphabetStyle | undefined = ALPHABET_STYLES[name];\n\tif (alphabet !== undefined) {\n\t\treturn atom(applyMathAlphabet(api.parseArgument(), alphabet));\n\t}\n\tif (name === 'mathrm') {\n\t\treturn atom(applyUprightIdentifiers(api.parseArgument()));\n\t}\n\t// The only commands left are the mathvariant-only families (\\boldsymbol, \\bm),\n\t// which have no dedicated Unicode glyph block.\n\tconst variant: string | undefined = VARIANTS[name];\n\tconst body: string = api.parseArgument();\n\tif (variant === undefined) return atom(body);\n\treturn atom(mstyle(body, { mathvariant: variant }));\n}\n","/**\n * Structural command handlers: fractions, roots, binomials, stacks.\n *\n * Layer A (framework-agnostic, zero notectl imports). These consume one or more\n * arguments and assemble the corresponding `mfrac`/`msqrt`/`mroot`/`mover`/\n * `munder` markup.\n */\n\nimport { mfrac, mo, mover, mroot, mrow, msqrt, munder } from '../../mathml/index.js';\nimport { atom } from '../LatexParserTypes.js';\nimport type { Atom, ParserApi } from '../LatexParserTypes.js';\n\nconst FRACTION_COMMANDS: ReadonlySet<string> = new Set(['frac', 'dfrac', 'tfrac', 'cfrac']);\nconst BINOM_COMMANDS: ReadonlySet<string> = new Set(['binom', 'dbinom', 'tbinom', 'choose']);\nconst STACK_COMMANDS: ReadonlySet<string> = new Set(['overset', 'underset', 'stackrel']);\n\n/** Returns true when `name` is a fraction-like command. */\nexport function isFraction(name: string): boolean {\n\treturn FRACTION_COMMANDS.has(name);\n}\n\n/** Returns true when `name` is a binomial-coefficient command. */\nexport function isBinom(name: string): boolean {\n\treturn BINOM_COMMANDS.has(name);\n}\n\n/** Returns true when `name` is an over/under-set stacking command. */\nexport function isStack(name: string): boolean {\n\treturn STACK_COMMANDS.has(name);\n}\n\n/** Parses `\\frac`/`\\dfrac`/`\\tfrac`/`\\cfrac` into an `mfrac`. */\nexport function parseFraction(api: ParserApi): Atom {\n\tconst numerator: string = api.parseArgument();\n\tconst denominator: string = api.parseArgument();\n\treturn atom(mfrac(numerator, denominator));\n}\n\n/** Parses `\\binom`/`\\dbinom`/`\\tbinom` into a parenthesized line-less fraction. */\nexport function parseBinom(api: ParserApi): Atom {\n\tconst top: string = api.parseArgument();\n\tconst bottom: string = api.parseArgument();\n\tconst stack: string = mfrac(top, bottom, { linethickness: 0 });\n\tconst open: string = mo('(', { fence: true });\n\tconst close: string = mo(')', { fence: true });\n\treturn atom(mrow(`${open}${stack}${close}`));\n}\n\n/** Parses `\\sqrt` with an optional `[index]` into `msqrt`/`mroot`. */\nexport function parseSqrt(api: ParserApi): Atom {\n\tconst index: string | undefined = api.parseOptionalArgument();\n\tconst radicand: string = api.parseArgument();\n\tif (index === undefined || index === '') return atom(msqrt(radicand));\n\treturn atom(mroot(radicand, index));\n}\n\n/**\n * Parses `\\overset`/`\\underset`/`\\stackrel`. The first argument is the mark,\n * the second is the base (LaTeX order), assembled into `mover`/`munder`.\n */\nexport function parseStack(name: string, api: ParserApi): Atom {\n\tconst mark: string = api.parseArgument();\n\tconst base: string = api.parseArgument();\n\tif (name === 'underset') return atom(munder(base, mark));\n\treturn atom(mover(base, mark));\n}\n","/**\n * Recursive-descent LaTeX parser emitting Presentation MathML strings.\n *\n * Layer A (framework-agnostic, zero notectl imports). Consumes the token stream\n * and produces an array of top-level atoms. Per-category commands (fractions,\n * accents, fonts, spacing, environments) are delegated to handler modules; the\n * core owns the expression loop, group parsing, script attachment and big-\n * operator limit placement. Never throws: malformed input is recovered and\n * recorded as a `LatexError`, and unknown commands become a visible `merror`.\n */\n\nimport {\n\telement,\n\tgroup,\n\tmi,\n\tmn,\n\tmo,\n\tmover,\n\tmrow,\n\tmsub,\n\tmsubsup,\n\tmsup,\n\tmtext,\n\tmunder,\n\tmunderover,\n} from '../mathml/index.js';\nimport { atom, bigOpAtom } from './LatexParserTypes.js';\nimport type { Atom, ParserApi } from './LatexParserTypes.js';\nimport { SymbolKind, lookupSymbol, resolveDelimiter } from './LatexSymbols.js';\nimport type { SymbolEntry } from './LatexSymbols.js';\nimport type { LatexError } from './LatexToMathML.js';\nimport { TokenType, isControlSymbol, tokenize } from './LatexTokenizer.js';\nimport type { Token } from './LatexTokenizer.js';\nimport { isAccent, parseAccent } from './handlers/Accents.js';\nimport {\n\tparseBegin,\n\tparseLeftRight,\n\tparsePmod,\n\tparseStrayRight,\n\tparseSubstack,\n} from './handlers/Delimiters.js';\nimport { isFontCommand, parseFontCommand } from './handlers/Fonts.js';\nimport { isSpacing, nbSpaceMarkup, spacingMarkup } from './handlers/Spacing.js';\nimport {\n\tisBinom,\n\tisFraction,\n\tisStack,\n\tparseBinom,\n\tparseFraction,\n\tparseSqrt,\n\tparseStack,\n} from './handlers/Structures.js';\n\nconst PRIME = '′';\n\n/** Integral-family glyphs whose limits remain side scripts even in display. */\nconst INTEGRAL_CHARS: ReadonlySet<string> = new Set(['∫', '∬', '∭', '∮']);\n\n/**\n * Hard cap on structural nesting depth. The descent recurses one frame chain per\n * nested group/argument, so pathological input (e.g. thousands of nested braces)\n * would otherwise overflow the call stack and throw, breaking the documented\n * \"never throws\" contract. Real formulas nest only a handful of levels, so this\n * is never reached in practice.\n */\nconst MAX_PARSE_DEPTH = 256;\n\n/** Parses a LaTeX source string into top-level atoms plus collected errors. */\nexport function parseLatex(\n\tsrc: string,\n\tdisplay: boolean,\n): { readonly atoms: readonly Atom[]; readonly errors: readonly LatexError[] } {\n\tconst parser = new LatexParser(src, tokenize(src), display);\n\tconst atoms: readonly Atom[] = parser.parseTopLevel();\n\treturn { atoms, errors: parser.collectedErrors };\n}\n\nclass LatexParser implements ParserApi {\n\tprivate readonly source: string;\n\tprivate readonly tokens: readonly Token[];\n\tprivate pos = 0;\n\tprivate depth = 0;\n\tprivate depthExceeded = false;\n\tprivate readonly errors: LatexError[] = [];\n\tpublic readonly display: boolean;\n\n\tpublic constructor(source: string, tokens: readonly Token[], display: boolean) {\n\t\tthis.source = source;\n\t\tthis.tokens = tokens;\n\t\tthis.display = display;\n\t}\n\n\tpublic get collectedErrors(): readonly LatexError[] {\n\t\treturn this.errors;\n\t}\n\n\tpublic peek(): Token | undefined {\n\t\treturn this.tokens[this.pos];\n\t}\n\n\tpublic next(): Token | undefined {\n\t\tconst tok: Token | undefined = this.tokens[this.pos];\n\t\tif (tok !== undefined) this.pos += 1;\n\t\treturn tok;\n\t}\n\n\tpublic error(err: LatexError): void {\n\t\tthis.errors.push(err);\n\t}\n\n\t/**\n\t * Parses the whole input. Stray closing braces (which have no matching open\n\t * at the top level) are consumed and recorded rather than ending the parse,\n\t * so trailing content is not silently dropped.\n\t */\n\tpublic parseTopLevel(): readonly Atom[] {\n\t\tconst atoms: Atom[] = [];\n\t\twhile (true) {\n\t\t\tconst tok: Token | undefined = this.peek();\n\t\t\tif (tok === undefined) break;\n\t\t\tif (tok.type === TokenType.GroupClose) {\n\t\t\t\tthis.next();\n\t\t\t\tthis.error({ message: 'Unmatched brace', position: tok.position });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst next: Atom | undefined = this.parseAtomWithScripts();\n\t\t\tif (next !== undefined) atoms.push(next);\n\t\t}\n\t\treturn atoms;\n\t}\n\n\t/**\n\t * Parses a flat sequence of atoms until `stop` matches the upcoming token or\n\t * EOF is reached. The stopping token is left unconsumed.\n\t */\n\tpublic parseExpression(stop: (token: Token) => boolean): readonly Atom[] {\n\t\tconst atoms: Atom[] = [];\n\t\twhile (true) {\n\t\t\tconst tok: Token | undefined = this.peek();\n\t\t\tif (tok === undefined || stop(tok)) break;\n\t\t\tif (tok.type === TokenType.GroupClose) break;\n\t\t\tconst next: Atom | undefined = this.parseAtomWithScripts();\n\t\t\tif (next !== undefined) atoms.push(next);\n\t\t}\n\t\treturn atoms;\n\t}\n\n\tpublic parseAtomsUntil(stop: (token: Token) => boolean): readonly Atom[] {\n\t\treturn this.parseExpression(stop);\n\t}\n\n\t/** Parses a base atom, then attaches any trailing scripts (`^`, `_`, `'`). */\n\tprivate parseAtomWithScripts(): Atom | undefined {\n\t\tconst base: Atom | undefined = this.parseBaseAtom();\n\t\tif (base === undefined) return undefined;\n\t\treturn this.attachScripts(base);\n\t}\n\n\tprivate attachScripts(base: Atom): Atom {\n\t\tlet sub: string | undefined;\n\t\tlet sup: string | undefined;\n\t\tlet primes = '';\n\t\tlet limitsOverride: 'limits' | 'nolimits' | undefined;\n\t\twhile (true) {\n\t\t\tconst tok: Token | undefined = this.peek();\n\t\t\tif (tok === undefined) break;\n\t\t\tif (tok.type === TokenType.Prime) {\n\t\t\t\tthis.next();\n\t\t\t\tprimes += PRIME;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (tok.type === TokenType.Command && tok.value === 'limits') {\n\t\t\t\tthis.next();\n\t\t\t\tlimitsOverride = 'limits';\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (tok.type === TokenType.Command && tok.value === 'nolimits') {\n\t\t\t\tthis.next();\n\t\t\t\tlimitsOverride = 'nolimits';\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (tok.type === TokenType.Superscript) {\n\t\t\t\tthis.next();\n\t\t\t\tsup = this.combineSup(sup, this.parseArgument());\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (tok.type === TokenType.Subscript) {\n\t\t\t\tthis.next();\n\t\t\t\tsub = this.combineSub(sub, this.parseArgument());\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t// Primes precede any explicit superscript: `f'^2` → f with sup `′2`.\n\t\tif (primes) sup = sup === undefined ? mo(primes) : mrow(`${mo(primes)}${sup}`);\n\t\tif (sub === undefined && sup === undefined) return base;\n\t\treturn atom(this.buildScripts(base, sub, sup, limitsOverride));\n\t}\n\n\tprivate combineSup(existing: string | undefined, next: string): string {\n\t\tif (existing === undefined) return next;\n\t\tthis.error({ message: 'Double superscript' });\n\t\treturn mrow(`${existing}${next}`);\n\t}\n\n\tprivate combineSub(existing: string | undefined, next: string): string {\n\t\tif (existing === undefined) return next;\n\t\tthis.error({ message: 'Double subscript' });\n\t\treturn mrow(`${existing}${next}`);\n\t}\n\n\tprivate buildScripts(\n\t\tbase: Atom,\n\t\tsub: string | undefined,\n\t\tsup: string | undefined,\n\t\toverride: 'limits' | 'nolimits' | undefined,\n\t): string {\n\t\tconst limitsByDefault: boolean = base.bigOp === true && base.intLike !== true && this.display;\n\t\tconst useLimits: boolean =\n\t\t\toverride === 'limits' || (override !== 'nolimits' && limitsByDefault);\n\t\tif (useLimits) {\n\t\t\tif (sub !== undefined && sup !== undefined) return munderover(base.node, sub, sup);\n\t\t\tif (sub !== undefined) return munder(base.node, sub);\n\t\t\tif (sup !== undefined) return mover(base.node, sup);\n\t\t}\n\t\tif (sub !== undefined && sup !== undefined) return msubsup(base.node, sub, sup);\n\t\tif (sub !== undefined) return msub(base.node, sub);\n\t\tif (sup !== undefined) return msup(base.node, sup);\n\t\treturn base.node;\n\t}\n\n\tprivate parseBaseAtom(): Atom | undefined {\n\t\tif (this.depth >= MAX_PARSE_DEPTH) return this.bailDeepNesting();\n\t\tthis.depth += 1;\n\t\ttry {\n\t\t\treturn this.parseBaseAtomInner();\n\t\t} finally {\n\t\t\tthis.depth -= 1;\n\t\t}\n\t}\n\n\t/**\n\t * Recovers from pathologically deep nesting without overflowing the call stack:\n\t * consumes one token so the enclosing loops always advance (never trading the\n\t * overflow for an infinite loop), records the limit once, and emits a single\n\t * visible marker for the dropped subtree.\n\t */\n\tprivate bailDeepNesting(): Atom | undefined {\n\t\tconst tok: Token | undefined = this.next();\n\t\tif (tok === undefined) return undefined;\n\t\tif (this.depthExceeded) return undefined;\n\t\tthis.depthExceeded = true;\n\t\tthis.error({ message: 'Maximum nesting depth exceeded', position: tok.position });\n\t\treturn atom(element('merror', mtext('⋯')));\n\t}\n\n\tprivate parseBaseAtomInner(): Atom | undefined {\n\t\tconst tok: Token | undefined = this.next();\n\t\tif (tok === undefined) return undefined;\n\t\tswitch (tok.type) {\n\t\t\tcase TokenType.Number:\n\t\t\t\treturn atom(mn(tok.value));\n\t\t\tcase TokenType.Char:\n\t\t\t\treturn this.parseChar(tok.value);\n\t\t\tcase TokenType.GroupOpen:\n\t\t\t\treturn this.parseGroup();\n\t\t\tcase TokenType.NbSpace:\n\t\t\t\treturn atom(nbSpaceMarkup());\n\t\t\tcase TokenType.Command:\n\t\t\t\treturn this.parseCommand(tok);\n\t\t\tcase TokenType.Superscript:\n\t\t\tcase TokenType.Subscript:\n\t\t\tcase TokenType.Prime:\n\t\t\t\t// A script with no preceding base: attach to an empty box (mrow).\n\t\t\t\tthis.pos -= 1;\n\t\t\t\treturn this.attachScripts(atom(mrow('')));\n\t\t\tcase TokenType.Ampersand:\n\t\t\tcase TokenType.RowBreak:\n\t\t\tcase TokenType.GroupClose:\n\t\t\t\treturn undefined;\n\t\t\tdefault:\n\t\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate parseGroup(): Atom {\n\t\tconst atoms: readonly Atom[] = this.parseExpression(() => false);\n\t\tthis.expect(TokenType.GroupClose);\n\t\treturn atom(group(atoms.map((a) => a.node)));\n\t}\n\n\tprivate parseChar(ch: string): Atom {\n\t\tconst delim: SymbolEntry | undefined = resolveDelimiter(ch);\n\t\tif (delim && (delim.kind === SymbolKind.Open || delim.kind === SymbolKind.Close)) {\n\t\t\treturn atom(mo(ch, { fence: true }), delim.kind);\n\t\t}\n\t\tif (ch === '+' || ch === '-' || ch === '*' || ch === '=' || ch === '/' || ch === '|') {\n\t\t\treturn atom(mo(ch));\n\t\t}\n\t\tif (ch === ',' || ch === ';' || ch === '.' || ch === ':' || ch === '!' || ch === '?') {\n\t\t\treturn atom(mo(ch));\n\t\t}\n\t\tif (ch === '<' || ch === '>') return atom(mo(ch));\n\t\treturn atom(mi(ch));\n\t}\n\n\tprivate parseCommand(tok: Token): Atom | undefined {\n\t\tconst name: string = tok.value;\n\t\tconst symbol: SymbolEntry | undefined = lookupSymbol(name);\n\t\tif (symbol) return this.symbolAtom(symbol);\n\t\tif (isControlSymbol(name)) return this.controlSymbolAtom(name);\n\t\tconst structural: Atom | undefined = this.dispatchStructural(name);\n\t\tif (structural !== undefined) return structural;\n\t\tconst special: Atom | undefined = this.dispatchSpecial(name, tok);\n\t\tif (special !== undefined) return special;\n\t\t// Unknown command: visible, accessible error marker plus a record.\n\t\tthis.error({ message: 'Unknown command', command: `\\\\${name}`, position: tok.position });\n\t\treturn atom(element('merror', mtext(`\\\\${name}`)));\n\t}\n\n\tprivate dispatchStructural(name: string): Atom | undefined {\n\t\tif (isFraction(name)) return parseFraction(this);\n\t\tif (isBinom(name)) return parseBinom(this);\n\t\tif (name === 'sqrt') return parseSqrt(this);\n\t\tif (isStack(name)) return parseStack(name, this);\n\t\tif (isAccent(name)) return parseAccent(name, this);\n\t\tif (isFontCommand(name)) return parseFontCommand(name, this);\n\t\tif (isSpacing(name)) {\n\t\t\tconst markup: string | undefined = spacingMarkup(name);\n\t\t\treturn markup === undefined ? undefined : atom(markup);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate dispatchSpecial(name: string, tok: Token): Atom | undefined {\n\t\tif (name === 'left') return parseLeftRight(this);\n\t\tif (name === 'begin') return parseBegin(this);\n\t\tif (name === 'pmod') return parsePmod(this);\n\t\tif (name === 'bmod') return atom(mo('mod', { lspace: '0.222em', rspace: '0.222em' }));\n\t\tif (name === 'mod') return atom(mo('mod', { lspace: '0.222em', rspace: '0.222em' }));\n\t\tif (name === 'substack') return parseSubstack(this);\n\t\tif (name === 'right') return parseStrayRight(this, tok.position);\n\t\treturn undefined;\n\t}\n\n\tprivate symbolAtom(symbol: SymbolEntry): Atom {\n\t\tswitch (symbol.kind) {\n\t\t\tcase SymbolKind.Ordinary:\n\t\t\t\treturn atom(mi(symbol.char), symbol.kind);\n\t\t\tcase SymbolKind.Function:\n\t\t\t\treturn atom(mi(symbol.char, { mathvariant: 'normal' }), symbol.kind);\n\t\t\tcase SymbolKind.BigOp:\n\t\t\t\treturn this.bigOperator(symbol);\n\t\t\tcase SymbolKind.Open:\n\t\t\tcase SymbolKind.Close:\n\t\t\t\treturn atom(mo(symbol.char, { fence: true }), symbol.kind);\n\t\t\tdefault:\n\t\t\t\treturn atom(mo(symbol.char), symbol.kind);\n\t\t}\n\t}\n\n\tprivate bigOperator(symbol: SymbolEntry): Atom {\n\t\t// Multi-letter big operators (lim, max, …) render upright like functions.\n\t\tconst multiLetter: boolean = /[a-z]/i.test(symbol.char);\n\t\tif (multiLetter) {\n\t\t\treturn bigOpAtom(mo(symbol.char, { movablelimits: true }), symbol.kind);\n\t\t}\n\t\tconst intLike: boolean = INTEGRAL_CHARS.has(symbol.char);\n\t\tconst node: string = mo(symbol.char, { movablelimits: true, largeop: true });\n\t\treturn bigOpAtom(node, symbol.kind, intLike);\n\t}\n\n\tprivate controlSymbolAtom(name: string): Atom | undefined {\n\t\t// `\\ ` (control space) and other spacing escapes route through mspace.\n\t\tif (isSpacing(name)) {\n\t\t\tconst markup: string | undefined = spacingMarkup(name);\n\t\t\treturn markup === undefined ? undefined : atom(markup);\n\t\t}\n\t\tif (name === '{') return atom(mo('{', { fence: true }), SymbolKind.Open);\n\t\tif (name === '}') return atom(mo('}', { fence: true }), SymbolKind.Close);\n\t\tif (name === '|') return atom(mo('‖'));\n\t\tif (name === '\\\\') return atom(mo('\\\\'));\n\t\tif (name === '/') return atom(mo('/'));\n\t\tif (name === \"'\") return atom(mo(PRIME));\n\t\tif (name === '.') return atom(mo('.'));\n\t\t// Escaped literal punctuation: \\% \\$ \\# \\& \\_\n\t\treturn atom(mtext(name));\n\t}\n\n\tpublic parseArgument(): string {\n\t\treturn nonEmpty(this.parseArgumentRaw());\n\t}\n\n\tprivate parseArgumentRaw(): string {\n\t\tconst tok: Token | undefined = this.peek();\n\t\tif (tok === undefined) return '';\n\t\tif (tok.type === TokenType.GroupOpen) {\n\t\t\tthis.next();\n\t\t\tconst atoms: readonly Atom[] = this.parseExpression(() => false);\n\t\t\tthis.expect(TokenType.GroupClose);\n\t\t\treturn group(atoms.map((a) => a.node));\n\t\t}\n\t\t// Single-token argument: parse exactly one base atom (with no scripts).\n\t\tconst single: Atom | undefined = this.parseBaseAtom();\n\t\treturn single?.node ?? '';\n\t}\n\n\tpublic parseOptionalArgument(): string | undefined {\n\t\tconst tok: Token | undefined = this.peek();\n\t\tif (tok === undefined || tok.type !== TokenType.Char || tok.value !== '[') return undefined;\n\t\tthis.next();\n\t\tconst atoms: readonly Atom[] = this.parseExpression(\n\t\t\t(t) => t.type === TokenType.Char && t.value === ']',\n\t\t);\n\t\tconst closing: Token | undefined = this.peek();\n\t\tif (closing !== undefined && closing.type === TokenType.Char && closing.value === ']') {\n\t\t\tthis.next();\n\t\t}\n\t\treturn group(atoms.map((a) => a.node));\n\t}\n\n\tpublic parseRawArgument(): string {\n\t\tconst tok: Token | undefined = this.peek();\n\t\tif (tok === undefined) return '';\n\t\tif (tok.type !== TokenType.GroupOpen) {\n\t\t\tthis.next();\n\t\t\treturn tok.value;\n\t\t}\n\t\tconst openPos: number = tok.position;\n\t\tthis.next();\n\t\t// Walk tokens tracking brace depth so we can slice the original source\n\t\t// (whitespace the tokenizer dropped is recovered, e.g. `\\text{if }`).\n\t\tlet depth = 1;\n\t\tlet closePos: number = this.source.length;\n\t\twhile (true) {\n\t\t\tconst cur: Token | undefined = this.next();\n\t\t\tif (cur === undefined) break;\n\t\t\tif (cur.type === TokenType.GroupOpen) depth += 1;\n\t\t\telse if (cur.type === TokenType.GroupClose) {\n\t\t\t\tdepth -= 1;\n\t\t\t\tif (depth === 0) {\n\t\t\t\t\tclosePos = cur.position;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this.source.slice(openPos + 1, closePos);\n\t}\n\n\tprivate expect(type: TokenType): void {\n\t\tconst tok: Token | undefined = this.peek();\n\t\tif (tok !== undefined && tok.type === type) {\n\t\t\tthis.next();\n\t\t\treturn;\n\t\t}\n\t\tif (type === TokenType.GroupClose) {\n\t\t\tthis.error({ message: 'Unmatched brace' });\n\t\t}\n\t}\n}\n\n/** Ensures a structural argument slot holds exactly one element, never empty. */\nfunction nonEmpty(markup: string): string {\n\treturn markup === '' ? mrow('') : markup;\n}\n","/**\n * Public entry point for the zero-dependency LaTeX → Presentation MathML converter.\n *\n * Layer A (framework-agnostic, zero notectl imports). Tokenizes the source,\n * runs the recursive-descent parser, and groups the top-level atoms into a\n * single MathML root element. Never throws: malformed input is recovered, and\n * every problem is surfaced both as a visible `merror`/marker in the output and\n * as a recorded `LatexError`.\n */\n\nimport { mrow } from '../mathml/index.js';\nimport { parseLatex } from './LatexParser.js';\nimport type { Atom } from './LatexParserTypes.js';\n\n/** A single recoverable problem encountered while converting LaTeX. */\nexport interface LatexError {\n\t/** Human-readable description (e.g. 'Unknown command'). */\n\treadonly message: string;\n\t/** The offending command, including the leading backslash, when applicable. */\n\treadonly command?: string;\n\t/** Zero-based source position of the problem, when known. */\n\treadonly position?: number;\n}\n\n/** The result of a LaTeX → MathML conversion. */\nexport interface LatexConversionResult {\n\t/** A SINGLE root presentation-MathML element string (e.g. `<mrow>…</mrow>`). Never empty: uses `<mrow></mrow>`. */\n\treadonly presentation: string;\n\t/** Every problem encountered; empty when the input converted cleanly. */\n\treadonly errors: readonly LatexError[];\n}\n\n/** Options controlling how the LaTeX source is converted. */\nexport interface LatexToMathMLOptions {\n\t/** Display (block) vs inline. Affects displaystyle / big-operator limit placement. */\n\treadonly display?: boolean;\n}\n\nconst EMPTY_ROOT = '<mrow></mrow>';\n\n/** Converts a LaTeX math string to a presentation-MathML root element. Never throws. */\nexport function latexToMathML(latex: string, opts?: LatexToMathMLOptions): LatexConversionResult {\n\tconst display: boolean = opts?.display ?? false;\n\tconst trimmed: string = latex.trim();\n\tif (trimmed === '') return { presentation: EMPTY_ROOT, errors: [] };\n\tconst { atoms, errors } = parseLatex(latex, display);\n\treturn { presentation: rootElement(atoms), errors };\n}\n\nfunction rootElement(atoms: readonly Atom[]): string {\n\tif (atoms.length === 0) return EMPTY_ROOT;\n\tif (atoms.length === 1) {\n\t\tconst only: Atom | undefined = atoms[0];\n\t\treturn only ? only.node : EMPTY_ROOT;\n\t}\n\treturn mrow(atoms.map((a) => a.node).join(''));\n}\n","/**\n * InputRules that turn `$...$` into inline math and `$$...$$` into display math\n * as the user types the closing delimiter, converting the LaTeX via the\n * zero-dependency converter. Display is registered first so `$$...$$` is never\n * mis-claimed by the inline rule (the inline pattern also rejects `$$` via a\n * lookbehind).\n */\n\nimport { createInlineNode } from '../../model/Document.js';\nimport type { InputRule } from '../../model/InputRule.js';\nimport { createCollapsedSelection, isCollapsed, isTextSelection } from '../../model/Selection.js';\nimport { type BlockId, inlineType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport { appendDisplayMathSteps } from './FormulaCommands.js';\nimport { INLINE_MATH_TYPE } from './FormulaTypes.js';\nimport { latexToMathML } from './latex/index.js';\nimport { buildMathML } from './mathml/index.js';\n\nconst INLINE_PATTERN = /(?<!\\$)\\$([^$\\n]+)\\$$/;\nconst DISPLAY_PATTERN = /\\$\\$([^$\\n]+)\\$\\$$/;\n\n/** Returns true when the block under the cursor accepts inline-flow transforms. */\nfunction isTransformable(state: EditorState, blockId: BlockId): boolean {\n\tconst block = state.getBlock(blockId);\n\treturn block !== undefined && block.type !== 'code_block';\n}\n\n/**\n * Maps a matched delimiter run to a model text range. The match is pure text\n * (delimiters + LaTeX) ending at the caret, so anchoring to the caret's model\n * offset stays correct even when inline atoms precede it in the same block\n * (`getBlockText` skips atoms, so the engine's text offsets can drift).\n */\nfunction modelRange(cursor: number, matchLength: number): { from: number; to: number } | null {\n\tconst from: number = cursor - matchLength;\n\tif (from < 0) return null;\n\treturn { from, to: cursor };\n}\n\nfunction inlineRule(): InputRule {\n\treturn {\n\t\tpattern: INLINE_PATTERN,\n\t\thandler(state: EditorState, match: RegExpMatchArray): Transaction | null {\n\t\t\tconst sel = state.selection;\n\t\t\tif (!isTextSelection(sel) || !isCollapsed(sel)) return null;\n\t\t\tconst latex: string = (match[1] ?? '').trim();\n\t\t\tif (!latex) return null;\n\t\t\tconst blockId = sel.anchor.blockId;\n\t\t\tif (!isTransformable(state, blockId)) return null;\n\t\t\tconst range = modelRange(sel.anchor.offset, match[0].length);\n\t\t\tif (!range) return null;\n\n\t\t\tconst { presentation } = latexToMathML(latex, { display: false });\n\t\t\tconst mathml: string = buildMathML({ presentation, latex, display: false });\n\t\t\tconst node = createInlineNode(inlineType(INLINE_MATH_TYPE), {\n\t\t\t\tmathml,\n\t\t\t\tlatex,\n\t\t\t\talt: '',\n\t\t\t\tfontSize: '',\n\t\t\t});\n\n\t\t\treturn state\n\t\t\t\t.transaction('input')\n\t\t\t\t.deleteTextAt(blockId, range.from, range.to)\n\t\t\t\t.insertInlineNode(blockId, range.from, node)\n\t\t\t\t.setSelection(createCollapsedSelection(blockId, range.from + 1))\n\t\t\t\t.build();\n\t\t},\n\t};\n}\n\nfunction displayRule(): InputRule {\n\treturn {\n\t\tpattern: DISPLAY_PATTERN,\n\t\thandler(state: EditorState, match: RegExpMatchArray): Transaction | null {\n\t\t\tconst sel = state.selection;\n\t\t\tif (!isTextSelection(sel) || !isCollapsed(sel)) return null;\n\t\t\tconst latex: string = (match[1] ?? '').trim();\n\t\t\tif (!latex) return null;\n\t\t\tconst blockId = sel.anchor.blockId;\n\t\t\tif (!isTransformable(state, blockId)) return null;\n\t\t\tconst range = modelRange(sel.anchor.offset, match[0].length);\n\t\t\tif (!range) return null;\n\n\t\t\t// Display equations are inserted at the top level after the current block.\n\t\t\tconst blockIndex: number = state.doc.children.findIndex((b) => b.id === blockId);\n\t\t\tif (blockIndex === -1) return null;\n\n\t\t\tconst { presentation } = latexToMathML(latex, { display: true });\n\t\t\tconst mathml: string = buildMathML({ presentation, latex, display: true });\n\n\t\t\tconst builder = state.transaction('input').deleteTextAt(blockId, range.from, range.to);\n\t\t\tappendDisplayMathSteps(builder, blockIndex + 1, { mathml, latex, alt: '', fontSize: '' });\n\t\t\treturn builder.build();\n\t\t},\n\t};\n}\n\n/** Builds the `$...$` (inline) and `$$...$$` (display) input rules, display first. */\nexport function createFormulaInputRules(): InputRule[] {\n\treturn [displayRule(), inlineRule()];\n}\n","/**\n * Locale interface and default English strings for the formula plugin.\n * All authoring surfaces (toolbar, overlay, palette) draw their labels here so\n * the plugin is fully translatable and accessible out of the box.\n */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface FormulaLocale {\n\treadonly insertInline: string;\n\treadonly insertInlineTooltip: string;\n\treadonly editFormula: string;\n\treadonly latexLabel: string;\n\treadonly latexPlaceholder: string;\n\treadonly previewLabel: string;\n\treadonly insertButton: string;\n\treadonly updateButton: string;\n\treadonly cancelButton: string;\n\treadonly displayToggle: string;\n\treadonly sizeLabel: string;\n\treadonly sizeDefault: string;\n\treadonly altLabel: string;\n\treadonly altPlaceholder: string;\n\treadonly paletteLabel: string;\n\treadonly emptyPreview: string;\n\t/** Announced when a formula is inserted. */\n\treadonly inserted: string;\n\t/** Announced when a formula is updated. */\n\treadonly updated: string;\n\t/** Announced when the editing overlay opens. */\n\treadonly editing: string;\n\t/** Announced when a formula node is selected (display math). */\n\treadonly selected: string;\n\t/** Builds the unknown-command error message. */\n\treadonly unknownCommand: (command: string) => string;\n\t/** Accessible group labels for the structural palette. */\n\treadonly groupFractions: string;\n\treadonly groupScripts: string;\n\treadonly groupRoots: string;\n\treadonly groupAccents: string;\n\treadonly groupOperators: string;\n\treadonly groupFunctions: string;\n\treadonly groupGreek: string;\n\treadonly groupRelations: string;\n\treadonly groupSets: string;\n\treadonly groupLogic: string;\n\treadonly groupArrows: string;\n\treadonly groupDelimiters: string;\n\treadonly groupDots: string;\n\treadonly groupMatrices: string;\n}\n\n// --- Default English Locale ---\n\nexport const FORMULA_LOCALE_EN: FormulaLocale = {\n\tinsertInline: 'Insert formula',\n\tinsertInlineTooltip: 'Insert inline formula',\n\teditFormula: 'Edit formula',\n\tlatexLabel: 'LaTeX',\n\tlatexPlaceholder: 'e.g. \\\\frac{a}{b} + \\\\sqrt{x}',\n\tpreviewLabel: 'Preview',\n\tinsertButton: 'Insert',\n\tupdateButton: 'Update',\n\tcancelButton: 'Cancel',\n\tdisplayToggle: 'Display (block) equation',\n\tsizeLabel: 'Size',\n\tsizeDefault: 'Default',\n\taltLabel: 'Description',\n\taltPlaceholder: 'Spoken description (optional)',\n\tpaletteLabel: 'Symbols and structures',\n\temptyPreview: 'Nothing to preview yet.',\n\tinserted: 'Formula inserted.',\n\tupdated: 'Formula updated.',\n\tediting: 'Editing formula.',\n\tselected: 'Formula selected. Press Enter to edit.',\n\tunknownCommand: (command: string) => `Unknown LaTeX command: ${command}`,\n\tgroupFractions: 'Fractions',\n\tgroupScripts: 'Scripts',\n\tgroupRoots: 'Roots',\n\tgroupAccents: 'Accents',\n\tgroupOperators: 'Operators',\n\tgroupFunctions: 'Functions',\n\tgroupGreek: 'Greek letters',\n\tgroupRelations: 'Relations',\n\tgroupSets: 'Sets',\n\tgroupLogic: 'Logic',\n\tgroupArrows: 'Arrows',\n\tgroupDelimiters: 'Brackets',\n\tgroupDots: 'Dots',\n\tgroupMatrices: 'Matrices',\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<FormulaLocale> = import.meta.glob<{\n\tdefault: FormulaLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadFormulaLocale(lang: string): Promise<FormulaLocale> {\n\treturn loadLocaleModule(localeModules, lang, FORMULA_LOCALE_EN);\n}\n","/**\n * Accessible structural palette / on-screen math keyboard (Layer A).\n *\n * Renders grouped buttons that insert LaTeX snippets at the caret. Implements\n * the WAI-ARIA toolbar pattern with a roving tabindex: one button is tabbable,\n * arrow keys move focus across the whole palette, Home/End jump to the ends, and\n * Enter/Space activate the focused button. Mouse clicks use mousedown+preventDefault\n * so the LaTeX field keeps focus and caret position; activation inserts the snippet\n * and returns focus to the field.\n */\n\nimport type { MathPaletteGroup } from './MathFieldTypes.js';\n\nexport class MathPalette {\n\t/** The toolbar root element. */\n\treadonly root: HTMLElement;\n\n\tprivate readonly buttons: HTMLButtonElement[] = [];\n\tprivate activeIndex = 0;\n\n\tconstructor(\n\t\tgroups: readonly MathPaletteGroup[],\n\t\tlabel: string,\n\t\tonInsert: (snippet: string) => void,\n\t) {\n\t\tthis.root = document.createElement('div');\n\t\tthis.root.className = 'notectl-math-palette';\n\t\tthis.root.setAttribute('role', 'toolbar');\n\t\tthis.root.setAttribute('aria-label', label);\n\n\t\tfor (const group of groups) {\n\t\t\tthis.root.appendChild(this.buildGroup(group, onInsert));\n\t\t}\n\t\tthis.root.addEventListener('keydown', (e: KeyboardEvent) => this.onKeydown(e));\n\t\tthis.setActive(0);\n\t}\n\n\t/** Moves keyboard focus to the palette's currently active button. */\n\tfocus(): void {\n\t\tthis.buttons[this.activeIndex]?.focus();\n\t}\n\n\t/** The palette's currently roving-active button (the single tabbable one). */\n\tactiveButton(): HTMLButtonElement | undefined {\n\t\treturn this.buttons[this.activeIndex];\n\t}\n\n\tprivate buildGroup(group: MathPaletteGroup, onInsert: (snippet: string) => void): HTMLElement {\n\t\tconst wrapper: HTMLDivElement = document.createElement('div');\n\t\twrapper.className = 'notectl-math-palette__group';\n\t\twrapper.setAttribute('role', 'group');\n\t\twrapper.setAttribute('aria-label', group.label);\n\n\t\tfor (const item of group.items) {\n\t\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\t\tbtn.type = 'button';\n\t\t\tbtn.className = 'notectl-math-palette__btn';\n\t\t\tbtn.textContent = item.label;\n\t\t\tbtn.setAttribute('aria-label', item.ariaLabel);\n\t\t\tbtn.tabIndex = -1;\n\t\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\tbtn.addEventListener('click', () => onInsert(item.snippet));\n\t\t\tthis.buttons.push(btn);\n\t\t\twrapper.appendChild(btn);\n\t\t}\n\t\treturn wrapper;\n\t}\n\n\tprivate onKeydown(e: KeyboardEvent): void {\n\t\t// The palette fully owns its keyboard (the WAI-ARIA toolbar pattern), mirroring\n\t\t// the color grid: it activates the focused button on Enter/Space and stops every\n\t\t// key it handles from bubbling, so the host toolbar popup never re-handles it\n\t\t// (which would otherwise advance focus a second time on Arrow keys).\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.buttons[this.activeIndex]?.click();\n\t\t\treturn;\n\t\t}\n\n\t\tconst last: number = this.buttons.length - 1;\n\t\tlet next: number = this.activeIndex;\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowDown':\n\t\t\t\tnext = this.activeIndex >= last ? 0 : this.activeIndex + 1;\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowUp':\n\t\t\t\tnext = this.activeIndex <= 0 ? last : this.activeIndex - 1;\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tnext = 0;\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tnext = last;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tthis.setActive(next);\n\t\tthis.buttons[next]?.focus();\n\t}\n\n\tprivate setActive(index: number): void {\n\t\tconst prev: HTMLButtonElement | undefined = this.buttons[this.activeIndex];\n\t\tif (prev) prev.tabIndex = -1;\n\t\tconst cur: HTMLButtonElement | undefined = this.buttons[index];\n\t\tif (cur) cur.tabIndex = 0;\n\t\tthis.activeIndex = index;\n\t}\n}\n","/**\n * Accessible math field (Layer A, zero notectl imports).\n *\n * A self-contained formula authoring surface: LaTeX source field, live MathML\n * preview, accessible description, display toggle, and structural palette. The\n * LaTeX field is the primary fully-accessible authoring path (linear, keyboard,\n * screen-reader friendly); unknown commands are surfaced visibly and announced\n * via a live region rather than swallowed. Emits MathML/LaTeX through callbacks.\n */\n\nimport { latexToMathML } from '../latex/index.js';\nimport { buildMathML } from '../mathml/index.js';\nimport type { MathFieldOptions, MathFieldResult } from './MathFieldTypes.js';\nimport { MathPalette } from './MathPalette.js';\n\nlet uidCounter = 0;\n\nexport class MathField {\n\t/** The field's root element; mount this wherever the formula is edited. */\n\treadonly root: HTMLElement;\n\n\tprivate readonly options: MathFieldOptions;\n\tprivate readonly textarea: HTMLTextAreaElement;\n\tprivate readonly preview: HTMLElement;\n\tprivate readonly previewEmpty: HTMLElement;\n\tprivate readonly errorsList: HTMLElement;\n\tprivate readonly altInput: HTMLInputElement;\n\tprivate readonly commitBtn: HTMLButtonElement;\n\tprivate palette: MathPalette | null = null;\n\tprivate displayCheckbox: HTMLInputElement | null = null;\n\tprivate cancelBtn: HTMLButtonElement | null = null;\n\tprivate fontSizeSelect: HTMLSelectElement | null = null;\n\tprivate display: boolean;\n\tprivate lastErrorKey = '';\n\n\tconstructor(options: MathFieldOptions) {\n\t\tthis.options = options;\n\t\tthis.display = options.initialDisplay ?? false;\n\t\tconst uid: number = ++uidCounter;\n\n\t\tthis.root = document.createElement('div');\n\t\tthis.root.className = 'notectl-formula-editor';\n\t\tthis.root.setAttribute('role', 'group');\n\t\tthis.root.setAttribute('aria-label', options.locale.latexLabel);\n\n\t\tif (options.palette && options.palette.length > 0) {\n\t\t\tthis.palette = new MathPalette(options.palette, options.locale.paletteLabel, (s) =>\n\t\t\t\tthis.insertSnippet(s),\n\t\t\t);\n\t\t\tthis.root.appendChild(this.palette.root);\n\t\t}\n\n\t\tthis.textarea = this.buildLatexField(uid);\n\t\tthis.preview = document.createElement('div');\n\t\tthis.previewEmpty = document.createElement('div');\n\t\tthis.errorsList = document.createElement('ul');\n\t\tthis.altInput = this.buildAltField(uid);\n\t\tthis.commitBtn = document.createElement('button');\n\n\t\tthis.root.appendChild(this.buildPreview());\n\t\tthis.root.appendChild(this.errorsList);\n\t\tthis.root.appendChild(this.altInput.parentElement as HTMLElement);\n\t\tif (options.fontSizes && options.fontSizes.length > 0) {\n\t\t\tthis.root.appendChild(this.buildSizeField(uid));\n\t\t}\n\t\tif (options.mode === 'insert') this.root.appendChild(this.buildDisplayToggle(uid));\n\t\tthis.root.appendChild(this.buildActions());\n\n\t\tthis.errorsList.className = 'notectl-formula-editor__errors';\n\t\tthis.errorsList.id = `notectl-formula-errors-${uid}`;\n\t\tthis.errorsList.setAttribute('aria-live', 'polite');\n\t\tthis.textarea.setAttribute('aria-describedby', this.errorsList.id);\n\n\t\tthis.root.addEventListener('keydown', (e: KeyboardEvent) => this.onRootKeydown(e));\n\n\t\tthis.update();\n\t}\n\n\t/** Focuses the LaTeX field. */\n\tfocus(): void {\n\t\tthis.textarea.focus();\n\t\tthis.textarea.setSelectionRange(this.textarea.value.length, this.textarea.value.length);\n\t}\n\n\tprivate onRootKeydown(e: KeyboardEvent): void {\n\t\t// Escape closes from any field, not just the LaTeX textarea. Stopping\n\t\t// propagation keeps it from bubbling out to exit the editor.\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.options.onCancel();\n\t\t\treturn;\n\t\t}\n\t\tif (e.key !== 'Tab') return;\n\t\t// The field is a dialog with several focusable sections (palette, LaTeX,\n\t\t// description, display toggle, actions). Tab/Shift+Tab cycle between them\n\t\t// instead of leaving the field, and stopping propagation prevents a host\n\t\t// toolbar popup from dismissing itself on Tab.\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tthis.moveFocus(!e.shiftKey);\n\t}\n\n\t/** Ordered keyboard stops: palette (one roving button), LaTeX, description, toggle, actions. */\n\tprivate focusStops(): HTMLElement[] {\n\t\tconst stops: HTMLElement[] = [];\n\t\tconst paletteButton: HTMLButtonElement | undefined = this.palette?.activeButton();\n\t\tif (paletteButton) stops.push(paletteButton);\n\t\tstops.push(this.textarea, this.altInput);\n\t\tif (this.fontSizeSelect) stops.push(this.fontSizeSelect);\n\t\tif (this.displayCheckbox) stops.push(this.displayCheckbox);\n\t\tif (this.cancelBtn) stops.push(this.cancelBtn);\n\t\tstops.push(this.commitBtn);\n\t\treturn stops;\n\t}\n\n\tprivate moveFocus(forward: boolean): void {\n\t\tconst stops: HTMLElement[] = this.focusStops();\n\t\tif (stops.length === 0) return;\n\t\tconst active: Element | null = this.activeElement();\n\t\tlet index: number = stops.findIndex((stop) => stop === active);\n\t\tif (index === -1 && active && this.palette?.root.contains(active)) {\n\t\t\tindex = 0; // focus sits on some palette button → the palette stop\n\t\t}\n\t\tif (index === -1) index = forward ? stops.length - 1 : 0;\n\t\tconst next: number = (index + (forward ? 1 : -1) + stops.length) % stops.length;\n\t\tstops[next]?.focus();\n\t}\n\n\t/** The focused element within this field's root, piercing shadow boundaries. */\n\tprivate activeElement(): Element | null {\n\t\tconst root = this.root.getRootNode() as Document | ShadowRoot;\n\t\tlet el: Element | null = root.activeElement;\n\t\twhile (el?.shadowRoot?.activeElement) el = el.shadowRoot.activeElement;\n\t\treturn el;\n\t}\n\n\t/** Builds the committed result (canonical MathML + LaTeX + alt + display). */\n\tgetResult(): MathFieldResult {\n\t\tconst latex: string = this.textarea.value.trim();\n\t\tconst alt: string = this.altInput.value.trim();\n\t\tconst { presentation } = latexToMathML(latex, { display: this.display });\n\t\tconst mathml: string = buildMathML({\n\t\t\tpresentation,\n\t\t\tlatex,\n\t\t\tdisplay: this.display,\n\t\t\talt: alt || undefined,\n\t\t});\n\t\treturn {\n\t\t\tlatex,\n\t\t\tmathml,\n\t\t\talt,\n\t\t\tdisplay: this.display,\n\t\t\tfontSize: this.fontSizeSelect?.value ?? '',\n\t\t};\n\t}\n\n\t/** Inserts a LaTeX snippet at the caret, honouring an optional `$0` caret marker. */\n\tinsertSnippet(snippet: string): void {\n\t\tconst start: number = this.textarea.selectionStart ?? this.textarea.value.length;\n\t\tconst end: number = this.textarea.selectionEnd ?? start;\n\t\tconst markerAt: number = snippet.indexOf('$0');\n\t\tconst text: string = markerAt >= 0 ? snippet.replace('$0', '') : snippet;\n\t\tconst caretOffset: number = markerAt >= 0 ? markerAt : text.length;\n\n\t\tconst value: string = this.textarea.value;\n\t\tthis.textarea.value = value.slice(0, start) + text + value.slice(end);\n\t\tconst caret: number = start + caretOffset;\n\t\tthis.textarea.focus();\n\t\tthis.textarea.setSelectionRange(caret, caret);\n\t\tthis.update();\n\t}\n\n\tprivate buildLatexField(uid: number): HTMLTextAreaElement {\n\t\tconst field: HTMLDivElement = document.createElement('div');\n\t\tfield.className = 'notectl-formula-editor__field';\n\t\tconst label: HTMLLabelElement = document.createElement('label');\n\t\tlabel.className = 'notectl-formula-editor__label';\n\t\tlabel.htmlFor = `notectl-formula-latex-${uid}`;\n\t\tlabel.textContent = this.options.locale.latexLabel;\n\t\tconst textarea: HTMLTextAreaElement = document.createElement('textarea');\n\t\ttextarea.id = `notectl-formula-latex-${uid}`;\n\t\ttextarea.className = 'notectl-formula-editor__input';\n\t\ttextarea.placeholder = this.options.locale.latexPlaceholder;\n\t\ttextarea.rows = 2;\n\t\ttextarea.spellcheck = false;\n\t\ttextarea.value = this.options.initialLatex ?? '';\n\t\ttextarea.addEventListener('input', () => this.update());\n\t\ttextarea.addEventListener('keydown', (e: KeyboardEvent) => this.onTextareaKeydown(e));\n\t\tfield.appendChild(label);\n\t\tfield.appendChild(textarea);\n\t\tthis.root.appendChild(field);\n\t\treturn textarea;\n\t}\n\n\tprivate buildPreview(): HTMLElement {\n\t\tconst field: HTMLDivElement = document.createElement('div');\n\t\tfield.className = 'notectl-formula-editor__field';\n\t\tconst label: HTMLSpanElement = document.createElement('span');\n\t\tlabel.className = 'notectl-formula-editor__label';\n\t\tlabel.textContent = this.options.locale.previewLabel;\n\t\tthis.preview.className = 'notectl-formula-editor__preview';\n\t\tthis.previewEmpty.className = 'notectl-formula-editor__preview-empty';\n\t\tthis.previewEmpty.textContent = this.options.locale.emptyPreview;\n\t\tfield.appendChild(label);\n\t\tfield.appendChild(this.previewEmpty);\n\t\tfield.appendChild(this.preview);\n\t\treturn field;\n\t}\n\n\tprivate buildAltField(uid: number): HTMLInputElement {\n\t\tconst field: HTMLDivElement = document.createElement('div');\n\t\tfield.className = 'notectl-formula-editor__field';\n\t\tconst label: HTMLLabelElement = document.createElement('label');\n\t\tlabel.className = 'notectl-formula-editor__label';\n\t\tlabel.htmlFor = `notectl-formula-alt-${uid}`;\n\t\tlabel.textContent = this.options.locale.altLabel;\n\t\tconst input: HTMLInputElement = document.createElement('input');\n\t\tinput.id = `notectl-formula-alt-${uid}`;\n\t\tinput.type = 'text';\n\t\tinput.className = 'notectl-formula-editor__alt';\n\t\tinput.placeholder = this.options.locale.altPlaceholder;\n\t\tinput.value = this.options.initialAlt ?? '';\n\t\tfield.appendChild(label);\n\t\tfield.appendChild(input);\n\t\treturn input;\n\t}\n\n\tprivate buildSizeField(uid: number): HTMLElement {\n\t\tconst field: HTMLDivElement = document.createElement('div');\n\t\tfield.className = 'notectl-formula-editor__field';\n\t\tconst label: HTMLLabelElement = document.createElement('label');\n\t\tlabel.className = 'notectl-formula-editor__label';\n\t\tlabel.htmlFor = `notectl-formula-size-${uid}`;\n\t\tlabel.textContent = this.options.locale.sizeLabel;\n\n\t\tconst select: HTMLSelectElement = document.createElement('select');\n\t\tselect.id = `notectl-formula-size-${uid}`;\n\t\tselect.className = 'notectl-formula-editor__size';\n\t\tconst initial: string = this.options.initialFontSize ?? '';\n\t\tselect.appendChild(this.buildSizeOption('', this.options.locale.sizeDefault));\n\t\tfor (const size of this.options.fontSizes ?? []) {\n\t\t\tselect.appendChild(this.buildSizeOption(`${size}px`, String(size)));\n\t\t}\n\t\t// Preserve a current size that is not among the presets.\n\t\tif (initial && !Array.from(select.options).some((o) => o.value === initial)) {\n\t\t\tselect.appendChild(this.buildSizeOption(initial, initial.replace('px', '')));\n\t\t}\n\t\tselect.value = initial;\n\t\tselect.addEventListener('change', () => this.applyPreviewFontSize());\n\t\tthis.fontSizeSelect = select;\n\n\t\tfield.appendChild(label);\n\t\tfield.appendChild(select);\n\t\treturn field;\n\t}\n\n\tprivate buildSizeOption(value: string, label: string): HTMLOptionElement {\n\t\tconst option: HTMLOptionElement = document.createElement('option');\n\t\toption.value = value;\n\t\toption.textContent = label;\n\t\treturn option;\n\t}\n\n\t/** Scales the live preview to the selected font size, so sizing is WYSIWYG. */\n\tprivate applyPreviewFontSize(): void {\n\t\tthis.preview.style.fontSize = this.fontSizeSelect?.value || '';\n\t}\n\n\tprivate buildDisplayToggle(uid: number): HTMLElement {\n\t\tconst wrapper: HTMLLabelElement = document.createElement('label');\n\t\twrapper.className = 'notectl-formula-editor__toggle';\n\t\twrapper.htmlFor = `notectl-formula-display-${uid}`;\n\t\tconst checkbox: HTMLInputElement = document.createElement('input');\n\t\tcheckbox.id = `notectl-formula-display-${uid}`;\n\t\tcheckbox.type = 'checkbox';\n\t\tcheckbox.checked = this.display;\n\t\tcheckbox.addEventListener('change', () => {\n\t\t\tthis.display = checkbox.checked;\n\t\t\tthis.update();\n\t\t});\n\t\tthis.displayCheckbox = checkbox;\n\t\tconst text: HTMLSpanElement = document.createElement('span');\n\t\ttext.textContent = this.options.locale.displayToggle;\n\t\twrapper.appendChild(checkbox);\n\t\twrapper.appendChild(text);\n\t\treturn wrapper;\n\t}\n\n\tprivate buildActions(): HTMLElement {\n\t\tconst actions: HTMLDivElement = document.createElement('div');\n\t\tactions.className = 'notectl-formula-editor__actions';\n\t\tconst cancel: HTMLButtonElement = document.createElement('button');\n\t\tcancel.type = 'button';\n\t\tcancel.className = 'notectl-formula-editor__btn';\n\t\tcancel.textContent = this.options.locale.cancel;\n\t\tcancel.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t});\n\t\tcancel.addEventListener('click', () => this.options.onCancel());\n\t\tthis.cancelBtn = cancel;\n\t\tthis.commitBtn.type = 'button';\n\t\tthis.commitBtn.className = 'notectl-formula-editor__btn notectl-formula-editor__btn--primary';\n\t\tthis.commitBtn.textContent =\n\t\t\tthis.options.mode === 'edit'\n\t\t\t\t? this.options.locale.commitUpdate\n\t\t\t\t: this.options.locale.commitInsert;\n\t\tthis.commitBtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t});\n\t\tthis.commitBtn.addEventListener('click', () => this.commit());\n\t\tactions.appendChild(cancel);\n\t\tactions.appendChild(this.commitBtn);\n\t\treturn actions;\n\t}\n\n\tprivate onTextareaKeydown(e: KeyboardEvent): void {\n\t\t// Escape is handled at the field root (see onRootKeydown) so it works from\n\t\t// every field; here we only intercept Enter to commit.\n\t\tif (e.key === 'Enter' && !e.shiftKey) {\n\t\t\te.preventDefault();\n\t\t\tthis.commit();\n\t\t}\n\t}\n\n\tprivate commit(): void {\n\t\tconst result: MathFieldResult = this.getResult();\n\t\tif (!result.latex) {\n\t\t\tthis.options.onCancel();\n\t\t\treturn;\n\t\t}\n\t\tthis.options.onCommit(result);\n\t}\n\n\tprivate update(): void {\n\t\tthis.applyPreviewFontSize();\n\t\tconst latex: string = this.textarea.value.trim();\n\t\tif (!latex) {\n\t\t\tthis.preview.innerHTML = '';\n\t\t\tthis.previewEmpty.hidden = false;\n\t\t\tthis.renderErrors([]);\n\t\t\treturn;\n\t\t}\n\t\tthis.previewEmpty.hidden = true;\n\t\tconst { presentation, errors } = latexToMathML(latex, { display: this.display });\n\t\tthis.preview.innerHTML = buildMathML({ presentation, display: this.display });\n\t\tthis.renderErrors(errors.map((err) => err.command ?? err.message));\n\t}\n\n\tprivate renderErrors(commands: readonly string[]): void {\n\t\tconst key: string = commands.join('\u0001');\n\t\tif (key === this.lastErrorKey) return;\n\t\tthis.lastErrorKey = key;\n\t\tthis.errorsList.replaceChildren();\n\t\tfor (const command of commands) {\n\t\t\tconst li: HTMLLIElement = document.createElement('li');\n\t\t\tli.textContent = command.startsWith('\\\\')\n\t\t\t\t? this.options.locale.unknownCommand(command)\n\t\t\t\t: command;\n\t\t\tthis.errorsList.appendChild(li);\n\t\t}\n\t}\n}\n","/**\n * Default structural palette / on-screen math keyboard data (Layer A).\n *\n * Each item inserts a LaTeX snippet; `$0` marks where the caret lands so the\n * user can keep typing inside the new structure. Group labels are supplied by\n * the host (translatable); item labels are the universal symbols themselves and\n * carry an English accessible name.\n */\n\nimport type { MathPaletteGroup } from './MathFieldTypes.js';\n\n/** Translatable group labels for the default palette. */\nexport interface MathPaletteLabels {\n\treadonly fractions: string;\n\treadonly scripts: string;\n\treadonly roots: string;\n\treadonly accents: string;\n\treadonly operators: string;\n\treadonly functions: string;\n\treadonly greek: string;\n\treadonly relations: string;\n\treadonly sets: string;\n\treadonly logic: string;\n\treadonly arrows: string;\n\treadonly delimiters: string;\n\treadonly dots: string;\n\treadonly matrices: string;\n}\n\n/** Builds the default palette groups using the given (translatable) group labels. */\nexport function buildMathPalette(labels: MathPaletteLabels): MathPaletteGroup[] {\n\treturn [\n\t\t{\n\t\t\tid: 'fractions',\n\t\t\tlabel: labels.fractions,\n\t\t\titems: [\n\t\t\t\t{ label: 'a╱b', ariaLabel: 'Fraction', snippet: '\\\\frac{$0}{}' },\n\t\t\t\t{ label: '⒞', ariaLabel: 'Binomial coefficient', snippet: '\\\\binom{$0}{}' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'scripts',\n\t\t\tlabel: labels.scripts,\n\t\t\titems: [\n\t\t\t\t{ label: 'xⁿ', ariaLabel: 'Superscript', snippet: '^{$0}' },\n\t\t\t\t{ label: 'xₙ', ariaLabel: 'Subscript', snippet: '_{$0}' },\n\t\t\t\t{ label: 'xⁿₘ', ariaLabel: 'Subscript and superscript', snippet: '_{$0}^{}' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'roots',\n\t\t\tlabel: labels.roots,\n\t\t\titems: [\n\t\t\t\t{ label: '√', ariaLabel: 'Square root', snippet: '\\\\sqrt{$0}' },\n\t\t\t\t{ label: 'ⁿ√', ariaLabel: 'N-th root', snippet: '\\\\sqrt[$0]{}' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'accents',\n\t\t\tlabel: labels.accents,\n\t\t\titems: [\n\t\t\t\t{ label: '→', ariaLabel: 'Vector', snippet: '\\\\vec{$0}' },\n\t\t\t\t{ label: 'â', ariaLabel: 'Hat', snippet: '\\\\hat{$0}' },\n\t\t\t\t{ label: 'ā', ariaLabel: 'Overline', snippet: '\\\\overline{$0}' },\n\t\t\t\t{ label: 'ȧ', ariaLabel: 'Dot above', snippet: '\\\\dot{$0}' },\n\t\t\t\t{ label: 'ã', ariaLabel: 'Tilde', snippet: '\\\\tilde{$0}' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'operators',\n\t\t\tlabel: labels.operators,\n\t\t\titems: [\n\t\t\t\t{ label: '∑', ariaLabel: 'Sum with limits', snippet: '\\\\sum_{$0}^{}' },\n\t\t\t\t{ label: '∏', ariaLabel: 'Product with limits', snippet: '\\\\prod_{$0}^{}' },\n\t\t\t\t{ label: '∫', ariaLabel: 'Integral with limits', snippet: '\\\\int_{$0}^{}' },\n\t\t\t\t{ label: '∬', ariaLabel: 'Double integral', snippet: '\\\\iint ' },\n\t\t\t\t{ label: '∮', ariaLabel: 'Contour integral', snippet: '\\\\oint ' },\n\t\t\t\t{ label: 'lim', ariaLabel: 'Limit', snippet: '\\\\lim_{$0}' },\n\t\t\t\t{ label: '∂', ariaLabel: 'Partial derivative', snippet: '\\\\partial ' },\n\t\t\t\t{ label: '∇', ariaLabel: 'Nabla (del)', snippet: '\\\\nabla ' },\n\t\t\t\t{ label: '×', ariaLabel: 'Times', snippet: '\\\\times ' },\n\t\t\t\t{ label: '·', ariaLabel: 'Dot product', snippet: '\\\\cdot ' },\n\t\t\t\t{ label: '±', ariaLabel: 'Plus or minus', snippet: '\\\\pm ' },\n\t\t\t\t{ label: '÷', ariaLabel: 'Division', snippet: '\\\\div ' },\n\t\t\t\t{ label: '∞', ariaLabel: 'Infinity', snippet: '\\\\infty ' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'functions',\n\t\t\tlabel: labels.functions,\n\t\t\titems: [\n\t\t\t\t{ label: 'sin', ariaLabel: 'Sine', snippet: '\\\\sin ' },\n\t\t\t\t{ label: 'cos', ariaLabel: 'Cosine', snippet: '\\\\cos ' },\n\t\t\t\t{ label: 'tan', ariaLabel: 'Tangent', snippet: '\\\\tan ' },\n\t\t\t\t{ label: 'log', ariaLabel: 'Logarithm', snippet: '\\\\log ' },\n\t\t\t\t{ label: 'ln', ariaLabel: 'Natural logarithm', snippet: '\\\\ln ' },\n\t\t\t\t{ label: 'exp', ariaLabel: 'Exponential function', snippet: '\\\\exp ' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'greek',\n\t\t\tlabel: labels.greek,\n\t\t\titems: [\n\t\t\t\t{ label: 'α', ariaLabel: 'Alpha', snippet: '\\\\alpha ' },\n\t\t\t\t{ label: 'β', ariaLabel: 'Beta', snippet: '\\\\beta ' },\n\t\t\t\t{ label: 'γ', ariaLabel: 'Gamma', snippet: '\\\\gamma ' },\n\t\t\t\t{ label: 'δ', ariaLabel: 'Delta', snippet: '\\\\delta ' },\n\t\t\t\t{ label: 'ε', ariaLabel: 'Epsilon', snippet: '\\\\varepsilon ' },\n\t\t\t\t{ label: 'ζ', ariaLabel: 'Zeta', snippet: '\\\\zeta ' },\n\t\t\t\t{ label: 'η', ariaLabel: 'Eta', snippet: '\\\\eta ' },\n\t\t\t\t{ label: 'θ', ariaLabel: 'Theta', snippet: '\\\\theta ' },\n\t\t\t\t{ label: 'κ', ariaLabel: 'Kappa', snippet: '\\\\kappa ' },\n\t\t\t\t{ label: 'λ', ariaLabel: 'Lambda', snippet: '\\\\lambda ' },\n\t\t\t\t{ label: 'μ', ariaLabel: 'Mu', snippet: '\\\\mu ' },\n\t\t\t\t{ label: 'ν', ariaLabel: 'Nu', snippet: '\\\\nu ' },\n\t\t\t\t{ label: 'ξ', ariaLabel: 'Xi', snippet: '\\\\xi ' },\n\t\t\t\t{ label: 'π', ariaLabel: 'Pi', snippet: '\\\\pi ' },\n\t\t\t\t{ label: 'ρ', ariaLabel: 'Rho', snippet: '\\\\rho ' },\n\t\t\t\t{ label: 'σ', ariaLabel: 'Sigma', snippet: '\\\\sigma ' },\n\t\t\t\t{ label: 'τ', ariaLabel: 'Tau', snippet: '\\\\tau ' },\n\t\t\t\t{ label: 'φ', ariaLabel: 'Phi', snippet: '\\\\varphi ' },\n\t\t\t\t{ label: 'χ', ariaLabel: 'Chi', snippet: '\\\\chi ' },\n\t\t\t\t{ label: 'ψ', ariaLabel: 'Psi', snippet: '\\\\psi ' },\n\t\t\t\t{ label: 'ω', ariaLabel: 'Omega', snippet: '\\\\omega ' },\n\t\t\t\t{ label: 'Γ', ariaLabel: 'Capital gamma', snippet: '\\\\Gamma ' },\n\t\t\t\t{ label: 'Δ', ariaLabel: 'Capital delta', snippet: '\\\\Delta ' },\n\t\t\t\t{ label: 'Θ', ariaLabel: 'Capital theta', snippet: '\\\\Theta ' },\n\t\t\t\t{ label: 'Λ', ariaLabel: 'Capital lambda', snippet: '\\\\Lambda ' },\n\t\t\t\t{ label: 'Π', ariaLabel: 'Capital pi', snippet: '\\\\Pi ' },\n\t\t\t\t{ label: 'Σ', ariaLabel: 'Capital sigma', snippet: '\\\\Sigma ' },\n\t\t\t\t{ label: 'Φ', ariaLabel: 'Capital phi', snippet: '\\\\Phi ' },\n\t\t\t\t{ label: 'Ψ', ariaLabel: 'Capital psi', snippet: '\\\\Psi ' },\n\t\t\t\t{ label: 'Ω', ariaLabel: 'Capital omega', snippet: '\\\\Omega ' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'relations',\n\t\t\tlabel: labels.relations,\n\t\t\titems: [\n\t\t\t\t{ label: '≤', ariaLabel: 'Less than or equal to', snippet: '\\\\leq ' },\n\t\t\t\t{ label: '≥', ariaLabel: 'Greater than or equal to', snippet: '\\\\geq ' },\n\t\t\t\t{ label: '≠', ariaLabel: 'Not equal to', snippet: '\\\\neq ' },\n\t\t\t\t{ label: '≈', ariaLabel: 'Approximately equal to', snippet: '\\\\approx ' },\n\t\t\t\t{ label: '≡', ariaLabel: 'Equivalent to', snippet: '\\\\equiv ' },\n\t\t\t\t{ label: '∼', ariaLabel: 'Similar to', snippet: '\\\\sim ' },\n\t\t\t\t{ label: '≅', ariaLabel: 'Congruent to', snippet: '\\\\cong ' },\n\t\t\t\t{ label: '∝', ariaLabel: 'Proportional to', snippet: '\\\\propto ' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'sets',\n\t\t\tlabel: labels.sets,\n\t\t\titems: [\n\t\t\t\t{ label: '∈', ariaLabel: 'Element of', snippet: '\\\\in ' },\n\t\t\t\t{ label: '∉', ariaLabel: 'Not an element of', snippet: '\\\\notin ' },\n\t\t\t\t{ label: '⊂', ariaLabel: 'Subset of', snippet: '\\\\subset ' },\n\t\t\t\t{ label: '⊆', ariaLabel: 'Subset of or equal to', snippet: '\\\\subseteq ' },\n\t\t\t\t{ label: '∪', ariaLabel: 'Union', snippet: '\\\\cup ' },\n\t\t\t\t{ label: '∩', ariaLabel: 'Intersection', snippet: '\\\\cap ' },\n\t\t\t\t{ label: '∅', ariaLabel: 'Empty set', snippet: '\\\\emptyset ' },\n\t\t\t\t{ label: 'ℝ', ariaLabel: 'Real numbers', snippet: '\\\\mathbb{R}' },\n\t\t\t\t{ label: 'ℕ', ariaLabel: 'Natural numbers', snippet: '\\\\mathbb{N}' },\n\t\t\t\t{ label: 'ℤ', ariaLabel: 'Integers', snippet: '\\\\mathbb{Z}' },\n\t\t\t\t{ label: 'ℚ', ariaLabel: 'Rational numbers', snippet: '\\\\mathbb{Q}' },\n\t\t\t\t{ label: 'ℂ', ariaLabel: 'Complex numbers', snippet: '\\\\mathbb{C}' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'logic',\n\t\t\tlabel: labels.logic,\n\t\t\titems: [\n\t\t\t\t{ label: '∀', ariaLabel: 'For all', snippet: '\\\\forall ' },\n\t\t\t\t{ label: '∃', ariaLabel: 'There exists', snippet: '\\\\exists ' },\n\t\t\t\t{ label: '¬', ariaLabel: 'Logical not', snippet: '\\\\neg ' },\n\t\t\t\t{ label: '∧', ariaLabel: 'Logical and', snippet: '\\\\land ' },\n\t\t\t\t{ label: '∨', ariaLabel: 'Logical or', snippet: '\\\\lor ' },\n\t\t\t\t{ label: '⟹', ariaLabel: 'Implies', snippet: '\\\\implies ' },\n\t\t\t\t{ label: '⟺', ariaLabel: 'If and only if', snippet: '\\\\iff ' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'arrows',\n\t\t\tlabel: labels.arrows,\n\t\t\titems: [\n\t\t\t\t{ label: '→', ariaLabel: 'Right arrow', snippet: '\\\\to ' },\n\t\t\t\t{ label: '⇒', ariaLabel: 'Rightwards double arrow', snippet: '\\\\Rightarrow ' },\n\t\t\t\t{ label: '↔', ariaLabel: 'Left-right arrow', snippet: '\\\\leftrightarrow ' },\n\t\t\t\t{ label: '↦', ariaLabel: 'Maps to', snippet: '\\\\mapsto ' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'delimiters',\n\t\t\tlabel: labels.delimiters,\n\t\t\titems: [\n\t\t\t\t{ label: '( )', ariaLabel: 'Auto-sized parentheses', snippet: '\\\\left($0\\\\right)' },\n\t\t\t\t{ label: '[ ]', ariaLabel: 'Auto-sized brackets', snippet: '\\\\left[$0\\\\right]' },\n\t\t\t\t{ label: '{ }', ariaLabel: 'Auto-sized braces', snippet: '\\\\left\\\\{$0\\\\right\\\\}' },\n\t\t\t\t{ label: '|x|', ariaLabel: 'Absolute value', snippet: '\\\\left|$0\\\\right|' },\n\t\t\t\t{ label: '‖x‖', ariaLabel: 'Norm', snippet: '\\\\left\\\\|$0\\\\right\\\\|' },\n\t\t\t\t{ label: '⌊x⌋', ariaLabel: 'Floor', snippet: '\\\\left\\\\lfloor $0\\\\right\\\\rfloor' },\n\t\t\t\t{ label: '⌈x⌉', ariaLabel: 'Ceiling', snippet: '\\\\left\\\\lceil $0\\\\right\\\\rceil' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'dots',\n\t\t\tlabel: labels.dots,\n\t\t\titems: [\n\t\t\t\t{ label: '⋯', ariaLabel: 'Centred ellipsis', snippet: '\\\\cdots ' },\n\t\t\t\t{ label: '…', ariaLabel: 'Baseline ellipsis', snippet: '\\\\ldots ' },\n\t\t\t\t{ label: '⋮', ariaLabel: 'Vertical ellipsis', snippet: '\\\\vdots ' },\n\t\t\t\t{ label: '⋱', ariaLabel: 'Diagonal ellipsis', snippet: '\\\\ddots ' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: 'matrices',\n\t\t\tlabel: labels.matrices,\n\t\t\titems: [\n\t\t\t\t{\n\t\t\t\t\tlabel: '[ ]',\n\t\t\t\t\tariaLabel: 'Bracket matrix',\n\t\t\t\t\tsnippet: '\\\\begin{bmatrix} $0 & \\\\\\\\ & \\\\end{bmatrix}',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: '( )',\n\t\t\t\t\tariaLabel: 'Parenthesis matrix',\n\t\t\t\t\tsnippet: '\\\\begin{pmatrix} $0 & \\\\\\\\ & \\\\end{pmatrix}',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: '{',\n\t\t\t\t\tariaLabel: 'Cases',\n\t\t\t\t\tsnippet: '\\\\begin{cases} $0 & \\\\\\\\ & \\\\end{cases}',\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t];\n}\n","/**\n * Glue between the framework-agnostic MathField (Layer A) and notectl. Maps the\n * plugin locale onto the math field's locale and builds the structural palette,\n * then mounts a MathField into a container and wires focus + announcements.\n */\n\nimport type { PluginContext } from '../Plugin.js';\nimport type { FormulaLocale } from './FormulaLocale.js';\nimport { MathField, buildMathPalette } from './math-field/index.js';\nimport type { MathFieldLocale, MathFieldResult, MathPaletteGroup } from './math-field/index.js';\n\n/** Options for mounting the formula editor into a host container. */\nexport interface MountFormulaEditorOptions {\n\treadonly context: PluginContext;\n\treadonly locale: FormulaLocale;\n\treadonly mode: 'insert' | 'edit';\n\treadonly initialLatex?: string;\n\treadonly initialAlt?: string;\n\treadonly initialDisplay?: boolean;\n\treadonly initialFontSize?: string;\n\treadonly fontSizes?: readonly number[];\n\treadonly onCommit: (result: MathFieldResult) => void;\n\treadonly onClose: () => void;\n}\n\nfunction toMathFieldLocale(locale: FormulaLocale): MathFieldLocale {\n\treturn {\n\t\tlatexLabel: locale.latexLabel,\n\t\tlatexPlaceholder: locale.latexPlaceholder,\n\t\tpreviewLabel: locale.previewLabel,\n\t\temptyPreview: locale.emptyPreview,\n\t\taltLabel: locale.altLabel,\n\t\taltPlaceholder: locale.altPlaceholder,\n\t\tdisplayToggle: locale.displayToggle,\n\t\tsizeLabel: locale.sizeLabel,\n\t\tsizeDefault: locale.sizeDefault,\n\t\tcommitInsert: locale.insertButton,\n\t\tcommitUpdate: locale.updateButton,\n\t\tcancel: locale.cancelButton,\n\t\tpaletteLabel: locale.paletteLabel,\n\t\tunknownCommand: locale.unknownCommand,\n\t};\n}\n\nfunction paletteFor(locale: FormulaLocale): MathPaletteGroup[] {\n\treturn buildMathPalette({\n\t\tfractions: locale.groupFractions,\n\t\tscripts: locale.groupScripts,\n\t\troots: locale.groupRoots,\n\t\taccents: locale.groupAccents,\n\t\toperators: locale.groupOperators,\n\t\tfunctions: locale.groupFunctions,\n\t\tgreek: locale.groupGreek,\n\t\trelations: locale.groupRelations,\n\t\tsets: locale.groupSets,\n\t\tlogic: locale.groupLogic,\n\t\tarrows: locale.groupArrows,\n\t\tdelimiters: locale.groupDelimiters,\n\t\tdots: locale.groupDots,\n\t\tmatrices: locale.groupMatrices,\n\t});\n}\n\n/** Creates a MathField, appends it to `container`, and focuses it on next frame. */\nexport function mountFormulaEditor(\n\tcontainer: HTMLElement,\n\toptions: MountFormulaEditorOptions,\n): MathField {\n\tconst field = new MathField({\n\t\tlocale: toMathFieldLocale(options.locale),\n\t\tmode: options.mode,\n\t\tinitialLatex: options.initialLatex,\n\t\tinitialAlt: options.initialAlt,\n\t\tinitialDisplay: options.initialDisplay,\n\t\tinitialFontSize: options.initialFontSize,\n\t\tfontSizes: options.fontSizes,\n\t\tpalette: paletteFor(options.locale),\n\t\tonCommit: options.onCommit,\n\t\tonCancel: options.onClose,\n\t});\n\tcontainer.appendChild(field.root);\n\trequestAnimationFrame(() => field.focus());\n\treturn field;\n}\n","/**\n * Floating editor overlay for inserting and editing formulas.\n *\n * A focusable panel positioned at the caret (insert) or the formula's bounding\n * rect (edit), living OUTSIDE the editable/reconciled DOM. This is the pattern\n * the PR1 plan mandates instead of a widget decoration: a widget would be\n * rebuilt on every keystroke (losing focus/state) and a focusable input inside\n * contenteditable fights SelectionSync. Changes commit as a single transaction\n * on apply, so undo/redo work and per-keystroke re-rendering never happens.\n */\n\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { promoteToTopLayer } from '../shared/PopupPositioning.js';\nimport {\n\tcommitInsertFormula,\n\tresultToFormulaAttrs,\n\tupdateDisplayMath,\n\tupdateInlineMath,\n} from './FormulaCommands.js';\nimport { mountFormulaEditor } from './FormulaEditorMount.js';\nimport type { FormulaLocale } from './FormulaLocale.js';\nimport type { FormulaAttrs } from './FormulaTypes.js';\nimport type { MathFieldResult } from './math-field/index.js';\n\n/** Identifies which existing formula node is being edited and where it sits. */\nexport interface FormulaEditTarget {\n\treadonly kind: 'inline' | 'display';\n\treadonly latex: string;\n\treadonly alt: string;\n\t/** Current CSS font-size of the formula (e.g. `'24px'`); empty inherits. */\n\treadonly fontSize: string;\n\t/** Anchor rect; when null the overlay falls back to the caret position. */\n\treadonly rect: DOMRect | null;\n\t/** Inline: the containing block id + the node's offset within it. */\n\treadonly blockId?: BlockId;\n\treadonly offset?: number;\n\t/** Display: the node's path. */\n\treadonly path?: readonly BlockId[];\n}\n\nconst PANEL_MARGIN = 8;\n\nexport class FormulaOverlay {\n\tprivate panel: HTMLElement | null = null;\n\tprivate outsideHandler: ((e: MouseEvent) => void) | null = null;\n\n\tconstructor(\n\t\tprivate readonly context: PluginContext,\n\t\tprivate readonly locale: FormulaLocale,\n\t\tprivate readonly fontSizes: readonly number[],\n\t) {}\n\n\t/** Whether the overlay is currently open. */\n\tisOpen(): boolean {\n\t\treturn this.panel !== null;\n\t}\n\n\t/** Opens the overlay at the caret to insert a new formula. */\n\topenInsert(display: boolean): void {\n\t\tif (this.context.isReadOnly()) return;\n\t\tconst rect: DOMRect | null = caretRect();\n\t\tthis.open({\n\t\t\trect,\n\t\t\tmode: 'insert',\n\t\t\tinitialDisplay: display,\n\t\t\tonCommit: (result: MathFieldResult) => {\n\t\t\t\tcommitInsertFormula(this.context, this.locale, result);\n\t\t\t\tthis.close(true);\n\t\t\t},\n\t\t});\n\t}\n\n\t/** Opens the overlay at an existing formula to edit it. */\n\topenEdit(target: FormulaEditTarget): void {\n\t\tif (this.context.isReadOnly()) return;\n\t\tthis.context.announce(this.locale.editing);\n\t\tthis.open({\n\t\t\trect: target.rect ?? caretRect(),\n\t\t\tmode: 'edit',\n\t\t\tinitialLatex: target.latex,\n\t\t\tinitialAlt: target.alt,\n\t\t\tinitialDisplay: target.kind === 'display',\n\t\t\tinitialFontSize: target.fontSize,\n\t\t\tonCommit: (result: MathFieldResult) => {\n\t\t\t\tthis.commitEdit(target, result);\n\t\t\t\tthis.context.announce(this.locale.updated);\n\t\t\t\tthis.close(true);\n\t\t\t},\n\t\t});\n\t}\n\n\t/** Closes the overlay, optionally returning focus to the editor. */\n\tclose(returnFocus: boolean): void {\n\t\tif (!this.panel) return;\n\t\tif (this.outsideHandler) {\n\t\t\tdocument.removeEventListener('mousedown', this.outsideHandler, true);\n\t\t\tthis.outsideHandler = null;\n\t\t}\n\t\tthis.panel.remove();\n\t\tthis.panel = null;\n\t\tif (returnFocus) this.context.getContainer().focus();\n\t}\n\n\tprivate commitEdit(target: FormulaEditTarget, result: MathFieldResult): void {\n\t\tconst attrs: FormulaAttrs = resultToFormulaAttrs(result);\n\t\tif (target.kind === 'inline' && target.blockId && target.offset !== undefined) {\n\t\t\tupdateInlineMath(this.context, target.blockId, target.offset, attrs);\n\t\t} else if (target.kind === 'display' && target.path) {\n\t\t\tupdateDisplayMath(this.context, target.path, attrs);\n\t\t}\n\t}\n\n\tprivate open(config: {\n\t\trect: DOMRect | null;\n\t\tmode: 'insert' | 'edit';\n\t\tinitialLatex?: string;\n\t\tinitialAlt?: string;\n\t\tinitialDisplay?: boolean;\n\t\tinitialFontSize?: string;\n\t\tonCommit: (result: MathFieldResult) => void;\n\t}): void {\n\t\tthis.close(false);\n\t\tconst panel: HTMLDivElement = document.createElement('div');\n\t\tpanel.className = 'notectl-formula-overlay';\n\t\tpanel.setAttribute('role', 'dialog');\n\t\tpanel.setAttribute(\n\t\t\t'aria-label',\n\t\t\tconfig.mode === 'edit' ? this.locale.editFormula : this.locale.insertInline,\n\t\t);\n\t\tthis.panel = panel;\n\n\t\tmountFormulaEditor(panel, {\n\t\t\tcontext: this.context,\n\t\t\tlocale: this.locale,\n\t\t\tmode: config.mode,\n\t\t\tinitialLatex: config.initialLatex,\n\t\t\tinitialAlt: config.initialAlt,\n\t\t\tinitialDisplay: config.initialDisplay,\n\t\t\tinitialFontSize: config.initialFontSize,\n\t\t\tfontSizes: this.fontSizes,\n\t\t\tonCommit: config.onCommit,\n\t\t\tonClose: () => this.close(true),\n\t\t});\n\n\t\t// Mount inside the editor's shadow DOM so the registered stylesheets apply,\n\t\t// but outside the editable content flow. Positioned `fixed` (viewport coords).\n\t\tthis.context.getPluginContainer('top').appendChild(panel);\n\t\t// Promote to the top layer before positioning so the panel escapes any\n\t\t// ancestor stacking context in the host page and `offsetWidth` reflects the\n\t\t// displayed box. Falls back to plain stacking when unsupported.\n\t\tpromoteToTopLayer(panel);\n\t\tpositionPanel(panel, config.rect);\n\t\tthis.installOutsideHandler();\n\t}\n\n\tprivate installOutsideHandler(): void {\n\t\tconst handler = (e: MouseEvent): void => {\n\t\t\t// Use composedPath, not e.target: the panel lives in the editor's shadow\n\t\t\t// DOM, so a document-level listener sees events retargeted to the host.\n\t\t\tif (this.panel && !e.composedPath().includes(this.panel)) {\n\t\t\t\tthis.close(false);\n\t\t\t}\n\t\t};\n\t\tthis.outsideHandler = handler;\n\t\t// Defer so the click that opened the overlay doesn't immediately close it.\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.outsideHandler) document.addEventListener('mousedown', handler, true);\n\t\t});\n\t}\n}\n\n/** Returns the bounding rect of the current DOM selection caret, if any. */\nfunction caretRect(): DOMRect | null {\n\tconst selection: Selection | null = window.getSelection();\n\tif (!selection || selection.rangeCount === 0) return null;\n\tconst rect: DOMRect = selection.getRangeAt(0).getBoundingClientRect();\n\tif (rect.width === 0 && rect.height === 0 && rect.top === 0 && rect.left === 0) return null;\n\treturn rect;\n}\n\n/**\n * Positions the panel below the anchor rect, clamped to the viewport. The panel\n * is `position: fixed`, so viewport coordinates from `getBoundingClientRect` are\n * used directly (no scroll offset).\n */\nfunction positionPanel(panel: HTMLElement, rect: DOMRect | null): void {\n\tconst anchorTop: number = rect ? rect.bottom : window.innerHeight / 3;\n\tconst anchorLeft: number = rect ? rect.left : window.innerWidth / 3;\n\tconst width: number = panel.offsetWidth || 360;\n\tconst maxLeft: number = window.innerWidth - width - PANEL_MARGIN;\n\tconst left: number = Math.max(PANEL_MARGIN, Math.min(anchorLeft, maxLeft));\n\tconst maxTop: number = window.innerHeight - panel.offsetHeight - PANEL_MARGIN;\n\tconst top: number = Math.min(anchorTop + PANEL_MARGIN, Math.max(PANEL_MARGIN, maxTop));\n\tpanel.style.left = `${Math.round(left)}px`;\n\tpanel.style.top = `${Math.round(top)}px`;\n}\n","/**\n * Paste interceptor for incoming MathML.\n *\n * Reads the RAW `text/html` (before the editor's own DOMPurify pass), extracts\n * every standalone `<math>` (native, KaTeX, or MathJax), sanitizes each against\n * the MathML allowlist, reads any embedded LaTeX (`<annotation\n * encoding=\"application/x-tex\">`), and inserts them as formula nodes.\n *\n * KaTeX/MathJax wrap the `<math>` in an `aria-hidden` visual layer alongside a\n * `katex-mathml`/assistive copy; we treat the paste as standalone formulas when,\n * after removing the `<math>` and any `aria-hidden` subtrees, only whitespace\n * remains. Two or more adjacent formulas qualify too, and all are inserted rather\n * than just the first (#159). Reading the canonical `<math>` from outside the\n * `aria-hidden` subtrees also dedups MathJax's assistive copy. Genuinely mixed\n * rich content falls through to the default pipeline.\n *\n * Note: the editor only runs paste interceptors when `text/plain` is also\n * present (which real math sources always provide).\n */\n\nimport DOMPurify from 'dompurify';\nimport type { PasteInterceptor } from '../../model/PasteInterceptor.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport { buildInsertDisplayFormulasTr, buildInsertInlineFormulasTr } from './FormulaCommands.js';\nimport { readFormulaFontSize } from './FormulaSerialization.js';\nimport type { FormulaAttrs } from './FormulaTypes.js';\nimport { extractTexAnnotation, isDisplayMath, stripMathsize } from './mathml/MathMLDocument.js';\nimport { MATHML_ATTRS, MATHML_TAGS } from './mathml/MathMLSanitize.js';\n\n/**\n * Parses untrusted clipboard HTML into an INERT fragment. A `<template>`'s content\n * lives in a document with no browsing context, so parsing it triggers no resource\n * loads and fires no `onerror`/`onload` handlers, unlike assigning `innerHTML` on a\n * live `<div>`. This matches the parse path the core uses everywhere\n * (`DocumentParser`, `PasteHTMLHandler`) and runs on the RAW, pre-sanitization HTML.\n */\nfunction parseFragment(html: string): DocumentFragment {\n\tconst template: HTMLTemplateElement = document.createElement('template');\n\ttemplate.innerHTML = html;\n\treturn template.content;\n}\n\n/**\n * True when the HTML is essentially nothing but formulas: it contains at least\n * one `<math>`, and once the `<math>` and any `aria-hidden` (visual-only)\n * subtrees are removed, nothing but whitespace is left. Holds for one formula or\n * for several separated only by whitespace (#159). Exported for unit testing.\n */\nexport function isStandaloneMathHtml(html: string): boolean {\n\tif (!html) return false;\n\tconst host: DocumentFragment = parseFragment(html);\n\tif (!host.querySelector('math')) return false;\n\tconst clone: DocumentFragment = host.cloneNode(true) as DocumentFragment;\n\tfor (const el of Array.from(clone.querySelectorAll('math, [aria-hidden=\"true\"]'))) {\n\t\tel.remove();\n\t}\n\treturn (clone.textContent ?? '').trim() === '';\n}\n\n/**\n * Collects the canonical `<math>` elements of a standalone paste in document\n * order, excluding any inside an `aria-hidden=\"true\"` subtree. KaTeX and MathJax\n * each emit a hidden duplicate per equation (a visual layer / an assistive\n * `<math>` copy); dropping those subtrees first counts every formula exactly\n * once, so the interceptor never double-inserts. Exported for unit testing.\n */\nexport function collectStandaloneMathElements(html: string): Element[] {\n\tif (!html) return [];\n\tconst host: DocumentFragment = parseFragment(html);\n\tfor (const hidden of Array.from(host.querySelectorAll('[aria-hidden=\"true\"]'))) {\n\t\thidden.remove();\n\t}\n\treturn Array.from(host.querySelectorAll('math'));\n}\n\n/** Sanitizes a raw `<math>` fragment; returns null if nothing survives. */\nfunction sanitizeMath(source: string): string | null {\n\tconst clean: string = DOMPurify.sanitize(source, {\n\t\tALLOWED_TAGS: [...MATHML_TAGS],\n\t\tALLOWED_ATTR: [...MATHML_ATTRS],\n\t});\n\treturn /<math[\\s>]/i.test(clean) ? clean : null;\n}\n\n/** Sanitizes one parsed `<math>` element into canonical formula attrs, or null. */\nfunction toFormulaAttrs(math: Element): FormulaAttrs | null {\n\tconst sanitized: string | null = sanitizeMath(math.outerHTML);\n\tif (!sanitized) return null;\n\t// Lift the native `mathsize` into the `fontSize` attr (single source of truth)\n\t// so a sized formula pasted from KaTeX/MathJax/Word keeps its size (#160).\n\tconst mathml: string = stripMathsize(sanitized);\n\treturn {\n\t\tmathml,\n\t\tlatex: extractTexAnnotation(mathml) ?? '',\n\t\talt: '',\n\t\tfontSize: readFormulaFontSize(math),\n\t};\n}\n\n/** Creates the MathML paste interceptor. */\nexport function createFormulaPasteInterceptor(): PasteInterceptor {\n\treturn (_plainText: string, html: string, state: EditorState): Transaction | null => {\n\t\tif (!isStandaloneMathHtml(html)) return null;\n\n\t\tconst formulas: FormulaAttrs[] = collectStandaloneMathElements(html)\n\t\t\t.map(toFormulaAttrs)\n\t\t\t.filter((attrs: FormulaAttrs | null): attrs is FormulaAttrs => attrs !== null);\n\t\tif (formulas.length === 0) return null;\n\n\t\t// Inline formulas join the text flow; a run that contains any display\n\t\t// formula is laid out as blocks (the safe context for display math).\n\t\tconst allInline: boolean = formulas.every((attrs) => !isDisplayMath(attrs.mathml));\n\t\treturn allInline\n\t\t\t? buildInsertInlineFormulasTr(state, formulas)\n\t\t\t: buildInsertDisplayFormulasTr(state, formulas);\n\t};\n}\n","/**\n * CSS for formula nodes and the authoring surfaces (editor panel + overlay).\n *\n * The `font-family: 'Notectl Math', math` cascade is essential: a real-browser\n * spike showed Chromium renders stretchy constructs (matrix brackets, large\n * integrals/roots) incorrectly without an explicit OpenType MATH font, and\n * correctly once one is applied. The bundled font is opt-in (see ./fonts); the\n * `math` generic keyword is the graceful fallback.\n */\n\nexport const FORMULA_CSS = `\n.notectl-math math {\n\tfont-family: 'Notectl Math', math;\n}\n\n.notectl-math--inline {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tpadding: 0 1px;\n\tborder-radius: 3px;\n\tcursor: pointer;\n}\n\n.notectl-math--inline:hover {\n\tbackground: var(--notectl-highlight, rgba(0, 0, 0, 0.06));\n}\n\n.notectl-math--inline:focus-visible {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 1px;\n}\n\n.notectl-math--inline math {\n\tfont-size: 1.15em;\n}\n\n.notectl-math--display {\n\tdisplay: block;\n\tmargin: 12px 0;\n\ttext-align: center;\n\tcursor: pointer;\n\tuser-select: none;\n\t-webkit-user-select: none;\n}\n\n.notectl-math--display math {\n\tfont-size: 1.35em;\n\tdisplay: inline-block;\n}\n\n.notectl-math--display.notectl-math--selected {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 4px;\n\tborder-radius: 6px;\n}\n\n.notectl-math__error,\n.notectl-math merror {\n\tcolor: var(--notectl-danger, #c0392b);\n\tbackground: var(--notectl-danger-bg, rgba(192, 57, 43, 0.1));\n\tborder-radius: 3px;\n\tpadding: 0 2px;\n}\n`;\n\nexport const FORMULA_EDITOR_CSS = `\n.notectl-formula-editor {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tpadding: 10px;\n\tmin-width: 320px;\n\tmax-width: 460px;\n\tbox-sizing: border-box;\n}\n\n.notectl-formula-editor__field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.notectl-formula-editor__label {\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-fg-muted, #555);\n}\n\n.notectl-formula-editor__input {\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tpadding: 6px 8px;\n\tfont-family: 'SF Mono', 'Fira Code', Menlo, Consolas, monospace;\n\tfont-size: 13px;\n\tline-height: 1.5;\n\tresize: vertical;\n\tmin-height: 56px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-overlay, #fff);\n\tcolor: var(--notectl-fg);\n}\n\n.notectl-formula-editor__alt {\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tpadding: 5px 8px;\n\tfont-size: 13px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-overlay, #fff);\n\tcolor: var(--notectl-fg);\n}\n\n.notectl-formula-editor__size {\n\tbox-sizing: border-box;\n\tpadding: 5px 8px;\n\tfont-size: 13px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-overlay, #fff);\n\tcolor: var(--notectl-fg);\n\tcursor: pointer;\n}\n\n.notectl-formula-editor__size:focus-visible {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 1px;\n}\n\n.notectl-formula-editor__preview {\n\tmin-height: 44px;\n\tpadding: 8px;\n\tborder: 1px dashed var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-raised, #fafafa);\n\ttext-align: center;\n\toverflow-x: auto;\n}\n\n.notectl-formula-editor__preview math {\n\tfont-family: 'Notectl Math', math;\n\tfont-size: 1.3em;\n}\n\n.notectl-formula-editor__preview-empty {\n\tcolor: var(--notectl-fg-muted, #888);\n\tfont-size: 13px;\n}\n\n.notectl-formula-editor__errors {\n\tcolor: var(--notectl-danger, #c0392b);\n\tfont-size: 12px;\n\tmargin: 0;\n\tpadding-inline-start: 16px;\n}\n\n.notectl-formula-editor__row {\n\tdisplay: flex;\n\tgap: 8px;\n\talign-items: center;\n}\n\n.notectl-formula-editor__toggle {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg);\n}\n\n.notectl-formula-editor__actions {\n\tdisplay: flex;\n\tgap: 8px;\n\tjustify-content: flex-end;\n\tmargin-top: 2px;\n}\n\n.notectl-formula-editor__btn {\n\tpadding: 6px 14px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-raised);\n\tcolor: var(--notectl-fg);\n\tcursor: pointer;\n\tfont-size: 13px;\n}\n\n.notectl-formula-editor__btn--primary {\n\tbackground: var(--notectl-primary);\n\tborder-color: var(--notectl-primary);\n\tcolor: var(--notectl-primary-fg, #fff);\n}\n\n.notectl-formula-editor__btn:focus-visible {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 2px;\n}\n\n.notectl-formula-overlay {\n\tposition: fixed;\n\tz-index: 1000;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 8px;\n\tbackground: var(--notectl-surface-overlay, #fff);\n\tbox-shadow: 0 6px 24px rgba(0, 0, 0, 0.18);\n}\n\n.notectl-math-palette {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px;\n\tpadding: 2px 2px 8px;\n\tborder-bottom: 1px solid var(--notectl-border);\n\tmargin-bottom: 2px;\n\tmax-height: 216px;\n\toverflow-y: auto;\n}\n\n.notectl-math-palette__group {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 2px;\n}\n\n.notectl-math-palette__group + .notectl-math-palette__group {\n\tborder-inline-start: 1px solid var(--notectl-border);\n\tpadding-inline-start: 6px;\n}\n\n.notectl-math-palette__btn {\n\tmin-width: 30px;\n\theight: 30px;\n\tpadding: 0 6px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcolor: var(--notectl-fg);\n\tcursor: pointer;\n\tfont-size: 15px;\n\tline-height: 1;\n}\n\n.notectl-math-palette__btn:hover {\n\tbackground: var(--notectl-surface-raised);\n}\n\n.notectl-math-palette__btn:focus-visible {\n\toutline: 2px solid var(--notectl-primary);\n\toutline-offset: 1px;\n}\n`;\n","/**\n * Toolbar item for inserting formulas. Opens a custom popup that mounts the\n * accessible math field; on commit it inserts an inline or display formula\n * depending on the field's display toggle.\n */\n\nimport type { PluginContext } from '../Plugin.js';\nimport { commitInsertFormula } from './FormulaCommands.js';\nimport { mountFormulaEditor } from './FormulaEditorMount.js';\nimport type { FormulaLocale } from './FormulaLocale.js';\nimport type { MathFieldResult } from './math-field/index.js';\n\n// Sigma (Σ) drawn as a clean STROKED outline, not a filled glyph. The toolbar\n// CSS sets `fill: currentColor` on icon svgs, which would fill this open Σ\n// polyline into a solid blob; the inline `fill:none` style overrides that (it\n// beats the non-!important rule) so it renders as a normal Σ character.\nconst FORMULA_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" ' +\n\t'style=\"fill:none;stroke:currentColor;stroke-width:2.2;' +\n\t'stroke-linecap:round;stroke-linejoin:round\">' +\n\t'<path d=\"M18 5 H6 L12 12 L6 19 H18\"/></svg>';\n\n/** Registers the \"Insert formula\" toolbar item (group: insert). */\nexport function registerFormulaToolbar(\n\tcontext: PluginContext,\n\tlocale: FormulaLocale,\n\tfontSizes: readonly number[],\n): void {\n\tcontext.registerToolbarItem({\n\t\tid: 'formula',\n\t\tgroup: 'insert',\n\t\ticon: FORMULA_ICON,\n\t\tlabel: locale.insertInline,\n\t\ttooltip: locale.insertInlineTooltip,\n\t\tcommand: 'insertInlineFormula',\n\t\tpopupType: 'custom',\n\t\trenderPopup: (container: HTMLElement, ctx: PluginContext, onClose: () => void): void => {\n\t\t\tmountFormulaEditor(container, {\n\t\t\t\tcontext: ctx,\n\t\t\t\tlocale,\n\t\t\t\tmode: 'insert',\n\t\t\t\tfontSizes,\n\t\t\t\tonClose,\n\t\t\t\tonCommit: (result: MathFieldResult): void => {\n\t\t\t\t\tcommitInsertFormula(ctx, locale, result);\n\t\t\t\t\tonClose();\n\t\t\t\t\tctx.getContainer().focus();\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t});\n}\n","/**\n * Inline math node spec: an atomic, contenteditable=false InlineNode that\n * renders native `<math>`. The native MathML is the accessibility surface\n * (screen readers consume it directly); `alttext` provides a fallback label.\n */\n\nimport type { InlineNode } from '../../model/Document.js';\nimport type { InlineNodeSpec } from '../../model/InlineNodeSpec.js';\nimport { readFormulaAttrs, renderFormulaInto, setFormulaFontSize } from './FormulaRendering.js';\nimport { formulaToHTMLString, parseFormulaElement } from './FormulaSerialization.js';\nimport { INLINE_MATH_TYPE } from './FormulaTypes.js';\nimport { MATHML_ATTRS, MATHML_TAGS } from './mathml/MathMLSanitize.js';\n\n/** Builds the inline math `InlineNodeSpec`. */\nexport function createInlineMathNodeSpec(): InlineNodeSpec<typeof INLINE_MATH_TYPE> {\n\treturn {\n\t\ttype: INLINE_MATH_TYPE,\n\t\tattrs: {\n\t\t\tmathml: { default: '' },\n\t\t\tlatex: { default: '' },\n\t\t\talt: { default: '' },\n\t\t\tfontSize: { default: '' },\n\t\t},\n\t\ttoDOM(node: InlineNode): HTMLElement {\n\t\t\tconst span: HTMLSpanElement = document.createElement('span');\n\t\t\tspan.className = 'notectl-math notectl-math--inline';\n\t\t\tspan.setAttribute('contenteditable', 'false');\n\t\t\tspan.setAttribute('data-inline-type', INLINE_MATH_TYPE);\n\t\t\trenderFormulaInto(span, readFormulaAttrs(node.attrs));\n\t\t\tsetFormulaFontSize(span, node.attrs);\n\t\t\treturn span;\n\t\t},\n\t\ttoHTMLString(node: InlineNode): string {\n\t\t\treturn formulaToHTMLString(readFormulaAttrs(node.attrs));\n\t\t},\n\t\tparseHTML: [\n\t\t\t{\n\t\t\t\ttag: 'math',\n\t\t\t\t// Block display is claimed by the display-math node spec.\n\t\t\t\tgetAttrs: (el: HTMLElement): Record<string, unknown> | false =>\n\t\t\t\t\tparseFormulaElement(el, false),\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: [...MATHML_TAGS], attrs: [...MATHML_ATTRS] },\n\t};\n}\n","/**\n * Builds an `@font-face` CSS rule from a font definition so the bundled MATH\n * font is registered as a plain web font (available to the `.notectl-math`\n * `font-family` cascade) WITHOUT appearing in the body-font picker.\n */\n\nimport type { FontDefinition } from '../font/FontPlugin.js';\n\n/** Returns `@font-face` CSS for every descriptor in the font definition. */\nexport function buildMathFontFaceCss(font: FontDefinition): string {\n\tconst family: string = (font.family.split(',')[0] ?? font.name).trim().replace(/['\"]/g, '');\n\tconst rules: string[] = (font.fontFaces ?? []).map((face) => {\n\t\tconst declarations: string[] = [`font-family: '${family}'`, `src: ${face.src}`];\n\t\tif (face.weight) declarations.push(`font-weight: ${face.weight}`);\n\t\tif (face.style) declarations.push(`font-style: ${face.style}`);\n\t\tdeclarations.push(`font-display: ${face.display ?? 'swap'}`);\n\t\treturn `@font-face { ${declarations.join('; ')}; }`;\n\t});\n\treturn rules.join('\\n');\n}\n","/**\n * FormulaPlugin: dependency-free, accessibility-first math support for notectl.\n *\n * Stores formulas as canonical MathML (the screen-reader surface) with the\n * LaTeX source embedded as a TeX annotation for lossless re-editing. Renders\n * natively via the browser's MathML engine (no runtime math library), authored\n * through a LaTeX field with live preview plus an accessible structural palette.\n *\n * Layer split: `latex/`, `mathml/`, and `math-field/` are framework-agnostic\n * (zero notectl imports), publishable on their own; this file and its siblings\n * are the notectl glue.\n */\n\nimport type { Keymap } from '../../model/Keymap.js';\nimport type { BlockId } from '../../model/TypeBrands.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { createDisplayMathNodeSpec } from './DisplayMathNodeSpec.js';\nimport { createDisplayMathNodeViewFactory } from './DisplayMathNodeView.js';\nimport {\n\tadjacentInlineEditTarget,\n\tdisplayEditTarget,\n\tinlineEditTargetFromElement,\n\tselectedDisplayBlockId,\n} from './FormulaEditTrigger.js';\nimport { createFormulaInputRules } from './FormulaInputRules.js';\nimport { FORMULA_LOCALE_EN, type FormulaLocale, loadFormulaLocale } from './FormulaLocale.js';\nimport { FormulaOverlay } from './FormulaOverlay.js';\nimport { createFormulaPasteInterceptor } from './FormulaPasteInterceptor.js';\nimport { FORMULA_CSS, FORMULA_EDITOR_CSS } from './FormulaStyles.js';\nimport { registerFormulaToolbar } from './FormulaToolbar.js';\nimport {\n\tDEFAULT_FORMULA_CONFIG,\n\tDEFAULT_FORMULA_FONT_SIZES,\n\tDEFAULT_FORMULA_KEYMAP,\n\tDISPLAY_MATH_TYPE,\n\ttype FormulaKeymap,\n\ttype FormulaPluginConfig,\n} from './FormulaTypes.js';\nimport { createInlineMathNodeSpec } from './InlineMathNodeSpec.js';\nimport { buildMathFontFaceCss } from './MathFontFace.js';\n\nconst INLINE_MATH_SELECTOR = '.notectl-math--inline';\n\nexport class FormulaPlugin implements Plugin {\n\treadonly id = 'formula';\n\treadonly name = 'Formula';\n\treadonly priority = 46;\n\n\tprivate readonly config: FormulaPluginConfig;\n\tprivate readonly resolvedKeymap: Readonly<Record<keyof FormulaKeymap, string | null>>;\n\tprivate readonly fontSizes: readonly number[];\n\tprivate locale: FormulaLocale = FORMULA_LOCALE_EN;\n\tprivate overlay: FormulaOverlay | null = null;\n\tprivate context: PluginContext | null = null;\n\tprivate clickHandler: ((e: MouseEvent) => void) | null = null;\n\n\tconstructor(config?: Partial<FormulaPluginConfig>) {\n\t\tthis.config = { ...DEFAULT_FORMULA_CONFIG, ...config };\n\t\tthis.resolvedKeymap = { ...DEFAULT_FORMULA_KEYMAP, ...config?.keymap };\n\t\tthis.fontSizes = this.config.fontSizes ?? DEFAULT_FORMULA_FONT_SIZES;\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.context = context;\n\t\tthis.locale = await resolveLocale(\n\t\t\tcontext,\n\t\t\tthis.config.locale,\n\t\t\tFORMULA_LOCALE_EN,\n\t\t\tloadFormulaLocale,\n\t\t);\n\t\tcontext.registerStyleSheet(FORMULA_CSS);\n\t\tcontext.registerStyleSheet(FORMULA_EDITOR_CSS);\n\t\tif (this.config.mathFont) {\n\t\t\tcontext.registerStyleSheet(buildMathFontFaceCss(this.config.mathFont));\n\t\t}\n\n\t\tcontext.registerInlineNodeSpec(createInlineMathNodeSpec());\n\t\tcontext.registerNodeSpec(createDisplayMathNodeSpec());\n\n\t\tthis.overlay = new FormulaOverlay(context, this.locale, this.fontSizes);\n\t\tcontext.registerNodeView(\n\t\t\tDISPLAY_MATH_TYPE,\n\t\t\tcreateDisplayMathNodeViewFactory({\n\t\t\t\tonEdit: (blockId, rect) => this.editDisplay(blockId, rect),\n\t\t\t\tonSelect: () => context.announce(this.locale.selected),\n\t\t\t}),\n\t\t);\n\t\tfor (const rule of createFormulaInputRules()) context.registerInputRule(rule);\n\t\t// Priority below smart-paste (50) so standalone <math> is claimed first.\n\t\tcontext.registerPasteInterceptor(createFormulaPasteInterceptor(), {\n\t\t\tname: 'formula',\n\t\t\tpriority: 40,\n\t\t});\n\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t\tregisterFormulaToolbar(context, this.locale, this.fontSizes);\n\t\tthis.installClickToEdit(context);\n\t}\n\n\tdestroy(): void {\n\t\tif (this.clickHandler && this.context) {\n\t\t\tthis.context.getContainer().removeEventListener('click', this.clickHandler);\n\t\t}\n\t\tthis.clickHandler = null;\n\t\tthis.overlay?.close(false);\n\t\tthis.overlay = null;\n\t\tthis.context = null;\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\t// Context-aware: edit the formula at the caret if there is one, else insert.\n\t\tcontext.registerCommand('insertInlineFormula', () => {\n\t\t\tconst adjacent = adjacentInlineEditTarget(context.getState());\n\t\t\tif (adjacent) {\n\t\t\t\tthis.overlay?.openEdit(adjacent);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tthis.overlay?.openInsert(false);\n\t\t\treturn true;\n\t\t});\n\t\tcontext.registerCommand('insertDisplayFormula', () => {\n\t\t\tconst blockId = selectedDisplayBlockId(context.getState());\n\t\t\tif (blockId) {\n\t\t\t\tthis.editDisplay(blockId, null);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tthis.overlay?.openInsert(true);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tconst keymap: Record<string, () => boolean> = {};\n\t\tconst inline: string | null = this.resolvedKeymap.insertInline;\n\t\tconst display: string | null = this.resolvedKeymap.insertDisplay;\n\t\tif (inline) keymap[inline] = () => context.executeCommand('insertInlineFormula');\n\t\tif (display) keymap[display] = () => context.executeCommand('insertDisplayFormula');\n\t\t// Enter edits the currently selected display formula; otherwise falls through.\n\t\tkeymap.Enter = () => {\n\t\t\tconst blockId = selectedDisplayBlockId(context.getState());\n\t\t\tif (!blockId) return false;\n\t\t\tthis.editDisplay(blockId, null);\n\t\t\treturn true;\n\t\t};\n\t\tcontext.registerKeymap(keymap as Keymap, { priority: 'context' });\n\t}\n\n\tprivate installClickToEdit(context: PluginContext): void {\n\t\tconst container: HTMLElement = context.getContainer();\n\t\tconst handler = (e: MouseEvent): void => {\n\t\t\tif (context.isReadOnly()) return;\n\t\t\tconst target = e.target as HTMLElement | null;\n\t\t\tconst element = target?.closest(INLINE_MATH_SELECTOR) as HTMLElement | null;\n\t\t\tif (!element) return;\n\t\t\tconst editTarget = inlineEditTargetFromElement(container, element, context.getState());\n\t\t\tif (!editTarget) return;\n\t\t\te.preventDefault();\n\t\t\tthis.overlay?.openEdit(editTarget);\n\t\t};\n\t\tthis.clickHandler = handler;\n\t\tcontainer.addEventListener('click', handler);\n\t}\n\n\tprivate editDisplay(blockId: BlockId, rect: DOMRect | null): void {\n\t\tif (!this.overlay || !this.context) return;\n\t\tconst target = displayEditTarget(this.context.getState(), blockId, rect);\n\t\tif (target) this.overlay.openEdit(target);\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{p as t}from"./Document-r7vLOAGA.mjs";import{a as e,c as r,r as n,t as o}from"./Selection-HYoVFpAx.mjs";import{r as s}from"./NodeResolver-ChgLF_IP.mjs";import{i}from"./NavigationQueries-Bt4zZ17v.mjs";import{t as l}from"./Platform-ByobkiCc.mjs";function u(t,e,r){return t.transaction("input").setSelection(o(e,r)).setStoredMarks(null,t.storedMarks).build()}function c(t,e){const r=s(t.doc,e)??[];return t.transaction("input").setSelection(n(e,r)).setStoredMarks(null,t.storedMarks).build()}function f(t,r,n,o,s){return t.transaction("input").setSelection(e({blockId:r,offset:n},{blockId:o,offset:s})).setStoredMarks(null,t.storedMarks).build()}function a(e,n,o){const s=e.selection;if(!r(s))return null;const f=e.getBlockOrder(),a=f.indexOf(s.blockId);if(a<0)return null;const d=function(t,e,r){if(!r)return t;if("left"!==t&&"right"!==t)return t;const n=r.querySelector(`[data-block-id="${e}"]`);return n instanceof HTMLElement?"rtl"!==l(n)?t:"left"===t?"right":"left":t}(n,s.blockId,o);if("before"===s.side&&("right"===d||"down"===d)||"after"===s.side&&("left"===d||"up"===d))return c(e,s.blockId);const m="before"===s.side?a-1:a+1;if(m<0||m>=f.length)return null;const k=f[m];if(!k)return null;if(i(e,k))return c(e,k);const p=e.getBlock(k);return p?u(e,k,"left"===d||"up"===d?t(p):0):null}export{c as i,f as n,u as r,a as t};
2
+ //# sourceMappingURL=GapCursorNavigation-ycNzuQVH.mjs.map