@notectl/core 2.1.2 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1215) hide show
  1. package/dist/chunks/AlignmentPlugin-CjmLXGsv.mjs +2 -0
  2. package/dist/chunks/AlignmentPlugin-CjmLXGsv.mjs.map +1 -0
  3. package/dist/chunks/AttrRegistry-cXq6uQK2.mjs +2 -0
  4. package/dist/chunks/AttrRegistry-cXq6uQK2.mjs.map +1 -0
  5. package/dist/chunks/AttributedMarkCommands-Ctt_1xRD.mjs +2 -0
  6. package/dist/chunks/AttributedMarkCommands-Ctt_1xRD.mjs.map +1 -0
  7. package/dist/chunks/BidiIsolationPlugin-q3zoofgZ.mjs +2 -0
  8. package/dist/chunks/BidiIsolationPlugin-q3zoofgZ.mjs.map +1 -0
  9. package/dist/chunks/BlockInsertion-4QmiYRMo.mjs +2 -0
  10. package/dist/chunks/BlockInsertion-4QmiYRMo.mjs.map +1 -0
  11. package/dist/chunks/BlockTypePickerRegistry-DgI_LlNO.mjs +2 -0
  12. package/dist/chunks/BlockTypePickerRegistry-DgI_LlNO.mjs.map +1 -0
  13. package/dist/chunks/BlockquotePlugin-BTsDYB3K.mjs +2 -0
  14. package/dist/chunks/BlockquotePlugin-BTsDYB3K.mjs.map +1 -0
  15. package/dist/chunks/CaretNavigationPlugin-BFBov4H7.mjs +2 -0
  16. package/dist/chunks/CaretNavigationPlugin-BFBov4H7.mjs.map +1 -0
  17. package/dist/chunks/CodeBlockPlugin-o0Aoq9Nu.mjs +2 -0
  18. package/dist/chunks/CodeBlockPlugin-o0Aoq9Nu.mjs.map +1 -0
  19. package/dist/chunks/ColorGrid-U5NtjqyV.mjs +2 -0
  20. package/dist/chunks/ColorGrid-U5NtjqyV.mjs.map +1 -0
  21. package/dist/chunks/ColorPickerPopup-BYSMUZZx.mjs +2 -0
  22. package/dist/chunks/ColorPickerPopup-BYSMUZZx.mjs.map +1 -0
  23. package/dist/chunks/ColorValidation-3viVw_tK.mjs +2 -0
  24. package/dist/chunks/ColorValidation-3viVw_tK.mjs.map +1 -0
  25. package/dist/chunks/CommandHelpers-BqHfwW7i.mjs +2 -0
  26. package/dist/chunks/CommandHelpers-BqHfwW7i.mjs.map +1 -0
  27. package/dist/chunks/Commands-BC_EPIEx.mjs +2 -0
  28. package/dist/chunks/Commands-BC_EPIEx.mjs.map +1 -0
  29. package/dist/chunks/Decoration-BeTkTHRO.mjs +2 -0
  30. package/dist/chunks/Decoration-BeTkTHRO.mjs.map +1 -0
  31. package/dist/chunks/DirectionDetection-kAewerPz.mjs +2 -0
  32. package/dist/chunks/DirectionDetection-kAewerPz.mjs.map +1 -0
  33. package/dist/chunks/DirectionIcons-BQHHAEYU.mjs +2 -0
  34. package/dist/chunks/DirectionIcons-BQHHAEYU.mjs.map +1 -0
  35. package/dist/chunks/Document-DJmYYuBx.mjs +2 -0
  36. package/dist/chunks/Document-DJmYYuBx.mjs.map +1 -0
  37. package/dist/chunks/DocumentParser-D2hn-48i.mjs +2 -0
  38. package/dist/chunks/DocumentParser-D2hn-48i.mjs.map +1 -0
  39. package/dist/chunks/FontPlugin-TmUrcVn1.mjs +2 -0
  40. package/dist/chunks/FontPlugin-TmUrcVn1.mjs.map +1 -0
  41. package/dist/chunks/FontSizePlugin-Bwui7gLI.mjs +2 -0
  42. package/dist/chunks/FontSizePlugin-Bwui7gLI.mjs.map +1 -0
  43. package/dist/chunks/GapCursorNavigation-BEO5L2-O.mjs +2 -0
  44. package/dist/chunks/GapCursorNavigation-BEO5L2-O.mjs.map +1 -0
  45. package/dist/chunks/GapCursorPlugin-BiZQyVrJ.mjs +2 -0
  46. package/dist/chunks/GapCursorPlugin-BiZQyVrJ.mjs.map +1 -0
  47. package/dist/chunks/HardBreakPlugin-Dj4pkSk-.mjs +2 -0
  48. package/dist/chunks/HardBreakPlugin-Dj4pkSk-.mjs.map +1 -0
  49. package/dist/chunks/HeadingPlugin-D8xIRk25.mjs +2 -0
  50. package/dist/chunks/HeadingPlugin-D8xIRk25.mjs.map +1 -0
  51. package/dist/chunks/HighlightPlugin-CNX7lup0.mjs +2 -0
  52. package/dist/chunks/HighlightPlugin-CNX7lup0.mjs.map +1 -0
  53. package/dist/chunks/HorizontalRulePlugin-D-ZjKGDv.mjs +2 -0
  54. package/dist/chunks/HorizontalRulePlugin-D-ZjKGDv.mjs.map +1 -0
  55. package/dist/chunks/ImagePlugin-DwL8i3pO.mjs +2 -0
  56. package/dist/chunks/ImagePlugin-DwL8i3pO.mjs.map +1 -0
  57. package/dist/chunks/InlineCodePlugin-BpXNuKAa.mjs +2 -0
  58. package/dist/chunks/InlineCodePlugin-BpXNuKAa.mjs.map +1 -0
  59. package/dist/chunks/KeyboardNav-BZIHDPDV.mjs +2 -0
  60. package/dist/chunks/KeyboardNav-BZIHDPDV.mjs.map +1 -0
  61. package/dist/chunks/LinkPlugin-BK15pc0u.mjs +2 -0
  62. package/dist/chunks/LinkPlugin-BK15pc0u.mjs.map +1 -0
  63. package/dist/chunks/ListPlugin-B5ihlVNx.mjs +2 -0
  64. package/dist/chunks/ListPlugin-B5ihlVNx.mjs.map +1 -0
  65. package/dist/chunks/NavigationQueries-DhptdQBe.mjs +2 -0
  66. package/dist/chunks/NavigationQueries-DhptdQBe.mjs.map +1 -0
  67. package/dist/chunks/NodeSelectionCommands-DenSYOfB.mjs +2 -0
  68. package/dist/chunks/NodeSelectionCommands-DenSYOfB.mjs.map +1 -0
  69. package/dist/chunks/PluginHelpers-BZphovwz.mjs +2 -0
  70. package/dist/chunks/PluginHelpers-BZphovwz.mjs.map +1 -0
  71. package/dist/chunks/PopupKeyboardPatterns-CgUM5kPf.mjs +2 -0
  72. package/dist/chunks/PopupKeyboardPatterns-CgUM5kPf.mjs.map +1 -0
  73. package/dist/chunks/PopupManager-B5SHhDsx.mjs +2 -0
  74. package/dist/chunks/PopupManager-B5SHhDsx.mjs.map +1 -0
  75. package/dist/chunks/PopupPositioning-BfahfPOm.mjs +2 -0
  76. package/dist/chunks/PopupPositioning-BfahfPOm.mjs.map +1 -0
  77. package/dist/chunks/PrintPlugin-CckjtZ9B.mjs +2 -0
  78. package/dist/chunks/PrintPlugin-CckjtZ9B.mjs.map +1 -0
  79. package/dist/chunks/PrintTypes-Ci3XW_s8.mjs +2 -0
  80. package/dist/chunks/PrintTypes-Ci3XW_s8.mjs.map +1 -0
  81. package/dist/chunks/RangeIterator-ZooGMxGy.mjs +2 -0
  82. package/dist/chunks/RangeIterator-ZooGMxGy.mjs.map +1 -0
  83. package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs +2 -0
  84. package/dist/chunks/ShortcutFormatting-DQPMvupx.mjs.map +1 -0
  85. package/dist/chunks/SmartPastePlugin-B_zi9WT9.mjs +2 -0
  86. package/dist/chunks/SmartPastePlugin-B_zi9WT9.mjs.map +1 -0
  87. package/dist/chunks/StrikethroughPlugin-2XDKYefG.mjs +2 -0
  88. package/dist/chunks/StrikethroughPlugin-2XDKYefG.mjs.map +1 -0
  89. package/dist/chunks/SuperSubPlugin-6gdrjKZv.mjs +2 -0
  90. package/dist/chunks/SuperSubPlugin-6gdrjKZv.mjs.map +1 -0
  91. package/dist/chunks/SyntaxTokenTypes-DZwhanGO.mjs +2 -0
  92. package/dist/chunks/SyntaxTokenTypes-DZwhanGO.mjs.map +1 -0
  93. package/dist/chunks/TablePlugin-DW78Y4pB.mjs +2 -0
  94. package/dist/chunks/TablePlugin-DW78Y4pB.mjs.map +1 -0
  95. package/dist/chunks/TextColorPlugin-CgHro45N.mjs +2 -0
  96. package/dist/chunks/TextColorPlugin-CgHro45N.mjs.map +1 -0
  97. package/dist/chunks/TextDirectionAutoPlugin-C88ZeXJo.mjs +2 -0
  98. package/dist/chunks/TextDirectionAutoPlugin-C88ZeXJo.mjs.map +1 -0
  99. package/dist/chunks/TextDirectionPlugin-BTTqrWbL.mjs +2 -0
  100. package/dist/chunks/TextDirectionPlugin-BTTqrWbL.mjs.map +1 -0
  101. package/dist/chunks/TextDirectionService-DzuOMFm8.mjs +2 -0
  102. package/dist/chunks/TextDirectionService-DzuOMFm8.mjs.map +1 -0
  103. package/dist/chunks/TextFormattingPlugin-BD4Qlpls.mjs +2 -0
  104. package/dist/chunks/TextFormattingPlugin-BD4Qlpls.mjs.map +1 -0
  105. package/dist/chunks/ToolbarPlugin-D5_-gWmH.mjs +2 -0
  106. package/dist/chunks/ToolbarPlugin-D5_-gWmH.mjs.map +1 -0
  107. package/dist/chunks/WordBoundary-Cz2bSRAU.mjs +2 -0
  108. package/dist/chunks/WordBoundary-Cz2bSRAU.mjs.map +1 -0
  109. package/dist/chunks/XmlDetector-DM-Vv-XW.mjs +2 -0
  110. package/dist/chunks/XmlDetector-DM-Vv-XW.mjs.map +1 -0
  111. package/dist/chunks/XmlPatterns-B-V-mHF4.mjs +2 -0
  112. package/dist/chunks/XmlPatterns-B-V-mHF4.mjs.map +1 -0
  113. package/dist/chunks/XmlSupport-Dr1S1HN9.mjs +2 -0
  114. package/dist/chunks/XmlSupport-Dr1S1HN9.mjs.map +1 -0
  115. package/dist/chunks/ar-4r3DgNTY.mjs +2 -0
  116. package/dist/chunks/ar-4r3DgNTY.mjs.map +1 -0
  117. package/dist/chunks/ar-7EtzKNIe.mjs +2 -0
  118. package/dist/chunks/ar-7EtzKNIe.mjs.map +1 -0
  119. package/dist/chunks/ar-B2pDI_LT.mjs +2 -0
  120. package/dist/chunks/ar-B2pDI_LT.mjs.map +1 -0
  121. package/dist/chunks/ar-BV6-zQd7.mjs +2 -0
  122. package/dist/chunks/ar-BV6-zQd7.mjs.map +1 -0
  123. package/dist/chunks/ar-BaCL4Bzy.mjs +2 -0
  124. package/dist/chunks/ar-BaCL4Bzy.mjs.map +1 -0
  125. package/dist/chunks/ar-BdGHrLSw.mjs +2 -0
  126. package/dist/chunks/ar-BdGHrLSw.mjs.map +1 -0
  127. package/dist/chunks/ar-BwYDKOvO.mjs +2 -0
  128. package/dist/chunks/ar-BwYDKOvO.mjs.map +1 -0
  129. package/dist/chunks/ar-C5eLSf71.mjs +2 -0
  130. package/dist/chunks/ar-C5eLSf71.mjs.map +1 -0
  131. package/dist/chunks/ar-CEUn6f7s.mjs +2 -0
  132. package/dist/chunks/ar-CEUn6f7s.mjs.map +1 -0
  133. package/dist/chunks/ar-CGYb1t6O.mjs +2 -0
  134. package/dist/chunks/ar-CGYb1t6O.mjs.map +1 -0
  135. package/dist/chunks/ar-CjK36QZ9.mjs +2 -0
  136. package/dist/chunks/ar-CjK36QZ9.mjs.map +1 -0
  137. package/dist/chunks/ar-D9jfC3WF.mjs +2 -0
  138. package/dist/chunks/ar-D9jfC3WF.mjs.map +1 -0
  139. package/dist/chunks/ar-DFeA_UxF.mjs +2 -0
  140. package/dist/chunks/ar-DFeA_UxF.mjs.map +1 -0
  141. package/dist/chunks/ar-DMuawOHV.mjs +2 -0
  142. package/dist/chunks/ar-DMuawOHV.mjs.map +1 -0
  143. package/dist/chunks/ar-DV30sa3s.mjs +2 -0
  144. package/dist/chunks/ar-DV30sa3s.mjs.map +1 -0
  145. package/dist/chunks/ar-DWwG54pa.mjs +2 -0
  146. package/dist/chunks/ar-DWwG54pa.mjs.map +1 -0
  147. package/dist/chunks/ar-DcJbUbml.mjs +2 -0
  148. package/dist/chunks/ar-DcJbUbml.mjs.map +1 -0
  149. package/dist/chunks/ar-DelI54_I.mjs +2 -0
  150. package/dist/chunks/ar-DelI54_I.mjs.map +1 -0
  151. package/dist/chunks/ar-DmqFnvxC.mjs +2 -0
  152. package/dist/chunks/ar-DmqFnvxC.mjs.map +1 -0
  153. package/dist/chunks/ar-DpEHjBUk.mjs +2 -0
  154. package/dist/chunks/ar-DpEHjBUk.mjs.map +1 -0
  155. package/dist/chunks/ar-EnfTpUuB.mjs +2 -0
  156. package/dist/chunks/ar-EnfTpUuB.mjs.map +1 -0
  157. package/dist/chunks/ar-ZHVy9O4c.mjs +2 -0
  158. package/dist/chunks/ar-ZHVy9O4c.mjs.map +1 -0
  159. package/dist/chunks/ar-_7aFyBGi.mjs +2 -0
  160. package/dist/chunks/ar-_7aFyBGi.mjs.map +1 -0
  161. package/dist/chunks/ar-l75rG_xT.mjs +2 -0
  162. package/dist/chunks/ar-l75rG_xT.mjs.map +1 -0
  163. package/dist/chunks/ar-qU1PohHA.mjs +2 -0
  164. package/dist/chunks/ar-qU1PohHA.mjs.map +1 -0
  165. package/dist/chunks/color-picker-BTex2Cfu.mjs +2 -0
  166. package/dist/chunks/color-picker-BTex2Cfu.mjs.map +1 -0
  167. package/dist/chunks/de-BDfimoiQ.mjs +2 -0
  168. package/dist/chunks/de-BDfimoiQ.mjs.map +1 -0
  169. package/dist/chunks/de-BSkOdXQZ.mjs +2 -0
  170. package/dist/chunks/de-BSkOdXQZ.mjs.map +1 -0
  171. package/dist/chunks/de-BooQr0-C.mjs +2 -0
  172. package/dist/chunks/de-BooQr0-C.mjs.map +1 -0
  173. package/dist/chunks/de-ByvLzlOc.mjs +2 -0
  174. package/dist/chunks/de-ByvLzlOc.mjs.map +1 -0
  175. package/dist/chunks/de-C03n6uR5.mjs +2 -0
  176. package/dist/chunks/de-C03n6uR5.mjs.map +1 -0
  177. package/dist/chunks/de-C0TfkuUd.mjs +2 -0
  178. package/dist/chunks/de-C0TfkuUd.mjs.map +1 -0
  179. package/dist/chunks/de-C0khkRSC.mjs +2 -0
  180. package/dist/chunks/de-C0khkRSC.mjs.map +1 -0
  181. package/dist/chunks/de-C4IW4BVo.mjs +2 -0
  182. package/dist/chunks/de-C4IW4BVo.mjs.map +1 -0
  183. package/dist/chunks/de-CDSG9CMy.mjs +2 -0
  184. package/dist/chunks/de-CDSG9CMy.mjs.map +1 -0
  185. package/dist/chunks/de-CkIwUE6R.mjs +2 -0
  186. package/dist/chunks/de-CkIwUE6R.mjs.map +1 -0
  187. package/dist/chunks/de-CmJ9oOiP.mjs +2 -0
  188. package/dist/chunks/de-CmJ9oOiP.mjs.map +1 -0
  189. package/dist/chunks/de-CrjOjB4F.mjs +2 -0
  190. package/dist/chunks/de-CrjOjB4F.mjs.map +1 -0
  191. package/dist/chunks/de-D5_uflBY.mjs +2 -0
  192. package/dist/chunks/de-D5_uflBY.mjs.map +1 -0
  193. package/dist/chunks/de-DH5zRyrS.mjs +2 -0
  194. package/dist/chunks/de-DH5zRyrS.mjs.map +1 -0
  195. package/dist/chunks/de-DJqgaz5N.mjs +2 -0
  196. package/dist/chunks/de-DJqgaz5N.mjs.map +1 -0
  197. package/dist/chunks/de-DMiAi5QJ.mjs +2 -0
  198. package/dist/chunks/de-DMiAi5QJ.mjs.map +1 -0
  199. package/dist/chunks/de-DT6VbHNl.mjs +2 -0
  200. package/dist/chunks/de-DT6VbHNl.mjs.map +1 -0
  201. package/dist/chunks/de-DbqObFs9.mjs +2 -0
  202. package/dist/chunks/de-DbqObFs9.mjs.map +1 -0
  203. package/dist/chunks/de-Dl0svzeh.mjs +2 -0
  204. package/dist/chunks/de-Dl0svzeh.mjs.map +1 -0
  205. package/dist/chunks/de-DzMY3LLH.mjs +2 -0
  206. package/dist/chunks/de-DzMY3LLH.mjs.map +1 -0
  207. package/dist/chunks/de-JGuzWRyC.mjs +2 -0
  208. package/dist/chunks/de-JGuzWRyC.mjs.map +1 -0
  209. package/dist/chunks/de-MOHX9tl7.mjs +2 -0
  210. package/dist/chunks/de-MOHX9tl7.mjs.map +1 -0
  211. package/dist/chunks/de-mtjvG1Li.mjs +2 -0
  212. package/dist/chunks/de-mtjvG1Li.mjs.map +1 -0
  213. package/dist/chunks/de-oNyi0r7G.mjs +2 -0
  214. package/dist/chunks/de-oNyi0r7G.mjs.map +1 -0
  215. package/dist/chunks/de-y5fJdnH9.mjs +2 -0
  216. package/dist/chunks/de-y5fJdnH9.mjs.map +1 -0
  217. package/dist/chunks/es-B-V14ELw.mjs +2 -0
  218. package/dist/chunks/es-B-V14ELw.mjs.map +1 -0
  219. package/dist/chunks/es-Bf6WRo_H.mjs +2 -0
  220. package/dist/chunks/es-Bf6WRo_H.mjs.map +1 -0
  221. package/dist/chunks/es-Bw9vJu_M.mjs +2 -0
  222. package/dist/chunks/es-Bw9vJu_M.mjs.map +1 -0
  223. package/dist/chunks/es-CCdE3xXm.mjs +2 -0
  224. package/dist/chunks/es-CCdE3xXm.mjs.map +1 -0
  225. package/dist/chunks/es-CDoZMS8v.mjs +2 -0
  226. package/dist/chunks/es-CDoZMS8v.mjs.map +1 -0
  227. package/dist/chunks/es-CO1hBMDj.mjs +2 -0
  228. package/dist/chunks/es-CO1hBMDj.mjs.map +1 -0
  229. package/dist/chunks/es-CU2TUgK3.mjs +2 -0
  230. package/dist/chunks/es-CU2TUgK3.mjs.map +1 -0
  231. package/dist/chunks/es-CXeJJ2r1.mjs +2 -0
  232. package/dist/chunks/es-CXeJJ2r1.mjs.map +1 -0
  233. package/dist/chunks/es-Cc337sYN.mjs +2 -0
  234. package/dist/chunks/es-Cc337sYN.mjs.map +1 -0
  235. package/dist/chunks/es-Ck88JtiM.mjs +2 -0
  236. package/dist/chunks/es-Ck88JtiM.mjs.map +1 -0
  237. package/dist/chunks/es-CmOFsz0P.mjs +2 -0
  238. package/dist/chunks/es-CmOFsz0P.mjs.map +1 -0
  239. package/dist/chunks/es-CpcUYxtO.mjs +2 -0
  240. package/dist/chunks/es-CpcUYxtO.mjs.map +1 -0
  241. package/dist/chunks/es-Cqp8LgVd.mjs +2 -0
  242. package/dist/chunks/es-Cqp8LgVd.mjs.map +1 -0
  243. package/dist/chunks/es-CsK826Q8.mjs +2 -0
  244. package/dist/chunks/es-CsK826Q8.mjs.map +1 -0
  245. package/dist/chunks/es-D7wyE736.mjs +2 -0
  246. package/dist/chunks/es-D7wyE736.mjs.map +1 -0
  247. package/dist/chunks/es-DGCoEaRB.mjs +2 -0
  248. package/dist/chunks/es-DGCoEaRB.mjs.map +1 -0
  249. package/dist/chunks/es-DPsoXXVT.mjs +2 -0
  250. package/dist/chunks/es-DPsoXXVT.mjs.map +1 -0
  251. package/dist/chunks/es-Df2ocRb2.mjs +2 -0
  252. package/dist/chunks/es-Df2ocRb2.mjs.map +1 -0
  253. package/dist/chunks/es-DgVSWMPU.mjs +2 -0
  254. package/dist/chunks/es-DgVSWMPU.mjs.map +1 -0
  255. package/dist/chunks/es-Dltvy1GA.mjs +2 -0
  256. package/dist/chunks/es-Dltvy1GA.mjs.map +1 -0
  257. package/dist/chunks/es-DtElbzrQ.mjs +2 -0
  258. package/dist/chunks/es-DtElbzrQ.mjs.map +1 -0
  259. package/dist/chunks/es-ERjP_b2h.mjs +2 -0
  260. package/dist/chunks/es-ERjP_b2h.mjs.map +1 -0
  261. package/dist/chunks/es-SN8M8vXY.mjs +2 -0
  262. package/dist/chunks/es-SN8M8vXY.mjs.map +1 -0
  263. package/dist/chunks/es-domW6tKg.mjs +2 -0
  264. package/dist/chunks/es-domW6tKg.mjs.map +1 -0
  265. package/dist/chunks/es-luS_ivBE.mjs +2 -0
  266. package/dist/chunks/es-luS_ivBE.mjs.map +1 -0
  267. package/dist/chunks/fonts-DVgoAAns.mjs +2 -0
  268. package/dist/chunks/fonts-DVgoAAns.mjs.map +1 -0
  269. package/dist/chunks/fr-BPa6RyuB.mjs +2 -0
  270. package/dist/chunks/fr-BPa6RyuB.mjs.map +1 -0
  271. package/dist/chunks/fr-BYK62vy-.mjs +2 -0
  272. package/dist/chunks/fr-BYK62vy-.mjs.map +1 -0
  273. package/dist/chunks/fr-BZH71A1g.mjs +2 -0
  274. package/dist/chunks/fr-BZH71A1g.mjs.map +1 -0
  275. package/dist/chunks/fr-BomQM4Qz.mjs +2 -0
  276. package/dist/chunks/fr-BomQM4Qz.mjs.map +1 -0
  277. package/dist/chunks/fr-BujOdWeE.mjs +2 -0
  278. package/dist/chunks/fr-BujOdWeE.mjs.map +1 -0
  279. package/dist/chunks/fr-C6BCt-Fk.mjs +2 -0
  280. package/dist/chunks/fr-C6BCt-Fk.mjs.map +1 -0
  281. package/dist/chunks/fr-C8NXcJOp.mjs +2 -0
  282. package/dist/chunks/fr-C8NXcJOp.mjs.map +1 -0
  283. package/dist/chunks/fr-C8aNnvoW.mjs +2 -0
  284. package/dist/chunks/fr-C8aNnvoW.mjs.map +1 -0
  285. package/dist/chunks/fr-C8jqjdbQ.mjs +2 -0
  286. package/dist/chunks/fr-C8jqjdbQ.mjs.map +1 -0
  287. package/dist/chunks/fr-Cg97syqs.mjs +2 -0
  288. package/dist/chunks/fr-Cg97syqs.mjs.map +1 -0
  289. package/dist/chunks/fr-CiT36QA9.mjs +2 -0
  290. package/dist/chunks/fr-CiT36QA9.mjs.map +1 -0
  291. package/dist/chunks/fr-D3Ho_0MV.mjs +2 -0
  292. package/dist/chunks/fr-D3Ho_0MV.mjs.map +1 -0
  293. package/dist/chunks/fr-DA37dDuJ.mjs +2 -0
  294. package/dist/chunks/fr-DA37dDuJ.mjs.map +1 -0
  295. package/dist/chunks/fr-DK9dc8bZ.mjs +2 -0
  296. package/dist/chunks/fr-DK9dc8bZ.mjs.map +1 -0
  297. package/dist/chunks/fr-DNA_bC6X.mjs +2 -0
  298. package/dist/chunks/fr-DNA_bC6X.mjs.map +1 -0
  299. package/dist/chunks/fr-DPXU2MTy.mjs +2 -0
  300. package/dist/chunks/fr-DPXU2MTy.mjs.map +1 -0
  301. package/dist/chunks/fr-DZCsB6H7.mjs +2 -0
  302. package/dist/chunks/fr-DZCsB6H7.mjs.map +1 -0
  303. package/dist/chunks/fr-Dd8f28BD.mjs +2 -0
  304. package/dist/chunks/fr-Dd8f28BD.mjs.map +1 -0
  305. package/dist/chunks/fr-DmCLgc4F.mjs +2 -0
  306. package/dist/chunks/fr-DmCLgc4F.mjs.map +1 -0
  307. package/dist/chunks/fr-DtEXB4RG.mjs +2 -0
  308. package/dist/chunks/fr-DtEXB4RG.mjs.map +1 -0
  309. package/dist/chunks/fr-FvGvPlqS.mjs +2 -0
  310. package/dist/chunks/fr-FvGvPlqS.mjs.map +1 -0
  311. package/dist/chunks/fr-V3LUcmFE.mjs +2 -0
  312. package/dist/chunks/fr-V3LUcmFE.mjs.map +1 -0
  313. package/dist/chunks/fr-eiqXGNgf.mjs +2 -0
  314. package/dist/chunks/fr-eiqXGNgf.mjs.map +1 -0
  315. package/dist/chunks/fr-fEWGSNI2.mjs +2 -0
  316. package/dist/chunks/fr-fEWGSNI2.mjs.map +1 -0
  317. package/dist/chunks/fr-w23c3SBW.mjs +2 -0
  318. package/dist/chunks/fr-w23c3SBW.mjs.map +1 -0
  319. package/dist/chunks/full-yocxIDB8.mjs +2 -0
  320. package/dist/chunks/full-yocxIDB8.mjs.map +1 -0
  321. package/dist/chunks/hi-4Xqp7mZC.mjs +2 -0
  322. package/dist/chunks/hi-4Xqp7mZC.mjs.map +1 -0
  323. package/dist/chunks/hi-8Eu7f89Y.mjs +2 -0
  324. package/dist/chunks/hi-8Eu7f89Y.mjs.map +1 -0
  325. package/dist/chunks/hi-BA9PP8mL.mjs +2 -0
  326. package/dist/chunks/hi-BA9PP8mL.mjs.map +1 -0
  327. package/dist/chunks/hi-BLCjECcV.mjs +2 -0
  328. package/dist/chunks/hi-BLCjECcV.mjs.map +1 -0
  329. package/dist/chunks/hi-BX9P0764.mjs +2 -0
  330. package/dist/chunks/hi-BX9P0764.mjs.map +1 -0
  331. package/dist/chunks/hi-BakCaBYh.mjs +2 -0
  332. package/dist/chunks/hi-BakCaBYh.mjs.map +1 -0
  333. package/dist/chunks/hi-BoITZeVd.mjs +2 -0
  334. package/dist/chunks/hi-BoITZeVd.mjs.map +1 -0
  335. package/dist/chunks/hi-C3BvlTfV.mjs +2 -0
  336. package/dist/chunks/hi-C3BvlTfV.mjs.map +1 -0
  337. package/dist/chunks/hi-C5HGb5IH.mjs +2 -0
  338. package/dist/chunks/hi-C5HGb5IH.mjs.map +1 -0
  339. package/dist/chunks/hi-CIpo_sTL.mjs +2 -0
  340. package/dist/chunks/hi-CIpo_sTL.mjs.map +1 -0
  341. package/dist/chunks/hi-CWRofsw7.mjs +2 -0
  342. package/dist/chunks/hi-CWRofsw7.mjs.map +1 -0
  343. package/dist/chunks/hi-C_eipolR.mjs +2 -0
  344. package/dist/chunks/hi-C_eipolR.mjs.map +1 -0
  345. package/dist/chunks/hi-ClaAWR5y.mjs +2 -0
  346. package/dist/chunks/hi-ClaAWR5y.mjs.map +1 -0
  347. package/dist/chunks/hi-Cn2ywhVT.mjs +2 -0
  348. package/dist/chunks/hi-Cn2ywhVT.mjs.map +1 -0
  349. package/dist/chunks/hi-CrsqMuKk.mjs +2 -0
  350. package/dist/chunks/hi-CrsqMuKk.mjs.map +1 -0
  351. package/dist/chunks/hi-D-iC4Hvv.mjs +2 -0
  352. package/dist/chunks/hi-D-iC4Hvv.mjs.map +1 -0
  353. package/dist/chunks/hi-DEN9a54c.mjs +2 -0
  354. package/dist/chunks/hi-DEN9a54c.mjs.map +1 -0
  355. package/dist/chunks/hi-DK9HmINW.mjs +2 -0
  356. package/dist/chunks/hi-DK9HmINW.mjs.map +1 -0
  357. package/dist/chunks/hi-DOnHDEqt.mjs +2 -0
  358. package/dist/chunks/hi-DOnHDEqt.mjs.map +1 -0
  359. package/dist/chunks/hi-DY0SGobQ.mjs +2 -0
  360. package/dist/chunks/hi-DY0SGobQ.mjs.map +1 -0
  361. package/dist/chunks/hi-FSXMWIXU.mjs +2 -0
  362. package/dist/chunks/hi-FSXMWIXU.mjs.map +1 -0
  363. package/dist/chunks/hi-JroSY-2k.mjs +2 -0
  364. package/dist/chunks/hi-JroSY-2k.mjs.map +1 -0
  365. package/dist/chunks/hi-WDIZzgAJ.mjs +2 -0
  366. package/dist/chunks/hi-WDIZzgAJ.mjs.map +1 -0
  367. package/dist/chunks/hi-fLLnVGix.mjs +2 -0
  368. package/dist/chunks/hi-fLLnVGix.mjs.map +1 -0
  369. package/dist/chunks/hi-f_MCrd2N.mjs +2 -0
  370. package/dist/chunks/hi-f_MCrd2N.mjs.map +1 -0
  371. package/dist/chunks/minimal-BL3kgYy-.mjs +2 -0
  372. package/dist/chunks/minimal-BL3kgYy-.mjs.map +1 -0
  373. package/dist/chunks/pt-206lqjCP.mjs +2 -0
  374. package/dist/chunks/pt-206lqjCP.mjs.map +1 -0
  375. package/dist/chunks/pt-B5wz6m3c.mjs +2 -0
  376. package/dist/chunks/pt-B5wz6m3c.mjs.map +1 -0
  377. package/dist/chunks/pt-B6KMxxw4.mjs +2 -0
  378. package/dist/chunks/pt-B6KMxxw4.mjs.map +1 -0
  379. package/dist/chunks/pt-BCg3YzEh.mjs +2 -0
  380. package/dist/chunks/pt-BCg3YzEh.mjs.map +1 -0
  381. package/dist/chunks/pt-BFr-zfd2.mjs +2 -0
  382. package/dist/chunks/pt-BFr-zfd2.mjs.map +1 -0
  383. package/dist/chunks/pt-BG1fIcHV.mjs +2 -0
  384. package/dist/chunks/pt-BG1fIcHV.mjs.map +1 -0
  385. package/dist/chunks/pt-Bhytb-k2.mjs +2 -0
  386. package/dist/chunks/pt-Bhytb-k2.mjs.map +1 -0
  387. package/dist/chunks/pt-Bjb6_1gI.mjs +2 -0
  388. package/dist/chunks/pt-Bjb6_1gI.mjs.map +1 -0
  389. package/dist/chunks/pt-BzQagqFt.mjs +2 -0
  390. package/dist/chunks/pt-BzQagqFt.mjs.map +1 -0
  391. package/dist/chunks/pt-C2rlfcQ4.mjs +2 -0
  392. package/dist/chunks/pt-C2rlfcQ4.mjs.map +1 -0
  393. package/dist/chunks/pt-C4xLSFYA.mjs +2 -0
  394. package/dist/chunks/pt-C4xLSFYA.mjs.map +1 -0
  395. package/dist/chunks/pt-CBxnU7dE.mjs +2 -0
  396. package/dist/chunks/pt-CBxnU7dE.mjs.map +1 -0
  397. package/dist/chunks/pt-CMXLiIJ3.mjs +2 -0
  398. package/dist/chunks/pt-CMXLiIJ3.mjs.map +1 -0
  399. package/dist/chunks/pt-Cn2yMIyR.mjs +2 -0
  400. package/dist/chunks/pt-Cn2yMIyR.mjs.map +1 -0
  401. package/dist/chunks/pt-DAh8UqJa.mjs +2 -0
  402. package/dist/chunks/pt-DAh8UqJa.mjs.map +1 -0
  403. package/dist/chunks/pt-DLe58Npz.mjs +2 -0
  404. package/dist/chunks/pt-DLe58Npz.mjs.map +1 -0
  405. package/dist/chunks/pt-D_DXzKyU.mjs +2 -0
  406. package/dist/chunks/pt-D_DXzKyU.mjs.map +1 -0
  407. package/dist/chunks/pt-DhC7TYvg.mjs +2 -0
  408. package/dist/chunks/pt-DhC7TYvg.mjs.map +1 -0
  409. package/dist/chunks/pt-Dl18NLl1.mjs +2 -0
  410. package/dist/chunks/pt-Dl18NLl1.mjs.map +1 -0
  411. package/dist/chunks/pt-Dz2YeCP4.mjs +2 -0
  412. package/dist/chunks/pt-Dz2YeCP4.mjs.map +1 -0
  413. package/dist/chunks/pt-GfM-nxvv.mjs +2 -0
  414. package/dist/chunks/pt-GfM-nxvv.mjs.map +1 -0
  415. package/dist/chunks/pt-PjsDW8WW.mjs +2 -0
  416. package/dist/chunks/pt-PjsDW8WW.mjs.map +1 -0
  417. package/dist/chunks/pt-X-M5uPLn.mjs +2 -0
  418. package/dist/chunks/pt-X-M5uPLn.mjs.map +1 -0
  419. package/dist/chunks/pt-appBsYpC.mjs +2 -0
  420. package/dist/chunks/pt-appBsYpC.mjs.map +1 -0
  421. package/dist/chunks/pt-i9ZFEE69.mjs +2 -0
  422. package/dist/chunks/pt-i9ZFEE69.mjs.map +1 -0
  423. package/dist/chunks/ru-B8HSQCj5.mjs +2 -0
  424. package/dist/chunks/ru-B8HSQCj5.mjs.map +1 -0
  425. package/dist/chunks/ru-BAOr7UOh.mjs +2 -0
  426. package/dist/chunks/ru-BAOr7UOh.mjs.map +1 -0
  427. package/dist/chunks/ru-BIV3iuR9.mjs +2 -0
  428. package/dist/chunks/ru-BIV3iuR9.mjs.map +1 -0
  429. package/dist/chunks/ru-BMJRGir6.mjs +2 -0
  430. package/dist/chunks/ru-BMJRGir6.mjs.map +1 -0
  431. package/dist/chunks/ru-BO59Tir1.mjs +2 -0
  432. package/dist/chunks/ru-BO59Tir1.mjs.map +1 -0
  433. package/dist/chunks/ru-BRnZSWPo.mjs +2 -0
  434. package/dist/chunks/ru-BRnZSWPo.mjs.map +1 -0
  435. package/dist/chunks/ru-Bf546sX_.mjs +2 -0
  436. package/dist/chunks/ru-Bf546sX_.mjs.map +1 -0
  437. package/dist/chunks/ru-Bfjq7sha.mjs +2 -0
  438. package/dist/chunks/ru-Bfjq7sha.mjs.map +1 -0
  439. package/dist/chunks/ru-Bm8utWf9.mjs +2 -0
  440. package/dist/chunks/ru-Bm8utWf9.mjs.map +1 -0
  441. package/dist/chunks/ru-BmneOLgh.mjs +2 -0
  442. package/dist/chunks/ru-BmneOLgh.mjs.map +1 -0
  443. package/dist/chunks/ru-Byrj1o3C.mjs +2 -0
  444. package/dist/chunks/ru-Byrj1o3C.mjs.map +1 -0
  445. package/dist/chunks/ru-C8ftQh9b.mjs +2 -0
  446. package/dist/chunks/ru-C8ftQh9b.mjs.map +1 -0
  447. package/dist/chunks/ru-CNjcfDD9.mjs +2 -0
  448. package/dist/chunks/ru-CNjcfDD9.mjs.map +1 -0
  449. package/dist/chunks/ru-Ccya5aSC.mjs +2 -0
  450. package/dist/chunks/ru-Ccya5aSC.mjs.map +1 -0
  451. package/dist/chunks/ru-Cd-mH9wa.mjs +2 -0
  452. package/dist/chunks/ru-Cd-mH9wa.mjs.map +1 -0
  453. package/dist/chunks/ru-CeZe9jTZ.mjs +2 -0
  454. package/dist/chunks/ru-CeZe9jTZ.mjs.map +1 -0
  455. package/dist/chunks/ru-Cl03u8Q0.mjs +2 -0
  456. package/dist/chunks/ru-Cl03u8Q0.mjs.map +1 -0
  457. package/dist/chunks/ru-CoCIIElm.mjs +2 -0
  458. package/dist/chunks/ru-CoCIIElm.mjs.map +1 -0
  459. package/dist/chunks/ru-CzUyZZmy.mjs +2 -0
  460. package/dist/chunks/ru-CzUyZZmy.mjs.map +1 -0
  461. package/dist/chunks/ru-D3fRdonc.mjs +2 -0
  462. package/dist/chunks/ru-D3fRdonc.mjs.map +1 -0
  463. package/dist/chunks/ru-Ddy9ONaX.mjs +2 -0
  464. package/dist/chunks/ru-Ddy9ONaX.mjs.map +1 -0
  465. package/dist/chunks/ru-Dgcyz845.mjs +2 -0
  466. package/dist/chunks/ru-Dgcyz845.mjs.map +1 -0
  467. package/dist/chunks/ru-DnIXvlfL.mjs +2 -0
  468. package/dist/chunks/ru-DnIXvlfL.mjs.map +1 -0
  469. package/dist/chunks/ru-DyBnSwCM.mjs +2 -0
  470. package/dist/chunks/ru-DyBnSwCM.mjs.map +1 -0
  471. package/dist/chunks/ru-i27SgAts.mjs +2 -0
  472. package/dist/chunks/ru-i27SgAts.mjs.map +1 -0
  473. package/dist/chunks/src-DfK2_MVH.mjs +2 -0
  474. package/dist/chunks/src-DfK2_MVH.mjs.map +1 -0
  475. package/dist/chunks/zh-6QoY3dY_.mjs +2 -0
  476. package/dist/chunks/zh-6QoY3dY_.mjs.map +1 -0
  477. package/dist/chunks/zh-9WLieF9N.mjs +2 -0
  478. package/dist/chunks/zh-9WLieF9N.mjs.map +1 -0
  479. package/dist/chunks/zh-B0VaFyeQ.mjs +2 -0
  480. package/dist/chunks/zh-B0VaFyeQ.mjs.map +1 -0
  481. package/dist/chunks/zh-B4pfqHD3.mjs +2 -0
  482. package/dist/chunks/zh-B4pfqHD3.mjs.map +1 -0
  483. package/dist/chunks/zh-BpaN1Nmc.mjs +2 -0
  484. package/dist/chunks/zh-BpaN1Nmc.mjs.map +1 -0
  485. package/dist/chunks/zh-BqCL2eZf.mjs +2 -0
  486. package/dist/chunks/zh-BqCL2eZf.mjs.map +1 -0
  487. package/dist/chunks/zh-Bvgb-e4z.mjs +2 -0
  488. package/dist/chunks/zh-Bvgb-e4z.mjs.map +1 -0
  489. package/dist/chunks/zh-C2by0u64.mjs +2 -0
  490. package/dist/chunks/zh-C2by0u64.mjs.map +1 -0
  491. package/dist/chunks/zh-C4Ia0Zrx.mjs +2 -0
  492. package/dist/chunks/zh-C4Ia0Zrx.mjs.map +1 -0
  493. package/dist/chunks/zh-CBHCLph7.mjs +2 -0
  494. package/dist/chunks/zh-CBHCLph7.mjs.map +1 -0
  495. package/dist/chunks/zh-CBJQlvWb.mjs +2 -0
  496. package/dist/chunks/zh-CBJQlvWb.mjs.map +1 -0
  497. package/dist/chunks/zh-CBNSrvly.mjs +2 -0
  498. package/dist/chunks/zh-CBNSrvly.mjs.map +1 -0
  499. package/dist/chunks/zh-CKEh4EwR.mjs +2 -0
  500. package/dist/chunks/zh-CKEh4EwR.mjs.map +1 -0
  501. package/dist/chunks/zh-CN8KiZ9v.mjs +2 -0
  502. package/dist/chunks/zh-CN8KiZ9v.mjs.map +1 -0
  503. package/dist/chunks/zh-CRJMQ4dT.mjs +2 -0
  504. package/dist/chunks/zh-CRJMQ4dT.mjs.map +1 -0
  505. package/dist/chunks/zh-CSg0qxe0.mjs +2 -0
  506. package/dist/chunks/zh-CSg0qxe0.mjs.map +1 -0
  507. package/dist/chunks/zh-CX7Bx0ia.mjs +2 -0
  508. package/dist/chunks/zh-CX7Bx0ia.mjs.map +1 -0
  509. package/dist/chunks/zh-CvlL1G9n.mjs +2 -0
  510. package/dist/chunks/zh-CvlL1G9n.mjs.map +1 -0
  511. package/dist/chunks/zh-DBKn0pzM.mjs +2 -0
  512. package/dist/chunks/zh-DBKn0pzM.mjs.map +1 -0
  513. package/dist/chunks/zh-DLOng8d-.mjs +2 -0
  514. package/dist/chunks/zh-DLOng8d-.mjs.map +1 -0
  515. package/dist/chunks/zh-DLVkXfcI.mjs +2 -0
  516. package/dist/chunks/zh-DLVkXfcI.mjs.map +1 -0
  517. package/dist/chunks/zh-DuaKGwyq.mjs +2 -0
  518. package/dist/chunks/zh-DuaKGwyq.mjs.map +1 -0
  519. package/dist/chunks/zh-KUnAhArn.mjs +2 -0
  520. package/dist/chunks/zh-KUnAhArn.mjs.map +1 -0
  521. package/dist/chunks/zh-wVp_7rfC.mjs +2 -0
  522. package/dist/chunks/zh-wVp_7rfC.mjs.map +1 -0
  523. package/dist/chunks/zh-z2wm3EA5.mjs +2 -0
  524. package/dist/chunks/zh-z2wm3EA5.mjs.map +1 -0
  525. package/dist/decorations/Decoration.d.ts +6 -0
  526. package/dist/decorations/Decoration.d.ts.map +1 -1
  527. package/dist/decorations/PositionMapping.d.ts +13 -3
  528. package/dist/decorations/PositionMapping.d.ts.map +1 -1
  529. package/dist/editor/EditorConfig.d.ts +14 -2
  530. package/dist/editor/EditorConfig.d.ts.map +1 -1
  531. package/dist/editor/EditorDOM.d.ts.map +1 -1
  532. package/dist/editor/EditorInitializer.d.ts.map +1 -1
  533. package/dist/editor/NotectlEditor.d.ts +2 -2
  534. package/dist/editor/PluginBootstrapper.d.ts.map +1 -1
  535. package/dist/editor/styles/base.d.ts +1 -1
  536. package/dist/editor/styles/base.d.ts.map +1 -1
  537. package/dist/editor/styles/table.d.ts +1 -1
  538. package/dist/editor/styles/table.d.ts.map +1 -1
  539. package/dist/editor/styles/toolbar.d.ts +1 -1
  540. package/dist/editor/styles/toolbar.d.ts.map +1 -1
  541. package/dist/fonts.mjs +1 -1
  542. package/dist/full.mjs +1 -1
  543. package/dist/html.mjs +1 -1
  544. package/dist/index.d.ts +4 -1
  545. package/dist/index.d.ts.map +1 -1
  546. package/dist/input/InputHandler.d.ts +9 -0
  547. package/dist/input/InputHandler.d.ts.map +1 -1
  548. package/dist/input/InputManager.d.ts +2 -0
  549. package/dist/input/InputManager.d.ts.map +1 -1
  550. package/dist/model/NodeResolver.d.ts +7 -0
  551. package/dist/model/NodeResolver.d.ts.map +1 -1
  552. package/dist/model/TextInputInterceptor.d.ts +21 -0
  553. package/dist/model/TextInputInterceptor.d.ts.map +1 -0
  554. package/dist/notectl-core.mjs +1 -1
  555. package/dist/notectl-core.umd.js +1 -1
  556. package/dist/notectl-core.umd.js.map +1 -1
  557. package/dist/plugins/MiddlewareChain.d.ts +11 -0
  558. package/dist/plugins/MiddlewareChain.d.ts.map +1 -1
  559. package/dist/plugins/Plugin.d.ts +7 -0
  560. package/dist/plugins/Plugin.d.ts.map +1 -1
  561. package/dist/plugins/PluginContextFactory.d.ts +6 -0
  562. package/dist/plugins/PluginContextFactory.d.ts.map +1 -1
  563. package/dist/plugins/PluginManager.d.ts +5 -0
  564. package/dist/plugins/PluginManager.d.ts.map +1 -1
  565. package/dist/plugins/RegistrationTracker.d.ts.map +1 -1
  566. package/dist/plugins/alignment.mjs +1 -1
  567. package/dist/plugins/bidi-isolation.mjs +1 -1
  568. package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -1
  569. package/dist/plugins/blockquote/BlockquoteStyles.d.ts +1 -1
  570. package/dist/plugins/blockquote/BlockquoteStyles.d.ts.map +1 -1
  571. package/dist/plugins/blockquote.mjs +1 -1
  572. package/dist/plugins/caret-navigation.mjs +1 -1
  573. package/dist/plugins/code-block/BracketPairing.d.ts +49 -0
  574. package/dist/plugins/code-block/BracketPairing.d.ts.map +1 -0
  575. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts +11 -2
  576. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -1
  577. package/dist/plugins/code-block/CodeBlockLocale.d.ts +4 -0
  578. package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -1
  579. package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -1
  580. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +25 -1
  581. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  582. package/dist/plugins/code-block/CodeBlockTypes.d.ts +66 -0
  583. package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
  584. package/dist/plugins/code-block/IndentHelpers.d.ts +71 -0
  585. package/dist/plugins/code-block/IndentHelpers.d.ts.map +1 -0
  586. package/dist/plugins/code-block/PairStack.d.ts +37 -0
  587. package/dist/plugins/code-block/PairStack.d.ts.map +1 -0
  588. package/dist/plugins/code-block/highlighter/RegexTokenizer.d.ts.map +1 -1
  589. package/dist/plugins/code-block/highlighter/TokenIteration.d.ts +18 -0
  590. package/dist/plugins/code-block/highlighter/TokenIteration.d.ts.map +1 -0
  591. package/dist/plugins/code-block/highlighter/languages/index.d.ts +1 -0
  592. package/dist/plugins/code-block/highlighter/languages/index.d.ts.map +1 -1
  593. package/dist/plugins/code-block/highlighter/languages/java.d.ts.map +1 -1
  594. package/dist/plugins/code-block/highlighter/languages/typescript.d.ts +3 -0
  595. package/dist/plugins/code-block/highlighter/languages/typescript.d.ts.map +1 -0
  596. package/dist/plugins/code-block/index.d.ts +1 -0
  597. package/dist/plugins/code-block/index.d.ts.map +1 -1
  598. package/dist/plugins/code-block/locales/ar.d.ts.map +1 -1
  599. package/dist/plugins/code-block/locales/de.d.ts.map +1 -1
  600. package/dist/plugins/code-block/locales/es.d.ts.map +1 -1
  601. package/dist/plugins/code-block/locales/fr.d.ts.map +1 -1
  602. package/dist/plugins/code-block/locales/hi.d.ts.map +1 -1
  603. package/dist/plugins/code-block/locales/pt.d.ts.map +1 -1
  604. package/dist/plugins/code-block/locales/ru.d.ts.map +1 -1
  605. package/dist/plugins/code-block/locales/zh.d.ts.map +1 -1
  606. package/dist/plugins/code-block.mjs +1 -1
  607. package/dist/plugins/font-size.mjs +1 -1
  608. package/dist/plugins/font.mjs +1 -1
  609. package/dist/plugins/gap-cursor.mjs +1 -1
  610. package/dist/plugins/hard-break.mjs +1 -1
  611. package/dist/plugins/heading.mjs +1 -1
  612. package/dist/plugins/highlight.mjs +1 -1
  613. package/dist/plugins/horizontal-rule.mjs +1 -1
  614. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
  615. package/dist/plugins/image/ImagePopup.d.ts.map +1 -1
  616. package/dist/plugins/image/ImagePopupStyles.d.ts +3 -0
  617. package/dist/plugins/image/ImagePopupStyles.d.ts.map +1 -0
  618. package/dist/plugins/image.mjs +1 -1
  619. package/dist/plugins/inline-code.mjs +1 -1
  620. package/dist/plugins/language/bundles/JavaSupport.d.ts.map +1 -1
  621. package/dist/plugins/language/bundles/TypeScriptSupport.d.ts +3 -0
  622. package/dist/plugins/language/bundles/TypeScriptSupport.d.ts.map +1 -0
  623. package/dist/plugins/language/bundles/index.d.ts +1 -0
  624. package/dist/plugins/language/bundles/index.d.ts.map +1 -1
  625. package/dist/plugins/language/index.d.ts +1 -1
  626. package/dist/plugins/language/index.d.ts.map +1 -1
  627. package/dist/plugins/language.mjs +1 -1
  628. package/dist/plugins/link.mjs +1 -1
  629. package/dist/plugins/list.mjs +1 -1
  630. package/dist/plugins/print.mjs +1 -1
  631. package/dist/plugins/shared.mjs +1 -1
  632. package/dist/plugins/smart-paste/detectors/DetectionScorer.d.ts +17 -0
  633. package/dist/plugins/smart-paste/detectors/DetectionScorer.d.ts.map +1 -0
  634. package/dist/plugins/smart-paste/detectors/LexerDetector.d.ts +36 -0
  635. package/dist/plugins/smart-paste/detectors/LexerDetector.d.ts.map +1 -0
  636. package/dist/plugins/smart-paste/detectors/TokenStats.d.ts +44 -0
  637. package/dist/plugins/smart-paste/detectors/TokenStats.d.ts.map +1 -0
  638. package/dist/plugins/smart-paste/index.d.ts +3 -1
  639. package/dist/plugins/smart-paste/index.d.ts.map +1 -1
  640. package/dist/plugins/smart-paste.mjs +1 -1
  641. package/dist/plugins/strikethrough.mjs +1 -1
  642. package/dist/plugins/super-sub.mjs +1 -1
  643. package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
  644. package/dist/plugins/table.mjs +1 -1
  645. package/dist/plugins/text-color.mjs +1 -1
  646. package/dist/plugins/text-direction-auto.mjs +1 -1
  647. package/dist/plugins/text-direction.mjs +1 -1
  648. package/dist/plugins/text-formatting.mjs +1 -1
  649. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts +14 -1
  650. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -1
  651. package/dist/plugins/toolbar/ToolbarPlugin.d.ts +13 -1
  652. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
  653. package/dist/plugins/toolbar/ToolbarRenderers.d.ts.map +1 -1
  654. package/dist/plugins/toolbar/index.d.ts +1 -1
  655. package/dist/plugins/toolbar/index.d.ts.map +1 -1
  656. package/dist/plugins/toolbar.mjs +1 -1
  657. package/dist/presets/full.mjs +1 -1
  658. package/dist/presets/minimal.mjs +1 -1
  659. package/dist/presets.mjs +1 -1
  660. package/dist/state/History.d.ts +20 -0
  661. package/dist/state/History.d.ts.map +1 -1
  662. package/dist/state/InlineContentOps.d.ts +30 -0
  663. package/dist/state/InlineContentOps.d.ts.map +1 -1
  664. package/dist/state/Mapping.d.ts +261 -0
  665. package/dist/state/Mapping.d.ts.map +1 -0
  666. package/dist/state/SelectionMapping.d.ts +25 -0
  667. package/dist/state/SelectionMapping.d.ts.map +1 -0
  668. package/dist/state/StepApplication.d.ts +20 -3
  669. package/dist/state/StepApplication.d.ts.map +1 -1
  670. package/dist/state/StepHandlers.d.ts +68 -0
  671. package/dist/state/StepHandlers.d.ts.map +1 -0
  672. package/dist/state/StepInversion.d.ts +22 -5
  673. package/dist/state/StepInversion.d.ts.map +1 -1
  674. package/dist/state/StepMapping.d.ts +18 -0
  675. package/dist/state/StepMapping.d.ts.map +1 -0
  676. package/dist/state/StepMaps.d.ts +25 -0
  677. package/dist/state/StepMaps.d.ts.map +1 -0
  678. package/dist/state/Steps.d.ts +38 -0
  679. package/dist/state/Steps.d.ts.map +1 -1
  680. package/dist/state/Transaction.d.ts +25 -1
  681. package/dist/state/Transaction.d.ts.map +1 -1
  682. package/dist/state/TransactionBuilder.d.ts +51 -7
  683. package/dist/state/TransactionBuilder.d.ts.map +1 -1
  684. package/dist/test/TestUtils.d.ts +2 -0
  685. package/dist/test/TestUtils.d.ts.map +1 -1
  686. package/dist/view/EditorView.d.ts.map +1 -1
  687. package/package.json +1 -1
  688. package/dist/chunks/AlignmentPlugin-bqK6ze-E.mjs +0 -2
  689. package/dist/chunks/AlignmentPlugin-bqK6ze-E.mjs.map +0 -1
  690. package/dist/chunks/AttrRegistry-nDKtHK87.mjs +0 -2
  691. package/dist/chunks/AttrRegistry-nDKtHK87.mjs.map +0 -1
  692. package/dist/chunks/AttributedMarkCommands-35jTbVRg.mjs +0 -2
  693. package/dist/chunks/AttributedMarkCommands-35jTbVRg.mjs.map +0 -1
  694. package/dist/chunks/BidiIsolationPlugin-SIKxfWXp.mjs +0 -2
  695. package/dist/chunks/BidiIsolationPlugin-SIKxfWXp.mjs.map +0 -1
  696. package/dist/chunks/BlockInsertion-DsnHLcvM.mjs +0 -2
  697. package/dist/chunks/BlockInsertion-DsnHLcvM.mjs.map +0 -1
  698. package/dist/chunks/BlockTypePickerRegistry-C_jLddOz.mjs +0 -2
  699. package/dist/chunks/BlockTypePickerRegistry-C_jLddOz.mjs.map +0 -1
  700. package/dist/chunks/BlockquotePlugin-BEaZSoVT.mjs +0 -2
  701. package/dist/chunks/BlockquotePlugin-BEaZSoVT.mjs.map +0 -1
  702. package/dist/chunks/CaretNavigationPlugin-DHl61oc6.mjs +0 -2
  703. package/dist/chunks/CaretNavigationPlugin-DHl61oc6.mjs.map +0 -1
  704. package/dist/chunks/CodeBlockPlugin-DglqiSNK.mjs +0 -2
  705. package/dist/chunks/CodeBlockPlugin-DglqiSNK.mjs.map +0 -1
  706. package/dist/chunks/ColorGrid-Czm0p2E9.mjs +0 -2
  707. package/dist/chunks/ColorGrid-Czm0p2E9.mjs.map +0 -1
  708. package/dist/chunks/ColorPickerPopup-CL-W380M.mjs +0 -2
  709. package/dist/chunks/ColorPickerPopup-CL-W380M.mjs.map +0 -1
  710. package/dist/chunks/ColorValidation-CiGxVsqd.mjs +0 -2
  711. package/dist/chunks/ColorValidation-CiGxVsqd.mjs.map +0 -1
  712. package/dist/chunks/CommandHelpers-DTlQcGv5.mjs +0 -2
  713. package/dist/chunks/CommandHelpers-DTlQcGv5.mjs.map +0 -1
  714. package/dist/chunks/Commands-BuYF23lf.mjs +0 -2
  715. package/dist/chunks/Commands-BuYF23lf.mjs.map +0 -1
  716. package/dist/chunks/Decoration-oeHDjWWq.mjs +0 -2
  717. package/dist/chunks/Decoration-oeHDjWWq.mjs.map +0 -1
  718. package/dist/chunks/DirectionDetection-Hun6-7ER.mjs +0 -2
  719. package/dist/chunks/DirectionDetection-Hun6-7ER.mjs.map +0 -1
  720. package/dist/chunks/DirectionIcons-CfaDcQ9a.mjs +0 -2
  721. package/dist/chunks/DirectionIcons-CfaDcQ9a.mjs.map +0 -1
  722. package/dist/chunks/Document-_qdGR4vh.mjs +0 -2
  723. package/dist/chunks/Document-_qdGR4vh.mjs.map +0 -1
  724. package/dist/chunks/DocumentParser-CyATBOz-.mjs +0 -2
  725. package/dist/chunks/DocumentParser-CyATBOz-.mjs.map +0 -1
  726. package/dist/chunks/FontPlugin-B-Sxa0UW.mjs +0 -2
  727. package/dist/chunks/FontPlugin-B-Sxa0UW.mjs.map +0 -1
  728. package/dist/chunks/FontSizePlugin-C1zlyXL2.mjs +0 -2
  729. package/dist/chunks/FontSizePlugin-C1zlyXL2.mjs.map +0 -1
  730. package/dist/chunks/GapCursorNavigation-BaXDnjFf.mjs +0 -2
  731. package/dist/chunks/GapCursorNavigation-BaXDnjFf.mjs.map +0 -1
  732. package/dist/chunks/GapCursorPlugin-nldun8cE.mjs +0 -2
  733. package/dist/chunks/GapCursorPlugin-nldun8cE.mjs.map +0 -1
  734. package/dist/chunks/HardBreakPlugin-DZRdsE15.mjs +0 -2
  735. package/dist/chunks/HardBreakPlugin-DZRdsE15.mjs.map +0 -1
  736. package/dist/chunks/HeadingPlugin-EPAmsEGt.mjs +0 -2
  737. package/dist/chunks/HeadingPlugin-EPAmsEGt.mjs.map +0 -1
  738. package/dist/chunks/HighlightPlugin-RN3l6pVJ.mjs +0 -2
  739. package/dist/chunks/HighlightPlugin-RN3l6pVJ.mjs.map +0 -1
  740. package/dist/chunks/HorizontalRulePlugin-BJPXzTtJ.mjs +0 -2
  741. package/dist/chunks/HorizontalRulePlugin-BJPXzTtJ.mjs.map +0 -1
  742. package/dist/chunks/ImagePlugin-CCEevNfJ.mjs +0 -2
  743. package/dist/chunks/ImagePlugin-CCEevNfJ.mjs.map +0 -1
  744. package/dist/chunks/InlineCodePlugin-B7IOgUSI.mjs +0 -2
  745. package/dist/chunks/InlineCodePlugin-B7IOgUSI.mjs.map +0 -1
  746. package/dist/chunks/KeyboardNav-CsdlWnNl.mjs +0 -2
  747. package/dist/chunks/KeyboardNav-CsdlWnNl.mjs.map +0 -1
  748. package/dist/chunks/LinkPlugin-Bhwg24lH.mjs +0 -2
  749. package/dist/chunks/LinkPlugin-Bhwg24lH.mjs.map +0 -1
  750. package/dist/chunks/ListPlugin-BkG6UO4x.mjs +0 -2
  751. package/dist/chunks/ListPlugin-BkG6UO4x.mjs.map +0 -1
  752. package/dist/chunks/NavigationQueries-CgYPG6oY.mjs +0 -2
  753. package/dist/chunks/NavigationQueries-CgYPG6oY.mjs.map +0 -1
  754. package/dist/chunks/NodeResolver-DVPpO5nC.mjs +0 -2
  755. package/dist/chunks/NodeResolver-DVPpO5nC.mjs.map +0 -1
  756. package/dist/chunks/NodeSelectionCommands-Ddxu5Qck.mjs +0 -2
  757. package/dist/chunks/NodeSelectionCommands-Ddxu5Qck.mjs.map +0 -1
  758. package/dist/chunks/PluginHelpers-D-MvWR98.mjs +0 -2
  759. package/dist/chunks/PluginHelpers-D-MvWR98.mjs.map +0 -1
  760. package/dist/chunks/PopupKeyboardPatterns-DQdL7RHx.mjs +0 -2
  761. package/dist/chunks/PopupKeyboardPatterns-DQdL7RHx.mjs.map +0 -1
  762. package/dist/chunks/PopupManager-CxPzNm-P.mjs +0 -2
  763. package/dist/chunks/PopupManager-CxPzNm-P.mjs.map +0 -1
  764. package/dist/chunks/PopupPositioning-DRNwWB0U.mjs +0 -2
  765. package/dist/chunks/PopupPositioning-DRNwWB0U.mjs.map +0 -1
  766. package/dist/chunks/PrintPlugin-DOk5IZRO.mjs +0 -2
  767. package/dist/chunks/PrintPlugin-DOk5IZRO.mjs.map +0 -1
  768. package/dist/chunks/PrintTypes-Drk6kLcl.mjs +0 -2
  769. package/dist/chunks/PrintTypes-Drk6kLcl.mjs.map +0 -1
  770. package/dist/chunks/RangeIterator-DytL1lUT.mjs +0 -2
  771. package/dist/chunks/RangeIterator-DytL1lUT.mjs.map +0 -1
  772. package/dist/chunks/ShortcutFormatting-DE6B8iGs.mjs +0 -2
  773. package/dist/chunks/ShortcutFormatting-DE6B8iGs.mjs.map +0 -1
  774. package/dist/chunks/SmartPastePlugin-DqKx94sH.mjs +0 -2
  775. package/dist/chunks/SmartPastePlugin-DqKx94sH.mjs.map +0 -1
  776. package/dist/chunks/StrikethroughPlugin-vYNzfxdy.mjs +0 -2
  777. package/dist/chunks/StrikethroughPlugin-vYNzfxdy.mjs.map +0 -1
  778. package/dist/chunks/SuperSubPlugin-BNsoXWHS.mjs +0 -2
  779. package/dist/chunks/SuperSubPlugin-BNsoXWHS.mjs.map +0 -1
  780. package/dist/chunks/SyntaxTokenTypes-CVUAMov0.mjs +0 -2
  781. package/dist/chunks/SyntaxTokenTypes-CVUAMov0.mjs.map +0 -1
  782. package/dist/chunks/TablePlugin-R-hmydrM.mjs +0 -2
  783. package/dist/chunks/TablePlugin-R-hmydrM.mjs.map +0 -1
  784. package/dist/chunks/TextColorPlugin-DQ-CB9cr.mjs +0 -2
  785. package/dist/chunks/TextColorPlugin-DQ-CB9cr.mjs.map +0 -1
  786. package/dist/chunks/TextDirectionAutoPlugin-kZ1tcu0d.mjs +0 -2
  787. package/dist/chunks/TextDirectionAutoPlugin-kZ1tcu0d.mjs.map +0 -1
  788. package/dist/chunks/TextDirectionPlugin-Bk3CkbYh.mjs +0 -2
  789. package/dist/chunks/TextDirectionPlugin-Bk3CkbYh.mjs.map +0 -1
  790. package/dist/chunks/TextDirectionService-DY4M8EwU.mjs +0 -2
  791. package/dist/chunks/TextDirectionService-DY4M8EwU.mjs.map +0 -1
  792. package/dist/chunks/TextFormattingPlugin-D13eP6nF.mjs +0 -2
  793. package/dist/chunks/TextFormattingPlugin-D13eP6nF.mjs.map +0 -1
  794. package/dist/chunks/ToolbarPlugin-DeH8n5d2.mjs +0 -2
  795. package/dist/chunks/ToolbarPlugin-DeH8n5d2.mjs.map +0 -1
  796. package/dist/chunks/WordBoundary-BE2u997Q.mjs +0 -2
  797. package/dist/chunks/WordBoundary-BE2u997Q.mjs.map +0 -1
  798. package/dist/chunks/XmlDetector-BtYxzBDa.mjs +0 -2
  799. package/dist/chunks/XmlDetector-BtYxzBDa.mjs.map +0 -1
  800. package/dist/chunks/XmlPatterns-DuP8GWVt.mjs +0 -2
  801. package/dist/chunks/XmlPatterns-DuP8GWVt.mjs.map +0 -1
  802. package/dist/chunks/XmlSupport-D54BdAJZ.mjs +0 -2
  803. package/dist/chunks/XmlSupport-D54BdAJZ.mjs.map +0 -1
  804. package/dist/chunks/ar-2Fkz_6nI.mjs +0 -2
  805. package/dist/chunks/ar-2Fkz_6nI.mjs.map +0 -1
  806. package/dist/chunks/ar-4ZPC8daa.mjs +0 -2
  807. package/dist/chunks/ar-4ZPC8daa.mjs.map +0 -1
  808. package/dist/chunks/ar-6I20_Djq.mjs +0 -2
  809. package/dist/chunks/ar-6I20_Djq.mjs.map +0 -1
  810. package/dist/chunks/ar-B7-Dm70S.mjs +0 -2
  811. package/dist/chunks/ar-B7-Dm70S.mjs.map +0 -1
  812. package/dist/chunks/ar-BRe0t96G.mjs +0 -2
  813. package/dist/chunks/ar-BRe0t96G.mjs.map +0 -1
  814. package/dist/chunks/ar-BnNyrtdi.mjs +0 -2
  815. package/dist/chunks/ar-BnNyrtdi.mjs.map +0 -1
  816. package/dist/chunks/ar-BsMfhWs5.mjs +0 -2
  817. package/dist/chunks/ar-BsMfhWs5.mjs.map +0 -1
  818. package/dist/chunks/ar-Bvja-bjE.mjs +0 -2
  819. package/dist/chunks/ar-Bvja-bjE.mjs.map +0 -1
  820. package/dist/chunks/ar-BxVbBvSa.mjs +0 -2
  821. package/dist/chunks/ar-BxVbBvSa.mjs.map +0 -1
  822. package/dist/chunks/ar-C5dW-co3.mjs +0 -2
  823. package/dist/chunks/ar-C5dW-co3.mjs.map +0 -1
  824. package/dist/chunks/ar-CARMr30L.mjs +0 -2
  825. package/dist/chunks/ar-CARMr30L.mjs.map +0 -1
  826. package/dist/chunks/ar-CB-pehGw.mjs +0 -2
  827. package/dist/chunks/ar-CB-pehGw.mjs.map +0 -1
  828. package/dist/chunks/ar-CEYgAxTM.mjs +0 -2
  829. package/dist/chunks/ar-CEYgAxTM.mjs.map +0 -1
  830. package/dist/chunks/ar-CO60qpZJ.mjs +0 -2
  831. package/dist/chunks/ar-CO60qpZJ.mjs.map +0 -1
  832. package/dist/chunks/ar-CtI_snUM.mjs +0 -2
  833. package/dist/chunks/ar-CtI_snUM.mjs.map +0 -1
  834. package/dist/chunks/ar-Cv1RQvhK.mjs +0 -2
  835. package/dist/chunks/ar-Cv1RQvhK.mjs.map +0 -1
  836. package/dist/chunks/ar-D5jV20Tu.mjs +0 -2
  837. package/dist/chunks/ar-D5jV20Tu.mjs.map +0 -1
  838. package/dist/chunks/ar-DJN9fQ7Z.mjs +0 -2
  839. package/dist/chunks/ar-DJN9fQ7Z.mjs.map +0 -1
  840. package/dist/chunks/ar-DPTsUnwA.mjs +0 -2
  841. package/dist/chunks/ar-DPTsUnwA.mjs.map +0 -1
  842. package/dist/chunks/ar-DZJIBD1Q.mjs +0 -2
  843. package/dist/chunks/ar-DZJIBD1Q.mjs.map +0 -1
  844. package/dist/chunks/ar-DkkbwV93.mjs +0 -2
  845. package/dist/chunks/ar-DkkbwV93.mjs.map +0 -1
  846. package/dist/chunks/ar-DmeMor8Y.mjs +0 -2
  847. package/dist/chunks/ar-DmeMor8Y.mjs.map +0 -1
  848. package/dist/chunks/ar-LnE7jPai.mjs +0 -2
  849. package/dist/chunks/ar-LnE7jPai.mjs.map +0 -1
  850. package/dist/chunks/ar-P3wW0fmA.mjs +0 -2
  851. package/dist/chunks/ar-P3wW0fmA.mjs.map +0 -1
  852. package/dist/chunks/ar-uum0DCfv.mjs +0 -2
  853. package/dist/chunks/ar-uum0DCfv.mjs.map +0 -1
  854. package/dist/chunks/color-picker-DlXhHBZ6.mjs +0 -2
  855. package/dist/chunks/color-picker-DlXhHBZ6.mjs.map +0 -1
  856. package/dist/chunks/de-8SHQu0rr.mjs +0 -2
  857. package/dist/chunks/de-8SHQu0rr.mjs.map +0 -1
  858. package/dist/chunks/de-B8a71A0X.mjs +0 -2
  859. package/dist/chunks/de-B8a71A0X.mjs.map +0 -1
  860. package/dist/chunks/de-B9weXoA1.mjs +0 -2
  861. package/dist/chunks/de-B9weXoA1.mjs.map +0 -1
  862. package/dist/chunks/de-BKm53tVU.mjs +0 -2
  863. package/dist/chunks/de-BKm53tVU.mjs.map +0 -1
  864. package/dist/chunks/de-BLWrnMfX.mjs +0 -2
  865. package/dist/chunks/de-BLWrnMfX.mjs.map +0 -1
  866. package/dist/chunks/de-BOujs1pF.mjs +0 -2
  867. package/dist/chunks/de-BOujs1pF.mjs.map +0 -1
  868. package/dist/chunks/de-B_1XleAG.mjs +0 -2
  869. package/dist/chunks/de-B_1XleAG.mjs.map +0 -1
  870. package/dist/chunks/de-BpmjrOMc.mjs +0 -2
  871. package/dist/chunks/de-BpmjrOMc.mjs.map +0 -1
  872. package/dist/chunks/de-C8OHD1fm.mjs +0 -2
  873. package/dist/chunks/de-C8OHD1fm.mjs.map +0 -1
  874. package/dist/chunks/de-CAVCXBBR.mjs +0 -2
  875. package/dist/chunks/de-CAVCXBBR.mjs.map +0 -1
  876. package/dist/chunks/de-CkMnuozT.mjs +0 -2
  877. package/dist/chunks/de-CkMnuozT.mjs.map +0 -1
  878. package/dist/chunks/de-CtDnvnnm.mjs +0 -2
  879. package/dist/chunks/de-CtDnvnnm.mjs.map +0 -1
  880. package/dist/chunks/de-Cz26vtXW.mjs +0 -2
  881. package/dist/chunks/de-Cz26vtXW.mjs.map +0 -1
  882. package/dist/chunks/de-D0BPSP3j.mjs +0 -2
  883. package/dist/chunks/de-D0BPSP3j.mjs.map +0 -1
  884. package/dist/chunks/de-D74v0paw.mjs +0 -2
  885. package/dist/chunks/de-D74v0paw.mjs.map +0 -1
  886. package/dist/chunks/de-DKj55F9g.mjs +0 -2
  887. package/dist/chunks/de-DKj55F9g.mjs.map +0 -1
  888. package/dist/chunks/de-DYuRb98l.mjs +0 -2
  889. package/dist/chunks/de-DYuRb98l.mjs.map +0 -1
  890. package/dist/chunks/de-DaK0-sdo.mjs +0 -2
  891. package/dist/chunks/de-DaK0-sdo.mjs.map +0 -1
  892. package/dist/chunks/de-Dia08Wsq.mjs +0 -2
  893. package/dist/chunks/de-Dia08Wsq.mjs.map +0 -1
  894. package/dist/chunks/de-Dp_uj2Z3.mjs +0 -2
  895. package/dist/chunks/de-Dp_uj2Z3.mjs.map +0 -1
  896. package/dist/chunks/de-DwX1CDNO.mjs +0 -2
  897. package/dist/chunks/de-DwX1CDNO.mjs.map +0 -1
  898. package/dist/chunks/de-DyF2mRfw.mjs +0 -2
  899. package/dist/chunks/de-DyF2mRfw.mjs.map +0 -1
  900. package/dist/chunks/de-X3BLBlF8.mjs +0 -2
  901. package/dist/chunks/de-X3BLBlF8.mjs.map +0 -1
  902. package/dist/chunks/de-dPC3Qk7N.mjs +0 -2
  903. package/dist/chunks/de-dPC3Qk7N.mjs.map +0 -1
  904. package/dist/chunks/de-pLGt5S7j.mjs +0 -2
  905. package/dist/chunks/de-pLGt5S7j.mjs.map +0 -1
  906. package/dist/chunks/es--xozZF4T.mjs +0 -2
  907. package/dist/chunks/es--xozZF4T.mjs.map +0 -1
  908. package/dist/chunks/es-2BjtTusm.mjs +0 -2
  909. package/dist/chunks/es-2BjtTusm.mjs.map +0 -1
  910. package/dist/chunks/es-B2rEK7_f.mjs +0 -2
  911. package/dist/chunks/es-B2rEK7_f.mjs.map +0 -1
  912. package/dist/chunks/es-B9esmUm1.mjs +0 -2
  913. package/dist/chunks/es-B9esmUm1.mjs.map +0 -1
  914. package/dist/chunks/es-BJxkHalP.mjs +0 -2
  915. package/dist/chunks/es-BJxkHalP.mjs.map +0 -1
  916. package/dist/chunks/es-BMKsnh3y.mjs +0 -2
  917. package/dist/chunks/es-BMKsnh3y.mjs.map +0 -1
  918. package/dist/chunks/es-BXFflrrU.mjs +0 -2
  919. package/dist/chunks/es-BXFflrrU.mjs.map +0 -1
  920. package/dist/chunks/es-BbX_lEEN.mjs +0 -2
  921. package/dist/chunks/es-BbX_lEEN.mjs.map +0 -1
  922. package/dist/chunks/es-BlHe_tc0.mjs +0 -2
  923. package/dist/chunks/es-BlHe_tc0.mjs.map +0 -1
  924. package/dist/chunks/es-Bu6nnEeT.mjs +0 -2
  925. package/dist/chunks/es-Bu6nnEeT.mjs.map +0 -1
  926. package/dist/chunks/es-Bx0CbUoY.mjs +0 -2
  927. package/dist/chunks/es-Bx0CbUoY.mjs.map +0 -1
  928. package/dist/chunks/es-CE9Tbsb7.mjs +0 -2
  929. package/dist/chunks/es-CE9Tbsb7.mjs.map +0 -1
  930. package/dist/chunks/es-COSomns3.mjs +0 -2
  931. package/dist/chunks/es-COSomns3.mjs.map +0 -1
  932. package/dist/chunks/es-C_7qthHu.mjs +0 -2
  933. package/dist/chunks/es-C_7qthHu.mjs.map +0 -1
  934. package/dist/chunks/es-CirfP3x1.mjs +0 -2
  935. package/dist/chunks/es-CirfP3x1.mjs.map +0 -1
  936. package/dist/chunks/es-CpF8eiPr.mjs +0 -2
  937. package/dist/chunks/es-CpF8eiPr.mjs.map +0 -1
  938. package/dist/chunks/es-D787y0ui.mjs +0 -2
  939. package/dist/chunks/es-D787y0ui.mjs.map +0 -1
  940. package/dist/chunks/es-D8iB5vwQ.mjs +0 -2
  941. package/dist/chunks/es-D8iB5vwQ.mjs.map +0 -1
  942. package/dist/chunks/es-DBb78XWu.mjs +0 -2
  943. package/dist/chunks/es-DBb78XWu.mjs.map +0 -1
  944. package/dist/chunks/es-DC6mYTD3.mjs +0 -2
  945. package/dist/chunks/es-DC6mYTD3.mjs.map +0 -1
  946. package/dist/chunks/es-Dh--mRZs.mjs +0 -2
  947. package/dist/chunks/es-Dh--mRZs.mjs.map +0 -1
  948. package/dist/chunks/es-DvPsYqFj.mjs +0 -2
  949. package/dist/chunks/es-DvPsYqFj.mjs.map +0 -1
  950. package/dist/chunks/es-DxXimuUa.mjs +0 -2
  951. package/dist/chunks/es-DxXimuUa.mjs.map +0 -1
  952. package/dist/chunks/es-mWJptxq3.mjs +0 -2
  953. package/dist/chunks/es-mWJptxq3.mjs.map +0 -1
  954. package/dist/chunks/es-qYV--o6U.mjs +0 -2
  955. package/dist/chunks/es-qYV--o6U.mjs.map +0 -1
  956. package/dist/chunks/fonts-CxtWyeNB.mjs +0 -2
  957. package/dist/chunks/fonts-CxtWyeNB.mjs.map +0 -1
  958. package/dist/chunks/fr--F426oao.mjs +0 -2
  959. package/dist/chunks/fr--F426oao.mjs.map +0 -1
  960. package/dist/chunks/fr-B0BPbbNB.mjs +0 -2
  961. package/dist/chunks/fr-B0BPbbNB.mjs.map +0 -1
  962. package/dist/chunks/fr-B4UQy0j-.mjs +0 -2
  963. package/dist/chunks/fr-B4UQy0j-.mjs.map +0 -1
  964. package/dist/chunks/fr-B4XLxkci.mjs +0 -2
  965. package/dist/chunks/fr-B4XLxkci.mjs.map +0 -1
  966. package/dist/chunks/fr-BC1Rfp9S.mjs +0 -2
  967. package/dist/chunks/fr-BC1Rfp9S.mjs.map +0 -1
  968. package/dist/chunks/fr-BRGGu0E2.mjs +0 -2
  969. package/dist/chunks/fr-BRGGu0E2.mjs.map +0 -1
  970. package/dist/chunks/fr-BoSz1pa9.mjs +0 -2
  971. package/dist/chunks/fr-BoSz1pa9.mjs.map +0 -1
  972. package/dist/chunks/fr-Bom3RFIN.mjs +0 -2
  973. package/dist/chunks/fr-Bom3RFIN.mjs.map +0 -1
  974. package/dist/chunks/fr-BtnwMUII.mjs +0 -2
  975. package/dist/chunks/fr-BtnwMUII.mjs.map +0 -1
  976. package/dist/chunks/fr-C6pglM3H.mjs +0 -2
  977. package/dist/chunks/fr-C6pglM3H.mjs.map +0 -1
  978. package/dist/chunks/fr-CDBpS6xE.mjs +0 -2
  979. package/dist/chunks/fr-CDBpS6xE.mjs.map +0 -1
  980. package/dist/chunks/fr-CN0ihkUg.mjs +0 -2
  981. package/dist/chunks/fr-CN0ihkUg.mjs.map +0 -1
  982. package/dist/chunks/fr-CNNBBeLM.mjs +0 -2
  983. package/dist/chunks/fr-CNNBBeLM.mjs.map +0 -1
  984. package/dist/chunks/fr-CVOY2y07.mjs +0 -2
  985. package/dist/chunks/fr-CVOY2y07.mjs.map +0 -1
  986. package/dist/chunks/fr-CZAbL_o0.mjs +0 -2
  987. package/dist/chunks/fr-CZAbL_o0.mjs.map +0 -1
  988. package/dist/chunks/fr-DJkPmQG_.mjs +0 -2
  989. package/dist/chunks/fr-DJkPmQG_.mjs.map +0 -1
  990. package/dist/chunks/fr-DkWdFDsR.mjs +0 -2
  991. package/dist/chunks/fr-DkWdFDsR.mjs.map +0 -1
  992. package/dist/chunks/fr-DnQHoPVo.mjs +0 -2
  993. package/dist/chunks/fr-DnQHoPVo.mjs.map +0 -1
  994. package/dist/chunks/fr-DsdueaiG.mjs +0 -2
  995. package/dist/chunks/fr-DsdueaiG.mjs.map +0 -1
  996. package/dist/chunks/fr-DxNdsa11.mjs +0 -2
  997. package/dist/chunks/fr-DxNdsa11.mjs.map +0 -1
  998. package/dist/chunks/fr-IO4_LYvE.mjs +0 -2
  999. package/dist/chunks/fr-IO4_LYvE.mjs.map +0 -1
  1000. package/dist/chunks/fr-ZKDCEpww.mjs +0 -2
  1001. package/dist/chunks/fr-ZKDCEpww.mjs.map +0 -1
  1002. package/dist/chunks/fr-coufP_et.mjs +0 -2
  1003. package/dist/chunks/fr-coufP_et.mjs.map +0 -1
  1004. package/dist/chunks/fr-lYSOgOK7.mjs +0 -2
  1005. package/dist/chunks/fr-lYSOgOK7.mjs.map +0 -1
  1006. package/dist/chunks/fr-wobtRjcF.mjs +0 -2
  1007. package/dist/chunks/fr-wobtRjcF.mjs.map +0 -1
  1008. package/dist/chunks/full-5hGvv-bG.mjs +0 -2
  1009. package/dist/chunks/full-5hGvv-bG.mjs.map +0 -1
  1010. package/dist/chunks/hi-B0o90MFd.mjs +0 -2
  1011. package/dist/chunks/hi-B0o90MFd.mjs.map +0 -1
  1012. package/dist/chunks/hi-BFko34WG.mjs +0 -2
  1013. package/dist/chunks/hi-BFko34WG.mjs.map +0 -1
  1014. package/dist/chunks/hi-BVxSgaNT.mjs +0 -2
  1015. package/dist/chunks/hi-BVxSgaNT.mjs.map +0 -1
  1016. package/dist/chunks/hi-BirBQ5Ef.mjs +0 -2
  1017. package/dist/chunks/hi-BirBQ5Ef.mjs.map +0 -1
  1018. package/dist/chunks/hi-BnsbcSIX.mjs +0 -2
  1019. package/dist/chunks/hi-BnsbcSIX.mjs.map +0 -1
  1020. package/dist/chunks/hi-BoFuxLtG.mjs +0 -2
  1021. package/dist/chunks/hi-BoFuxLtG.mjs.map +0 -1
  1022. package/dist/chunks/hi-BptyTwAv.mjs +0 -2
  1023. package/dist/chunks/hi-BptyTwAv.mjs.map +0 -1
  1024. package/dist/chunks/hi-BulaYhi_.mjs +0 -2
  1025. package/dist/chunks/hi-BulaYhi_.mjs.map +0 -1
  1026. package/dist/chunks/hi-BzflHG6Y.mjs +0 -2
  1027. package/dist/chunks/hi-BzflHG6Y.mjs.map +0 -1
  1028. package/dist/chunks/hi-C7Hb-gQ_.mjs +0 -2
  1029. package/dist/chunks/hi-C7Hb-gQ_.mjs.map +0 -1
  1030. package/dist/chunks/hi-C_lY7kA9.mjs +0 -2
  1031. package/dist/chunks/hi-C_lY7kA9.mjs.map +0 -1
  1032. package/dist/chunks/hi-CkylXoIm.mjs +0 -2
  1033. package/dist/chunks/hi-CkylXoIm.mjs.map +0 -1
  1034. package/dist/chunks/hi-DGJTbrQi.mjs +0 -2
  1035. package/dist/chunks/hi-DGJTbrQi.mjs.map +0 -1
  1036. package/dist/chunks/hi-DGJgX0fG.mjs +0 -2
  1037. package/dist/chunks/hi-DGJgX0fG.mjs.map +0 -1
  1038. package/dist/chunks/hi-DKDYpjdr.mjs +0 -2
  1039. package/dist/chunks/hi-DKDYpjdr.mjs.map +0 -1
  1040. package/dist/chunks/hi-DfAX8S-T.mjs +0 -2
  1041. package/dist/chunks/hi-DfAX8S-T.mjs.map +0 -1
  1042. package/dist/chunks/hi-Dhq91ipt.mjs +0 -2
  1043. package/dist/chunks/hi-Dhq91ipt.mjs.map +0 -1
  1044. package/dist/chunks/hi-Dup389dM.mjs +0 -2
  1045. package/dist/chunks/hi-Dup389dM.mjs.map +0 -1
  1046. package/dist/chunks/hi-DzRFsYYN.mjs +0 -2
  1047. package/dist/chunks/hi-DzRFsYYN.mjs.map +0 -1
  1048. package/dist/chunks/hi-ObZRwITd.mjs +0 -2
  1049. package/dist/chunks/hi-ObZRwITd.mjs.map +0 -1
  1050. package/dist/chunks/hi-VvUzjfH_.mjs +0 -2
  1051. package/dist/chunks/hi-VvUzjfH_.mjs.map +0 -1
  1052. package/dist/chunks/hi-jWQDQkOX.mjs +0 -2
  1053. package/dist/chunks/hi-jWQDQkOX.mjs.map +0 -1
  1054. package/dist/chunks/hi-l3hIrp8J.mjs +0 -2
  1055. package/dist/chunks/hi-l3hIrp8J.mjs.map +0 -1
  1056. package/dist/chunks/hi-o8Gsu5Ly.mjs +0 -2
  1057. package/dist/chunks/hi-o8Gsu5Ly.mjs.map +0 -1
  1058. package/dist/chunks/hi-sxC2nk3h.mjs +0 -2
  1059. package/dist/chunks/hi-sxC2nk3h.mjs.map +0 -1
  1060. package/dist/chunks/minimal-pBhi4EJI.mjs +0 -2
  1061. package/dist/chunks/minimal-pBhi4EJI.mjs.map +0 -1
  1062. package/dist/chunks/pt--57Ug7ig.mjs +0 -2
  1063. package/dist/chunks/pt--57Ug7ig.mjs.map +0 -1
  1064. package/dist/chunks/pt-4j8Km9Db.mjs +0 -2
  1065. package/dist/chunks/pt-4j8Km9Db.mjs.map +0 -1
  1066. package/dist/chunks/pt-BTGFKCns.mjs +0 -2
  1067. package/dist/chunks/pt-BTGFKCns.mjs.map +0 -1
  1068. package/dist/chunks/pt-BU8Qfuoz.mjs +0 -2
  1069. package/dist/chunks/pt-BU8Qfuoz.mjs.map +0 -1
  1070. package/dist/chunks/pt-BYAOJxIB.mjs +0 -2
  1071. package/dist/chunks/pt-BYAOJxIB.mjs.map +0 -1
  1072. package/dist/chunks/pt-BjNWQm9A.mjs +0 -2
  1073. package/dist/chunks/pt-BjNWQm9A.mjs.map +0 -1
  1074. package/dist/chunks/pt-Bvnb_NpT.mjs +0 -2
  1075. package/dist/chunks/pt-Bvnb_NpT.mjs.map +0 -1
  1076. package/dist/chunks/pt-C2pkn7vo.mjs +0 -2
  1077. package/dist/chunks/pt-C2pkn7vo.mjs.map +0 -1
  1078. package/dist/chunks/pt-C8MhLnWx.mjs +0 -2
  1079. package/dist/chunks/pt-C8MhLnWx.mjs.map +0 -1
  1080. package/dist/chunks/pt-CJfYLSTe.mjs +0 -2
  1081. package/dist/chunks/pt-CJfYLSTe.mjs.map +0 -1
  1082. package/dist/chunks/pt-CdwVIYOK.mjs +0 -2
  1083. package/dist/chunks/pt-CdwVIYOK.mjs.map +0 -1
  1084. package/dist/chunks/pt-CwrVo90O.mjs +0 -2
  1085. package/dist/chunks/pt-CwrVo90O.mjs.map +0 -1
  1086. package/dist/chunks/pt-DD26CKCA.mjs +0 -2
  1087. package/dist/chunks/pt-DD26CKCA.mjs.map +0 -1
  1088. package/dist/chunks/pt-DLbf6uoo.mjs +0 -2
  1089. package/dist/chunks/pt-DLbf6uoo.mjs.map +0 -1
  1090. package/dist/chunks/pt-DNyNHwKh.mjs +0 -2
  1091. package/dist/chunks/pt-DNyNHwKh.mjs.map +0 -1
  1092. package/dist/chunks/pt-DVfMAcXb.mjs +0 -2
  1093. package/dist/chunks/pt-DVfMAcXb.mjs.map +0 -1
  1094. package/dist/chunks/pt-DWSFad3n.mjs +0 -2
  1095. package/dist/chunks/pt-DWSFad3n.mjs.map +0 -1
  1096. package/dist/chunks/pt-DZXY4i4G.mjs +0 -2
  1097. package/dist/chunks/pt-DZXY4i4G.mjs.map +0 -1
  1098. package/dist/chunks/pt-DfUpRhK1.mjs +0 -2
  1099. package/dist/chunks/pt-DfUpRhK1.mjs.map +0 -1
  1100. package/dist/chunks/pt-DlvNEDeW.mjs +0 -2
  1101. package/dist/chunks/pt-DlvNEDeW.mjs.map +0 -1
  1102. package/dist/chunks/pt-DzFyGwB4.mjs +0 -2
  1103. package/dist/chunks/pt-DzFyGwB4.mjs.map +0 -1
  1104. package/dist/chunks/pt-HhQcARW6.mjs +0 -2
  1105. package/dist/chunks/pt-HhQcARW6.mjs.map +0 -1
  1106. package/dist/chunks/pt-SjvTF40s.mjs +0 -2
  1107. package/dist/chunks/pt-SjvTF40s.mjs.map +0 -1
  1108. package/dist/chunks/pt-ihNE0VQJ.mjs +0 -2
  1109. package/dist/chunks/pt-ihNE0VQJ.mjs.map +0 -1
  1110. package/dist/chunks/pt-zfCjhIgy.mjs +0 -2
  1111. package/dist/chunks/pt-zfCjhIgy.mjs.map +0 -1
  1112. package/dist/chunks/ru-0AHodbWv.mjs +0 -2
  1113. package/dist/chunks/ru-0AHodbWv.mjs.map +0 -1
  1114. package/dist/chunks/ru-2MDGmLw0.mjs +0 -2
  1115. package/dist/chunks/ru-2MDGmLw0.mjs.map +0 -1
  1116. package/dist/chunks/ru-3VfYKfTm.mjs +0 -2
  1117. package/dist/chunks/ru-3VfYKfTm.mjs.map +0 -1
  1118. package/dist/chunks/ru-B-gRJ6nQ.mjs +0 -2
  1119. package/dist/chunks/ru-B-gRJ6nQ.mjs.map +0 -1
  1120. package/dist/chunks/ru-B6ITUB-Y.mjs +0 -2
  1121. package/dist/chunks/ru-B6ITUB-Y.mjs.map +0 -1
  1122. package/dist/chunks/ru-BKDWkabk.mjs +0 -2
  1123. package/dist/chunks/ru-BKDWkabk.mjs.map +0 -1
  1124. package/dist/chunks/ru-BMxJsSe3.mjs +0 -2
  1125. package/dist/chunks/ru-BMxJsSe3.mjs.map +0 -1
  1126. package/dist/chunks/ru-Bep1iHQL.mjs +0 -2
  1127. package/dist/chunks/ru-Bep1iHQL.mjs.map +0 -1
  1128. package/dist/chunks/ru-Blj0nqoL.mjs +0 -2
  1129. package/dist/chunks/ru-Blj0nqoL.mjs.map +0 -1
  1130. package/dist/chunks/ru-BqnHkmii.mjs +0 -2
  1131. package/dist/chunks/ru-BqnHkmii.mjs.map +0 -1
  1132. package/dist/chunks/ru-C-4AaPUK.mjs +0 -2
  1133. package/dist/chunks/ru-C-4AaPUK.mjs.map +0 -1
  1134. package/dist/chunks/ru-C9Nv7JJI.mjs +0 -2
  1135. package/dist/chunks/ru-C9Nv7JJI.mjs.map +0 -1
  1136. package/dist/chunks/ru-CJFtr1Ks.mjs +0 -2
  1137. package/dist/chunks/ru-CJFtr1Ks.mjs.map +0 -1
  1138. package/dist/chunks/ru-CN63yWk_.mjs +0 -2
  1139. package/dist/chunks/ru-CN63yWk_.mjs.map +0 -1
  1140. package/dist/chunks/ru-CcFX97-2.mjs +0 -2
  1141. package/dist/chunks/ru-CcFX97-2.mjs.map +0 -1
  1142. package/dist/chunks/ru-D8PhWFSp.mjs +0 -2
  1143. package/dist/chunks/ru-D8PhWFSp.mjs.map +0 -1
  1144. package/dist/chunks/ru-DYAncidS.mjs +0 -2
  1145. package/dist/chunks/ru-DYAncidS.mjs.map +0 -1
  1146. package/dist/chunks/ru-D_zXo-FA.mjs +0 -2
  1147. package/dist/chunks/ru-D_zXo-FA.mjs.map +0 -1
  1148. package/dist/chunks/ru-DhSPV6m0.mjs +0 -2
  1149. package/dist/chunks/ru-DhSPV6m0.mjs.map +0 -1
  1150. package/dist/chunks/ru-LNbpjKCw.mjs +0 -2
  1151. package/dist/chunks/ru-LNbpjKCw.mjs.map +0 -1
  1152. package/dist/chunks/ru-LXi1ONW4.mjs +0 -2
  1153. package/dist/chunks/ru-LXi1ONW4.mjs.map +0 -1
  1154. package/dist/chunks/ru-db7wsWkx.mjs +0 -2
  1155. package/dist/chunks/ru-db7wsWkx.mjs.map +0 -1
  1156. package/dist/chunks/ru-nZ4BjiD0.mjs +0 -2
  1157. package/dist/chunks/ru-nZ4BjiD0.mjs.map +0 -1
  1158. package/dist/chunks/ru-v9zumXd2.mjs +0 -2
  1159. package/dist/chunks/ru-v9zumXd2.mjs.map +0 -1
  1160. package/dist/chunks/ru-wK2ytv3A.mjs +0 -2
  1161. package/dist/chunks/ru-wK2ytv3A.mjs.map +0 -1
  1162. package/dist/chunks/src-CNK6vpUU.mjs +0 -2
  1163. package/dist/chunks/src-CNK6vpUU.mjs.map +0 -1
  1164. package/dist/chunks/zh-9AcCSFm0.mjs +0 -2
  1165. package/dist/chunks/zh-9AcCSFm0.mjs.map +0 -1
  1166. package/dist/chunks/zh-B3bJCfdB.mjs +0 -2
  1167. package/dist/chunks/zh-B3bJCfdB.mjs.map +0 -1
  1168. package/dist/chunks/zh-B46Dt1h7.mjs +0 -2
  1169. package/dist/chunks/zh-B46Dt1h7.mjs.map +0 -1
  1170. package/dist/chunks/zh-BRy2B6Og.mjs +0 -2
  1171. package/dist/chunks/zh-BRy2B6Og.mjs.map +0 -1
  1172. package/dist/chunks/zh-BfYi8wB2.mjs +0 -2
  1173. package/dist/chunks/zh-BfYi8wB2.mjs.map +0 -1
  1174. package/dist/chunks/zh-C0I3L6NA.mjs +0 -2
  1175. package/dist/chunks/zh-C0I3L6NA.mjs.map +0 -1
  1176. package/dist/chunks/zh-C33e4gfg.mjs +0 -2
  1177. package/dist/chunks/zh-C33e4gfg.mjs.map +0 -1
  1178. package/dist/chunks/zh-C9sNwnC1.mjs +0 -2
  1179. package/dist/chunks/zh-C9sNwnC1.mjs.map +0 -1
  1180. package/dist/chunks/zh-CACr0qSo.mjs +0 -2
  1181. package/dist/chunks/zh-CACr0qSo.mjs.map +0 -1
  1182. package/dist/chunks/zh-CU0hd8zq.mjs +0 -2
  1183. package/dist/chunks/zh-CU0hd8zq.mjs.map +0 -1
  1184. package/dist/chunks/zh-CX2zUoWR.mjs +0 -2
  1185. package/dist/chunks/zh-CX2zUoWR.mjs.map +0 -1
  1186. package/dist/chunks/zh-CblZ-34H.mjs +0 -2
  1187. package/dist/chunks/zh-CblZ-34H.mjs.map +0 -1
  1188. package/dist/chunks/zh-CicpU0g8.mjs +0 -2
  1189. package/dist/chunks/zh-CicpU0g8.mjs.map +0 -1
  1190. package/dist/chunks/zh-Cr3KdEZV.mjs +0 -2
  1191. package/dist/chunks/zh-Cr3KdEZV.mjs.map +0 -1
  1192. package/dist/chunks/zh-D24dsCiw.mjs +0 -2
  1193. package/dist/chunks/zh-D24dsCiw.mjs.map +0 -1
  1194. package/dist/chunks/zh-DQtLxQ3s.mjs +0 -2
  1195. package/dist/chunks/zh-DQtLxQ3s.mjs.map +0 -1
  1196. package/dist/chunks/zh-DR1OF5vm.mjs +0 -2
  1197. package/dist/chunks/zh-DR1OF5vm.mjs.map +0 -1
  1198. package/dist/chunks/zh-DS82x1KL.mjs +0 -2
  1199. package/dist/chunks/zh-DS82x1KL.mjs.map +0 -1
  1200. package/dist/chunks/zh-DdJA-AEY.mjs +0 -2
  1201. package/dist/chunks/zh-DdJA-AEY.mjs.map +0 -1
  1202. package/dist/chunks/zh-DpVlDZ9n.mjs +0 -2
  1203. package/dist/chunks/zh-DpVlDZ9n.mjs.map +0 -1
  1204. package/dist/chunks/zh-OWVKcbVR.mjs +0 -2
  1205. package/dist/chunks/zh-OWVKcbVR.mjs.map +0 -1
  1206. package/dist/chunks/zh-d19V68ib.mjs +0 -2
  1207. package/dist/chunks/zh-d19V68ib.mjs.map +0 -1
  1208. package/dist/chunks/zh-fSMt1FnB.mjs +0 -2
  1209. package/dist/chunks/zh-fSMt1FnB.mjs.map +0 -1
  1210. package/dist/chunks/zh-mLlk9Wki.mjs +0 -2
  1211. package/dist/chunks/zh-mLlk9Wki.mjs.map +0 -1
  1212. package/dist/chunks/zh-nnMt8E6m.mjs +0 -2
  1213. package/dist/chunks/zh-nnMt8E6m.mjs.map +0 -1
  1214. package/dist/plugins/smart-paste/detectors/JavaDetector.d.ts +0 -7
  1215. package/dist/plugins/smart-paste/detectors/JavaDetector.d.ts.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{i as t}from"./Platform-D9TRT4Mn.mjs";import{o as e,s as o}from"./StyleRuntime-D3d1XFFe.mjs";import{n}from"./TypedKeys-CU7aToqY.mjs";import{i as r,o as i}from"./PluginHelpers-BZphovwz.mjs";import{n as l,r as s,t as a}from"./KeyboardNav-BZIHDPDV.mjs";import{n as c,r as d,t as p}from"./PopupPositioning-BfahfPOm.mjs";import{n as u,t as h}from"./PopupManager-B5SHhDsx.mjs";var b=class{_toolbarItems=/* @__PURE__ */new Map;_toolbarItemPluginMap=/* @__PURE__ */new Map;registerToolbarItem(t,e){if(this._toolbarItems.has(t.id))throw new Error(`ToolbarItem with id "${t.id}" is already registered.`);if(this._toolbarItems.set(t.id,t),e){const o=this._toolbarItemPluginMap.get(e)??[];o.push(t.id),this._toolbarItemPluginMap.set(e,o)}}getToolbarItemsByPlugin(t){const e=this._toolbarItemPluginMap.get(t)??[],o=[];for(const n of e){const t=this._toolbarItems.get(n);t&&o.push(t)}return o}getToolbarItem(t){return this._toolbarItems.get(t)}getToolbarItems(){return[...this._toolbarItems.values()]}removeToolbarItem(t){this._toolbarItems.delete(t);for(const[e,o]of this._toolbarItemPluginMap){const n=o.indexOf(t);if(-1!==n){o.splice(n,1),0===o.length&&this._toolbarItemPluginMap.delete(e);break}}}clear(){this._toolbarItems.clear(),this._toolbarItemPluginMap.clear()}};function m(t){for(let e=0;e<t.length;e++)if(!t[e]?.disabled)return e;return-1}var f={formattingOptionsAria:"Formatting options",moreToolsAria:"More tools",gridPickerLabel:(t,e)=>`${t} x ${e}`},v=/* @__PURE__ */Object.assign({"./locales/ar.ts":()=>import("./ar-DcJbUbml.mjs"),"./locales/de.ts":()=>import("./de-ByvLzlOc.mjs"),"./locales/es.ts":()=>import("./es-CXeJJ2r1.mjs"),"./locales/fr.ts":()=>import("./fr-BZH71A1g.mjs"),"./locales/hi.ts":()=>import("./hi-BLCjECcV.mjs"),"./locales/pt.ts":()=>import("./pt-BCg3YzEh.mjs"),"./locales/ru.ts":()=>import("./ru-Cl03u8Q0.mjs"),"./locales/zh.ts":()=>import("./zh-CBJQlvWb.mjs")});async function g(t){return i(v,t,f)}var w={BurgerMenu:"burger-menu",Flow:"flow",None:"none"},x="notectl-toolbar-btn--overflow-hidden",y="notectl-toolbar-separator--overflow-hidden",A="notectl-toolbar-group--overflow-hidden",E="notectl-toolbar-group",_="notectl-toolbar-separator",k=class{toolbar;context;onOverflowChange;onItemActivated;getActiveElement;ariaLabel;popupManager;entries=[];overflowButton=null;overflowDropdown=null;overflowHandle=null;overflowEntries=[];resizeObserver=null;closeHandler=null;closeHandlerTimer=null;closeHandlerAttached=!1;constructor(t){this.toolbar=t.toolbar,this.ariaLabel=t.ariaLabel,this.context=t.context,this.onOverflowChange=t.onOverflowChange,this.onItemActivated=t.onItemActivated,this.getActiveElement=t.getActiveElement,this.popupManager=t.popupManager??null,this.resizeObserver=new ResizeObserver(()=>this.recalculate()),this.resizeObserver.observe(this.toolbar)}update(t){this.entries=t.map(t=>({element:t.element,item:t.item})),this.recalculate()}recalculate(){if(0===this.entries.length)return;this.closeDropdown(),this.resetVisibility(),this.ensureOverflowButton(),this.setOverflowButtonVisible(!1);const t=this.measureAvailableWidth(),e=Array.from(this.toolbar.children),o=this.measureChildWidths(e),n=t-34-2;let r=0,i=!1;const l=[];for(const s of e){if(s===this.overflowButton)continue;if(s.classList.contains(_)){const t=(o.get(s)??0)+2;i||r+t>n?(i=!0,s.classList.add(y)):r+=t;continue}if(s.classList.contains(E)){const t=(o.get(s)??0)+2,e=this.entriesInside(s);i||r+t>n?(i=!0,this.hideGroup(s,e,l)):r+=t;continue}const t=this.entries.find(t=>t.element===s);if(!t)continue;const e=(o.get(s)??0)+2;i||r+e>n?(i=!0,t.element.classList.add(x),l.push(t)):r+=e}this.overflowEntries=l,this.hideTrailingSeparators(),this.setOverflowButtonVisible(l.length>0),this.notifyChange()}hideGroup(t,e,o){t.classList.add(A);for(const n of e)n.element.classList.add(x),o.push(n)}entriesInside(t){const e=[];for(const o of this.entries)t.contains(o.element)&&e.push(o);return e}updateItemStates(t){if(!this.overflowDropdown)return;const e=Array.from(this.overflowDropdown.querySelectorAll(".notectl-dropdown__item"));for(const o of e){const e=o.getAttribute("data-toolbar-item"),n=this.overflowEntries.find(t=>t.item.id===e);if(!n)continue;const r=n.item.isActive?.(t)??!1,i=n.item.isEnabled?.(t)??!0;if(o.classList.toggle("notectl-dropdown__item--active",r),o.disabled=!i,"combobox"===n.item.popupType){const e=o.querySelector(".notectl-dropdown__item-label");e&&(e.textContent=n.item.getLabel(t))}if(n.item.getIcon){const e=n.item.getIcon(t),r=o.querySelector(".notectl-dropdown__item-icon");r&&r.innerHTML!==e&&(r.innerHTML=e)}}}destroy(){this.resizeObserver?.disconnect(),this.resizeObserver=null,this.closeDropdown(),this.overflowButton?.remove(),this.overflowButton=null,this.entries=[],this.overflowEntries=[]}measureChildWidths(t){const e=/* @__PURE__ */new Map;for(const o of t)o!==this.overflowButton&&e.set(o,o.offsetWidth);return e}measureAvailableWidth(){const t=getComputedStyle(this.toolbar),e=Number.parseFloat(t.paddingLeft)||0,o=Number.parseFloat(t.paddingRight)||0;return this.toolbar.clientWidth-e-o}resetVisibility(){for(const o of this.entries)o.element.classList.remove(x);const t=Array.from(this.toolbar.querySelectorAll(`.${_}`));for(const o of t)o.classList.remove(y);const e=Array.from(this.toolbar.querySelectorAll(`.${E}`));for(const o of e)o.classList.remove(A)}setOverflowButtonVisible(t){this.overflowButton&&(this.overflowButton.classList.toggle("notectl-toolbar-overflow-btn--hidden",!t),t||this.overflowButton.removeAttribute("tabindex"))}ensureOverflowButton(){if(this.overflowButton)return;const t=document.createElement("button");t.type="button",t.className="notectl-toolbar-overflow-btn",t.setAttribute("aria-label",this.ariaLabel),t.setAttribute("aria-haspopup","true"),t.setAttribute("aria-expanded","false"),t.setAttribute("part","toolbar-button toolbar-overflow-button"),t.innerHTML='<svg viewBox="0 0 16 16" width="16" height="16"><circle cx="3" cy="8" r="1.5" fill="currentColor"/><circle cx="8" cy="8" r="1.5" fill="currentColor"/><circle cx="13" cy="8" r="1.5" fill="currentColor"/></svg>',t.addEventListener("mousedown",t=>{t.preventDefault(),this.toggleDropdown()}),this.toolbar.appendChild(t),this.overflowButton=t}toggleDropdown(){this.overflowDropdown?this.closeDropdown():this.openDropdown()}openDropdown(){if(!this.overflowButton||0===this.overflowEntries.length)return;const t=document.createElement("div");t.className="notectl-toolbar-popup notectl-dropdown",t.setAttribute("role","menu"),this.renderDropdownItems(t,this.context.getState()),this.popupManager?(this.overflowHandle=this.popupManager.open({anchor:this.overflowButton,className:"notectl-toolbar-popup notectl-dropdown",ariaRole:"menu",position:"below-end",referenceNode:this.overflowButton,restoreFocusTo:this.overflowButton,onClose:()=>{this.overflowHandle=null,this.overflowDropdown=null,this.overflowButton&&this.overflowButton.setAttribute("aria-expanded","false")},content:t=>{this.renderDropdownItems(t,this.context.getState()),this.overflowDropdown=t,t.addEventListener("keydown",t=>this.handleDropdownKeydown(t))}}),this.overflowButton.setAttribute("aria-expanded","true")):(this.positionDropdown(t),p(t,this.overflowButton),this.overflowDropdown=t,this.overflowButton.setAttribute("aria-expanded","true"),requestAnimationFrame(()=>{t.querySelector('[role="menuitem"]')?.focus()}),t.addEventListener("keydown",t=>this.handleDropdownKeydown(t)),this.registerCloseHandler())}renderDropdownItems(t,e){let o=null;for(const n of this.overflowEntries){if(null!==o&&n.item.group!==o){const e=document.createElement("div");e.className="notectl-dropdown__separator",e.setAttribute("role","separator"),t.appendChild(e)}o=n.item.group;const r=document.createElement("button");r.type="button",r.className="notectl-dropdown__item",r.setAttribute("role","menuitem"),r.setAttribute("tabindex","-1"),r.setAttribute("data-toolbar-item",n.item.id);const i=document.createElement("span");i.className="notectl-dropdown__item-icon","combobox"!==n.item.popupType&&(i.innerHTML=n.item.icon),r.appendChild(i);const l=document.createElement("span");l.className="notectl-dropdown__item-label",l.textContent="combobox"===n.item.popupType?n.item.getLabel(e):n.item.tooltip??n.item.label,r.appendChild(l),r.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),this.activateOverflowItem(n)}),t.appendChild(r)}}positionDropdown(e){if(!this.overflowButton)return;const o=this.overflowButton.getBoundingClientRect(),n=t(this.toolbar);d(e,o,{position:n?"below-start":"below-end",isRtl:n})}registerCloseHandler(){this.closeHandler=t=>{const e=t.composedPath();this.overflowDropdown&&!e.includes(this.overflowDropdown)&&this.overflowButton&&!e.includes(this.overflowButton)&&this.closeDropdown()},this.closeHandlerTimer=setTimeout(()=>{this.closeHandlerTimer=null,this.closeHandler&&this.overflowDropdown&&(document.addEventListener("mousedown",this.closeHandler),this.closeHandlerAttached=!0)},0)}closeDropdown(){if(this.overflowHandle){const t=this.overflowHandle;return this.overflowHandle=null,this.overflowDropdown=null,t.close(),void(this.overflowButton&&this.overflowButton.setAttribute("aria-expanded","false"))}this.overflowDropdown&&(this.overflowDropdown.remove(),this.overflowDropdown=null),this.overflowButton&&this.overflowButton.setAttribute("aria-expanded","false"),this.closeHandler&&(null!==this.closeHandlerTimer&&(clearTimeout(this.closeHandlerTimer),this.closeHandlerTimer=null),this.closeHandlerAttached&&(document.removeEventListener("mousedown",this.closeHandler),this.closeHandlerAttached=!1),this.closeHandler=null)}activateOverflowItem(t){this.closeDropdown(),t.item.popupType&&this.overflowButton?this.onItemActivated(this.overflowButton,t.item):this.context.executeCommand(t.item.command)}handleDropdownKeydown(t){if(!this.overflowDropdown)return;if("Escape"===t.key||"Tab"===t.key)return t.preventDefault(),t.stopPropagation(),this.closeDropdown(),void this.overflowButton?.focus();const e=Array.from(this.overflowDropdown.querySelectorAll('[role="menuitem"]')),o=e.indexOf(this.getActiveElement());switch(t.key){case"ArrowDown":t.preventDefault(),e[l(e,o,1)]?.focus();break;case"ArrowUp":t.preventDefault(),e[l(e,o,-1)]?.focus();break;case"Enter":case" ":{t.preventDefault();const n=e[o];if(!n)break;const r=n.getAttribute("data-toolbar-item"),i=this.overflowEntries.find(t=>t.item.id===r);i&&this.activateOverflowItem(i);break}}}hideTrailingSeparators(){const t=Array.from(this.toolbar.children);for(let e=t.length-1;e>=0;e--){const o=t[e];if(!o||o===this.overflowButton)continue;if(o.classList.contains(_)){o.classList.contains(y)||o.classList.add(y);continue}const n=o.classList.contains(E)&&o.classList.contains(A),r=o.classList.contains("notectl-toolbar-btn")&&o.classList.contains(x);if(!n&&!r)break}}notifyChange(){const t=this.entries.filter(t=>!t.element.classList.contains(x)).map(t=>t.element);this.onOverflowChange(t,this.overflowEntries.length>0?this.overflowButton:null)}};function C(t,e,o){const n=t.querySelectorAll(".notectl-grid-picker__cell");for(const r of n){const t=Number(r.getAttribute("data-row")),n=Number(r.getAttribute("data-col"));r.classList.toggle("notectl-grid-picker__cell--highlighted",t<=e&&n<=o)}}function B(){const t=document.createElement("span");return t.className="notectl-toolbar-separator",t.setAttribute("role","separator"),t.setAttribute("part","toolbar-divider"),t}var L=class{activePopup=null;activePopupButton=null;activeHandle=null;getActiveElement;locale;popupManager=null;constructor(t,e=f){this.getActiveElement=t,this.locale=e}setPopupManager(t){this.popupManager=t}isOpen(){return null!==this.activePopup}toggle(t,e,o){this.activePopup?this.close():this.openViaManager(t,e,o)}close(){if(this.activeHandle){const t=this.activeHandle;return this.activeHandle=null,this.clearButtonState(),void t.close()}this.clearButtonState(),this.activePopup&&(this.activePopup.remove(),this.activePopup=null)}closeAndRestoreFocus(){const t=this.activePopupButton;this.close(),t?.focus()}destroy(){this.close()}openViaManager(t,e,o){this.popupManager&&(this.activePopupButton=t,t.classList.add("notectl-toolbar-btn--popup-open"),t.setAttribute("aria-expanded","true"),this.activeHandle=this.popupManager.open({anchor:t,className:"notectl-toolbar-popup",referenceNode:t,restoreFocusTo:t,position:"below-start",onClose:()=>{this.activeHandle=null,this.clearButtonState(),this.activePopup=null},content:(t,n)=>{this.activePopup=t,this.renderPopupContent(t,e,o,n),t.addEventListener("keydown",t=>this.handlePopupKeydown(t))}}))}renderPopupContent(t,o,n,r){const i=()=>{r({restoreFocusTo:null}),n.getContainer().focus()};switch(o.popupType){case"gridPicker":!function(t,o,n,r=f){t.className+=" notectl-grid-picker";const i=document.createElement("div");i.className="notectl-grid-picker__grid",i.setAttribute("role","grid"),e(i,{display:"grid",gridTemplateColumns:`repeat(${o.maxCols}, 1fr)`,gap:"2px",padding:"8px"});const l=document.createElement("div");l.className="notectl-grid-picker__label",l.textContent=r.gridPickerLabel(1,1),e(l,{textAlign:"center",padding:"4px",fontSize:"12px"}),l.setAttribute("aria-live","polite");for(let s=1;s<=o.maxRows;s++)for(let t=1;t<=o.maxCols;t++){const a=document.createElement("div");a.className="notectl-grid-picker__cell",a.setAttribute("role","gridcell"),a.setAttribute("tabindex","-1"),a.setAttribute("aria-label",r.gridPickerLabel(s,t)),e(a,{width:"20px",height:"20px",border:"1px solid #ccc",cursor:"pointer"}),a.setAttribute("data-row",String(s)),a.setAttribute("data-col",String(t)),a.addEventListener("mouseenter",()=>{C(i,s,t),l.textContent=r.gridPickerLabel(s,t)}),a.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),a.addEventListener("click",()=>{o.onSelect(s,t),n()}),i.appendChild(a)}t.appendChild(i),t.appendChild(l)}(t,o.popupConfig,i,this.locale);break;case"dropdown":!function(t,e,o,r){t.classList.add("notectl-dropdown"),t.setAttribute("role","menu");for(const i of e.items){const e=document.createElement("button");if(e.type="button",e.className="notectl-dropdown__item",e.setAttribute("role","menuitem"),e.setAttribute("tabindex","-1"),i.icon){const t=document.createElement("span");t.className="notectl-dropdown__item-icon",t.innerHTML=i.icon,e.appendChild(t)}const o=document.createElement("span");o.className="notectl-dropdown__item-label",o.textContent=i.label,e.appendChild(o),e.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation()}),e.addEventListener("click",()=>{var t;t=i.command,n.executeCommand(t),r()}),t.appendChild(e)}}(t,o.popupConfig,0,i);break;case"custom":case"combobox":o.renderPopup(t,n,r)}}clearButtonState(){this.activePopupButton&&(this.activePopupButton.classList.remove("notectl-toolbar-btn--popup-open"),this.activePopupButton.setAttribute("aria-expanded","false"),this.activePopupButton=null)}handlePopupKeydown(t){if(!this.activePopup)return;if("Escape"===t.key)return t.preventDefault(),t.stopPropagation(),void this.closeAndRestoreFocus();if("Tab"===t.key)return t.preventDefault(),void this.closeAndRestoreFocus();const e=this.activePopup.querySelectorAll('[role="menuitem"]');e.length>0?this.handleDropdownKeydown(t,e):null===this.activePopup.querySelector(".notectl-grid-picker__cell")?this.handleCustomPopupKeydown(t):this.handleGridKeydown(t)}handleDropdownKeydown(t,e){const o=Array.from(e),n=o.indexOf(this.getActiveElement());switch(t.key){case"ArrowDown":t.preventDefault(),o[l(o,n,1)]?.focus();break;case"ArrowUp":t.preventDefault(),o[l(o,n,-1)]?.focus();break;case"Enter":case" ":{t.preventDefault();const e=o[n];e&&e.click();break}}}handleGridKeydown(e){const o=this.getActiveElement(),n=Number(o?.getAttribute("data-row")??1),r=Number(o?.getAttribute("data-col")??1),i=this.activePopup?.querySelector(".notectl-grid-picker__grid")??null;if(!i)return;const l=i.querySelector(".notectl-grid-picker__cell:last-child"),a=Number(l?.getAttribute("data-col")??1),c=Number(l?.getAttribute("data-row")??1);if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(e.key)){e.preventDefault();const[o,l]=s(n,r,c,a,e.key,!!this.activePopup&&t(this.activePopup));i.querySelector(`.notectl-grid-picker__cell[data-row="${o}"][data-col="${l}"]`)?.focus(),C(i,o,l);const d=this.activePopup?.querySelector(".notectl-grid-picker__label")??null;d&&(d.textContent=this.locale.gridPickerLabel(o,l))}"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),o?.click())}handleCustomPopupKeydown(t){if(!this.activePopup)return;const e=Array.from(this.activePopup.querySelectorAll("button"));if(0===e.length)return;const o=this.getActiveElement(),n=e.indexOf(o);switch(t.key){case"ArrowDown":t.preventDefault(),e[l(e,n,1)]?.focus();break;case"ArrowUp":t.preventDefault(),e[l(e,n,-1)]?.focus();break;case"Enter":case" ":t.preventDefault(),o&&o.dispatchEvent(new MouseEvent("mousedown",{bubbles:!0,cancelable:!0}))}}},I=class t{element;timer=null;target=null;isPopupActive;static TOOLTIP_ID="notectl-toolbar-tooltip";constructor(e){this.isPopupActive=e,this.element=document.createElement("div"),this.element.className="notectl-toolbar-tooltip",this.element.id=t.TOOLTIP_ID,this.element.setAttribute("role","tooltip"),o(this.element,"display","none")}show(n){if(this.hide(),this.isPopupActive()||n.disabled)return;const r=n.getAttribute("data-tooltip");r&&(this.target=n,this.timer=setTimeout(()=>{if(this.isPopupActive())return;this.element.textContent=r,o(this.element,"display","");const i=n.getRootNode();i instanceof ShadowRoot&&!this.element.parentNode?i.appendChild(this.element):i instanceof ShadowRoot||this.element.parentNode||document.body.appendChild(this.element),n.setAttribute("aria-describedby",t.TOOLTIP_ID);const l=n.getBoundingClientRect();o(this.element,"position","fixed");const s=c(this.element);e(this.element,{top:l.bottom+6-s.y+"px",left:l.left+l.width/2-s.x+"px",transform:"translateX(-50%)"})},500))}hide(){this.timer&&(clearTimeout(this.timer),this.timer=null),this.target&&(this.target.removeAttribute("aria-describedby"),this.target=null),o(this.element,"display","none")}destroy(){this.hide(),this.element.remove()}};function P(t){if(Array.isArray(t))return{plugins:t,label:void 0};const e=t;return{plugins:e.plugins,label:e.label}}var T=new n("toolbar"),D=class{id="toolbar";name="Toolbar";priority=10;context=null;toolbarElement=null;buttons=[];hiddenItems=/* @__PURE__ */new Set;layoutConfig;overflowBehavior;focusedIndex=0;tooltip=null;popupController=null;popupManager=null;overflowController=null;visibleElements=[];locale;constructor(t){this.layoutConfig=t??null,this.overflowBehavior=t?.overflow??w.BurgerMenu}async init(t){this.locale=await r(t,void 0,f,g),t.registerStyleSheet('\n/* Toolbar */\n.notectl-plugin-container--top {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: nowrap;\n\tborder-bottom: 1px solid var(--notectl-border);\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n\tmin-height: 40px;\n\tflex-shrink: 0;\n}\n\n.notectl-toolbar {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: nowrap;\n\toverflow: hidden;\n\tflex: 1;\n\tmin-width: 0;\n\tgap: 2px;\n\tpadding: 4px 8px;\n}\n\n.notectl-toolbar[hidden] {\n\tdisplay: none;\n}\n\n/* Group wrapper — real flex container so consumers can style it via ::part(toolbar-group)\n with padding/background/border directly. Group gap mirrors the toolbar gap so the\n visual rhythm between buttons stays uniform whether or not a group boundary lies between them. */\n.notectl-toolbar-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 2px;\n}\n\n.notectl-toolbar-group--overflow-hidden {\n\tdisplay: none;\n}\n\n.notectl-toolbar-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-toolbar-button-bg, transparent);\n\tcursor: pointer;\n\tcolor: var(--notectl-toolbar-button-fg, var(--notectl-fg));\n\tfont-size: 14px;\n\tline-height: 1;\n\tpadding: 0;\n\tflex-shrink: 0;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn:hover {\n\t\tbackground: var(--notectl-toolbar-button-hover-bg, var(--notectl-hover-bg));\n\t\tborder-color: var(--notectl-border);\n\t}\n}\n\n.notectl-toolbar-btn--active {\n\tbackground: var(--notectl-toolbar-button-active-bg, var(--notectl-active-bg));\n\tborder-color: var(--notectl-primary-muted);\n\tcolor: var(--notectl-toolbar-button-active-fg, var(--notectl-primary-fg));\n}\n\n.notectl-toolbar-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n.notectl-toolbar-btn:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn:disabled:hover {\n\t\tbackground: transparent;\n\t\tborder-color: transparent;\n\t}\n}\n\n.notectl-toolbar-btn__icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpointer-events: none;\n}\n\n.notectl-toolbar-btn__icon svg {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tfill: currentColor;\n}\n\n/* Tooltip (rendered as fixed-position element in shadow root) */\n.notectl-toolbar-tooltip {\n\tpadding: 4px 8px;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\tz-index: 10001;\n\tline-height: 1.4;\n\tletter-spacing: 0.01em;\n\tfont-family: -apple-system, BlinkMacSystemFont, \'Segoe UI\', Roboto, sans-serif;\n}\n\n.notectl-toolbar-separator {\n\tdisplay: inline-block;\n\twidth: 1px;\n\theight: 20px;\n\tbackground: var(--notectl-border);\n\tmargin: 0 4px;\n\tvertical-align: middle;\n}\n\n/* Toolbar Popups */\n.notectl-toolbar-popup {\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 12px var(--notectl-shadow);\n\toverflow: hidden;\n}\n\n/* Grid Picker */\n.notectl-grid-picker__cell:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-grid-picker__cell--highlighted {\n\tbackground: var(--notectl-primary-muted);\n\tborder-color: var(--notectl-primary);\n}\n\n/* Dropdown */\n.notectl-dropdown {\n\tmin-width: 160px;\n\tpadding: 4px 0;\n}\n\n.notectl-dropdown__item {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\tpadding: 8px 12px;\n\ttext-align: start;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tline-height: 1.4;\n\tfont-family: inherit;\n\twhite-space: nowrap;\n}\n\n@media (hover: hover) {\n\t.notectl-dropdown__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-dropdown__item:focus-visible {\n\tbackground: var(--notectl-hover-bg);\n\toutline: none;\n}\n\n.notectl-dropdown__item-icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-fg-muted);\n\tflex-shrink: 0;\n}\n\n.notectl-dropdown__item-label {\n\tflex: 1;\n}\n\n/* Overflow behavior: flow mode — toolbar wraps to additional rows */\n.notectl-toolbar[data-overflow="flow"] {\n\tflex-wrap: wrap;\n\toverflow: visible;\n}\n\n/* Overflow behavior: none — toolbar clips without any responsive behavior */\n.notectl-toolbar[data-overflow="none"] {\n\tflex-wrap: nowrap;\n\toverflow: hidden;\n}\n\n/* Overflow: hidden items (burger-menu mode) */\n.notectl-toolbar-btn--overflow-hidden,\n.notectl-toolbar-separator--overflow-hidden {\n\tdisplay: none;\n}\n\n/* Overflow "more" button */\n.notectl-toolbar-overflow-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n\tfont-size: 16px;\n\tline-height: 1;\n\tpadding: 0;\n\tflex-shrink: 0;\n\tmargin-inline-start: auto;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-overflow-btn:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-border);\n\t}\n}\n\n.notectl-toolbar-overflow-btn--hidden {\n\tdisplay: none;\n}\n\n.notectl-toolbar-overflow-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n/* Dropdown item states shared by all dropdown menus (including overflow) */\n.notectl-dropdown__item:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n@media (hover: hover) {\n\t.notectl-dropdown__item:disabled:hover {\n\t\tbackground: none;\n\t}\n}\n\n.notectl-dropdown__item--active {\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-dropdown__item-icon svg {\n\tdisplay: block;\n\twidth: 16px;\n\theight: 16px;\n\tfill: currentColor;\n}\n\n.notectl-dropdown__separator {\n\theight: 1px;\n\tbackground: var(--notectl-border);\n\tmargin: 4px 0;\n}\n\n/* Combobox-style toolbar buttons (shared base for font, fontSize, heading, etc.) */\n.notectl-toolbar-btn[role="combobox"] {\n\twidth: auto;\n\tpadding: 0 8px;\n\tgap: 4px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn[role="combobox"]:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-fg-muted);\n\t}\n}\n\n.notectl-toolbar-btn[role="combobox"].notectl-toolbar-btn--active {\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n\tborder-color: var(--notectl-primary-muted);\n}\n\n.notectl-toolbar-combobox__label {\n\tflex: 1;\n\tfont-size: 13px;\n\tfont-weight: 500;\n\tcolor: var(--notectl-fg);\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: start;\n\tline-height: 30px;\n}\n\n.notectl-toolbar-combobox__arrow {\n\tflex-shrink: 0;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\tline-height: 30px;\n}\n\n/* Link Popup */\n.notectl-link-popup {\n\tpadding: 8px;\n\tmin-width: 200px;\n}\n\n.notectl-link-popup__input {\n\twidth: 100%;\n\tpadding: 4px;\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg);\n\tbackground: var(--notectl-surface-overlay);\n}\n\n.notectl-link-popup__input:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-link-popup__button {\n\twidth: 100%;\n\tpadding: 6px 12px;\n\tcursor: pointer;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-overlay);\n\tcolor: var(--notectl-fg);\n\tfont-size: 13px;\n}\n\n.notectl-link-popup__button--apply {\n\tmargin-top: 4px;\n}\n\n@media (hover: hover) {\n\t.notectl-link-popup__button:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-link-popup__button:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n'),this.context=t,this.popupManager=new h(t.getContainer()),t.registerService(u,this.popupManager),this.popupController=new L(()=>this.getActiveElement(),this.locale),this.popupController.setPopupManager(this.popupManager),this.tooltip=new I(()=>this.popupController?.isOpen()??!1),t.registerService(T,{refresh:()=>this.updateButtonStates(t.getState()),closePopup:()=>this.popupController?.close()}),this.createToolbarElement()}getOverflowBehavior(){return this.overflowBehavior}setOverflowBehavior(t){t!==this.overflowBehavior&&(this.overflowBehavior=t,this.applyOverflowBehavior(),this.renderItems())}onReady(){this.renderItems()}destroy(){this.overflowController?.destroy(),this.overflowController=null,this.popupController?.destroy(),this.popupController=null,this.popupManager?.destroy(),this.popupManager=null,this.tooltip?.destroy(),this.tooltip=null,this.toolbarElement&&(this.toolbarElement.remove(),this.toolbarElement=null),this.buttons=[],this.visibleElements=[],this.context=null}onStateChange(t,e,o){this.updateButtonStates(e)}onReadOnlyChange(t){this.toolbarElement&&(this.toolbarElement.hidden=t)}onConfigure(t){for(const[e,o]of Object.entries(t))!1===o?this.hiddenItems.add(e):this.hiddenItems.delete(e);this.renderItems()}createToolbarElement(){if(!this.context)return;this.toolbarElement&&this.toolbarElement.remove(),this.buttons=[];const t=this.context.getPluginContainer("top");this.toolbarElement=document.createElement("div"),this.toolbarElement.setAttribute("role","toolbar"),this.toolbarElement.setAttribute("aria-label",this.locale.formattingOptionsAria),this.toolbarElement.setAttribute("data-notectl-no-print",""),this.toolbarElement.setAttribute("part","toolbar"),this.toolbarElement.className="notectl-toolbar",this.toolbarElement.addEventListener("keydown",t=>this.handleToolbarKeydown(t)),this.applyOverflowBehavior(),t.appendChild(this.toolbarElement)}applyOverflowBehavior(){this.toolbarElement&&this.context&&(this.overflowController?.destroy(),this.overflowController=null,this.toolbarElement.setAttribute("data-overflow",this.overflowBehavior),this.overflowBehavior===w.BurgerMenu?this.overflowController=new k({toolbar:this.toolbarElement,ariaLabel:this.locale.moreToolsAria,context:this.context,popupManager:this.popupManager??void 0,onOverflowChange:(t,e)=>{this.visibleElements=e?[...t,e]:[...t],this.initRovingTabindex()},onItemActivated:(t,e)=>{this.activateButton(t,e)},getActiveElement:()=>this.getActiveElement()}):this.visibleElements=[])}renderItems(){if(this.context&&this.toolbarElement){for(const t of this.buttons)t.element.remove();this.buttons=[];for(const t of this.toolbarElement.querySelectorAll(".notectl-toolbar-separator"))t.remove();for(const t of this.toolbarElement.querySelectorAll(".notectl-toolbar-group"))t.remove();this.layoutConfig?this.renderItemsByLayout():this.renderItemsByGroup(),this.buttons.length>0&&!this.toolbarElement.parentElement&&this.context.getPluginContainer("top").appendChild(this.toolbarElement),this.overflowController?.update(this.buttons),this.initRovingTabindex(),this.updateButtonStates(this.context.getState())}}createGroupWrapper(t){const e=document.createElement("div");return e.className="notectl-toolbar-group",e.setAttribute("part","toolbar-group"),void 0!==t&&(e.setAttribute("role","group"),e.setAttribute("aria-label",t)),e}getTabElements(){return this.visibleElements.length>0?this.visibleElements:this.buttons.map(t=>t.element)}initRovingTabindex(){const t=this.getTabElements(),e=m(t);this.focusedIndex=e>=0?e:0,a(t,this.focusedIndex)}setRovingFocus(t){const e=this.getTabElements();t<0||t>=e.length||(this.focusedIndex=t,a(e,t),e[t]?.focus())}getActiveElement(){const t=this.toolbarElement?.getRootNode();return t instanceof ShadowRoot?t.activeElement:document.activeElement}syncFocusedIndex(){const t=this.getActiveElement(),e=this.getTabElements().findIndex(e=>e===t);e>=0&&(this.focusedIndex=e)}handleToolbarKeydown(e){const o=this.getTabElements();var n;if(0!==o.length)switch(this.syncFocusedIndex(),e.key){case"ArrowRight":case"ArrowLeft":{e.preventDefault();const r=(n=!!this.toolbarElement&&t(this.toolbarElement),"ArrowRight"===e.key?n?-1:1:n?1:-1),i=function(t,e,o){const n=t.length;if(0===n)return-1;let r=e;for(let i=0;i<n;i++)if(r=(r+o+n)%n,!t[r]?.disabled)return r;return e}(o,this.focusedIndex,r);this.setRovingFocus(i);break}case"Home":{e.preventDefault();const t=m(o);t>=0&&this.setRovingFocus(t);break}case"End":{e.preventDefault();const t=function(t){for(let e=t.length-1;e>=0;e--)if(!t[e]?.disabled)return e;return-1}(o);t>=0&&this.setRovingFocus(t);break}case"Enter":case" ":{e.preventDefault();const t=o[this.focusedIndex],n=this.buttons.find(e=>e.element===t);n&&this.activateButton(n.element,n.item);break}}}activateButton(t,e){this.tooltip?.hide(),e.popupType&&this.context?this.popupController?.toggle(t,e,this.context):this.context?.executeCommand(e.command)}renderItemsByLayout(){if(!this.context||!this.toolbarElement||!this.layoutConfig)return;const t=this.context.getToolbarRegistry();let e=!0;for(const o of this.layoutConfig.groups){const{plugins:n,label:r}=P(o),i=[];for(const e of n){const o=t.getToolbarItemsByPlugin(e).filter(t=>!this.hiddenItems.has(t.id));i.push(...o)}if(0===i.length)continue;e||this.toolbarElement.appendChild(B()),e=!1;const l=this.createGroupWrapper(r);for(const t of i){const e=this.createButton(t);l.appendChild(e.element),this.buttons.push(e)}this.toolbarElement.appendChild(l)}0===this.buttons.length&&this.toolbarElement.remove()}renderItemsByGroup(){if(!this.context||!this.toolbarElement)return;const t=this.context.getToolbarRegistry().getToolbarItems().filter(t=>!this.hiddenItems.has(t.id));if(0===t.length)return void this.toolbarElement.remove();const e=/* @__PURE__ */new Map;for(const n of t){const t=e.get(n.group)??[];t.push(n),e.set(n.group,t)}let o=!0;for(const[,n]of e){o||this.toolbarElement.appendChild(B()),o=!1;const t=this.createGroupWrapper(void 0);for(const e of n){const o=this.createButton(e);t.appendChild(o.element),this.buttons.push(o)}this.toolbarElement.appendChild(t)}}createButton(t){const e=document.createElement("button");e.type="button",e.className=`notectl-toolbar-btn notectl-toolbar-btn--${t.id}`,e.setAttribute("aria-pressed","false"),e.setAttribute("aria-label",t.label),e.setAttribute("data-toolbar-item",t.id),e.setAttribute("data-tooltip",t.tooltip??t.label),e.setAttribute("part","toolbar-button");let o=null;if("combobox"===t.popupType){e.setAttribute("role","combobox"),e.setAttribute("aria-haspopup","listbox"),e.setAttribute("aria-expanded","false");const n=document.createElement("span");n.className="notectl-toolbar-combobox__label";const r=this.context?.getState();r&&(n.textContent=t.getLabel(r)),e.appendChild(n),o=n;const i=document.createElement("span");i.className="notectl-toolbar-combobox__arrow",i.setAttribute("aria-hidden","true"),i.textContent="▾",e.appendChild(i)}else{t.popupType&&(e.setAttribute("aria-haspopup","true"),e.setAttribute("aria-expanded","false"));const o=document.createElement("span");o.className="notectl-toolbar-btn__icon",o.innerHTML=t.icon,e.appendChild(o)}return e.addEventListener("mousedown",o=>{o.preventDefault(),this.activateButton(e,t)}),e.addEventListener("mouseenter",()=>this.tooltip?.show(e)),e.addEventListener("mouseleave",()=>this.tooltip?.hide()),e.addEventListener("focus",()=>this.tooltip?.show(e)),e.addEventListener("blur",()=>this.tooltip?.hide()),{element:e,item:t,comboLabelEl:o}}updateButtonStates(t){for(const e of this.buttons){const o=e.item.isActive?.(t)??!1,n=e.item.isEnabled?.(t)??!0;if(e.element.setAttribute("aria-pressed",String(o)),e.element.classList.toggle("notectl-toolbar-btn--active",o),e.element.setAttribute("part",o?"toolbar-button toolbar-button-active":"toolbar-button"),e.element.disabled=!n,n?e.element.removeAttribute("aria-disabled"):e.element.setAttribute("aria-disabled","true"),e.comboLabelEl&&"combobox"===e.item.popupType&&(e.comboLabelEl.textContent=e.item.getLabel(t)),e.item.getIcon){const o=e.item.getIcon(t),n=e.element.querySelector(".notectl-toolbar-btn__icon");n&&n.innerHTML!==o&&(n.innerHTML=o)}}this.overflowController?.updateItemStates(t)}};export{g as a,f as i,T as n,b as o,w as r,D as t};
2
+ //# sourceMappingURL=ToolbarPlugin-D5_-gWmH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarPlugin-D5_-gWmH.mjs","names":[],"sources":["../../src/plugins/toolbar/ToolbarRegistry.ts","../../src/editor/styles/toolbar.ts","../../src/plugins/toolbar/ToolbarKeyboardNav.ts","../../src/plugins/toolbar/ToolbarLocale.ts","../../src/plugins/toolbar/ToolbarOverflowBehavior.ts","../../src/plugins/toolbar/ToolbarOverflowController.ts","../../src/plugins/toolbar/ToolbarRenderers.ts","../../src/plugins/toolbar/ToolbarPopupController.ts","../../src/plugins/toolbar/ToolbarTooltip.ts","../../src/plugins/toolbar/ToolbarPlugin.ts"],"sourcesContent":["/**\n * ToolbarRegistry: manages plugin-registered toolbar items\n * with per-plugin tracking for clean teardown.\n */\n\nimport type { ToolbarItem } from './ToolbarItem.js';\n\nexport class ToolbarRegistry {\n\tprivate readonly _toolbarItems = new Map<string, ToolbarItem>();\n\tprivate readonly _toolbarItemPluginMap = new Map<string, string[]>();\n\n\tregisterToolbarItem(item: ToolbarItem, pluginId?: string): void {\n\t\tif (this._toolbarItems.has(item.id)) {\n\t\t\tthrow new Error(`ToolbarItem with id \"${item.id}\" is already registered.`);\n\t\t}\n\t\tthis._toolbarItems.set(item.id, item);\n\t\tif (pluginId) {\n\t\t\tconst ids = this._toolbarItemPluginMap.get(pluginId) ?? [];\n\t\t\tids.push(item.id);\n\t\t\tthis._toolbarItemPluginMap.set(pluginId, ids);\n\t\t}\n\t}\n\n\tgetToolbarItemsByPlugin(pluginId: string): ToolbarItem[] {\n\t\tconst ids = this._toolbarItemPluginMap.get(pluginId) ?? [];\n\t\tconst items: ToolbarItem[] = [];\n\t\tfor (const id of ids) {\n\t\t\tconst item = this._toolbarItems.get(id);\n\t\t\tif (item) items.push(item);\n\t\t}\n\t\treturn items;\n\t}\n\n\tgetToolbarItem(id: string): ToolbarItem | undefined {\n\t\treturn this._toolbarItems.get(id);\n\t}\n\n\tgetToolbarItems(): ToolbarItem[] {\n\t\treturn [...this._toolbarItems.values()];\n\t}\n\n\tremoveToolbarItem(id: string): void {\n\t\tthis._toolbarItems.delete(id);\n\t\tfor (const [pluginId, ids] of this._toolbarItemPluginMap) {\n\t\t\tconst idx = ids.indexOf(id);\n\t\t\tif (idx !== -1) {\n\t\t\t\tids.splice(idx, 1);\n\t\t\t\tif (ids.length === 0) this._toolbarItemPluginMap.delete(pluginId);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis._toolbarItems.clear();\n\t\tthis._toolbarItemPluginMap.clear();\n\t}\n}\n","/** Toolbar styles — buttons, separators, tooltips, popups, dropdowns. */\nexport const TOOLBAR_CSS = `\n/* Toolbar */\n.notectl-plugin-container--top {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: nowrap;\n\tborder-bottom: 1px solid var(--notectl-border);\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n\tmin-height: 40px;\n\tflex-shrink: 0;\n}\n\n.notectl-toolbar {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: nowrap;\n\toverflow: hidden;\n\tflex: 1;\n\tmin-width: 0;\n\tgap: 2px;\n\tpadding: 4px 8px;\n}\n\n.notectl-toolbar[hidden] {\n\tdisplay: none;\n}\n\n/* Group wrapper — real flex container so consumers can style it via ::part(toolbar-group)\n with padding/background/border directly. Group gap mirrors the toolbar gap so the\n visual rhythm between buttons stays uniform whether or not a group boundary lies between them. */\n.notectl-toolbar-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 2px;\n}\n\n.notectl-toolbar-group--overflow-hidden {\n\tdisplay: none;\n}\n\n.notectl-toolbar-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-toolbar-button-bg, transparent);\n\tcursor: pointer;\n\tcolor: var(--notectl-toolbar-button-fg, var(--notectl-fg));\n\tfont-size: 14px;\n\tline-height: 1;\n\tpadding: 0;\n\tflex-shrink: 0;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn:hover {\n\t\tbackground: var(--notectl-toolbar-button-hover-bg, var(--notectl-hover-bg));\n\t\tborder-color: var(--notectl-border);\n\t}\n}\n\n.notectl-toolbar-btn--active {\n\tbackground: var(--notectl-toolbar-button-active-bg, var(--notectl-active-bg));\n\tborder-color: var(--notectl-primary-muted);\n\tcolor: var(--notectl-toolbar-button-active-fg, var(--notectl-primary-fg));\n}\n\n.notectl-toolbar-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n.notectl-toolbar-btn:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn:disabled:hover {\n\t\tbackground: transparent;\n\t\tborder-color: transparent;\n\t}\n}\n\n.notectl-toolbar-btn__icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpointer-events: none;\n}\n\n.notectl-toolbar-btn__icon svg {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tfill: currentColor;\n}\n\n/* Tooltip (rendered as fixed-position element in shadow root) */\n.notectl-toolbar-tooltip {\n\tpadding: 4px 8px;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\tz-index: 10001;\n\tline-height: 1.4;\n\tletter-spacing: 0.01em;\n\tfont-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.notectl-toolbar-separator {\n\tdisplay: inline-block;\n\twidth: 1px;\n\theight: 20px;\n\tbackground: var(--notectl-border);\n\tmargin: 0 4px;\n\tvertical-align: middle;\n}\n\n/* Toolbar Popups */\n.notectl-toolbar-popup {\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 12px var(--notectl-shadow);\n\toverflow: hidden;\n}\n\n/* Grid Picker */\n.notectl-grid-picker__cell:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-grid-picker__cell--highlighted {\n\tbackground: var(--notectl-primary-muted);\n\tborder-color: var(--notectl-primary);\n}\n\n/* Dropdown */\n.notectl-dropdown {\n\tmin-width: 160px;\n\tpadding: 4px 0;\n}\n\n.notectl-dropdown__item {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\tpadding: 8px 12px;\n\ttext-align: start;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tline-height: 1.4;\n\tfont-family: inherit;\n\twhite-space: nowrap;\n}\n\n@media (hover: hover) {\n\t.notectl-dropdown__item:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-dropdown__item:focus-visible {\n\tbackground: var(--notectl-hover-bg);\n\toutline: none;\n}\n\n.notectl-dropdown__item-icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-fg-muted);\n\tflex-shrink: 0;\n}\n\n.notectl-dropdown__item-label {\n\tflex: 1;\n}\n\n/* Overflow behavior: flow mode — toolbar wraps to additional rows */\n.notectl-toolbar[data-overflow=\"flow\"] {\n\tflex-wrap: wrap;\n\toverflow: visible;\n}\n\n/* Overflow behavior: none — toolbar clips without any responsive behavior */\n.notectl-toolbar[data-overflow=\"none\"] {\n\tflex-wrap: nowrap;\n\toverflow: hidden;\n}\n\n/* Overflow: hidden items (burger-menu mode) */\n.notectl-toolbar-btn--overflow-hidden,\n.notectl-toolbar-separator--overflow-hidden {\n\tdisplay: none;\n}\n\n/* Overflow \"more\" button */\n.notectl-toolbar-overflow-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n\tfont-size: 16px;\n\tline-height: 1;\n\tpadding: 0;\n\tflex-shrink: 0;\n\tmargin-inline-start: auto;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-overflow-btn:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-border);\n\t}\n}\n\n.notectl-toolbar-overflow-btn--hidden {\n\tdisplay: none;\n}\n\n.notectl-toolbar-overflow-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n/* Dropdown item states shared by all dropdown menus (including overflow) */\n.notectl-dropdown__item:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n@media (hover: hover) {\n\t.notectl-dropdown__item:disabled:hover {\n\t\tbackground: none;\n\t}\n}\n\n.notectl-dropdown__item--active {\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-dropdown__item-icon svg {\n\tdisplay: block;\n\twidth: 16px;\n\theight: 16px;\n\tfill: currentColor;\n}\n\n.notectl-dropdown__separator {\n\theight: 1px;\n\tbackground: var(--notectl-border);\n\tmargin: 4px 0;\n}\n\n/* Combobox-style toolbar buttons (shared base for font, fontSize, heading, etc.) */\n.notectl-toolbar-btn[role=\"combobox\"] {\n\twidth: auto;\n\tpadding: 0 8px;\n\tgap: 4px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n}\n\n@media (hover: hover) {\n\t.notectl-toolbar-btn[role=\"combobox\"]:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t\tborder-color: var(--notectl-fg-muted);\n\t}\n}\n\n.notectl-toolbar-btn[role=\"combobox\"].notectl-toolbar-btn--active {\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n\tborder-color: var(--notectl-primary-muted);\n}\n\n.notectl-toolbar-combobox__label {\n\tflex: 1;\n\tfont-size: 13px;\n\tfont-weight: 500;\n\tcolor: var(--notectl-fg);\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: start;\n\tline-height: 30px;\n}\n\n.notectl-toolbar-combobox__arrow {\n\tflex-shrink: 0;\n\tfont-size: 11px;\n\tcolor: var(--notectl-fg-muted);\n\tline-height: 30px;\n}\n\n/* Link Popup */\n.notectl-link-popup {\n\tpadding: 8px;\n\tmin-width: 200px;\n}\n\n.notectl-link-popup__input {\n\twidth: 100%;\n\tpadding: 4px;\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg);\n\tbackground: var(--notectl-surface-overlay);\n}\n\n.notectl-link-popup__input:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-link-popup__button {\n\twidth: 100%;\n\tpadding: 6px 12px;\n\tcursor: pointer;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-surface-overlay);\n\tcolor: var(--notectl-fg);\n\tfont-size: 13px;\n}\n\n.notectl-link-popup__button--apply {\n\tmargin-top: 4px;\n}\n\n@media (hover: hover) {\n\t.notectl-link-popup__button:hover {\n\t\tbackground: var(--notectl-hover-bg);\n\t}\n}\n\n.notectl-link-popup__button:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n`;\n","/**\n * Keyboard navigation helpers for the toolbar (WAI-ARIA Toolbar pattern).\n * Also re-exports generic navigation helpers from `plugins/shared`.\n */\n\n/** Returns indices of all enabled buttons. */\nexport function getEnabledIndices(buttons: readonly HTMLButtonElement[]): number[] {\n\tconst result: number[] = [];\n\tfor (let i = 0; i < buttons.length; i++) {\n\t\tif (!buttons[i]?.disabled) {\n\t\t\tresult.push(i);\n\t\t}\n\t}\n\treturn result;\n}\n\n/** Finds the next enabled button index in the given direction (wraps around). */\nexport function findNextEnabled(\n\tbuttons: readonly HTMLButtonElement[],\n\tcurrent: number,\n\tdirection: 1 | -1,\n): number {\n\tconst len = buttons.length;\n\tif (len === 0) return -1;\n\n\tlet index = current;\n\tfor (let i = 0; i < len; i++) {\n\t\tindex = (index + direction + len) % len;\n\t\tif (!buttons[index]?.disabled) {\n\t\t\treturn index;\n\t\t}\n\t}\n\treturn current;\n}\n\n/** Finds the first enabled button index. */\nexport function findFirstEnabled(buttons: readonly HTMLButtonElement[]): number {\n\tfor (let i = 0; i < buttons.length; i++) {\n\t\tif (!buttons[i]?.disabled) return i;\n\t}\n\treturn -1;\n}\n\n/** Finds the last enabled button index. */\nexport function findLastEnabled(buttons: readonly HTMLButtonElement[]): number {\n\tfor (let i = buttons.length - 1; i >= 0; i--) {\n\t\tif (!buttons[i]?.disabled) return i;\n\t}\n\treturn -1;\n}\n\nexport {\n\tapplyRovingTabindex,\n\tfindNextDropdownItem,\n\tnavigateGrid,\n} from '../shared/KeyboardNav.js';\n\n/**\n * Resolves a horizontal navigation direction based on text direction.\n * In RTL, ArrowRight moves backward (-1) and ArrowLeft moves forward (1).\n */\nexport function resolveHorizontalDirection(\n\tkey: 'ArrowRight' | 'ArrowLeft',\n\tisRtl: boolean,\n): 1 | -1 {\n\tif (key === 'ArrowRight') return isRtl ? -1 : 1;\n\treturn isRtl ? 1 : -1;\n}\n","/** Locale interface and default English locale for the ToolbarPlugin. */\n\nimport { type LocaleModuleMap, loadLocaleModule } from '../shared/LocaleLoader.js';\n\n// --- Locale Interface ---\n\nexport interface ToolbarLocale {\n\treadonly formattingOptionsAria: string;\n\treadonly moreToolsAria: string;\n\treadonly gridPickerLabel: (rows: number, cols: number) => string;\n}\n\n// --- Default English Locale ---\n\nexport const TOOLBAR_LOCALE_EN: ToolbarLocale = {\n\tformattingOptionsAria: 'Formatting options',\n\tmoreToolsAria: 'More tools',\n\tgridPickerLabel: (rows: number, cols: number) => `${rows} x ${cols}`,\n};\n\n// --- Lazy Locale Loader ---\n\nconst localeModules: LocaleModuleMap<ToolbarLocale> = import.meta.glob<{\n\tdefault: ToolbarLocale;\n}>('./locales/*.ts', { eager: false });\n\nexport async function loadToolbarLocale(lang: string): Promise<ToolbarLocale> {\n\treturn loadLocaleModule(localeModules, lang, TOOLBAR_LOCALE_EN);\n}\n","/**\n * Controls how the toolbar responds when items exceed the available width.\n *\n * @example\n * ```typescript\n * const editor = await createEditor({\n * toolbar: {\n * groups: [[BoldPlugin, ItalicPlugin], [HeadingPlugin]],\n * overflow: ToolbarOverflowBehavior.Flow,\n * },\n * });\n * ```\n */\nexport const ToolbarOverflowBehavior = {\n\t/** Items that don't fit are hidden behind a \"...\" dropdown button. Default. */\n\tBurgerMenu: 'burger-menu',\n\t/** Toolbar wraps to additional rows when items overflow. Pure CSS, no JS measurement. */\n\tFlow: 'flow',\n\t/** No responsive behavior; the toolbar clips at the container boundary. */\n\tNone: 'none',\n} as const;\n\nexport type ToolbarOverflowBehavior =\n\t(typeof ToolbarOverflowBehavior)[keyof typeof ToolbarOverflowBehavior];\n","/**\n * ToolbarOverflowController: manages responsive toolbar overflow.\n * Uses ResizeObserver to detect when items exceed available width,\n * hides overflow items, and shows a \"more\" dropdown button.\n * Delegates popup lifecycle to PopupManager when available.\n */\n\nimport { isRtlContext } from '../../platform/Platform.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { findNextDropdownItem } from '../shared/KeyboardNav.js';\nimport type { PopupHandle, PopupManager } from '../shared/PopupManager.js';\nimport { appendToRoot, positionPopup } from '../shared/PopupPositioning.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\n\n// --- Types ---\n\ninterface OverflowEntry {\n\treadonly element: HTMLButtonElement;\n\treadonly item: ToolbarItem;\n}\n\ntype OnOverflowChange = (\n\tvisibleButtons: readonly HTMLButtonElement[],\n\toverflowButton: HTMLButtonElement | null,\n) => void;\n\ntype OnItemActivated = (overflowButton: HTMLButtonElement, item: ToolbarItem) => void;\n\nexport interface OverflowControllerConfig {\n\treadonly toolbar: HTMLElement;\n\treadonly ariaLabel: string;\n\treadonly context: PluginContext;\n\treadonly onOverflowChange: OnOverflowChange;\n\treadonly onItemActivated: OnItemActivated;\n\treadonly getActiveElement: () => Element | null;\n\treadonly popupManager?: PopupManager;\n}\n\n// --- Constants ---\n\nconst OVERFLOW_BTN_WIDTH = 34;\nconst GAP = 2;\nconst HIDDEN_BTN_CLASS = 'notectl-toolbar-btn--overflow-hidden';\nconst HIDDEN_SEP_CLASS = 'notectl-toolbar-separator--overflow-hidden';\nconst HIDDEN_GROUP_CLASS = 'notectl-toolbar-group--overflow-hidden';\nconst HIDDEN_OVERFLOW_CLASS = 'notectl-toolbar-overflow-btn--hidden';\nconst GROUP_CLASS = 'notectl-toolbar-group';\nconst SEPARATOR_CLASS = 'notectl-toolbar-separator';\nconst BUTTON_CLASS = 'notectl-toolbar-btn';\nconst ELLIPSIS_SVG =\n\t'<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\"><circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/></svg>';\n\n// --- Controller ---\n\nexport class ToolbarOverflowController {\n\tprivate readonly toolbar: HTMLElement;\n\tprivate readonly context: PluginContext;\n\tprivate readonly onOverflowChange: OnOverflowChange;\n\tprivate readonly onItemActivated: OnItemActivated;\n\tprivate readonly getActiveElement: () => Element | null;\n\tprivate readonly ariaLabel: string;\n\tprivate readonly popupManager: PopupManager | null;\n\n\tprivate entries: OverflowEntry[] = [];\n\tprivate overflowButton: HTMLButtonElement | null = null;\n\tprivate overflowDropdown: HTMLElement | null = null;\n\tprivate overflowHandle: PopupHandle | null = null;\n\tprivate overflowEntries: OverflowEntry[] = [];\n\tprivate resizeObserver: ResizeObserver | null = null;\n\tprivate closeHandler: ((e: MouseEvent) => void) | null = null;\n\tprivate closeHandlerTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate closeHandlerAttached = false;\n\n\tconstructor(config: OverflowControllerConfig) {\n\t\tthis.toolbar = config.toolbar;\n\t\tthis.ariaLabel = config.ariaLabel;\n\t\tthis.context = config.context;\n\t\tthis.onOverflowChange = config.onOverflowChange;\n\t\tthis.onItemActivated = config.onItemActivated;\n\t\tthis.getActiveElement = config.getActiveElement;\n\t\tthis.popupManager = config.popupManager ?? null;\n\n\t\tthis.resizeObserver = new ResizeObserver(() => this.recalculate());\n\t\tthis.resizeObserver.observe(this.toolbar);\n\t}\n\n\t/** Called after renderItems() — stores button references and recalculates. */\n\tupdate(buttons: readonly { element: HTMLButtonElement; item: ToolbarItem }[]): void {\n\t\tthis.entries = buttons.map((b) => ({ element: b.element, item: b.item }));\n\t\tthis.recalculate();\n\t}\n\n\t/**\n\t * Measures the toolbar and redistributes content between visible and overflow.\n\t *\n\t * Overflow unit is the **group wrapper** (`.notectl-toolbar-group`), not individual\n\t * buttons — when any button in a group would not fit, the whole group moves to the\n\t * overflow dropdown so logical clusters stay together. Standalone buttons appended\n\t * directly to the toolbar (legacy / test setups) are treated as single-button groups.\n\t */\n\trecalculate(): void {\n\t\tif (this.entries.length === 0) return;\n\n\t\tthis.closeDropdown();\n\t\tthis.resetVisibility();\n\t\tthis.ensureOverflowButton();\n\t\tthis.setOverflowButtonVisible(false);\n\n\t\t// Phase 1 — Measure (reads only): batch all layout reads before any writes\n\t\tconst availableWidth: number = this.measureAvailableWidth();\n\t\tconst children: HTMLElement[] = Array.from(this.toolbar.children) as HTMLElement[];\n\t\tconst childWidths: Map<HTMLElement, number> = this.measureChildWidths(children);\n\n\t\t// Phase 2 — Apply (writes only): use cached widths, no layout reads\n\t\tconst maxWidth: number = availableWidth - OVERFLOW_BTN_WIDTH - GAP;\n\t\tlet usedWidth = 0;\n\t\tlet overflowing = false;\n\t\tconst overflowList: OverflowEntry[] = [];\n\n\t\tfor (const child of children) {\n\t\t\tif (child === this.overflowButton) continue;\n\n\t\t\tif (child.classList.contains(SEPARATOR_CLASS)) {\n\t\t\t\tconst sepWidth: number = (childWidths.get(child) ?? 0) + GAP;\n\t\t\t\tif (overflowing || usedWidth + sepWidth > maxWidth) {\n\t\t\t\t\toverflowing = true;\n\t\t\t\t\tchild.classList.add(HIDDEN_SEP_CLASS);\n\t\t\t\t} else {\n\t\t\t\t\tusedWidth += sepWidth;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (child.classList.contains(GROUP_CLASS)) {\n\t\t\t\tconst groupWidth: number = (childWidths.get(child) ?? 0) + GAP;\n\t\t\t\tconst groupEntries: OverflowEntry[] = this.entriesInside(child);\n\t\t\t\tif (overflowing || usedWidth + groupWidth > maxWidth) {\n\t\t\t\t\toverflowing = true;\n\t\t\t\t\tthis.hideGroup(child, groupEntries, overflowList);\n\t\t\t\t} else {\n\t\t\t\t\tusedWidth += groupWidth;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Standalone button (used by tests that append buttons directly to the toolbar)\n\t\t\tconst entry: OverflowEntry | undefined = this.entries.find((oe) => oe.element === child);\n\t\t\tif (!entry) continue;\n\n\t\t\tconst btnWidth: number = (childWidths.get(child) ?? 0) + GAP;\n\t\t\tif (overflowing || usedWidth + btnWidth > maxWidth) {\n\t\t\t\toverflowing = true;\n\t\t\t\tentry.element.classList.add(HIDDEN_BTN_CLASS);\n\t\t\t\toverflowList.push(entry);\n\t\t\t} else {\n\t\t\t\tusedWidth += btnWidth;\n\t\t\t}\n\t\t}\n\n\t\tthis.overflowEntries = overflowList;\n\t\tthis.hideTrailingSeparators();\n\t\tthis.setOverflowButtonVisible(overflowList.length > 0);\n\t\tthis.notifyChange();\n\t}\n\n\t/**\n\t * Hides a group wrapper and marks every entry inside it as overflowed.\n\t * Marking individual buttons too keeps `notifyChange()` filter logic uniform.\n\t */\n\tprivate hideGroup(\n\t\tgroup: HTMLElement,\n\t\tentries: readonly OverflowEntry[],\n\t\toverflowList: OverflowEntry[],\n\t): void {\n\t\tgroup.classList.add(HIDDEN_GROUP_CLASS);\n\t\tfor (const entry of entries) {\n\t\t\tentry.element.classList.add(HIDDEN_BTN_CLASS);\n\t\t\toverflowList.push(entry);\n\t\t}\n\t}\n\n\tprivate entriesInside(group: HTMLElement): OverflowEntry[] {\n\t\tconst result: OverflowEntry[] = [];\n\t\tfor (const entry of this.entries) {\n\t\t\tif (group.contains(entry.element)) {\n\t\t\t\tresult.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t/** Updates active/disabled states for items in the open overflow dropdown. */\n\tupdateItemStates(state: EditorState): void {\n\t\tif (!this.overflowDropdown) return;\n\n\t\tconst menuItems: HTMLButtonElement[] = Array.from(\n\t\t\tthis.overflowDropdown.querySelectorAll('.notectl-dropdown__item'),\n\t\t) as HTMLButtonElement[];\n\n\t\tfor (const menuItem of menuItems) {\n\t\t\tconst itemId: string | null = menuItem.getAttribute('data-toolbar-item');\n\t\t\tconst entry: OverflowEntry | undefined = this.overflowEntries.find(\n\t\t\t\t(oe) => oe.item.id === itemId,\n\t\t\t);\n\t\t\tif (!entry) continue;\n\n\t\t\tconst active: boolean = entry.item.isActive?.(state) ?? false;\n\t\t\tconst enabled: boolean = entry.item.isEnabled?.(state) ?? true;\n\t\t\tmenuItem.classList.toggle('notectl-dropdown__item--active', active);\n\t\t\tmenuItem.disabled = !enabled;\n\n\t\t\tif (entry.item.popupType === 'combobox') {\n\t\t\t\tconst labelEl: HTMLSpanElement | null = menuItem.querySelector(\n\t\t\t\t\t'.notectl-dropdown__item-label',\n\t\t\t\t);\n\t\t\t\tif (labelEl) {\n\t\t\t\t\tlabelEl.textContent = entry.item.getLabel(state);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entry.item.getIcon) {\n\t\t\t\tconst newIcon: string = entry.item.getIcon(state);\n\t\t\t\tconst iconEl: HTMLSpanElement | null = menuItem.querySelector(\n\t\t\t\t\t'.notectl-dropdown__item-icon',\n\t\t\t\t);\n\t\t\t\tif (iconEl && iconEl.innerHTML !== newIcon) {\n\t\t\t\t\ticonEl.innerHTML = newIcon;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Cleans up ResizeObserver, DOM elements, and event listeners. */\n\tdestroy(): void {\n\t\tthis.resizeObserver?.disconnect();\n\t\tthis.resizeObserver = null;\n\t\tthis.closeDropdown();\n\t\tthis.overflowButton?.remove();\n\t\tthis.overflowButton = null;\n\t\tthis.entries = [];\n\t\tthis.overflowEntries = [];\n\t}\n\n\t// --- Measurement ---\n\n\tprivate measureChildWidths(children: readonly HTMLElement[]): Map<HTMLElement, number> {\n\t\tconst widths: Map<HTMLElement, number> = new Map();\n\t\tfor (const child of children) {\n\t\t\tif (child === this.overflowButton) continue;\n\t\t\twidths.set(child, child.offsetWidth);\n\t\t}\n\t\treturn widths;\n\t}\n\n\tprivate measureAvailableWidth(): number {\n\t\tconst toolbarStyle: CSSStyleDeclaration = getComputedStyle(this.toolbar);\n\t\tconst paddingLeft: number = Number.parseFloat(toolbarStyle.paddingLeft) || 0;\n\t\tconst paddingRight: number = Number.parseFloat(toolbarStyle.paddingRight) || 0;\n\t\treturn this.toolbar.clientWidth - paddingLeft - paddingRight;\n\t}\n\n\tprivate resetVisibility(): void {\n\t\tfor (const entry of this.entries) {\n\t\t\tentry.element.classList.remove(HIDDEN_BTN_CLASS);\n\t\t}\n\t\tconst separators: HTMLElement[] = Array.from(\n\t\t\tthis.toolbar.querySelectorAll(`.${SEPARATOR_CLASS}`),\n\t\t) as HTMLElement[];\n\t\tfor (const sep of separators) {\n\t\t\tsep.classList.remove(HIDDEN_SEP_CLASS);\n\t\t}\n\t\tconst groups: HTMLElement[] = Array.from(\n\t\t\tthis.toolbar.querySelectorAll(`.${GROUP_CLASS}`),\n\t\t) as HTMLElement[];\n\t\tfor (const grp of groups) {\n\t\t\tgrp.classList.remove(HIDDEN_GROUP_CLASS);\n\t\t}\n\t}\n\n\t// --- Overflow Button ---\n\n\tprivate setOverflowButtonVisible(visible: boolean): void {\n\t\tif (!this.overflowButton) return;\n\t\tthis.overflowButton.classList.toggle(HIDDEN_OVERFLOW_CLASS, !visible);\n\t\tif (!visible) {\n\t\t\tthis.overflowButton.removeAttribute('tabindex');\n\t\t}\n\t}\n\n\tprivate ensureOverflowButton(): void {\n\t\tif (this.overflowButton) return;\n\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = 'notectl-toolbar-overflow-btn';\n\t\tbtn.setAttribute('aria-label', this.ariaLabel);\n\t\tbtn.setAttribute('aria-haspopup', 'true');\n\t\tbtn.setAttribute('aria-expanded', 'false');\n\t\tbtn.setAttribute('part', 'toolbar-button toolbar-overflow-button');\n\t\tbtn.innerHTML = ELLIPSIS_SVG;\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\tthis.toggleDropdown();\n\t\t});\n\n\t\tthis.toolbar.appendChild(btn);\n\t\tthis.overflowButton = btn;\n\t}\n\n\t// --- Dropdown ---\n\n\tprivate toggleDropdown(): void {\n\t\tif (this.overflowDropdown) {\n\t\t\tthis.closeDropdown();\n\t\t} else {\n\t\t\tthis.openDropdown();\n\t\t}\n\t}\n\n\tprivate openDropdown(): void {\n\t\tif (!this.overflowButton || this.overflowEntries.length === 0) return;\n\n\t\tconst dropdown: HTMLDivElement = document.createElement('div');\n\t\tdropdown.className = 'notectl-toolbar-popup notectl-dropdown';\n\t\tdropdown.setAttribute('role', 'menu');\n\n\t\tthis.renderDropdownItems(dropdown, this.context.getState());\n\n\t\tif (this.popupManager) {\n\t\t\tthis.overflowHandle = this.popupManager.open({\n\t\t\t\tanchor: this.overflowButton,\n\t\t\t\tclassName: 'notectl-toolbar-popup notectl-dropdown',\n\t\t\t\tariaRole: 'menu',\n\t\t\t\tposition: 'below-end',\n\t\t\t\treferenceNode: this.overflowButton,\n\t\t\t\trestoreFocusTo: this.overflowButton,\n\t\t\t\tonClose: () => {\n\t\t\t\t\tthis.overflowHandle = null;\n\t\t\t\t\tthis.overflowDropdown = null;\n\t\t\t\t\tif (this.overflowButton) {\n\t\t\t\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'false');\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcontent: (popup: HTMLElement) => {\n\t\t\t\t\tthis.renderDropdownItems(popup, this.context.getState());\n\t\t\t\t\tthis.overflowDropdown = popup;\n\t\t\t\t\tpopup.addEventListener('keydown', (e: KeyboardEvent) => this.handleDropdownKeydown(e));\n\t\t\t\t},\n\t\t\t});\n\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'true');\n\t\t} else {\n\t\t\tthis.positionDropdown(dropdown);\n\t\t\tappendToRoot(dropdown, this.overflowButton);\n\t\t\tthis.overflowDropdown = dropdown;\n\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'true');\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst first: HTMLElement | null = dropdown.querySelector('[role=\"menuitem\"]');\n\t\t\t\tfirst?.focus();\n\t\t\t});\n\n\t\t\tdropdown.addEventListener('keydown', (e: KeyboardEvent) => this.handleDropdownKeydown(e));\n\t\t\tthis.registerCloseHandler();\n\t\t}\n\t}\n\n\tprivate renderDropdownItems(dropdown: HTMLElement, state: EditorState): void {\n\t\tlet lastGroup: string | null = null;\n\n\t\tfor (const entry of this.overflowEntries) {\n\t\t\tif (lastGroup !== null && entry.item.group !== lastGroup) {\n\t\t\t\tconst sep: HTMLDivElement = document.createElement('div');\n\t\t\t\tsep.className = 'notectl-dropdown__separator';\n\t\t\t\tsep.setAttribute('role', 'separator');\n\t\t\t\tdropdown.appendChild(sep);\n\t\t\t}\n\t\t\tlastGroup = entry.item.group;\n\n\t\t\tconst menuBtn: HTMLButtonElement = document.createElement('button');\n\t\t\tmenuBtn.type = 'button';\n\t\t\tmenuBtn.className = 'notectl-dropdown__item';\n\t\t\tmenuBtn.setAttribute('role', 'menuitem');\n\t\t\tmenuBtn.setAttribute('tabindex', '-1');\n\t\t\tmenuBtn.setAttribute('data-toolbar-item', entry.item.id);\n\n\t\t\tconst iconSpan: HTMLSpanElement = document.createElement('span');\n\t\t\ticonSpan.className = 'notectl-dropdown__item-icon';\n\t\t\tif (entry.item.popupType !== 'combobox') {\n\t\t\t\ticonSpan.innerHTML = entry.item.icon;\n\t\t\t}\n\t\t\tmenuBtn.appendChild(iconSpan);\n\n\t\t\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\t\t\tlabelSpan.className = 'notectl-dropdown__item-label';\n\t\t\tlabelSpan.textContent =\n\t\t\t\tentry.item.popupType === 'combobox'\n\t\t\t\t\t? entry.item.getLabel(state)\n\t\t\t\t\t: (entry.item.tooltip ?? entry.item.label);\n\t\t\tmenuBtn.appendChild(labelSpan);\n\n\t\t\tmenuBtn.addEventListener('mousedown', (ev: MouseEvent) => {\n\t\t\t\tev.preventDefault();\n\t\t\t\tev.stopPropagation();\n\t\t\t\tthis.activateOverflowItem(entry);\n\t\t\t});\n\n\t\t\tdropdown.appendChild(menuBtn);\n\t\t}\n\t}\n\n\tprivate positionDropdown(dropdown: HTMLElement): void {\n\t\tif (!this.overflowButton) return;\n\n\t\tconst rect: DOMRect = this.overflowButton.getBoundingClientRect();\n\t\tconst rtl: boolean = isRtlContext(this.toolbar);\n\n\t\tpositionPopup(dropdown, rect, { position: rtl ? 'below-start' : 'below-end', isRtl: rtl });\n\t}\n\n\tprivate registerCloseHandler(): void {\n\t\tthis.closeHandler = (ev: MouseEvent) => {\n\t\t\tconst path: EventTarget[] = ev.composedPath();\n\t\t\tif (\n\t\t\t\tthis.overflowDropdown &&\n\t\t\t\t!path.includes(this.overflowDropdown) &&\n\t\t\t\tthis.overflowButton &&\n\t\t\t\t!path.includes(this.overflowButton)\n\t\t\t) {\n\t\t\t\tthis.closeDropdown();\n\t\t\t}\n\t\t};\n\t\tthis.closeHandlerTimer = setTimeout(() => {\n\t\t\tthis.closeHandlerTimer = null;\n\t\t\tif (!this.closeHandler || !this.overflowDropdown) return;\n\t\t\tdocument.addEventListener('mousedown', this.closeHandler);\n\t\t\tthis.closeHandlerAttached = true;\n\t\t}, 0);\n\t}\n\n\tprivate closeDropdown(): void {\n\t\tif (this.overflowHandle) {\n\t\t\tconst handle: PopupHandle = this.overflowHandle;\n\t\t\tthis.overflowHandle = null;\n\t\t\tthis.overflowDropdown = null;\n\t\t\thandle.close();\n\t\t\tif (this.overflowButton) {\n\t\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'false');\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.overflowDropdown) {\n\t\t\tthis.overflowDropdown.remove();\n\t\t\tthis.overflowDropdown = null;\n\t\t}\n\t\tif (this.overflowButton) {\n\t\t\tthis.overflowButton.setAttribute('aria-expanded', 'false');\n\t\t}\n\t\tif (this.closeHandler) {\n\t\t\tif (this.closeHandlerTimer !== null) {\n\t\t\t\tclearTimeout(this.closeHandlerTimer);\n\t\t\t\tthis.closeHandlerTimer = null;\n\t\t\t}\n\t\t\tif (this.closeHandlerAttached) {\n\t\t\t\tdocument.removeEventListener('mousedown', this.closeHandler);\n\t\t\t\tthis.closeHandlerAttached = false;\n\t\t\t}\n\t\t\tthis.closeHandler = null;\n\t\t}\n\t}\n\n\tprivate activateOverflowItem(entry: OverflowEntry): void {\n\t\tthis.closeDropdown();\n\t\tif (entry.item.popupType && this.overflowButton) {\n\t\t\tthis.onItemActivated(this.overflowButton, entry.item);\n\t\t} else {\n\t\t\tthis.context.executeCommand(entry.item.command);\n\t\t}\n\t}\n\n\t// --- Keyboard Navigation ---\n\n\tprivate handleDropdownKeydown(e: KeyboardEvent): void {\n\t\tif (!this.overflowDropdown) return;\n\n\t\tif (e.key === 'Escape' || e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.closeDropdown();\n\t\t\tthis.overflowButton?.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst items: HTMLElement[] = Array.from(\n\t\t\tthis.overflowDropdown.querySelectorAll('[role=\"menuitem\"]'),\n\t\t) as HTMLElement[];\n\t\tconst current: number = items.indexOf(this.getActiveElement() as HTMLElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(items, current, 1);\n\t\t\t\titems[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(items, current, -1);\n\t\t\t\titems[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst focusedItem: HTMLElement | undefined = items[current];\n\t\t\t\tif (!focusedItem) break;\n\t\t\t\tconst itemId: string | null = focusedItem.getAttribute('data-toolbar-item');\n\t\t\t\tconst entry: OverflowEntry | undefined = this.overflowEntries.find(\n\t\t\t\t\t(oe) => oe.item.id === itemId,\n\t\t\t\t);\n\t\t\t\tif (entry) this.activateOverflowItem(entry);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Helpers ---\n\n\tprivate hideTrailingSeparators(): void {\n\t\tconst children: HTMLElement[] = Array.from(this.toolbar.children) as HTMLElement[];\n\t\tfor (let i = children.length - 1; i >= 0; i--) {\n\t\t\tconst child: HTMLElement | undefined = children[i];\n\t\t\tif (!child || child === this.overflowButton) continue;\n\t\t\tif (child.classList.contains(SEPARATOR_CLASS)) {\n\t\t\t\tif (!child.classList.contains(HIDDEN_SEP_CLASS)) {\n\t\t\t\t\tchild.classList.add(HIDDEN_SEP_CLASS);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isHiddenGroup: boolean =\n\t\t\t\tchild.classList.contains(GROUP_CLASS) && child.classList.contains(HIDDEN_GROUP_CLASS);\n\t\t\tconst isHiddenButton: boolean =\n\t\t\t\tchild.classList.contains(BUTTON_CLASS) && child.classList.contains(HIDDEN_BTN_CLASS);\n\t\t\tif (isHiddenGroup || isHiddenButton) continue;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate notifyChange(): void {\n\t\tconst visible: HTMLButtonElement[] = this.entries\n\t\t\t.filter((oe) => !oe.element.classList.contains(HIDDEN_BTN_CLASS))\n\t\t\t.map((oe) => oe.element);\n\t\tthis.onOverflowChange(visible, this.overflowEntries.length > 0 ? this.overflowButton : null);\n\t}\n}\n","/**\n * ToolbarRenderers: pure rendering functions for toolbar popup content.\n * Grid pickers, dropdown menus, and separator elements.\n */\n\nimport { setStyleProperties } from '../../style/StyleRuntime.js';\nimport type { DropdownConfig, GridPickerConfig } from './ToolbarItem.js';\nimport { TOOLBAR_LOCALE_EN, type ToolbarLocale } from './ToolbarLocale.js';\n\nconst HIGHLIGHTED_CLASS = 'notectl-grid-picker__cell--highlighted';\n\n/**\n * Renders a grid picker into the given container.\n * Calls `onClose` after a cell is selected so the popup can be dismissed.\n */\nexport function renderGridPicker(\n\tcontainer: HTMLElement,\n\tconfig: GridPickerConfig,\n\tonClose: () => void,\n\tlocale: ToolbarLocale = TOOLBAR_LOCALE_EN,\n): void {\n\tcontainer.className += ' notectl-grid-picker';\n\n\tconst grid: HTMLDivElement = document.createElement('div');\n\tgrid.className = 'notectl-grid-picker__grid';\n\tgrid.setAttribute('role', 'grid');\n\tsetStyleProperties(grid, {\n\t\tdisplay: 'grid',\n\t\tgridTemplateColumns: `repeat(${config.maxCols}, 1fr)`,\n\t\tgap: '2px',\n\t\tpadding: '8px',\n\t});\n\n\tconst label: HTMLDivElement = document.createElement('div');\n\tlabel.className = 'notectl-grid-picker__label';\n\tlabel.textContent = locale.gridPickerLabel(1, 1);\n\tsetStyleProperties(label, {\n\t\ttextAlign: 'center',\n\t\tpadding: '4px',\n\t\tfontSize: '12px',\n\t});\n\tlabel.setAttribute('aria-live', 'polite');\n\n\tfor (let r = 1; r <= config.maxRows; r++) {\n\t\tfor (let c = 1; c <= config.maxCols; c++) {\n\t\t\tconst cell: HTMLDivElement = document.createElement('div');\n\t\t\tcell.className = 'notectl-grid-picker__cell';\n\t\t\tcell.setAttribute('role', 'gridcell');\n\t\t\tcell.setAttribute('tabindex', '-1');\n\t\t\tcell.setAttribute('aria-label', locale.gridPickerLabel(r, c));\n\t\t\tsetStyleProperties(cell, {\n\t\t\t\twidth: '20px',\n\t\t\t\theight: '20px',\n\t\t\t\tborder: '1px solid #ccc',\n\t\t\t\tcursor: 'pointer',\n\t\t\t});\n\t\t\tcell.setAttribute('data-row', String(r));\n\t\t\tcell.setAttribute('data-col', String(c));\n\n\t\t\tcell.addEventListener('mouseenter', () => {\n\t\t\t\thighlightCells(grid, r, c);\n\t\t\t\tlabel.textContent = locale.gridPickerLabel(r, c);\n\t\t\t});\n\n\t\t\tcell.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\t\tcell.addEventListener('click', () => {\n\t\t\t\tconfig.onSelect(r, c);\n\t\t\t\tonClose();\n\t\t\t});\n\n\t\t\tgrid.appendChild(cell);\n\t\t}\n\t}\n\n\tcontainer.appendChild(grid);\n\tcontainer.appendChild(label);\n}\n\n/**\n * Highlights grid cells up to the given row/col and updates the label.\n * Used by both mouse hover and keyboard navigation.\n */\nexport function highlightCells(grid: HTMLElement, targetRow: number, targetCol: number): void {\n\tconst cells: NodeListOf<Element> = grid.querySelectorAll('.notectl-grid-picker__cell');\n\tfor (const cell of cells) {\n\t\tconst r: number = Number(cell.getAttribute('data-row'));\n\t\tconst c: number = Number(cell.getAttribute('data-col'));\n\t\tcell.classList.toggle(HIGHLIGHTED_CLASS, r <= targetRow && c <= targetCol);\n\t}\n}\n\n/**\n * Renders a dropdown menu into the given container.\n * Calls `onClose` after an item is activated so the popup can be dismissed.\n */\nexport function renderDropdown(\n\tcontainer: HTMLElement,\n\tconfig: DropdownConfig,\n\texecuteCommand: (command: string) => void,\n\tonClose: () => void,\n): void {\n\tcontainer.classList.add('notectl-dropdown');\n\tcontainer.setAttribute('role', 'menu');\n\n\tfor (const item of config.items) {\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = 'notectl-dropdown__item';\n\t\tbtn.setAttribute('role', 'menuitem');\n\t\tbtn.setAttribute('tabindex', '-1');\n\n\t\tif (item.icon) {\n\t\t\tconst iconSpan: HTMLSpanElement = document.createElement('span');\n\t\t\ticonSpan.className = 'notectl-dropdown__item-icon';\n\t\t\ticonSpan.innerHTML = item.icon;\n\t\t\tbtn.appendChild(iconSpan);\n\t\t}\n\n\t\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\t\tlabelSpan.className = 'notectl-dropdown__item-label';\n\t\tlabelSpan.textContent = item.label;\n\t\tbtn.appendChild(labelSpan);\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tbtn.addEventListener('click', () => {\n\t\t\texecuteCommand(item.command);\n\t\t\tonClose();\n\t\t});\n\n\t\tcontainer.appendChild(btn);\n\t}\n}\n\n/** Creates a toolbar group separator element. */\nexport function createSeparator(): HTMLSpanElement {\n\tconst sep: HTMLSpanElement = document.createElement('span');\n\tsep.className = 'notectl-toolbar-separator';\n\tsep.setAttribute('role', 'separator');\n\tsep.setAttribute('part', 'toolbar-divider');\n\treturn sep;\n}\n","/**\n * ToolbarPopupController: manages popup lifecycle, positioning, keyboard\n * navigation, and auto-close for toolbar popups (grid pickers, dropdowns,\n * and custom popups). Delegates lifecycle to PopupManager.\n */\n\nimport { isRtlContext } from '../../platform/Platform.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { findNextDropdownItem, navigateGrid } from '../shared/KeyboardNav.js';\nimport type { PopupCloseOptions, PopupHandle, PopupManager } from '../shared/PopupManager.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\nimport { TOOLBAR_LOCALE_EN, type ToolbarLocale } from './ToolbarLocale.js';\nimport { highlightCells, renderDropdown, renderGridPicker } from './ToolbarRenderers.js';\n\nexport class ToolbarPopupController {\n\tprivate activePopup: HTMLElement | null = null;\n\tprivate activePopupButton: HTMLButtonElement | null = null;\n\tprivate activeHandle: PopupHandle | null = null;\n\tprivate readonly getActiveElement: () => Element | null;\n\tprivate readonly locale: ToolbarLocale;\n\tprivate popupManager: PopupManager | null = null;\n\n\tconstructor(getActiveElement: () => Element | null, locale: ToolbarLocale = TOOLBAR_LOCALE_EN) {\n\t\tthis.getActiveElement = getActiveElement;\n\t\tthis.locale = locale;\n\t}\n\n\t/** Injects the PopupManager instance (called after service registration). */\n\tsetPopupManager(manager: PopupManager): void {\n\t\tthis.popupManager = manager;\n\t}\n\n\t/** Whether a popup is currently open. */\n\tisOpen(): boolean {\n\t\treturn this.activePopup !== null;\n\t}\n\n\t/** Toggles a popup for the given toolbar button. */\n\ttoggle(button: HTMLButtonElement, item: ToolbarItem, context: PluginContext): void {\n\t\tif (this.activePopup) {\n\t\t\tthis.close();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.openViaManager(button, item, context);\n\t}\n\n\t/** Closes the active popup and cleans up event listeners. */\n\tclose(): void {\n\t\tif (this.activeHandle) {\n\t\t\t// Prevent onClose callback from re-entering\n\t\t\tconst handle: PopupHandle = this.activeHandle;\n\t\t\tthis.activeHandle = null;\n\t\t\tthis.clearButtonState();\n\t\t\thandle.close();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearButtonState();\n\t\tif (this.activePopup) {\n\t\t\tthis.activePopup.remove();\n\t\t\tthis.activePopup = null;\n\t\t}\n\t}\n\n\t/** Closes popup and restores focus to the trigger button. */\n\tcloseAndRestoreFocus(): void {\n\t\tconst triggerBtn: HTMLButtonElement | null = this.activePopupButton;\n\t\tthis.close();\n\t\ttriggerBtn?.focus();\n\t}\n\n\tdestroy(): void {\n\t\tthis.close();\n\t}\n\n\t// --- PopupManager path ---\n\n\tprivate openViaManager(\n\t\tbutton: HTMLButtonElement,\n\t\titem: ToolbarItem,\n\t\tcontext: PluginContext,\n\t): void {\n\t\tif (!this.popupManager) return;\n\n\t\tthis.activePopupButton = button;\n\t\tbutton.classList.add('notectl-toolbar-btn--popup-open');\n\t\tbutton.setAttribute('aria-expanded', 'true');\n\n\t\tthis.activeHandle = this.popupManager.open({\n\t\t\tanchor: button,\n\t\t\tclassName: 'notectl-toolbar-popup',\n\t\t\treferenceNode: button,\n\t\t\trestoreFocusTo: button,\n\t\t\tposition: 'below-start',\n\t\t\tonClose: () => {\n\t\t\t\t// Called when PopupManager closes the popup (click-outside, etc.)\n\t\t\t\tthis.activeHandle = null;\n\t\t\t\tthis.clearButtonState();\n\t\t\t\tthis.activePopup = null;\n\t\t\t},\n\t\t\tcontent: (popup: HTMLElement, close: (options?: PopupCloseOptions) => void) => {\n\t\t\t\tthis.activePopup = popup;\n\t\t\t\tthis.renderPopupContent(popup, item, context, close);\n\t\t\t\tpopup.addEventListener('keydown', (e: KeyboardEvent) => this.handlePopupKeydown(e));\n\t\t\t},\n\t\t});\n\t}\n\n\t// --- Shared rendering ---\n\n\tprivate renderPopupContent(\n\t\tpopup: HTMLElement,\n\t\titem: ToolbarItem,\n\t\tcontext: PluginContext,\n\t\tclose: (options?: PopupCloseOptions) => void,\n\t): void {\n\t\tconst closeAndFocusEditor = (): void => {\n\t\t\tclose({ restoreFocusTo: null });\n\t\t\tcontext.getContainer().focus();\n\t\t};\n\n\t\tswitch (item.popupType) {\n\t\t\tcase 'gridPicker':\n\t\t\t\trenderGridPicker(popup, item.popupConfig, closeAndFocusEditor, this.locale);\n\t\t\t\tbreak;\n\t\t\tcase 'dropdown':\n\t\t\t\trenderDropdown(\n\t\t\t\t\tpopup,\n\t\t\t\t\titem.popupConfig,\n\t\t\t\t\t(cmd: string) => context.executeCommand(cmd),\n\t\t\t\t\tcloseAndFocusEditor,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'custom':\n\t\t\t\titem.renderPopup(popup, context, close);\n\t\t\t\tbreak;\n\t\t\tcase 'combobox':\n\t\t\t\titem.renderPopup(popup, context, close);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// --- Button state ---\n\n\tprivate clearButtonState(): void {\n\t\tif (this.activePopupButton) {\n\t\t\tthis.activePopupButton.classList.remove('notectl-toolbar-btn--popup-open');\n\t\t\tthis.activePopupButton.setAttribute('aria-expanded', 'false');\n\t\t\tthis.activePopupButton = null;\n\t\t}\n\t}\n\n\t// --- Keyboard Navigation ---\n\n\tprivate handlePopupKeydown(e: KeyboardEvent): void {\n\t\tif (!this.activePopup) return;\n\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.closeAndRestoreFocus();\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\tthis.closeAndRestoreFocus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst menuItems: NodeListOf<Element> = this.activePopup.querySelectorAll('[role=\"menuitem\"]');\n\t\tif (menuItems.length > 0) {\n\t\t\tthis.handleDropdownKeydown(e, menuItems);\n\t\t\treturn;\n\t\t}\n\n\t\tconst hasGrid: boolean = this.activePopup.querySelector('.notectl-grid-picker__cell') !== null;\n\t\tif (hasGrid) {\n\t\t\tthis.handleGridKeydown(e);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.handleCustomPopupKeydown(e);\n\t}\n\n\tprivate handleDropdownKeydown(e: KeyboardEvent, items: NodeListOf<Element>): void {\n\t\tconst itemArr: HTMLElement[] = Array.from(items) as HTMLElement[];\n\t\tconst current: number = itemArr.indexOf(this.getActiveElement() as HTMLElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(itemArr, current, 1);\n\t\t\t\titemArr[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(itemArr, current, -1);\n\t\t\t\titemArr[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst focused: HTMLElement | undefined = itemArr[current];\n\t\t\t\tif (focused) focused.click();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleGridKeydown(e: KeyboardEvent): void {\n\t\tconst focused: HTMLElement = this.getActiveElement() as HTMLElement;\n\t\tconst row: number = Number(focused?.getAttribute('data-row') ?? 1);\n\t\tconst col: number = Number(focused?.getAttribute('data-col') ?? 1);\n\n\t\tconst grid: Element | null =\n\t\t\tthis.activePopup?.querySelector('.notectl-grid-picker__grid') ?? null;\n\t\tif (!grid) return;\n\n\t\tconst lastCell: Element | null = grid.querySelector('.notectl-grid-picker__cell:last-child');\n\t\tconst maxCols: number = Number(lastCell?.getAttribute('data-col') ?? 1);\n\t\tconst maxRows: number = Number(lastCell?.getAttribute('data-row') ?? 1);\n\n\t\tif (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\tconst [newRow, newCol]: [number, number] = navigateGrid(\n\t\t\t\trow,\n\t\t\t\tcol,\n\t\t\t\tmaxRows,\n\t\t\t\tmaxCols,\n\t\t\t\te.key as 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n\t\t\t\tthis.activePopup ? isRtlContext(this.activePopup) : false,\n\t\t\t);\n\t\t\tconst target: HTMLElement | null = grid.querySelector(\n\t\t\t\t`.notectl-grid-picker__cell[data-row=\"${newRow}\"][data-col=\"${newCol}\"]`,\n\t\t\t);\n\t\t\ttarget?.focus();\n\n\t\t\thighlightCells(grid as HTMLElement, newRow, newCol);\n\t\t\tconst label: Element | null =\n\t\t\t\tthis.activePopup?.querySelector('.notectl-grid-picker__label') ?? null;\n\t\t\tif (label) label.textContent = this.locale.gridPickerLabel(newRow, newCol);\n\t\t}\n\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\tfocused?.click();\n\t\t}\n\t}\n\n\tprivate handleCustomPopupKeydown(e: KeyboardEvent): void {\n\t\tif (!this.activePopup) return;\n\t\tconst buttons: HTMLButtonElement[] = Array.from(this.activePopup.querySelectorAll('button'));\n\t\tif (buttons.length === 0) return;\n\t\tconst active: HTMLElement = this.getActiveElement() as HTMLElement;\n\t\tconst currentIdx: number = buttons.indexOf(active as HTMLButtonElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(buttons, currentIdx, 1);\n\t\t\t\tbuttons[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(buttons, currentIdx, -1);\n\t\t\t\tbuttons[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tif (active) {\n\t\t\t\t\tactive.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true }));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * ToolbarTooltip: manages the tooltip lifecycle for toolbar buttons.\n * Shows a tooltip after a short delay when hovering or focusing a button,\n * hides it when the cursor leaves or focus moves away.\n */\n\nimport { setStyleProperties, setStyleProperty } from '../../style/StyleRuntime.js';\nimport type { ContainingBlockOffset } from '../shared/PopupPositioning.js';\nimport { measureContainingBlockOffset } from '../shared/PopupPositioning.js';\n\nconst TOOLTIP_DELAY_MS = 500;\n\nexport class ToolbarTooltip {\n\tprivate readonly element: HTMLElement;\n\tprivate timer: ReturnType<typeof setTimeout> | null = null;\n\tprivate target: HTMLButtonElement | null = null;\n\tprivate readonly isPopupActive: () => boolean;\n\n\tstatic readonly TOOLTIP_ID = 'notectl-toolbar-tooltip';\n\n\tconstructor(isPopupActive: () => boolean) {\n\t\tthis.isPopupActive = isPopupActive;\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'notectl-toolbar-tooltip';\n\t\tthis.element.id = ToolbarTooltip.TOOLTIP_ID;\n\t\tthis.element.setAttribute('role', 'tooltip');\n\t\tsetStyleProperty(this.element, 'display', 'none');\n\t}\n\n\tshow(button: HTMLButtonElement): void {\n\t\tthis.hide();\n\n\t\tif (this.isPopupActive() || button.disabled) return;\n\n\t\tconst text: string | null = button.getAttribute('data-tooltip');\n\t\tif (!text) return;\n\n\t\tthis.target = button;\n\n\t\tthis.timer = setTimeout(() => {\n\t\t\tif (this.isPopupActive()) return;\n\n\t\t\tthis.element.textContent = text;\n\t\t\tsetStyleProperty(this.element, 'display', '');\n\n\t\t\tconst root: Node = button.getRootNode();\n\t\t\tif (root instanceof ShadowRoot && !this.element.parentNode) {\n\t\t\t\troot.appendChild(this.element);\n\t\t\t} else if (!(root instanceof ShadowRoot) && !this.element.parentNode) {\n\t\t\t\tdocument.body.appendChild(this.element);\n\t\t\t}\n\n\t\t\tbutton.setAttribute('aria-describedby', ToolbarTooltip.TOOLTIP_ID);\n\n\t\t\tconst rect: DOMRect = button.getBoundingClientRect();\n\t\t\tsetStyleProperty(this.element, 'position', 'fixed');\n\t\t\tconst cbOffset: ContainingBlockOffset = measureContainingBlockOffset(this.element);\n\t\t\tsetStyleProperties(this.element, {\n\t\t\t\ttop: `${rect.bottom + 6 - cbOffset.y}px`,\n\t\t\t\tleft: `${rect.left + rect.width / 2 - cbOffset.x}px`,\n\t\t\t\ttransform: 'translateX(-50%)',\n\t\t\t});\n\t\t}, TOOLTIP_DELAY_MS);\n\t}\n\n\thide(): void {\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timer);\n\t\t\tthis.timer = null;\n\t\t}\n\t\tif (this.target) {\n\t\t\tthis.target.removeAttribute('aria-describedby');\n\t\t\tthis.target = null;\n\t\t}\n\t\tsetStyleProperty(this.element, 'display', 'none');\n\t}\n\n\tdestroy(): void {\n\t\tthis.hide();\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * Toolbar plugin: renders toolbar items registered by other plugins.\n * Acts as a pure rendering engine — has no knowledge of specific features.\n * Supports buttons, dropdowns, grid pickers, and custom popups.\n * Implements WAI-ARIA Toolbar pattern with roving tabindex.\n */\n\nimport { TOOLBAR_CSS } from '../../editor/styles/toolbar.js';\nimport { isRtlContext } from '../../platform/Platform.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport { ServiceKey } from '../Plugin.js';\nimport type { Plugin, PluginConfig, PluginContext } from '../Plugin.js';\nimport { applyRovingTabindex } from '../shared/KeyboardNav.js';\nimport { resolveLocale } from '../shared/PluginHelpers.js';\nimport { PopupManager, PopupServiceKey } from '../shared/PopupManager.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\nimport {\n\tfindFirstEnabled,\n\tfindLastEnabled,\n\tfindNextEnabled,\n\tresolveHorizontalDirection,\n} from './ToolbarKeyboardNav.js';\nimport { TOOLBAR_LOCALE_EN, type ToolbarLocale, loadToolbarLocale } from './ToolbarLocale.js';\nimport {\n\tToolbarOverflowBehavior,\n\ttype ToolbarOverflowBehavior as ToolbarOverflowBehaviorType,\n} from './ToolbarOverflowBehavior.js';\nimport { ToolbarOverflowController } from './ToolbarOverflowController.js';\nimport { ToolbarPopupController } from './ToolbarPopupController.js';\nimport { createSeparator } from './ToolbarRenderers.js';\nimport { ToolbarTooltip } from './ToolbarTooltip.js';\n\n// --- Layout Config ---\n\n/**\n * Configuration for a single toolbar group. Accepts either:\n * - A `ReadonlyArray<string>` of plugin ids (backwards-compatible tuple form), or\n * - An object with `plugins` and an optional accessible `label`. When `label` is set,\n * the group wrapper receives `role=\"group\"` and `aria-label`, so assistive technology\n * can announce the cluster by name.\n */\nexport type ToolbarGroupConfig =\n\t| ReadonlyArray<string>\n\t| {\n\t\t\treadonly plugins: ReadonlyArray<string>;\n\t\t\treadonly label?: string;\n\t };\n\nexport interface ToolbarLayoutConfig {\n\treadonly groups: ReadonlyArray<ToolbarGroupConfig>;\n\t/**\n\t * Controls responsive overflow behavior when toolbar items exceed available width.\n\t * Defaults to `ToolbarOverflowBehavior.BurgerMenu`.\n\t */\n\treadonly overflow?: ToolbarOverflowBehaviorType;\n}\n\ninterface NormalizedGroup {\n\treadonly plugins: ReadonlyArray<string>;\n\treadonly label: string | undefined;\n}\n\nfunction normalizeGroupConfig(group: ToolbarGroupConfig): NormalizedGroup {\n\tif (Array.isArray(group)) {\n\t\treturn { plugins: group, label: undefined };\n\t}\n\tconst obj: { readonly plugins: ReadonlyArray<string>; readonly label?: string } = group as {\n\t\treadonly plugins: ReadonlyArray<string>;\n\t\treadonly label?: string;\n\t};\n\treturn { plugins: obj.plugins, label: obj.label };\n}\n\n// --- Typed Service API ---\n\nexport interface ToolbarServiceAPI {\n\t/** Re-reads isActive/isEnabled from state and updates all buttons. */\n\trefresh(): void;\n\t/** Closes the currently open popup, if any. */\n\tclosePopup(): void;\n}\n\nexport const ToolbarServiceKey = new ServiceKey<ToolbarServiceAPI>('toolbar');\n\n// --- Plugin ---\n\ninterface ToolbarButton {\n\telement: HTMLButtonElement;\n\titem: ToolbarItem;\n\tcomboLabelEl: HTMLSpanElement | null;\n}\n\nexport class ToolbarPlugin implements Plugin {\n\treadonly id = 'toolbar';\n\treadonly name = 'Toolbar';\n\treadonly priority = 10;\n\n\tprivate context: PluginContext | null = null;\n\tprivate toolbarElement: HTMLElement | null = null;\n\tprivate buttons: ToolbarButton[] = [];\n\tprivate readonly hiddenItems = new Set<string>();\n\tprivate readonly layoutConfig: ToolbarLayoutConfig | null;\n\tprivate overflowBehavior: ToolbarOverflowBehaviorType;\n\tprivate focusedIndex = 0;\n\tprivate tooltip: ToolbarTooltip | null = null;\n\tprivate popupController: ToolbarPopupController | null = null;\n\tprivate popupManager: PopupManager | null = null;\n\tprivate overflowController: ToolbarOverflowController | null = null;\n\tprivate visibleElements: HTMLButtonElement[] = [];\n\tprivate locale!: ToolbarLocale;\n\n\tconstructor(layoutConfig?: ToolbarLayoutConfig) {\n\t\tthis.layoutConfig = layoutConfig ?? null;\n\t\tthis.overflowBehavior = layoutConfig?.overflow ?? ToolbarOverflowBehavior.BurgerMenu;\n\t}\n\n\tasync init(context: PluginContext): Promise<void> {\n\t\tthis.locale = await resolveLocale(context, undefined, TOOLBAR_LOCALE_EN, loadToolbarLocale);\n\t\tcontext.registerStyleSheet(TOOLBAR_CSS);\n\t\tthis.context = context;\n\n\t\tthis.popupManager = new PopupManager(context.getContainer());\n\t\tcontext.registerService(PopupServiceKey, this.popupManager);\n\n\t\tthis.popupController = new ToolbarPopupController(() => this.getActiveElement(), this.locale);\n\t\tthis.popupController.setPopupManager(this.popupManager);\n\t\tthis.tooltip = new ToolbarTooltip(() => this.popupController?.isOpen() ?? false);\n\n\t\tcontext.registerService(ToolbarServiceKey, {\n\t\t\trefresh: () => this.updateButtonStates(context.getState()),\n\t\t\tclosePopup: () => this.popupController?.close(),\n\t\t});\n\n\t\tthis.createToolbarElement();\n\t}\n\n\t/** Returns the current overflow behavior. */\n\tgetOverflowBehavior(): ToolbarOverflowBehaviorType {\n\t\treturn this.overflowBehavior;\n\t}\n\n\t/** Switches the overflow behavior at runtime. */\n\tsetOverflowBehavior(behavior: ToolbarOverflowBehaviorType): void {\n\t\tif (behavior === this.overflowBehavior) return;\n\n\t\tthis.overflowBehavior = behavior;\n\t\tthis.applyOverflowBehavior();\n\t\tthis.renderItems();\n\t}\n\n\tonReady(): void {\n\t\tthis.renderItems();\n\t}\n\n\tdestroy(): void {\n\t\tthis.overflowController?.destroy();\n\t\tthis.overflowController = null;\n\t\tthis.popupController?.destroy();\n\t\tthis.popupController = null;\n\t\tthis.popupManager?.destroy();\n\t\tthis.popupManager = null;\n\t\tthis.tooltip?.destroy();\n\t\tthis.tooltip = null;\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.remove();\n\t\t\tthis.toolbarElement = null;\n\t\t}\n\t\tthis.buttons = [];\n\t\tthis.visibleElements = [];\n\t\tthis.context = null;\n\t}\n\n\tonStateChange(_oldState: EditorState, newState: EditorState, _tr: Transaction): void {\n\t\tthis.updateButtonStates(newState);\n\t}\n\n\tonReadOnlyChange(readonly: boolean): void {\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.hidden = readonly;\n\t\t}\n\t}\n\n\tonConfigure(config: PluginConfig): void {\n\t\tfor (const [key, value] of Object.entries(config)) {\n\t\t\tif (value === false) {\n\t\t\t\tthis.hiddenItems.add(key);\n\t\t\t} else {\n\t\t\t\tthis.hiddenItems.delete(key);\n\t\t\t}\n\t\t}\n\t\tthis.renderItems();\n\t}\n\n\t// --- Toolbar ---\n\n\tprivate createToolbarElement(): void {\n\t\tif (!this.context) return;\n\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.remove();\n\t\t}\n\t\tthis.buttons = [];\n\n\t\tconst container: HTMLElement = this.context.getPluginContainer('top');\n\t\tthis.toolbarElement = document.createElement('div');\n\t\tthis.toolbarElement.setAttribute('role', 'toolbar');\n\t\tthis.toolbarElement.setAttribute('aria-label', this.locale.formattingOptionsAria);\n\t\tthis.toolbarElement.setAttribute('data-notectl-no-print', '');\n\t\tthis.toolbarElement.setAttribute('part', 'toolbar');\n\t\tthis.toolbarElement.className = 'notectl-toolbar';\n\n\t\tthis.toolbarElement.addEventListener('keydown', (e) => this.handleToolbarKeydown(e));\n\n\t\tthis.applyOverflowBehavior();\n\t\tcontainer.appendChild(this.toolbarElement);\n\t}\n\n\t/** Applies the current overflow behavior: creates/destroys the overflow controller and sets the data attribute. */\n\tprivate applyOverflowBehavior(): void {\n\t\tif (!this.toolbarElement || !this.context) return;\n\n\t\t// Tear down existing overflow controller\n\t\tthis.overflowController?.destroy();\n\t\tthis.overflowController = null;\n\n\t\tthis.toolbarElement.setAttribute('data-overflow', this.overflowBehavior);\n\n\t\tif (this.overflowBehavior === ToolbarOverflowBehavior.BurgerMenu) {\n\t\t\tthis.overflowController = new ToolbarOverflowController({\n\t\t\t\ttoolbar: this.toolbarElement,\n\t\t\t\tariaLabel: this.locale.moreToolsAria,\n\t\t\t\tcontext: this.context,\n\t\t\t\tpopupManager: this.popupManager ?? undefined,\n\t\t\t\tonOverflowChange: (visibleButtons, overflowBtn) => {\n\t\t\t\t\tthis.visibleElements = overflowBtn\n\t\t\t\t\t\t? [...visibleButtons, overflowBtn]\n\t\t\t\t\t\t: [...visibleButtons];\n\t\t\t\t\tthis.initRovingTabindex();\n\t\t\t\t},\n\t\t\t\tonItemActivated: (btn: HTMLButtonElement, item: ToolbarItem) => {\n\t\t\t\t\tthis.activateButton(btn, item);\n\t\t\t\t},\n\t\t\t\tgetActiveElement: () => this.getActiveElement(),\n\t\t\t});\n\t\t} else {\n\t\t\t// Flow and None modes: all buttons are visible for roving tabindex\n\t\t\tthis.visibleElements = [];\n\t\t}\n\t}\n\n\tprivate renderItems(): void {\n\t\tif (!this.context || !this.toolbarElement) return;\n\n\t\tfor (const btn of this.buttons) {\n\t\t\tbtn.element.remove();\n\t\t}\n\t\tthis.buttons = [];\n\n\t\tfor (const sep of this.toolbarElement.querySelectorAll('.notectl-toolbar-separator')) {\n\t\t\tsep.remove();\n\t\t}\n\t\tfor (const grp of this.toolbarElement.querySelectorAll('.notectl-toolbar-group')) {\n\t\t\tgrp.remove();\n\t\t}\n\n\t\tif (this.layoutConfig) {\n\t\t\tthis.renderItemsByLayout();\n\t\t} else {\n\t\t\tthis.renderItemsByGroup();\n\t\t}\n\n\t\tif (this.buttons.length > 0 && !this.toolbarElement.parentElement) {\n\t\t\tconst container: HTMLElement = this.context.getPluginContainer('top');\n\t\t\tcontainer.appendChild(this.toolbarElement);\n\t\t}\n\n\t\tthis.overflowController?.update(this.buttons);\n\t\tthis.initRovingTabindex();\n\t\tthis.updateButtonStates(this.context.getState());\n\t}\n\n\tprivate createGroupWrapper(label: string | undefined): HTMLDivElement {\n\t\tconst wrapper: HTMLDivElement = document.createElement('div');\n\t\twrapper.className = 'notectl-toolbar-group';\n\t\twrapper.setAttribute('part', 'toolbar-group');\n\t\tif (label !== undefined) {\n\t\t\twrapper.setAttribute('role', 'group');\n\t\t\twrapper.setAttribute('aria-label', label);\n\t\t}\n\t\treturn wrapper;\n\t}\n\n\t// --- Roving Tabindex ---\n\n\tprivate getTabElements(): HTMLButtonElement[] {\n\t\treturn this.visibleElements.length > 0\n\t\t\t? this.visibleElements\n\t\t\t: this.buttons.map((b) => b.element);\n\t}\n\n\tprivate initRovingTabindex(): void {\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tconst first: number = findFirstEnabled(elements);\n\t\tthis.focusedIndex = first >= 0 ? first : 0;\n\t\tapplyRovingTabindex(elements, this.focusedIndex);\n\t}\n\n\tprivate setRovingFocus(index: number): void {\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tif (index < 0 || index >= elements.length) return;\n\t\tthis.focusedIndex = index;\n\t\tapplyRovingTabindex(elements, index);\n\t\telements[index]?.focus();\n\t}\n\n\t/** Returns the active element, respecting shadow DOM boundaries. */\n\tprivate getActiveElement(): Element | null {\n\t\tconst root: Node | undefined = this.toolbarElement?.getRootNode();\n\t\tif (root instanceof ShadowRoot) {\n\t\t\treturn root.activeElement;\n\t\t}\n\t\treturn document.activeElement;\n\t}\n\n\tprivate syncFocusedIndex(): void {\n\t\tconst active: Element | null = this.getActiveElement();\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tconst idx: number = elements.findIndex((el) => el === active);\n\t\tif (idx >= 0) {\n\t\t\tthis.focusedIndex = idx;\n\t\t}\n\t}\n\n\t// --- Toolbar Keyboard ---\n\n\tprivate handleToolbarKeydown(e: KeyboardEvent): void {\n\t\tconst elements: HTMLButtonElement[] = this.getTabElements();\n\t\tif (elements.length === 0) return;\n\n\t\tthis.syncFocusedIndex();\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowLeft': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst rtl: boolean = this.toolbarElement ? isRtlContext(this.toolbarElement) : false;\n\t\t\t\tconst dir: 1 | -1 = resolveHorizontalDirection(e.key, rtl);\n\t\t\t\tconst next: number = findNextEnabled(elements, this.focusedIndex, dir);\n\t\t\t\tthis.setRovingFocus(next);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Home': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst first: number = findFirstEnabled(elements);\n\t\t\t\tif (first >= 0) this.setRovingFocus(first);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'End': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst last: number = findLastEnabled(elements);\n\t\t\t\tif (last >= 0) this.setRovingFocus(last);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst focused: HTMLButtonElement | undefined = elements[this.focusedIndex];\n\t\t\t\tconst btn: ToolbarButton | undefined = this.buttons.find((b) => b.element === focused);\n\t\t\t\tif (btn) this.activateButton(btn.element, btn.item);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Activates a toolbar button (shared between mouse click and keyboard). */\n\tprivate activateButton(btn: HTMLButtonElement, item: ToolbarItem): void {\n\t\tthis.tooltip?.hide();\n\t\tif (item.popupType && this.context) {\n\t\t\tthis.popupController?.toggle(btn, item, this.context);\n\t\t} else {\n\t\t\tthis.context?.executeCommand(item.command);\n\t\t}\n\t}\n\n\t// --- Layout Rendering ---\n\n\tprivate renderItemsByLayout(): void {\n\t\tif (!this.context || !this.toolbarElement || !this.layoutConfig) return;\n\n\t\tconst toolbarReg = this.context.getToolbarRegistry();\n\t\tlet firstGroup = true;\n\n\t\tfor (const rawGroup of this.layoutConfig.groups) {\n\t\t\tconst { plugins, label }: NormalizedGroup = normalizeGroupConfig(rawGroup);\n\t\t\tconst groupItems: ToolbarItem[] = [];\n\t\t\tfor (const pId of plugins) {\n\t\t\t\tconst items: ToolbarItem[] = toolbarReg\n\t\t\t\t\t.getToolbarItemsByPlugin(pId)\n\t\t\t\t\t.filter((item) => !this.hiddenItems.has(item.id));\n\t\t\t\tgroupItems.push(...items);\n\t\t\t}\n\n\t\t\tif (groupItems.length === 0) continue;\n\n\t\t\tif (!firstGroup) {\n\t\t\t\tthis.toolbarElement.appendChild(createSeparator());\n\t\t\t}\n\t\t\tfirstGroup = false;\n\n\t\t\tconst wrapper: HTMLDivElement = this.createGroupWrapper(label);\n\t\t\tfor (const item of groupItems) {\n\t\t\t\tconst btn: ToolbarButton = this.createButton(item);\n\t\t\t\twrapper.appendChild(btn.element);\n\t\t\t\tthis.buttons.push(btn);\n\t\t\t}\n\t\t\tthis.toolbarElement.appendChild(wrapper);\n\t\t}\n\n\t\tif (this.buttons.length === 0) {\n\t\t\tthis.toolbarElement.remove();\n\t\t}\n\t}\n\n\tprivate renderItemsByGroup(): void {\n\t\tif (!this.context || !this.toolbarElement) return;\n\n\t\tconst toolbarRegistry = this.context.getToolbarRegistry();\n\t\tconst items: ToolbarItem[] = toolbarRegistry\n\t\t\t.getToolbarItems()\n\t\t\t.filter((item) => !this.hiddenItems.has(item.id));\n\t\tif (items.length === 0) {\n\t\t\tthis.toolbarElement.remove();\n\t\t\treturn;\n\t\t}\n\n\t\tconst groups = new Map<string, ToolbarItem[]>();\n\t\tfor (const item of items) {\n\t\t\tconst list: ToolbarItem[] = groups.get(item.group) ?? [];\n\t\t\tlist.push(item);\n\t\t\tgroups.set(item.group, list);\n\t\t}\n\n\t\tlet firstGroup = true;\n\t\tfor (const [, groupItems] of groups) {\n\t\t\tif (!firstGroup) {\n\t\t\t\tthis.toolbarElement.appendChild(createSeparator());\n\t\t\t}\n\t\t\tfirstGroup = false;\n\n\t\t\tconst wrapper: HTMLDivElement = this.createGroupWrapper(undefined);\n\t\t\tfor (const item of groupItems) {\n\t\t\t\tconst btn: ToolbarButton = this.createButton(item);\n\t\t\t\twrapper.appendChild(btn.element);\n\t\t\t\tthis.buttons.push(btn);\n\t\t\t}\n\t\t\tthis.toolbarElement.appendChild(wrapper);\n\t\t}\n\t}\n\n\t// --- Button Creation ---\n\n\tprivate createButton(item: ToolbarItem): ToolbarButton {\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = `notectl-toolbar-btn notectl-toolbar-btn--${item.id}`;\n\t\tbtn.setAttribute('aria-pressed', 'false');\n\t\tbtn.setAttribute('aria-label', item.label);\n\t\tbtn.setAttribute('data-toolbar-item', item.id);\n\t\tbtn.setAttribute('data-tooltip', item.tooltip ?? item.label);\n\t\tbtn.setAttribute('part', 'toolbar-button');\n\n\t\tlet comboLabelEl: HTMLSpanElement | null = null;\n\n\t\tif (item.popupType === 'combobox') {\n\t\t\tbtn.setAttribute('role', 'combobox');\n\t\t\tbtn.setAttribute('aria-haspopup', 'listbox');\n\t\t\tbtn.setAttribute('aria-expanded', 'false');\n\n\t\t\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\t\t\tlabelSpan.className = 'notectl-toolbar-combobox__label';\n\t\t\tconst state: EditorState | undefined = this.context?.getState();\n\t\t\tif (state) {\n\t\t\t\tlabelSpan.textContent = item.getLabel(state);\n\t\t\t}\n\t\t\tbtn.appendChild(labelSpan);\n\t\t\tcomboLabelEl = labelSpan;\n\n\t\t\tconst arrowSpan: HTMLSpanElement = document.createElement('span');\n\t\t\tarrowSpan.className = 'notectl-toolbar-combobox__arrow';\n\t\t\tarrowSpan.setAttribute('aria-hidden', 'true');\n\t\t\tarrowSpan.textContent = '\\u25BE';\n\t\t\tbtn.appendChild(arrowSpan);\n\t\t} else {\n\t\t\tif (item.popupType) {\n\t\t\t\tbtn.setAttribute('aria-haspopup', 'true');\n\t\t\t\tbtn.setAttribute('aria-expanded', 'false');\n\t\t\t}\n\n\t\t\tconst span: HTMLSpanElement = document.createElement('span');\n\t\t\tspan.className = 'notectl-toolbar-btn__icon';\n\t\t\tspan.innerHTML = item.icon;\n\t\t\tbtn.appendChild(span);\n\t\t}\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\tthis.activateButton(btn, item);\n\t\t});\n\n\t\tbtn.addEventListener('mouseenter', () => this.tooltip?.show(btn));\n\t\tbtn.addEventListener('mouseleave', () => this.tooltip?.hide());\n\t\tbtn.addEventListener('focus', () => this.tooltip?.show(btn));\n\t\tbtn.addEventListener('blur', () => this.tooltip?.hide());\n\n\t\treturn { element: btn, item, comboLabelEl };\n\t}\n\n\t// --- Button State Updates ---\n\n\tprivate updateButtonStates(state: EditorState): void {\n\t\tfor (const btn of this.buttons) {\n\t\t\tconst active: boolean = btn.item.isActive?.(state) ?? false;\n\t\t\tconst enabled: boolean = btn.item.isEnabled?.(state) ?? true;\n\t\t\tbtn.element.setAttribute('aria-pressed', String(active));\n\t\t\tbtn.element.classList.toggle('notectl-toolbar-btn--active', active);\n\t\t\t// Modifier part mirrors active state for ::part() targeting from outside the shadow root.\n\t\t\t// Kept in sync with aria-pressed — never drift these apart.\n\t\t\tbtn.element.setAttribute(\n\t\t\t\t'part',\n\t\t\t\tactive ? 'toolbar-button toolbar-button-active' : 'toolbar-button',\n\t\t\t);\n\t\t\tbtn.element.disabled = !enabled;\n\t\t\tif (!enabled) {\n\t\t\t\tbtn.element.setAttribute('aria-disabled', 'true');\n\t\t\t} else {\n\t\t\t\tbtn.element.removeAttribute('aria-disabled');\n\t\t\t}\n\t\t\tif (btn.comboLabelEl && btn.item.popupType === 'combobox') {\n\t\t\t\tbtn.comboLabelEl.textContent = btn.item.getLabel(state);\n\t\t\t}\n\t\t\tif (btn.item.getIcon) {\n\t\t\t\tconst newIcon: string = btn.item.getIcon(state);\n\t\t\t\tconst iconEl: HTMLSpanElement | null = btn.element.querySelector(\n\t\t\t\t\t'.notectl-toolbar-btn__icon',\n\t\t\t\t);\n\t\t\t\tif (iconEl && iconEl.innerHTML !== newIcon) {\n\t\t\t\t\ticonEl.innerHTML = newIcon;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.overflowController?.updateItemStates(state);\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{d as n,h as e}from"./Document-DJmYYuBx.mjs";var t="undefined"!=typeof Intl&&"Segmenter"in Intl?new Intl.Segmenter(void 0,{granularity:"grapheme"}):null;function r(n,e){if(e>=n.length||0===n.length)return 0;if(t){for(const r of t.segment(n))if(r.index>=e)return r.segment.length;return 0}return 1}function i(n,e){if(e<=0||0===n.length)return 0;if(t){let r=1;for(const i of t.segment(n)){if(i.index+i.segment.length>=e){r=i.segment.length;break}r=i.segment.length}return r}return 1}function f(n,t){let r=t-1;for(;r>=0;){const t=e(n,r);if(!t||"inline"===t.kind)break;if(!/\s/.test(t.char))break;r--}if(r>=0&&"inline"===e(n,r)?.kind)return r;for(;r>=0;){const t=e(n,r);if(!t||"inline"===t.kind)break;if(/\s/.test(t.char))break;r--}return r+1}function s(t,r){const i=n(t);let f=r;for(;f<i;){const n=e(t,f);if(!n||"inline"===n.kind)break;if(/\s/.test(n.char))break;f++}if(f===r&&f<i&&"inline"===e(t,f)?.kind)return f+1;for(;f<i;){const n=e(t,f);if(!n||"inline"===n.kind)break;if(!/\s/.test(n.char))break;f++}return f}export{i,s as n,r,f as t};
2
+ //# sourceMappingURL=WordBoundary-Cz2bSRAU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WordBoundary-Cz2bSRAU.mjs","names":[],"sources":["../../src/model/GraphemeUtils.ts","../../src/model/WordBoundary.ts"],"sourcesContent":["/**\n * Grapheme-cluster utilities for correct character navigation.\n *\n * Uses `Intl.Segmenter` (with `granularity: 'grapheme'`) to correctly\n * handle multi-code-unit characters such as emoji, ZWJ sequences, and\n * combining characters. Falls back to +1/-1 when `Intl.Segmenter` is\n * not available.\n */\n\nconst SEGMENTER_SUPPORTED: boolean = typeof Intl !== 'undefined' && 'Segmenter' in Intl;\nconst SEGMENTER: Intl.Segmenter | null = SEGMENTER_SUPPORTED\n\t? new Intl.Segmenter(undefined, { granularity: 'grapheme' })\n\t: null;\n\n/**\n * Returns the number of UTF-16 code units in the next grapheme cluster\n * starting at `offset`. Returns 0 if `offset` is at or past the end.\n */\nexport function nextGraphemeSize(text: string, offset: number): number {\n\tif (offset >= text.length || text.length === 0) return 0;\n\n\tif (SEGMENTER) {\n\t\tfor (const segment of SEGMENTER.segment(text)) {\n\t\t\tif (segment.index >= offset) {\n\t\t\t\treturn segment.segment.length;\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t}\n\n\treturn 1;\n}\n\n/**\n * Returns the number of UTF-16 code units in the grapheme cluster\n * immediately before `offset`. Returns 0 if `offset` is 0 or the\n * string is empty.\n */\nexport function prevGraphemeSize(text: string, offset: number): number {\n\tif (offset <= 0 || text.length === 0) return 0;\n\n\tif (SEGMENTER) {\n\t\tlet lastSize = 1;\n\t\tfor (const segment of SEGMENTER.segment(text)) {\n\t\t\tif (segment.index + segment.segment.length >= offset) {\n\t\t\t\tlastSize = segment.segment.length;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlastSize = segment.segment.length;\n\t\t}\n\t\treturn lastSize;\n\t}\n\n\treturn 1;\n}\n","/**\n * Word boundary detection for delete-word and word-movement commands.\n * InlineNodes act as word boundaries.\n */\n\nimport { type BlockNode, getBlockLength, getContentAtOffset } from './Document.js';\n\n/**\n * Finds the word boundary backward from the given offset.\n * InlineNodes act as word boundaries.\n */\nexport function findWordBoundaryBackward(block: BlockNode, offset: number): number {\n\tlet pos = offset - 1;\n\t// Skip trailing whitespace\n\twhile (pos >= 0) {\n\t\tconst content = getContentAtOffset(block, pos);\n\t\tif (!content || content.kind === 'inline') break;\n\t\tif (!/\\s/.test(content.char)) break;\n\t\tpos--;\n\t}\n\t// If at InlineNode, delete just it (treat as word boundary)\n\tif (pos >= 0) {\n\t\tconst content = getContentAtOffset(block, pos);\n\t\tif (content?.kind === 'inline') return pos;\n\t}\n\t// Skip word characters until whitespace or InlineNode\n\twhile (pos >= 0) {\n\t\tconst content = getContentAtOffset(block, pos);\n\t\tif (!content || content.kind === 'inline') break;\n\t\tif (/\\s/.test(content.char)) break;\n\t\tpos--;\n\t}\n\treturn pos + 1;\n}\n\n/**\n * Finds the word boundary forward from the given offset.\n * InlineNodes act as word boundaries.\n */\nexport function findWordBoundaryForward(block: BlockNode, offset: number): number {\n\tconst len = getBlockLength(block);\n\tlet pos = offset;\n\t// Skip word characters first\n\twhile (pos < len) {\n\t\tconst content = getContentAtOffset(block, pos);\n\t\tif (!content || content.kind === 'inline') break;\n\t\tif (/\\s/.test(content.char)) break;\n\t\tpos++;\n\t}\n\t// If at InlineNode and haven't moved, delete just the InlineNode\n\tif (pos === offset && pos < len) {\n\t\tconst content = getContentAtOffset(block, pos);\n\t\tif (content?.kind === 'inline') return pos + 1;\n\t}\n\t// Skip trailing whitespace\n\twhile (pos < len) {\n\t\tconst content = getContentAtOffset(block, pos);\n\t\tif (!content || content.kind === 'inline') break;\n\t\tif (!/\\s/.test(content.char)) break;\n\t\tpos++;\n\t}\n\treturn pos;\n}\n"],"mappings":"mDAUA,IAAM,EAD+C,oBAAT,MAAwB,cAAe,KAEhF,IAAI,KAAK,eAAU,EAAW,CAAE,YAAa,aAC7C,KAMH,SAAgB,EAAiB,EAAc,GAC9C,GAAI,GAAU,EAAK,QAA0B,IAAhB,EAAK,OAAc,OAAO,EAEvD,GAAI,EAAW,CACd,IAAK,MAAM,KAAW,EAAU,QAAQ,GACvC,GAAI,EAAQ,OAAS,EACpB,OAAO,EAAQ,QAAQ,OAGzB,OAAO,EAGR,OAAO,EAQR,SAAgB,EAAiB,EAAc,GAC9C,GAAI,GAAU,GAAqB,IAAhB,EAAK,OAAc,OAAO,EAE7C,GAAI,EAAW,CACd,IAAI,EAAW,EACf,IAAK,MAAM,KAAW,EAAU,QAAQ,GAAO,CAC9C,GAAI,EAAQ,MAAQ,EAAQ,QAAQ,QAAU,EAAQ,CACrD,EAAW,EAAQ,QAAQ,OAC3B,MAED,EAAW,EAAQ,QAAQ,OAE5B,OAAO,EAGR,OAAO,EC1CR,SAAgB,EAAyB,EAAkB,GAC1D,IAAI,EAAM,EAAS,EAEnB,KAAO,GAAO,GAAG,CAChB,MAAM,EAAU,EAAmB,EAAO,GAC1C,IAAK,GAA4B,WAAjB,EAAQ,KAAmB,MAC3C,IAAK,KAAK,KAAK,EAAQ,MAAO,MAC9B,IAGD,GAAI,GAAO,GAEY,WADN,EAAmB,EAAO,IAC7B,KAAmB,OAAO,EAGxC,KAAO,GAAO,GAAG,CAChB,MAAM,EAAU,EAAmB,EAAO,GAC1C,IAAK,GAA4B,WAAjB,EAAQ,KAAmB,MAC3C,GAAI,KAAK,KAAK,EAAQ,MAAO,MAC7B,IAED,OAAO,EAAM,EAOd,SAAgB,EAAwB,EAAkB,GACzD,MAAM,EAAM,EAAe,GAC3B,IAAI,EAAM,EAEV,KAAO,EAAM,GAAK,CACjB,MAAM,EAAU,EAAmB,EAAO,GAC1C,IAAK,GAA4B,WAAjB,EAAQ,KAAmB,MAC3C,GAAI,KAAK,KAAK,EAAQ,MAAO,MAC7B,IAGD,GAAI,IAAQ,GAAU,EAAM,GAEL,WADN,EAAmB,EAAO,IAC7B,KAAmB,OAAO,EAAM,EAG9C,KAAO,EAAM,GAAK,CACjB,MAAM,EAAU,EAAmB,EAAO,GAC1C,IAAK,GAA4B,WAAjB,EAAQ,KAAmB,MAC3C,IAAK,KAAK,KAAK,EAAQ,MAAO,MAC9B,IAED,OAAO"}
@@ -0,0 +1,2 @@
1
+ import{n as t}from"./TypedKeys-CU7aToqY.mjs";import{n,t as e}from"./XmlPatterns-B-V-mHF4.mjs";var s=new t("languageRegistry");function*o(t,n){let e=0;for(;e<t.length;){let s=!1;for(const o of n.patterns){o.pattern.lastIndex=e;const n=o.pattern.exec(t);if(n&&n.index===e&&n[0].length>0){const t=n[0].length;yield{type:o.type,from:e,to:e+t},e+=t,s=!0;break}}s||e++}}var r={keyword:1,function:.9,type:1,annotation:1.5,property:1.2,tag:1.5,attribute:1.5,constant:.8,string:.4,number:.4,boolean:.6,null:.6,regex:.8,comment:.3,operator:.1,punctuation:.1},i=1.5;function a(t,n,e=r){const s=t.length;if(0===s)return{totalBytes:0,nonWhitespaceBytes:0,recognizedBytes:0,unknownBytes:0,tokenCount:0,weightedScore:0};const i=e.punctuation??0;let a=0,c=0,u=0;for(const r of o(t,n)){const t=r.to-r.from;a+=t,u++,c+=t*(e[r.type]??i)}return{totalBytes:s,nonWhitespaceBytes:l(t),recognizedBytes:a,unknownBytes:s-a,tokenCount:u,weightedScore:c}}function l(t){let n=0;for(let e=0;e<t.length;e++){const s=t.charCodeAt(e);32!==s&&9!==s&&10!==s&&13!==s&&n++}return n}function c(t){if(0===t.nonWhitespaceBytes)return 0;return n=.7*(t.recognizedBytes/t.nonWhitespaceBytes)+.3*(t.weightedScore/t.nonWhitespaceBytes/1.5),Math.max(0,Math.min(1,n));var n}var u=class{id;constructor(t,n={}){this.language=t,this.options=n,this.id=t.name}detect(t){const n=this.options.maxLength??1e5;if(t.length>n)return null;const e=t.trim(),s=this.options.minLines??2;if(e.split("\n").filter(t=>t.trim().length>0).length<s)return null;const o=c(a(e,this.language,this.options.weights)),r=this.matchesAnySignature(e)?this.options.signatureBonus??.3:0,i=Math.min(1,o+r);return i<(this.options.minConfidence??.35)?null:{language:this.language.name,formattedText:e,confidence:i}}matchesAnySignature(t){const n=this.options.signatures??[];for(const e of n)if(e.test(t))return!0;return!1}},h=class{id="json";detect(t){const n=t.trim();if(!n.startsWith("{")&&!n.startsWith("["))return null;try{const t=JSON.parse(n);if("object"!=typeof t||null===t)return null;const e=JSON.stringify(t,null,2);return e.length<=5?null:{language:"json",formattedText:e,confidence:.9}}catch{return null}}},g=/^(<\?[\s\S]*?\?>\s*)+/,f=new RegExp(`^<${n}${e}\\/?>`),p=new RegExp(["<\\?[^?]*\\?>","\x3c!--[\\s\\S]*?--\x3e","<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",`<\\/(${n})>`,`<(${n})${e}\\/>`,`<(${n})${e}>`].join("|"),"g"),m=new RegExp(`<\\/${n}>\\s*$`),d=class{id="xml";detect(t){const n=t.trim();if(!n.startsWith("<"))return null;const e=n.replace(g,"");if(!f.test(e))return null;if(!this.isWellFormed(n))return null;const s=this.formatXml(n);return s.length<=10?null:{language:"xml",formattedText:s,confidence:.85}}isWellFormed(t){const n=[];let e=!1;p.lastIndex=0;let s=p.exec(t);for(;s;){const o=s[1],r=s[2],i=s[3];if(o){if(0===n.length||n[n.length-1]!==o)return!1;n.pop(),e=!0}else r?e=!0:i&&(n.push(i),e=!0);s=p.exec(t)}return e&&0===n.length}formatXml(t){const n=this.splitIntoTokens(t),e=[];let s=0;for(const o of n){const t=y[x(o)];"decrease"===t&&(s=Math.max(0,s-1)),e.push(" ".repeat(2*s)+o),"increase"===t&&s++}return e.join("\n")}splitIntoTokens(t){return t.replace(/>\s*</g,">\n<").split("\n").map(t=>t.trim()).filter(t=>t.length>0)}},y={pi:"none",comment:"none",cdata:"none",closing:"decrease",selfClosing:"none",inline:"none",opening:"increase",text:"none"};function x(t){return t.startsWith("<?")?"pi":t.startsWith("\x3c!--")?"comment":t.startsWith("<![CDATA[")?"cdata":t.startsWith("</")?"closing":t.endsWith("/>")?"selfClosing":t.startsWith("<")&&m.test(t)?"inline":t.startsWith("<")?"opening":"text"}export{r as a,o as c,c as i,s as l,h as n,i as o,u as r,a as s,d as t};
2
+ //# sourceMappingURL=XmlDetector-DM-Vv-XW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlDetector-DM-Vv-XW.mjs","names":[],"sources":["../../src/plugins/language/LanguageTypes.ts","../../src/plugins/code-block/highlighter/TokenIteration.ts","../../src/plugins/smart-paste/detectors/TokenStats.ts","../../src/plugins/smart-paste/detectors/DetectionScorer.ts","../../src/plugins/smart-paste/detectors/LexerDetector.ts","../../src/plugins/smart-paste/detectors/JsonDetector.ts","../../src/plugins/smart-paste/detectors/XmlDetector.ts"],"sourcesContent":["/**\n * Unified language support types for programming language registration.\n *\n * Bundles syntax highlighting and paste detection into a single\n * registration unit so that all artifacts for one language live together.\n */\n\nimport { ServiceKey } from '../Plugin.js';\nimport type { LanguageDefinition } from '../code-block/highlighter/TokenizerTypes.js';\nimport type { ContentDetector } from '../smart-paste/SmartPasteTypes.js';\n\n/**\n * Unified language support bundle grouping all artifacts for one\n * programming language: syntax highlighting, paste detection, and\n * (optionally) code formatting.\n *\n * Pass to `LanguageRegistryService.register()` to make a language\n * available across all participating plugins in a single call.\n */\nexport interface LanguageSupport {\n\t/** Canonical lowercase identifier (e.g. `'java'`, `'python'`). */\n\treadonly id: string;\n\n\t/** Human-readable name shown in the language picker (e.g. `'Java'`). */\n\treadonly displayName: string;\n\n\t/** Alternative names accepted as aliases (e.g. `['py', 'py3']`). */\n\treadonly aliases?: readonly string[];\n\n\t/** Syntax highlighting token patterns for the RegexTokenizer. */\n\treadonly highlighting?: LanguageDefinition;\n\n\t/** Smart-paste detector for auto-detecting this language in pasted text. */\n\treadonly detection?: ContentDetector;\n\n\t/**\n\t * Code formatter for reformatting code block content on demand.\n\t * @experimental Not yet consumed by any built-in plugin.\n\t */\n\treadonly formatter?: CodeFormatter;\n}\n\n/**\n * Formatter that can reformat source code.\n * @experimental Reserved for future use.\n */\nexport interface CodeFormatter {\n\tformat(code: string): string | Promise<string>;\n}\n\n/** Service for registering and querying language support bundles. */\nexport interface LanguageRegistryService {\n\t/** Registers a language bundle. Re-registering the same `id` overwrites. */\n\tregister(support: LanguageSupport): void;\n\n\t/**\n\t * Subscribes to language registrations with replay semantics.\n\t * The listener is immediately called for all already-registered\n\t * bundles, then called for each future registration.\n\t */\n\tonRegister(listener: LanguageRegistryListener): void;\n\n\t/** Returns the bundle for the given language id, or `undefined`. */\n\tget(id: string): LanguageSupport | undefined;\n\n\t/** Returns all registered language support bundles. */\n\tgetAll(): readonly LanguageSupport[];\n}\n\n/** Internal listener type for registry change notifications. */\nexport type LanguageRegistryListener = (support: LanguageSupport) => void;\n\nexport const LANGUAGE_REGISTRY_SERVICE_KEY = new ServiceKey<LanguageRegistryService>(\n\t'languageRegistry',\n);\n","/**\n * Shared low-level iteration over tokenized regions of source code.\n *\n * Used by both the `RegexTokenizer` (for syntax highlighting) and the\n * smart-paste `LexerDetector` (for language detection) so both consumers\n * see exactly the same tokenization for a given language definition.\n */\n\nimport type { LanguageDefinition } from './TokenizerTypes.js';\n\n/** A successfully matched token region produced by `iterateTokens`. */\nexport interface IteratedToken {\n\treadonly type: string;\n\treadonly from: number;\n\treadonly to: number;\n}\n\n/**\n * Iterates tokens of `code` according to the language's sticky-regex patterns.\n *\n * Walks left-to-right; at each position emits the first matching pattern's\n * token and advances past it. Positions where no pattern matches are silently\n * skipped one byte at a time and never appear in the output — a consumer\n * that needs unknown-byte counts can derive them from `code.length` minus the\n * sum of yielded token widths.\n */\nexport function* iterateTokens(\n\tcode: string,\n\tlanguage: LanguageDefinition,\n): Generator<IteratedToken> {\n\tlet pos = 0;\n\twhile (pos < code.length) {\n\t\tlet matched = false;\n\t\tfor (const pattern of language.patterns) {\n\t\t\tpattern.pattern.lastIndex = pos;\n\t\t\tconst match: RegExpExecArray | null = pattern.pattern.exec(code);\n\t\t\tif (match && match.index === pos && match[0].length > 0) {\n\t\t\t\tconst len: number = match[0].length;\n\t\t\t\tyield { type: pattern.type, from: pos, to: pos + len };\n\t\t\t\tpos += len;\n\t\t\t\tmatched = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!matched) {\n\t\t\tpos++;\n\t\t}\n\t}\n}\n","/**\n * Tokenization statistics used by the lexer-based content detector to\n * derive a calibrated, discriminative confidence score per language.\n *\n * The same `LanguageDefinition` that powers syntax highlighting is run\n * over the candidate text, and the token stream is reduced to four\n * aggregate measures: how much of the input was recognized, how many\n * tokens were emitted, and the relevance-weighted byte score that\n * favours language-specific tokens (keywords, decorators, tags) over\n * universal ones (punctuation, operators).\n */\n\nimport { iterateTokens } from '../../code-block/highlighter/TokenIteration.js';\nimport type { LanguageDefinition } from '../../code-block/highlighter/TokenizerTypes.js';\n\n/**\n * Per-token-type relevance weights.\n *\n * Higher weights indicate a matched token of that type contributes more\n * evidence that the input is in the corresponding language. Tokens that\n * appear in many languages (punctuation, operators) are weighted low;\n * tokens whose patterns encode language-specific identifiers (keywords,\n * annotations, tags) are weighted high.\n */\nexport type RelevanceWeights = Readonly<Record<string, number>>;\n\n/**\n * Default relevance weights spanning the canonical syntax token types.\n * Values were chosen so that keyword-rich code (typical for general\n * programming languages) and tag/attribute-rich code (markup) reach\n * scores comparable to one another while pure punctuation falls off.\n */\nexport const DEFAULT_RELEVANCE_WEIGHTS: RelevanceWeights = {\n\tkeyword: 1.0,\n\tfunction: 0.9,\n\ttype: 1.0,\n\tannotation: 1.5,\n\tproperty: 1.2,\n\ttag: 1.5,\n\tattribute: 1.5,\n\tconstant: 0.8,\n\tstring: 0.4,\n\tnumber: 0.4,\n\tboolean: 0.6,\n\tnull: 0.6,\n\tregex: 0.8,\n\tcomment: 0.3,\n\toperator: 0.1,\n\tpunctuation: 0.1,\n};\n\n/**\n * Maximum value present in `DEFAULT_RELEVANCE_WEIGHTS`.\n * Used as the normalization upper bound when computing density —\n * a stream consisting entirely of maximally-weighted tokens has\n * density 1.0.\n */\nexport const MAX_RELEVANCE_WEIGHT = 1.5;\n\n/** Aggregate statistics describing one tokenization pass. */\nexport interface TokenStats {\n\treadonly totalBytes: number;\n\treadonly nonWhitespaceBytes: number;\n\treadonly recognizedBytes: number;\n\treadonly unknownBytes: number;\n\treadonly tokenCount: number;\n\treadonly weightedScore: number;\n}\n\n/**\n * Tokenizes `code` with `language` and returns aggregate statistics\n * suitable for confidence scoring across competing language candidates.\n *\n * Whitespace is counted separately from `unknownBytes` so the scorer can\n * normalize against the meaningful (non-whitespace) input length without\n * unfairly penalizing indentation or vertical spacing.\n */\nexport function computeTokenStats(\n\tcode: string,\n\tlanguage: LanguageDefinition,\n\tweights: RelevanceWeights = DEFAULT_RELEVANCE_WEIGHTS,\n): TokenStats {\n\tconst totalBytes: number = code.length;\n\tif (totalBytes === 0) {\n\t\treturn {\n\t\t\ttotalBytes: 0,\n\t\t\tnonWhitespaceBytes: 0,\n\t\t\trecognizedBytes: 0,\n\t\t\tunknownBytes: 0,\n\t\t\ttokenCount: 0,\n\t\t\tweightedScore: 0,\n\t\t};\n\t}\n\n\tconst fallbackWeight: number = weights.punctuation ?? 0;\n\n\tlet recognizedBytes = 0;\n\tlet weightedScore = 0;\n\tlet tokenCount = 0;\n\n\tfor (const token of iterateTokens(code, language)) {\n\t\tconst len: number = token.to - token.from;\n\t\trecognizedBytes += len;\n\t\ttokenCount++;\n\t\tconst weight: number = weights[token.type] ?? fallbackWeight;\n\t\tweightedScore += len * weight;\n\t}\n\n\tconst nonWhitespaceBytes: number = countNonWhitespaceBytes(code);\n\n\treturn {\n\t\ttotalBytes,\n\t\tnonWhitespaceBytes,\n\t\trecognizedBytes,\n\t\tunknownBytes: totalBytes - recognizedBytes,\n\t\ttokenCount,\n\t\tweightedScore,\n\t};\n}\n\nfunction countNonWhitespaceBytes(text: string): number {\n\tlet count = 0;\n\tfor (let i = 0; i < text.length; i++) {\n\t\tconst c: number = text.charCodeAt(i);\n\t\tif (c !== 32 && c !== 9 && c !== 10 && c !== 13) count++;\n\t}\n\treturn count;\n}\n","/**\n * Pure scoring function that maps tokenization statistics to a\n * discriminative confidence value in `[0, 1]`.\n *\n * The score combines two independent signals:\n * - **Coverage** — fraction of input bytes recognized by the language's\n * patterns. Low coverage means many bytes fell through with no rule\n * matching, which is strong evidence the text is not in this language.\n * - **Density** — average per-byte weight of recognized tokens, normalized\n * against the maximum possible weight. High density means the recognized\n * tokens are themselves discriminative (keywords, annotations) rather\n * than universally-shared syntax (punctuation, operators).\n *\n * Coverage and density are equally weighted: a language that recognizes\n * lots of low-information punctuation is no more credible than one that\n * recognizes a few highly-specific keywords surrounded by unknown bytes,\n * and only the union of both signals sums to high confidence.\n */\n\nimport { MAX_RELEVANCE_WEIGHT, type TokenStats } from './TokenStats.js';\n\n/**\n * Weight of the byte-coverage signal in the combined confidence.\n *\n * Coverage dominates because failure to recognize most non-whitespace\n * bytes is the strongest evidence that the input is not in this language.\n * Relevance is a secondary refinement: among languages with comparable\n * coverage, the one whose recognized tokens are more discriminative\n * (keywords / annotations / tags rather than punctuation) wins.\n */\nconst COVERAGE_WEIGHT = 0.7;\n/** Weight of the relevance-density signal in the combined confidence. */\nconst RELEVANCE_WEIGHT = 0.3;\n\n/**\n * Maps tokenization statistics to a confidence value in `[0, 1]`.\n *\n * Both axes normalize against `nonWhitespaceBytes` so the score scales\n * linearly with the size of the meaningful input and is unaffected by\n * indentation:\n *\n * - **Coverage** = recognized bytes / non-whitespace bytes. Measures how\n * *much* of the meaningful input the lexer matched.\n * - **Relevance** = weighted score / non-whitespace bytes / max weight.\n * Measures how *rich* the matched tokens are on average — a sparse run\n * of keywords amid mostly-unknown text scores low here even though the\n * recognized bytes alone would look high-weight.\n */\nexport function scoreFromStats(stats: TokenStats): number {\n\tif (stats.nonWhitespaceBytes === 0) return 0;\n\n\tconst coverage: number = stats.recognizedBytes / stats.nonWhitespaceBytes;\n\tconst relevance: number = stats.weightedScore / stats.nonWhitespaceBytes / MAX_RELEVANCE_WEIGHT;\n\n\treturn clamp01(COVERAGE_WEIGHT * coverage + RELEVANCE_WEIGHT * relevance);\n}\n\nfunction clamp01(value: number): number {\n\treturn Math.max(0, Math.min(1, value));\n}\n","/**\n * Generic, lexer-driven content detector.\n *\n * Re-uses the `LanguageDefinition` from the syntax highlighter as the\n * authoritative grammar for detection — anything the highlighter learns\n * to tokenize, the detector learns to recognize, with no parallel\n * heuristic to maintain.\n *\n * Detection strategy:\n * 1. **Lexer probe** — tokenize the candidate text with the language's\n * patterns. Coverage and weighted density jointly form a calibrated\n * confidence in `[0, 1]` (see `DetectionScorer`).\n * 2. **Smoking-gun signatures** — when present, language-specific regexes\n * that confirm a plausible interpretation. A signature match adds a\n * fixed bonus to the lexer-derived confidence (capped at 1.0); without\n * signatures the lexer score stands on its own.\n *\n * Signatures must be definitionally specific to the target language —\n * patterns that are syntactically impossible in any competing language\n * the detector will be matched against. They are intentionally additive,\n * not gating: a signature on a near-zero lexer score still produces a\n * low overall confidence and is rejected by the minimum threshold.\n */\n\nimport type { LanguageDefinition } from '../../code-block/highlighter/TokenizerTypes.js';\nimport type { ContentDetector, DetectionResult } from '../SmartPasteTypes.js';\nimport { scoreFromStats } from './DetectionScorer.js';\nimport { type RelevanceWeights, type TokenStats, computeTokenStats } from './TokenStats.js';\n\n/** Configuration options for the lexer-based content detector. */\nexport interface LexerDetectorOptions {\n\t/** Minimum number of non-empty lines required before detection runs. */\n\treadonly minLines?: number;\n\n\t/** Maximum input length analyzed (DoS guard). */\n\treadonly maxLength?: number;\n\n\t/** Minimum confidence value required to accept the detection. */\n\treadonly minConfidence?: number;\n\n\t/**\n\t * Language-specific \"smoking-gun\" patterns. If any pattern matches,\n\t * `signatureBonus` is added to the lexer-derived confidence (capped\n\t * at 1.0). Patterns must be effectively impossible in any competing\n\t * language the detector will be matched against.\n\t */\n\treadonly signatures?: readonly RegExp[];\n\n\t/** Confidence bonus added on signature match. Defaults to `0.3`. */\n\treadonly signatureBonus?: number;\n\n\t/** Custom per-token-type relevance weights. Defaults to the canonical set. */\n\treadonly weights?: RelevanceWeights;\n}\n\nconst DEFAULT_MIN_LINES = 2;\nconst DEFAULT_MAX_LENGTH = 100_000;\nconst DEFAULT_MIN_CONFIDENCE = 0.35;\nconst DEFAULT_SIGNATURE_BONUS = 0.3;\n\n/**\n * Content detector that classifies pasted text using the same\n * `LanguageDefinition` employed for syntax highlighting.\n */\nexport class LexerDetector implements ContentDetector {\n\treadonly id: string;\n\n\tconstructor(\n\t\tprivate readonly language: LanguageDefinition,\n\t\tprivate readonly options: LexerDetectorOptions = {},\n\t) {\n\t\tthis.id = language.name;\n\t}\n\n\tdetect(text: string): DetectionResult | null {\n\t\tconst maxLength: number = this.options.maxLength ?? DEFAULT_MAX_LENGTH;\n\t\tif (text.length > maxLength) return null;\n\n\t\tconst trimmed: string = text.trim();\n\t\tconst minLines: number = this.options.minLines ?? DEFAULT_MIN_LINES;\n\t\tconst lines: string[] = trimmed.split('\\n').filter((l: string) => l.trim().length > 0);\n\t\tif (lines.length < minLines) return null;\n\n\t\tconst stats: TokenStats = computeTokenStats(trimmed, this.language, this.options.weights);\n\t\tconst lexerConfidence: number = scoreFromStats(stats);\n\n\t\tconst bonus: number = this.matchesAnySignature(trimmed)\n\t\t\t? (this.options.signatureBonus ?? DEFAULT_SIGNATURE_BONUS)\n\t\t\t: 0;\n\t\tconst confidence: number = Math.min(1, lexerConfidence + bonus);\n\n\t\tconst minConfidence: number = this.options.minConfidence ?? DEFAULT_MIN_CONFIDENCE;\n\t\tif (confidence < minConfidence) return null;\n\n\t\treturn { language: this.language.name, formattedText: trimmed, confidence };\n\t}\n\n\tprivate matchesAnySignature(text: string): boolean {\n\t\tconst signatures: readonly RegExp[] = this.options.signatures ?? [];\n\t\tfor (const signature of signatures) {\n\t\t\tif (signature.test(text)) return true;\n\t\t}\n\t\treturn false;\n\t}\n}\n","/**\n * JSON content detector — validates and formats JSON for code block insertion.\n */\n\nimport type { ContentDetector, DetectionResult } from '../SmartPasteTypes.js';\n\n/** Minimum length for formatted JSON to be considered meaningful. */\nconst MIN_FORMATTED_LENGTH = 5;\n\n/** Confidence score for valid JSON detected via JSON.parse. */\nconst JSON_CONFIDENCE = 0.9;\n\nexport class JsonDetector implements ContentDetector {\n\treadonly id = 'json';\n\n\tdetect(text: string): DetectionResult | null {\n\t\tconst trimmed: string = text.trim();\n\t\tif (!trimmed.startsWith('{') && !trimmed.startsWith('[')) return null;\n\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(trimmed);\n\t\t\tif (typeof parsed !== 'object' || parsed === null) return null;\n\n\t\t\tconst formatted: string = JSON.stringify(parsed, null, 2);\n\t\t\tif (formatted.length <= MIN_FORMATTED_LENGTH) return null;\n\n\t\t\treturn { language: 'json', formattedText: formatted, confidence: JSON_CONFIDENCE };\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n","/**\n * XML content detector — validates and formats XML for code block insertion.\n */\n\nimport { XML_ATTRS, XML_TAG_NAME } from '../../shared/XmlPatterns.js';\nimport type { ContentDetector, DetectionResult } from '../SmartPasteTypes.js';\n\n/** Minimum length for formatted XML to be considered meaningful. */\nconst MIN_FORMATTED_LENGTH = 10;\n\n/** Confidence score for valid XML detected via structural analysis. */\nconst XML_CONFIDENCE = 0.85;\n\n/** Matches any leading processing instructions like <?xml ...?> or <?xml-stylesheet ...?> */\nconst LEADING_PIS_PATTERN = /^(<\\?[\\s\\S]*?\\?>\\s*)+/;\n\n/** Matches an opening tag like <root> or <ns:tag attr=\"val\"> */\nconst OPENING_TAG_PATTERN = new RegExp(`^<${XML_TAG_NAME}${XML_ATTRS}\\\\/?>`);\n\n// --- Well-formedness regex (decomposed for readability) ---\n\nconst PI_FRAGMENT = '<\\\\?[^?]*\\\\?>';\nconst COMMENT_FRAGMENT = '<!--[\\\\s\\\\S]*?-->';\nconst CDATA_FRAGMENT = '<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>';\nconst CLOSING_TAG_FRAGMENT = `<\\\\/(${XML_TAG_NAME})>`;\nconst SELF_CLOSING_TAG_FRAGMENT = `<(${XML_TAG_NAME})${XML_ATTRS}\\\\/>`;\nconst OPENING_TAG_FRAGMENT = `<(${XML_TAG_NAME})${XML_ATTRS}>`;\n\nconst WELL_FORMED_TAG_PATTERN = new RegExp(\n\t[\n\t\tPI_FRAGMENT,\n\t\tCOMMENT_FRAGMENT,\n\t\tCDATA_FRAGMENT,\n\t\tCLOSING_TAG_FRAGMENT,\n\t\tSELF_CLOSING_TAG_FRAGMENT,\n\t\tOPENING_TAG_FRAGMENT,\n\t].join('|'),\n\t'g',\n);\n\n/** Matches an inline element where open + close tag appear on the same token. */\nconst INLINE_ELEMENT_PATTERN = new RegExp(`<\\\\/${XML_TAG_NAME}>\\\\s*$`);\n\n/**\n * Detects well-formed XML content and formats it with proper indentation.\n *\n * Detection strategy:\n * 1. Text must start with `<` (after trimming)\n * 2. Must begin with an XML declaration, processing instruction, or opening tag\n * 3. All opened tags must be properly closed (basic well-formedness check)\n * 4. Must contain at least one tag pair or self-closing tag\n */\nexport class XmlDetector implements ContentDetector {\n\treadonly id = 'xml';\n\n\tdetect(text: string): DetectionResult | null {\n\t\tconst trimmed: string = text.trim();\n\t\tif (!trimmed.startsWith('<')) return null;\n\n\t\t// Quick structural check: strip leading PIs, then must start with an opening tag\n\t\tconst remainder: string = trimmed.replace(LEADING_PIS_PATTERN, '');\n\t\tif (!OPENING_TAG_PATTERN.test(remainder)) return null;\n\n\t\t// Validate well-formedness via tag balancing\n\t\tif (!this.isWellFormed(trimmed)) return null;\n\n\t\tconst formatted: string = this.formatXml(trimmed);\n\t\tif (formatted.length <= MIN_FORMATTED_LENGTH) return null;\n\n\t\treturn { language: 'xml', formattedText: formatted, confidence: XML_CONFIDENCE };\n\t}\n\n\t/**\n\t * Checks basic XML well-formedness by verifying that all opened tags\n\t * are properly closed in the correct nesting order.\n\t */\n\tprivate isWellFormed(xml: string): boolean {\n\t\tconst tagStack: string[] = [];\n\t\tlet foundTag = false;\n\n\t\t// Reset lastIndex — RegExp with 'g' flag is stateful\n\t\tWELL_FORMED_TAG_PATTERN.lastIndex = 0;\n\t\tlet match: RegExpExecArray | null = WELL_FORMED_TAG_PATTERN.exec(xml);\n\n\t\twhile (match) {\n\t\t\tconst closingTag: string | undefined = match[1];\n\t\t\tconst selfClosingTag: string | undefined = match[2];\n\t\t\tconst openingTag: string | undefined = match[3];\n\n\t\t\tif (closingTag) {\n\t\t\t\tif (tagStack.length === 0 || tagStack[tagStack.length - 1] !== closingTag) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\ttagStack.pop();\n\t\t\t\tfoundTag = true;\n\t\t\t} else if (selfClosingTag) {\n\t\t\t\tfoundTag = true;\n\t\t\t} else if (openingTag) {\n\t\t\t\ttagStack.push(openingTag);\n\t\t\t\tfoundTag = true;\n\t\t\t}\n\n\t\t\tmatch = WELL_FORMED_TAG_PATTERN.exec(xml);\n\t\t}\n\n\t\treturn foundTag && tagStack.length === 0;\n\t}\n\n\t/**\n\t * Formats XML with consistent 2-space indentation.\n\t */\n\tprivate formatXml(xml: string): string {\n\t\tconst tokens: string[] = this.splitIntoTokens(xml);\n\t\tconst parts: string[] = [];\n\t\tlet indent = 0;\n\t\tconst INDENT_STEP = 2;\n\n\t\tfor (const token of tokens) {\n\t\t\tconst kind: XmlTokenKind = classifyXmlToken(token);\n\t\t\tconst indentChange: IndentChange = INDENT_BEHAVIOR[kind];\n\n\t\t\tif (indentChange === 'decrease') {\n\t\t\t\tindent = Math.max(0, indent - 1);\n\t\t\t}\n\n\t\t\tparts.push(' '.repeat(indent * INDENT_STEP) + token);\n\n\t\t\tif (indentChange === 'increase') {\n\t\t\t\tindent++;\n\t\t\t}\n\t\t}\n\n\t\treturn parts.join('\\n');\n\t}\n\n\t/** Splits XML into line-level tokens by breaking between adjacent tags. */\n\tprivate splitIntoTokens(xml: string): string[] {\n\t\treturn xml\n\t\t\t.replace(/>\\s*</g, '>\\n<')\n\t\t\t.split('\\n')\n\t\t\t.map((line: string) => line.trim())\n\t\t\t.filter((line: string) => line.length > 0);\n\t}\n}\n\n// --- Token Classification ---\n\ntype XmlTokenKind =\n\t| 'pi'\n\t| 'comment'\n\t| 'cdata'\n\t| 'closing'\n\t| 'selfClosing'\n\t| 'inline'\n\t| 'opening'\n\t| 'text';\ntype IndentChange = 'increase' | 'decrease' | 'none';\n\nconst INDENT_BEHAVIOR: Readonly<Record<XmlTokenKind, IndentChange>> = {\n\tpi: 'none',\n\tcomment: 'none',\n\tcdata: 'none',\n\tclosing: 'decrease',\n\tselfClosing: 'none',\n\tinline: 'none',\n\topening: 'increase',\n\ttext: 'none',\n};\n\nfunction classifyXmlToken(token: string): XmlTokenKind {\n\tif (token.startsWith('<?')) return 'pi';\n\tif (token.startsWith('<!--')) return 'comment';\n\tif (token.startsWith('<![CDATA[')) return 'cdata';\n\tif (token.startsWith('</')) return 'closing';\n\tif (token.endsWith('/>')) return 'selfClosing';\n\tif (token.startsWith('<') && INLINE_ELEMENT_PATTERN.test(token)) return 'inline';\n\tif (token.startsWith('<')) return 'opening';\n\treturn 'text';\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var a="[a-zA-Z_][\\w:.-]*",s="(?:\\s(?:[^>\"']|\"[^\"]*\"|'[^']*')*)?";export{a as n,s as t};
2
+ //# sourceMappingURL=XmlPatterns-B-V-mHF4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlPatterns-B-V-mHF4.mjs","names":[],"sources":["../../src/plugins/shared/XmlPatterns.ts"],"sourcesContent":["/**\n * Shared XML regex pattern fragments used by XmlDetector and XML language definition.\n *\n * Based on XML 1.0 spec Name production (simplified to ASCII + common extensions).\n */\n\n/** XML tag name pattern (string fragment for RegExp construction). */\nexport const XML_TAG_NAME = '[a-zA-Z_][\\\\w:.-]*';\n\n/** Optional attributes pattern (string fragment for RegExp construction). */\nexport const XML_ATTRS = '(?:\\\\s(?:[^>\"\\']|\"[^\"]*\"|\\'[^\\']*\\')*)?';\n"],"mappings":"AAOA,IAAa,EAAe,qBAGf,EAAY"}
@@ -0,0 +1,2 @@
1
+ import{n as t,r as e,t as n}from"./XmlDetector-DM-Vv-XW.mjs";import{n as a}from"./XmlPatterns-B-V-mHF4.mjs";var s={name:"java",aliases:[],patterns:[{type:"comment",pattern:/\/\*[\s\S]*?\*\//y},{type:"comment",pattern:/\/\/[^\n]*/y},{type:"string",pattern:/"""[\s\S]*?"""/y},{type:"string",pattern:/"(?:[^"\\]|\\.)*"/y},{type:"string",pattern:/'(?:[^'\\]|\\.)*'/y},{type:"annotation",pattern:/@[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/y},{type:"keyword",pattern:new RegExp(`(?:${["abstract","assert","boolean","break","byte","case","catch","char","class","const","continue","default","do","double","else","enum","exports","extends","final","finally","float","for","goto","if","implements","import","instanceof","int","interface","long","module","native","new","non-sealed","open","opens","package","permits","private","protected","provides","public","record","requires","return","sealed","short","static","strictfp","super","switch","synchronized","this","throw","throws","to","transient","transitive","try","uses","var","void","volatile","when","while","with","yield"].join("|")})\\b`,"y")},{type:"boolean",pattern:/(?:true|false)\b/y},{type:"null",pattern:/null\b/y},{type:"number",pattern:/0[xX][\da-fA-F](?:_*[\da-fA-F])*[lL]?/y},{type:"number",pattern:/0[bB][01](?:_*[01])*[lL]?/y},{type:"number",pattern:/\d(?:_*\d)*(?:\.(?:\d(?:_*\d)*)?)?(?:[eE][+-]?\d(?:_*\d)*)?[fFdDlL]?/y},{type:"function",pattern:/[a-zA-Z_]\w*(?=\s*\()/y},{type:"operator",pattern:/(?:>>>=?|>>=?|<<=?|->|::|\+\+|--|&&|\|\||[+\-*/%&|^~!=<>]=?|\?|:)/y},{type:"punctuation",pattern:/[{}[\]();.,]/y}]},r={id:"java",displayName:"Java",highlighting:s,detection:new e(s,{signatures:[/^[ \t]*package\s+[\w.]+\s*;/m,/^[ \t]*import\s+(?:static\s+)?[\w.]+(?:\.\*)?\s*;/m,/\bSystem\s*\.\s*(?:out|err)\s*\.\s*\w+\s*\(/,/\bpublic\s+static\s+void\s+main\s*\(\s*String\s*\[\s*\]/]})},p={name:"json",aliases:["jsonc"],patterns:[{type:"property",pattern:/"(?:[^"\\]|\\.)*"(?=\s*:)/y},{type:"string",pattern:/"(?:[^"\\]|\\.)*"/y},{type:"number",pattern:/-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/y},{type:"boolean",pattern:/(?:true|false)\b/y},{type:"null",pattern:/null\b/y},{type:"punctuation",pattern:/[{}[\]:,]/y}]},i={id:"json",displayName:"JSON",aliases:["jsonc"],highlighting:p,detection:new t},o={name:"typescript",aliases:["ts","tsx"],patterns:[{type:"comment",pattern:/\/\*[\s\S]*?\*\//y},{type:"comment",pattern:/\/\/[^\n]*/y},{type:"string",pattern:/`(?:[^`\\$]|\\.|\$(?!\{)|\$\{[^}]*\})*`/y},{type:"string",pattern:/"(?:[^"\\]|\\.)*"/y},{type:"string",pattern:/'(?:[^'\\]|\\.)*'/y},{type:"annotation",pattern:/@[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*)*/y},{type:"keyword",pattern:new RegExp(`(?:${["abstract","any","as","asserts","async","await","bigint","boolean","break","case","catch","class","const","constructor","continue","debugger","declare","default","delete","do","else","enum","export","extends","finally","for","from","function","get","global","if","implements","import","in","infer","instanceof","interface","is","keyof","let","module","namespace","never","new","number","object","of","out","override","package","private","protected","public","readonly","require","return","satisfies","set","static","string","super","switch","symbol","this","throw","try","type","typeof","unique","unknown","using","var","void","while","with","yield"].join("|")})\\b`,"y")},{type:"boolean",pattern:/(?:true|false)\b/y},{type:"null",pattern:/(?:null|undefined)\b/y},{type:"number",pattern:/0[xX][\da-fA-F](?:_*[\da-fA-F])*n?/y},{type:"number",pattern:/0[bB][01](?:_*[01])*n?/y},{type:"number",pattern:/0[oO][0-7](?:_*[0-7])*n?/y},{type:"number",pattern:/\d(?:_*\d)*(?:\.(?:\d(?:_*\d)*)?)?(?:[eE][+-]?\d(?:_*\d)*)?n?/y},{type:"function",pattern:/[a-zA-Z_$][\w$]*(?=\s*\()/y},{type:"operator",pattern:/(?:>>>=?|>>=?|<<=?|\*\*=?|\?\?=?|\|\|=?|&&=?|===?|!==?|=>|\?\.|\.\.\.|\+\+|--|[+\-*/%&|^~!=<>]=?|\?|:)/y},{type:"punctuation",pattern:/[{}[\]();.,]/y}]},y={id:"typescript",displayName:"TypeScript",aliases:["ts","tsx"],highlighting:o,detection:new e(o,{signatures:[/^[ \t]*import\b[^;\n]*?\bfrom\s+['"]/m,/^[ \t]*(?:export\s+)?type\s+\w+(?:\s*<[^=>]*>)?\s*=/m,/^[ \t]*declare\s+(?:const|let|var|function|class|namespace|module|global)\b/m,/[\w$\])]\??\s*:\s*(?:string|number|boolean|void|any|unknown|never|bigint|symbol|object|null|undefined)\b/,/^[ \t]*export\s+(?:default\s+|const\s+|let\s+|var\s+|function\s+|async\s+function\b|class\s+|interface\s+|enum\s+|namespace\s+|abstract\s+class\b|\*\s+from\b|\{)/m]})},l={name:"xml",aliases:["html","xhtml","svg","xsl"],patterns:[{type:"comment",pattern:/<!--[\s\S]*?-->/y},{type:"keyword",pattern:/<!\[CDATA\[[\s\S]*?\]\]>/y},{type:"keyword",pattern:/<\?[\s\S]*?\?>/y},{type:"tag",pattern:new RegExp(`<\\/${a}`,"y")},{type:"tag",pattern:new RegExp(`<${a}`,"y")},{type:"punctuation",pattern:/\/>|>|=/y},{type:"attribute",pattern:new RegExp(`${a}(?=\\s*=)`,"y")},{type:"string",pattern:/"[^"]*"/y},{type:"string",pattern:/'[^']*'/y}]},c={id:"xml",displayName:"XML",aliases:["html","xhtml","svg","xsl"],highlighting:l,detection:new n};export{i as a,s as c,o as i,l as n,p as o,y as r,r as s,c as t};
2
+ //# sourceMappingURL=XmlSupport-Dr1S1HN9.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlSupport-Dr1S1HN9.mjs","names":[],"sources":["../../src/plugins/code-block/highlighter/languages/java.ts","../../src/plugins/language/bundles/JavaSupport.ts","../../src/plugins/code-block/highlighter/languages/json.ts","../../src/plugins/language/bundles/JsonSupport.ts","../../src/plugins/code-block/highlighter/languages/typescript.ts","../../src/plugins/language/bundles/TypeScriptSupport.ts","../../src/plugins/code-block/highlighter/languages/xml.ts","../../src/plugins/language/bundles/XmlSupport.ts"],"sourcesContent":["/**\n * Java language definition for regex-based syntax highlighting.\n *\n * Covers Java 21 syntax including sealed classes, records, pattern matching,\n * modules, text blocks, and switch expressions.\n *\n * Token type mapping:\n * - `comment` - line `//`, block, and Javadoc comments\n * - `string` - double-quoted strings, text blocks, char literals\n * - `annotation` - annotations `@Name`, `@java.lang.Override`\n * - `keyword` - Java 21 keywords (including contextual: sealed, record, var, yield, when)\n * - `boolean` - `true`, `false`\n * - `null` - `null`\n * - `number` - decimal, hex, binary, float, scientific, with underscores\n * - `function` - method/function names (identifier followed by `(`)\n * - `operator` - all Java operators including `->`, `::`, `>>>=`\n * - `punctuation` - delimiters `{}[]();.,`\n */\n\nimport type { LanguageDefinition } from '../TokenizerTypes.js';\n\nconst JAVA_KEYWORDS: readonly string[] = [\n\t'abstract',\n\t'assert',\n\t'boolean',\n\t'break',\n\t'byte',\n\t'case',\n\t'catch',\n\t'char',\n\t'class',\n\t'const',\n\t'continue',\n\t'default',\n\t'do',\n\t'double',\n\t'else',\n\t'enum',\n\t'exports',\n\t'extends',\n\t'final',\n\t'finally',\n\t'float',\n\t'for',\n\t'goto',\n\t'if',\n\t'implements',\n\t'import',\n\t'instanceof',\n\t'int',\n\t'interface',\n\t'long',\n\t'module',\n\t'native',\n\t'new',\n\t'non-sealed',\n\t'open',\n\t'opens',\n\t'package',\n\t'permits',\n\t'private',\n\t'protected',\n\t'provides',\n\t'public',\n\t'record',\n\t'requires',\n\t'return',\n\t'sealed',\n\t'short',\n\t'static',\n\t'strictfp',\n\t'super',\n\t'switch',\n\t'synchronized',\n\t'this',\n\t'throw',\n\t'throws',\n\t'to',\n\t'transient',\n\t'transitive',\n\t'try',\n\t'uses',\n\t'var',\n\t'void',\n\t'volatile',\n\t'when',\n\t'while',\n\t'with',\n\t'yield',\n];\n\nconst KEYWORD_PATTERN: RegExp = new RegExp(`(?:${JAVA_KEYWORDS.join('|')})\\\\b`, 'y');\n\nexport const JAVA_LANGUAGE: LanguageDefinition = {\n\tname: 'java',\n\taliases: [],\n\tpatterns: [\n\t\t// 1. Block/Javadoc comments — before `/` operator\n\t\t{ type: 'comment', pattern: /\\/\\*[\\s\\S]*?\\*\\//y },\n\t\t// 2. Line comments — before `/` operator\n\t\t{ type: 'comment', pattern: /\\/\\/[^\\n]*/y },\n\t\t// 3. Text blocks `\"\"\"...\"\"\"` — before empty string `\"\"`\n\t\t{ type: 'string', pattern: /\"\"\"[\\s\\S]*?\"\"\"/y },\n\t\t// 4. Double-quoted strings — escape-aware\n\t\t{ type: 'string', pattern: /\"(?:[^\"\\\\]|\\\\.)*\"/y },\n\t\t// 5. Char literals — escape-aware\n\t\t{ type: 'string', pattern: /'(?:[^'\\\\]|\\\\.)*'/y },\n\t\t// 6. Annotations — before operators (captures `@`)\n\t\t{ type: 'annotation', pattern: /@[a-zA-Z_]\\w*(?:\\.[a-zA-Z_]\\w*)*/y },\n\t\t// 7. Keywords — before functions (`if(` = keyword, not function)\n\t\t{ type: 'keyword', pattern: KEYWORD_PATTERN },\n\t\t// 8. Booleans\n\t\t{ type: 'boolean', pattern: /(?:true|false)\\b/y },\n\t\t// 9. Null\n\t\t{ type: 'null', pattern: /null\\b/y },\n\t\t// 10. Hex numbers — before decimal (both can start with `0`)\n\t\t{ type: 'number', pattern: /0[xX][\\da-fA-F](?:_*[\\da-fA-F])*[lL]?/y },\n\t\t// 11. Binary numbers — before decimal\n\t\t{ type: 'number', pattern: /0[bB][01](?:_*[01])*[lL]?/y },\n\t\t// 12. Decimal/float/scientific numbers — with underscore and suffix support\n\t\t{\n\t\t\ttype: 'number',\n\t\t\tpattern: /\\d(?:_*\\d)*(?:\\.(?:\\d(?:_*\\d)*)?)?(?:[eE][+-]?\\d(?:_*\\d)*)?[fFdDlL]?/y,\n\t\t},\n\t\t// 13. Function/method names — identifier followed by `(`\n\t\t{ type: 'function', pattern: /[a-zA-Z_]\\w*(?=\\s*\\()/y },\n\t\t// 14. Operators\n\t\t{\n\t\t\ttype: 'operator',\n\t\t\tpattern: /(?:>>>=?|>>=?|<<=?|->|::|\\+\\+|--|&&|\\|\\||[+\\-*/%&|^~!=<>]=?|\\?|:)/y,\n\t\t},\n\t\t// 15. Punctuation — catch-all delimiters\n\t\t{ type: 'punctuation', pattern: /[{}[\\]();.,]/y },\n\t],\n};\n","/**\n * Built-in Java language support bundle.\n * Includes syntax highlighting (Java 21) and lexer-based smart-paste detection.\n *\n * Detection re-uses the same `JAVA_LANGUAGE` token definition that powers\n * highlighting — see `LexerDetector` for the algorithm. Smoking-gun\n * signatures encode constructs that are syntactically impossible outside\n * Java: dotted-path imports terminated by `;`, file-leading `package`\n * declarations, the canonical `main(String[] args)` entry point, and\n * `System.out` / `System.err` calls.\n */\n\nimport { JAVA_LANGUAGE } from '../../code-block/highlighter/languages/java.js';\nimport { LexerDetector } from '../../smart-paste/detectors/LexerDetector.js';\nimport type { LanguageSupport } from '../LanguageTypes.js';\n\nconst JAVA_SIGNATURES: readonly RegExp[] = [\n\t/^[ \\t]*package\\s+[\\w.]+\\s*;/m,\n\t/^[ \\t]*import\\s+(?:static\\s+)?[\\w.]+(?:\\.\\*)?\\s*;/m,\n\t/\\bSystem\\s*\\.\\s*(?:out|err)\\s*\\.\\s*\\w+\\s*\\(/,\n\t/\\bpublic\\s+static\\s+void\\s+main\\s*\\(\\s*String\\s*\\[\\s*\\]/,\n];\n\nexport const JAVA_SUPPORT: LanguageSupport = {\n\tid: 'java',\n\tdisplayName: 'Java',\n\thighlighting: JAVA_LANGUAGE,\n\tdetection: new LexerDetector(JAVA_LANGUAGE, { signatures: JAVA_SIGNATURES }),\n};\n","/**\n * JSON language definition for regex-based syntax highlighting.\n */\n\nimport type { LanguageDefinition } from '../TokenizerTypes.js';\n\nexport const JSON_LANGUAGE: LanguageDefinition = {\n\tname: 'json',\n\taliases: ['jsonc'],\n\tpatterns: [\n\t\t{ type: 'property', pattern: /\"(?:[^\"\\\\]|\\\\.)*\"(?=\\s*:)/y },\n\t\t{ type: 'string', pattern: /\"(?:[^\"\\\\]|\\\\.)*\"/y },\n\t\t{ type: 'number', pattern: /-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/y },\n\t\t{ type: 'boolean', pattern: /(?:true|false)\\b/y },\n\t\t{ type: 'null', pattern: /null\\b/y },\n\t\t{ type: 'punctuation', pattern: /[{}[\\]:,]/y },\n\t],\n};\n","/**\n * Built-in JSON language support bundle.\n * Includes syntax highlighting and smart-paste detection.\n */\n\nimport { JSON_LANGUAGE } from '../../code-block/highlighter/languages/json.js';\nimport { JsonDetector } from '../../smart-paste/detectors/JsonDetector.js';\nimport type { LanguageSupport } from '../LanguageTypes.js';\n\nexport const JSON_SUPPORT: LanguageSupport = {\n\tid: 'json',\n\tdisplayName: 'JSON',\n\taliases: ['jsonc'],\n\thighlighting: JSON_LANGUAGE,\n\tdetection: new JsonDetector(),\n};\n","/**\n * TypeScript language definition for regex-based syntax highlighting.\n *\n * Covers modern TypeScript syntax including interfaces, type aliases, enums,\n * generics, decorators, async/await, optional chaining, nullish coalescing,\n * template literals, and JSX-friendly punctuation.\n *\n * Token type mapping:\n * - `comment` - line `//`, block, and JSDoc comments\n * - `string` - double/single-quoted strings, template literals\n * - `annotation` - decorators `@Name`, `@module.Name`\n * - `keyword` - JS/TS keywords (control flow, declarations, modifiers)\n * - `boolean` - `true`, `false`\n * - `null` - `null`, `undefined`\n * - `number` - decimal, hex, octal, binary, BigInt, scientific, with separators\n * - `function` - function/method names (identifier followed by `(` or `<...>(`)\n * - `operator` - all TS operators including `=>`, `??`, `?.`, `**`, `>>>=`\n * - `punctuation` - delimiters `{}[]();.,`\n *\n * Aliases: `ts`, `tsx`.\n */\n\nimport type { LanguageDefinition } from '../TokenizerTypes.js';\n\nconst TYPESCRIPT_KEYWORDS: readonly string[] = [\n\t'abstract',\n\t'any',\n\t'as',\n\t'asserts',\n\t'async',\n\t'await',\n\t'bigint',\n\t'boolean',\n\t'break',\n\t'case',\n\t'catch',\n\t'class',\n\t'const',\n\t'constructor',\n\t'continue',\n\t'debugger',\n\t'declare',\n\t'default',\n\t'delete',\n\t'do',\n\t'else',\n\t'enum',\n\t'export',\n\t'extends',\n\t'finally',\n\t'for',\n\t'from',\n\t'function',\n\t'get',\n\t'global',\n\t'if',\n\t'implements',\n\t'import',\n\t'in',\n\t'infer',\n\t'instanceof',\n\t'interface',\n\t'is',\n\t'keyof',\n\t'let',\n\t'module',\n\t'namespace',\n\t'never',\n\t'new',\n\t'number',\n\t'object',\n\t'of',\n\t'out',\n\t'override',\n\t'package',\n\t'private',\n\t'protected',\n\t'public',\n\t'readonly',\n\t'require',\n\t'return',\n\t'satisfies',\n\t'set',\n\t'static',\n\t'string',\n\t'super',\n\t'switch',\n\t'symbol',\n\t'this',\n\t'throw',\n\t'try',\n\t'type',\n\t'typeof',\n\t'unique',\n\t'unknown',\n\t'using',\n\t'var',\n\t'void',\n\t'while',\n\t'with',\n\t'yield',\n];\n\nconst KEYWORD_PATTERN: RegExp = new RegExp(`(?:${TYPESCRIPT_KEYWORDS.join('|')})\\\\b`, 'y');\n\nexport const TYPESCRIPT_LANGUAGE: LanguageDefinition = {\n\tname: 'typescript',\n\taliases: ['ts', 'tsx'],\n\tpatterns: [\n\t\t// 1. Block/JSDoc comments — before `/` operator\n\t\t{ type: 'comment', pattern: /\\/\\*[\\s\\S]*?\\*\\//y },\n\t\t// 2. Line comments — before `/` operator\n\t\t{ type: 'comment', pattern: /\\/\\/[^\\n]*/y },\n\t\t// 3. Template literals (no nested ${} parsing) — escape-aware\n\t\t{ type: 'string', pattern: /`(?:[^`\\\\$]|\\\\.|\\$(?!\\{)|\\$\\{[^}]*\\})*`/y },\n\t\t// 4. Double-quoted strings — escape-aware\n\t\t{ type: 'string', pattern: /\"(?:[^\"\\\\]|\\\\.)*\"/y },\n\t\t// 5. Single-quoted strings — escape-aware\n\t\t{ type: 'string', pattern: /'(?:[^'\\\\]|\\\\.)*'/y },\n\t\t// 6. Decorators — before operators\n\t\t{ type: 'annotation', pattern: /@[a-zA-Z_$][\\w$]*(?:\\.[a-zA-Z_$][\\w$]*)*/y },\n\t\t// 7. Keywords — before functions (`if(` = keyword, not function)\n\t\t{ type: 'keyword', pattern: KEYWORD_PATTERN },\n\t\t// 8. Booleans\n\t\t{ type: 'boolean', pattern: /(?:true|false)\\b/y },\n\t\t// 9. Null/undefined\n\t\t{ type: 'null', pattern: /(?:null|undefined)\\b/y },\n\t\t// 10. Hex numbers (with optional BigInt suffix) — before decimal\n\t\t{ type: 'number', pattern: /0[xX][\\da-fA-F](?:_*[\\da-fA-F])*n?/y },\n\t\t// 11. Binary numbers — before decimal\n\t\t{ type: 'number', pattern: /0[bB][01](?:_*[01])*n?/y },\n\t\t// 12. Octal numbers — before decimal\n\t\t{ type: 'number', pattern: /0[oO][0-7](?:_*[0-7])*n?/y },\n\t\t// 13. Decimal/float/scientific/BigInt — with numeric separator support\n\t\t{\n\t\t\ttype: 'number',\n\t\t\tpattern: /\\d(?:_*\\d)*(?:\\.(?:\\d(?:_*\\d)*)?)?(?:[eE][+-]?\\d(?:_*\\d)*)?n?/y,\n\t\t},\n\t\t// 14. Function/method names — identifier followed by `(`\n\t\t{ type: 'function', pattern: /[a-zA-Z_$][\\w$]*(?=\\s*\\()/y },\n\t\t// 15. Operators — longer alternatives first (alternation picks first match, not longest)\n\t\t{\n\t\t\ttype: 'operator',\n\t\t\tpattern:\n\t\t\t\t/(?:>>>=?|>>=?|<<=?|\\*\\*=?|\\?\\?=?|\\|\\|=?|&&=?|===?|!==?|=>|\\?\\.|\\.\\.\\.|\\+\\+|--|[+\\-*/%&|^~!=<>]=?|\\?|:)/y,\n\t\t},\n\t\t// 16. Punctuation — catch-all delimiters\n\t\t{ type: 'punctuation', pattern: /[{}[\\]();.,]/y },\n\t],\n};\n","/**\n * Built-in TypeScript language support bundle.\n * Includes syntax highlighting (modern TS) and lexer-based smart-paste detection.\n *\n * Aliases `ts` and `tsx` are accepted for the language picker and code-block fences.\n *\n * Detection re-uses the same `TYPESCRIPT_LANGUAGE` token definition that\n * powers highlighting — see `LexerDetector` for the algorithm. Smoking-gun\n * signatures encode constructs that are syntactically impossible in Java:\n * `import … from '…'`, `type X = …` aliases, `declare …` ambients,\n * `: <lowercase-primitive>` type annotations, and the `export` statement\n * starter for declarations.\n */\n\nimport { TYPESCRIPT_LANGUAGE } from '../../code-block/highlighter/languages/typescript.js';\nimport { LexerDetector } from '../../smart-paste/detectors/LexerDetector.js';\nimport type { LanguageSupport } from '../LanguageTypes.js';\n\nconst TYPESCRIPT_SIGNATURES: readonly RegExp[] = [\n\t/^[ \\t]*import\\b[^;\\n]*?\\bfrom\\s+['\"]/m,\n\t/^[ \\t]*(?:export\\s+)?type\\s+\\w+(?:\\s*<[^=>]*>)?\\s*=/m,\n\t/^[ \\t]*declare\\s+(?:const|let|var|function|class|namespace|module|global)\\b/m,\n\t/[\\w$\\])]\\??\\s*:\\s*(?:string|number|boolean|void|any|unknown|never|bigint|symbol|object|null|undefined)\\b/,\n\t/^[ \\t]*export\\s+(?:default\\s+|const\\s+|let\\s+|var\\s+|function\\s+|async\\s+function\\b|class\\s+|interface\\s+|enum\\s+|namespace\\s+|abstract\\s+class\\b|\\*\\s+from\\b|\\{)/m,\n];\n\nexport const TYPESCRIPT_SUPPORT: LanguageSupport = {\n\tid: 'typescript',\n\tdisplayName: 'TypeScript',\n\taliases: ['ts', 'tsx'],\n\thighlighting: TYPESCRIPT_LANGUAGE,\n\tdetection: new LexerDetector(TYPESCRIPT_LANGUAGE, { signatures: TYPESCRIPT_SIGNATURES }),\n};\n","/**\n * XML language definition for regex-based syntax highlighting.\n *\n * Token type mapping:\n * - `comment` — XML comments `<!-- ... -->`\n * - `keyword` — processing instructions, CDATA sections\n * - `tag` — tag names (consumed with `<`/`</` prefix)\n * - `attribute` — attribute names (identifier followed by `=`)\n * - `string` — attribute values (double or single quoted)\n * - `punctuation` — delimiters `/>`, `>`, `=`\n *\n * Tag names are combined with their `<` or `</` prefix into a single `tag` token\n * to prevent text content between tags from being incorrectly highlighted.\n */\n\nimport { XML_TAG_NAME } from '../../../shared/XmlPatterns.js';\nimport type { LanguageDefinition } from '../TokenizerTypes.js';\n\nexport const XML_LANGUAGE: LanguageDefinition = {\n\tname: 'xml',\n\taliases: ['html', 'xhtml', 'svg', 'xsl'],\n\tpatterns: [\n\t\t{ type: 'comment', pattern: /<!--[\\s\\S]*?-->/y },\n\t\t{ type: 'keyword', pattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/y },\n\t\t{ type: 'keyword', pattern: /<\\?[\\s\\S]*?\\?>/y },\n\t\t{ type: 'tag', pattern: new RegExp(`<\\\\/${XML_TAG_NAME}`, 'y') },\n\t\t{ type: 'tag', pattern: new RegExp(`<${XML_TAG_NAME}`, 'y') },\n\t\t{ type: 'punctuation', pattern: /\\/>|>|=/y },\n\t\t{ type: 'attribute', pattern: new RegExp(`${XML_TAG_NAME}(?=\\\\s*=)`, 'y') },\n\t\t{ type: 'string', pattern: /\"[^\"]*\"/y },\n\t\t{ type: 'string', pattern: /'[^']*'/y },\n\t],\n};\n","/**\n * Built-in XML language support bundle.\n * Includes syntax highlighting and smart-paste detection.\n */\n\nimport { XML_LANGUAGE } from '../../code-block/highlighter/languages/xml.js';\nimport { XmlDetector } from '../../smart-paste/detectors/XmlDetector.js';\nimport type { LanguageSupport } from '../LanguageTypes.js';\n\nexport const XML_SUPPORT: LanguageSupport = {\n\tid: 'xml',\n\tdisplayName: 'XML',\n\taliases: ['html', 'xhtml', 'svg', 'xsl'],\n\thighlighting: XML_LANGUAGE,\n\tdetection: new XmlDetector(),\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var a={ariaLabel:"محرر نص منسق",ariaDescription:"اضغط Escape للخروج من المحرر",defaultPlaceholder:"ابدأ الكتابة..."};export{a as default};
2
+ //# sourceMappingURL=ar-4r3DgNTY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-4r3DgNTY.mjs","names":[],"sources":["../../src/editor/locales/ar.ts"],"sourcesContent":["import type { EditorLocale } from '../EditorLocale.js';\n\nconst locale: EditorLocale = {\n\tariaLabel: '\\u0645\\u062d\\u0631\\u0631 \\u0646\\u0635 \\u0645\\u0646\\u0633\\u0642',\n\tariaDescription:\n\t\t'\\u0627\\u0636\\u063a\\u0637 Escape \\u0644\\u0644\\u062e\\u0631\\u0648\\u062c \\u0645\\u0646 \\u0627\\u0644\\u0645\\u062d\\u0631\\u0631',\n\tdefaultPlaceholder: '\\u0627\\u0628\\u062f\\u0623 \\u0627\\u0644\\u0643\\u062a\\u0627\\u0628\\u0629...',\n};\n\nexport default locale;\n"],"mappings":"AAEA,IAAM,EAAuB,CAC5B,UAAW,eACX,gBACC,+BACD,mBAAoB"}
@@ -0,0 +1,2 @@
1
+ var e={detectedAsCodeBlock:e=>`تم اللصق ككتلة كود ${e} مع تمييز بناء الجملة.`,detectedMixedContent:(e,t,o)=>{const d=[];if(e>0&&d.push(`${e} فقر${e>1?"ات":"ة"}`),t>0){const e=o.join("، ");d.push(`${t} كتل${t>1?"ة":""} كود (${e})`)}return`تم اللصق كـ ${d.join(" و ")}.`}};export{e as default};
2
+ //# sourceMappingURL=ar-7EtzKNIe.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-7EtzKNIe.mjs","names":[],"sources":["../../src/plugins/smart-paste/locales/ar.ts"],"sourcesContent":["import type { SmartPasteLocale } from '../SmartPasteLocale.js';\n\nconst locale: SmartPasteLocale = {\n\tdetectedAsCodeBlock: (language: string) => `تم اللصق ككتلة كود ${language} مع تمييز بناء الجملة.`,\n\tdetectedMixedContent: (textCount: number, codeCount: number, languages: readonly string[]) => {\n\t\tconst parts: string[] = [];\n\t\tif (textCount > 0) {\n\t\t\tparts.push(`${textCount} فقر${textCount > 1 ? 'ات' : 'ة'}`);\n\t\t}\n\t\tif (codeCount > 0) {\n\t\t\tconst langList: string = languages.join('، ');\n\t\t\tparts.push(`${codeCount} كتل${codeCount > 1 ? 'ة' : ''} كود (${langList})`);\n\t\t}\n\t\treturn `تم اللصق كـ ${parts.join(' و ')}.`;\n\t},\n};\n\nexport default locale;\n"],"mappings":"AAEA,IAAM,EAA2B,CAChC,oBAAsB,GAAqB,sBAAsB,0BACjE,qBAAA,CAAuB,EAAmB,EAAmB,KAC5D,MAAM,EAAkB,GAIxB,GAHI,EAAY,GACf,EAAM,KAAK,GAAG,QAAgB,EAAY,EAAI,KAAO,OAElD,EAAY,EAAG,CAClB,MAAM,EAAmB,EAAU,KAAK,MACxC,EAAM,KAAK,GAAG,QAAgB,EAAY,EAAI,IAAM,WAAW,MAEhE,MAAO,eAAe,EAAM,KAAK"}
@@ -0,0 +1,2 @@
1
+ var i={inlineLTR:"سطري من اليسار إلى اليمين",inlineRTL:"سطري من اليمين إلى اليسار",inlineAuto:"سطري تلقائي",inlineLabel:"اتجاه سطري",inlineTooltip:"اتجاه سطري",announceRemoveBidi:"تم إزالة عزل الاتجاه السطري"};export{i as default};
2
+ //# sourceMappingURL=ar-B2pDI_LT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-B2pDI_LT.mjs","names":[],"sources":["../../src/plugins/bidi-isolation/locales/ar.ts"],"sourcesContent":["import type { BidiIsolationLocale } from '../BidiIsolationLocale.js';\n\nconst locale: BidiIsolationLocale = {\n\tinlineLTR: 'سطري من اليسار إلى اليمين',\n\tinlineRTL: 'سطري من اليمين إلى اليسار',\n\tinlineAuto: 'سطري تلقائي',\n\tinlineLabel: 'اتجاه سطري',\n\tinlineTooltip: 'اتجاه سطري',\n\tannounceRemoveBidi: 'تم إزالة عزل الاتجاه السطري',\n};\n\nexport default locale;\n"],"mappings":"AAEA,IAAM,EAA8B,CACnC,UAAW,4BACX,UAAW,4BACX,WAAY,cACZ,YAAa,aACb,cAAe,aACf,mBAAoB"}
@@ -0,0 +1,2 @@
1
+ var a={boldLabel:"غامق",italicLabel:"مائل",underlineLabel:"تحته خط"};export{a as default};
2
+ //# sourceMappingURL=ar-BV6-zQd7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-BV6-zQd7.mjs","names":[],"sources":["../../src/plugins/text-formatting/locales/ar.ts"],"sourcesContent":["import type { TextFormattingLocale } from '../TextFormattingLocale.js';\n\nconst locale: TextFormattingLocale = {\n\tboldLabel: 'غامق',\n\titalicLabel: 'مائل',\n\tunderlineLabel: 'تحته خط',\n};\n\nexport default locale;\n"],"mappings":"AAEA,IAAM,EAA+B,CACpC,UAAW,OACX,YAAa,OACb,eAAgB"}
@@ -0,0 +1,2 @@
1
+ var e={label:"كتلة كود",tooltip:e=>e?`كتلة كود (${e})`:"كتلة كود",enteredCodeBlock:"تم الدخول إلى كتلة الكود. اضغط Escape للخروج.",leftCodeBlock:"تم الخروج من كتلة الكود.",copyCodeAria:"نسخ الكود",escToExit:"Esc للخروج",codeBlockAriaLabel:e=>`كتلة كود ${e}. اضغط Escape للخروج.`,copiedToClipboard:"تم النسخ إلى الحافظة",copyFailed:"فشل نسخ الكود",deleteCodeBlockAria:"حذف كتلة الكود",deletedCodeBlock:"تم حذف كتلة الكود",selectLanguageAria:"اختيار اللغة",languageChanged:e=>`تم تغيير اللغة إلى ${e}`,plainText:"نص عادي",indentedNLines:e=>1===e?"تمّ تعويض سطر واحد":`تمّ تعويض ${e} أسطر`,dedentedNLines:e=>1===e?"تمّ إلغاء تعويض سطر واحد":`تمّ إلغاء تعويض ${e} أسطر`};export{e as default};
2
+ //# sourceMappingURL=ar-BaCL4Bzy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-BaCL4Bzy.mjs","names":[],"sources":["../../src/plugins/code-block/locales/ar.ts"],"sourcesContent":["import type { CodeBlockLocale } from '../CodeBlockLocale.js';\n\nconst locale: CodeBlockLocale = {\n\tlabel: '\\u0643\\u062a\\u0644\\u0629 \\u0643\\u0648\\u062f',\n\ttooltip: (shortcut?: string) =>\n\t\tshortcut\n\t\t\t? `\\u0643\\u062a\\u0644\\u0629 \\u0643\\u0648\\u062f (${shortcut})`\n\t\t\t: '\\u0643\\u062a\\u0644\\u0629 \\u0643\\u0648\\u062f',\n\tenteredCodeBlock:\n\t\t'\\u062a\\u0645 \\u0627\\u0644\\u062f\\u062e\\u0648\\u0644 \\u0625\\u0644\\u0649 \\u0643\\u062a\\u0644\\u0629 \\u0627\\u0644\\u0643\\u0648\\u062f. \\u0627\\u0636\\u063a\\u0637 Escape \\u0644\\u0644\\u062e\\u0631\\u0648\\u062c.',\n\tleftCodeBlock:\n\t\t'\\u062a\\u0645 \\u0627\\u0644\\u062e\\u0631\\u0648\\u062c \\u0645\\u0646 \\u0643\\u062a\\u0644\\u0629 \\u0627\\u0644\\u0643\\u0648\\u062f.',\n\tcopyCodeAria: '\\u0646\\u0633\\u062e \\u0627\\u0644\\u0643\\u0648\\u062f',\n\tescToExit: 'Esc \\u0644\\u0644\\u062e\\u0631\\u0648\\u062c',\n\tcodeBlockAriaLabel: (lang: string) =>\n\t\t`\\u0643\\u062a\\u0644\\u0629 \\u0643\\u0648\\u062f ${lang}. \\u0627\\u0636\\u063a\\u0637 Escape \\u0644\\u0644\\u062e\\u0631\\u0648\\u062c.`,\n\tcopiedToClipboard:\n\t\t'\\u062a\\u0645 \\u0627\\u0644\\u0646\\u0633\\u062e \\u0625\\u0644\\u0649 \\u0627\\u0644\\u062d\\u0627\\u0641\\u0638\\u0629',\n\tcopyFailed: '\\u0641\\u0634\\u0644 \\u0646\\u0633\\u062e \\u0627\\u0644\\u0643\\u0648\\u062f',\n\tdeleteCodeBlockAria: '\\u062d\\u0630\\u0641 \\u0643\\u062a\\u0644\\u0629 \\u0627\\u0644\\u0643\\u0648\\u062f',\n\tdeletedCodeBlock:\n\t\t'\\u062a\\u0645 \\u062d\\u0630\\u0641 \\u0643\\u062a\\u0644\\u0629 \\u0627\\u0644\\u0643\\u0648\\u062f',\n\tselectLanguageAria: '\\u0627\\u062e\\u062a\\u064a\\u0627\\u0631 \\u0627\\u0644\\u0644\\u063a\\u0629',\n\tlanguageChanged: (lang: string) =>\n\t\t`\\u062a\\u0645 \\u062a\\u063a\\u064a\\u064a\\u0631 \\u0627\\u0644\\u0644\\u063a\\u0629 \\u0625\\u0644\\u0649 ${lang}`,\n\tplainText: '\\u0646\\u0635 \\u0639\\u0627\\u062f\\u064a',\n\tindentedNLines: (n: number) =>\n\t\tn === 1\n\t\t\t? '\\u062a\\u0645\\u0651 \\u062a\\u0639\\u0648\\u064a\\u0636 \\u0633\\u0637\\u0631 \\u0648\\u0627\\u062d\\u062f'\n\t\t\t: `\\u062a\\u0645\\u0651 \\u062a\\u0639\\u0648\\u064a\\u0636 ${n} \\u0623\\u0633\\u0637\\u0631`,\n\tdedentedNLines: (n: number) =>\n\t\tn === 1\n\t\t\t? '\\u062a\\u0645\\u0651 \\u0625\\u0644\\u063a\\u0627\\u0621 \\u062a\\u0639\\u0648\\u064a\\u0636 \\u0633\\u0637\\u0631 \\u0648\\u0627\\u062d\\u062f'\n\t\t\t: `\\u062a\\u0645\\u0651 \\u0625\\u0644\\u063a\\u0627\\u0621 \\u062a\\u0639\\u0648\\u064a\\u0636 ${n} \\u0623\\u0633\\u0637\\u0631`,\n};\n\nexport default locale;\n"],"mappings":"AAEA,IAAM,EAA0B,CAC/B,MAAO,WACP,QAAU,GACT,EACG,aAAgD,KAChD,WACJ,iBACC,gDACD,cACC,2BACD,aAAc,YACd,UAAW,aACX,mBAAqB,GACpB,YAA+C,yBAChD,kBACC,uBACD,WAAY,gBACZ,oBAAqB,iBACrB,iBACC,oBACD,mBAAoB,eACpB,gBAAkB,GACjB,sBAAiG,IAClG,UAAW,UACX,eAAiB,GACV,IAAN,EACG,qBACA,aAAqD,SACzD,eAAiB,GACV,IAAN,EACG,2BACA,mBAAoF"}
@@ -0,0 +1,2 @@
1
+ var t={label:"حجم الخط",tooltip:"حجم الخط",customFontSizeAria:"حجم خط مخصص",fontSizesAria:"أحجام الخط"};export{t as default};
2
+ //# sourceMappingURL=ar-BdGHrLSw.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-BdGHrLSw.mjs","names":[],"sources":["../../src/plugins/font-size/locales/ar.ts"],"sourcesContent":["import type { FontSizeLocale } from '../FontSizeLocale.js';\n\nconst locale: FontSizeLocale = {\n\tlabel: 'حجم الخط',\n\ttooltip: 'حجم الخط',\n\tcustomFontSizeAria: 'حجم خط مخصص',\n\tfontSizesAria: 'أحجام الخط',\n};\n\nexport default locale;\n"],"mappings":"AAEA,IAAM,EAAyB,CAC9B,MAAO,WACP,QAAS,WACT,mBAAoB,cACpB,cAAe"}
@@ -0,0 +1,2 @@
1
+ var e={bulletList:"قائمة نقطية",numberedList:"قائمة مرقمة",checklist:"قائمة تحقق"};export{e as default};
2
+ //# sourceMappingURL=ar-BwYDKOvO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-BwYDKOvO.mjs","names":[],"sources":["../../src/plugins/list/locales/ar.ts"],"sourcesContent":["import type { ListLocale } from '../ListLocale.js';\n\nconst locale: ListLocale = {\n\tbulletList: 'قائمة نقطية',\n\tnumberedList: 'قائمة مرقمة',\n\tchecklist: 'قائمة تحقق',\n};\n\nexport default locale;\n"],"mappings":"AAEA,IAAM,EAAqB,CAC1B,WAAY,cACZ,aAAc,cACd,UAAW"}
@@ -0,0 +1,2 @@
1
+ var e={insertImage:"إدراج صورة",insertImageTooltip:"إدراج صورة",uploadFromComputer:"رفع من الحاسوب",uploadAria:"رفع صورة من الحاسوب",separator:"أو",urlPlaceholder:"https://...",urlAria:"رابط الصورة",insertButton:"إدراج",insertAria:"إدراج صورة",imageAria:(e,t,i)=>{const a=[e||"صورة"];return void 0!==t&&void 0!==i&&a.push(`${t} × ${i} بكسل`),a.join("، ")},resetToNaturalSize:"تمت إعادة الصورة إلى حجمها الطبيعي.",uploadFailed:"فشل رفع الصورة.",uploading:"...جارٍ الرفع",resizeHandleLabel:e=>`تغيير حجم ${{"top-left":"أعلى اليسار","top-right":"أعلى اليمين","bottom-left":"أسفل اليسار","bottom-right":"أسفل اليمين"}[e]??e}`,imageSelected:"تم تحديد الصورة.",altTextPrefix:"النص البديل: ",imageSizeAnnounce:(e,t)=>`الحجم: ${e} × ${t} بكسل.`,resizeHint:(e,t)=>`${e} / ${t} لتغيير الحجم.`,imageResized:(e,t)=>`تم تغيير حجم الصورة إلى ${e} × ${t} بكسل.`,keyboardResizeHint:(e,t)=>`${e} / ${t} لتغيير الحجم`};export{e as default};
2
+ //# sourceMappingURL=ar-C5eLSf71.mjs.map