bridgerte 0.9.22 → 0.9.24

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 (642) hide show
  1. package/README.md +55 -9
  2. package/dist/assets/abap-5JJ_uXwM.js +8 -0
  3. package/dist/assets/abap-5JJ_uXwM.js.map +1 -0
  4. package/dist/assets/actionscript-3-DE1C41bY.js +8 -0
  5. package/dist/assets/actionscript-3-DE1C41bY.js.map +1 -0
  6. package/dist/assets/ada-BG05PpOB.js +8 -0
  7. package/dist/assets/ada-BG05PpOB.js.map +1 -0
  8. package/dist/assets/andromeeda-BY_rNuBQ.js +5 -0
  9. package/dist/assets/andromeeda-BY_rNuBQ.js.map +1 -0
  10. package/dist/assets/angular-html-aal4wZP4.js +42 -0
  11. package/dist/assets/angular-html-aal4wZP4.js.map +1 -0
  12. package/dist/assets/angular-ts-DAE48Xv3.js +30 -0
  13. package/dist/assets/angular-ts-DAE48Xv3.js.map +1 -0
  14. package/dist/assets/apache-D7jlTOw0.js +8 -0
  15. package/dist/assets/apache-D7jlTOw0.js.map +1 -0
  16. package/dist/assets/apex-B5cHO7Zb.js +8 -0
  17. package/dist/assets/apex-B5cHO7Zb.js.map +1 -0
  18. package/dist/assets/apl-KqhKRlqN.js +19 -0
  19. package/dist/assets/apl-KqhKRlqN.js.map +1 -0
  20. package/dist/assets/applescript-guFn5j4s.js +8 -0
  21. package/dist/assets/applescript-guFn5j4s.js.map +1 -0
  22. package/dist/assets/ara-D87wAYhe.js +8 -0
  23. package/dist/assets/ara-D87wAYhe.js.map +1 -0
  24. package/dist/assets/asciidoc-DHU272__.js +8 -0
  25. package/dist/assets/asciidoc-DHU272__.js.map +1 -0
  26. package/dist/assets/asm-BIl1E4lX.js +8 -0
  27. package/dist/assets/asm-BIl1E4lX.js.map +1 -0
  28. package/dist/assets/astro-CoyRAbIC.js +20 -0
  29. package/dist/assets/astro-CoyRAbIC.js.map +1 -0
  30. package/dist/assets/aurora-x-C6DmnWDt.js +5 -0
  31. package/dist/assets/aurora-x-C6DmnWDt.js.map +1 -0
  32. package/dist/assets/awk-x1P7Yy6J.js +8 -0
  33. package/dist/assets/awk-x1P7Yy6J.js.map +1 -0
  34. package/dist/assets/ayu-dark-DwU3UN-n.js +5 -0
  35. package/dist/assets/ayu-dark-DwU3UN-n.js.map +1 -0
  36. package/dist/assets/ayu-light-BeSY2ZJx.js +5 -0
  37. package/dist/assets/ayu-light-BeSY2ZJx.js.map +1 -0
  38. package/dist/assets/ayu-mirage-EiPwM0mG.js +5 -0
  39. package/dist/assets/ayu-mirage-EiPwM0mG.js.map +1 -0
  40. package/dist/assets/ballerina-D1k6pTDA.js +8 -0
  41. package/dist/assets/ballerina-D1k6pTDA.js.map +1 -0
  42. package/dist/assets/bat-CKn1WSW3.js +8 -0
  43. package/dist/assets/bat-CKn1WSW3.js.map +1 -0
  44. package/dist/assets/beancount-1v_PY4BB.js +8 -0
  45. package/dist/assets/beancount-1v_PY4BB.js.map +1 -0
  46. package/dist/assets/berry-ChXc1sMd.js +8 -0
  47. package/dist/assets/berry-ChXc1sMd.js.map +1 -0
  48. package/dist/assets/bibtex-YjwILF7F.js +8 -0
  49. package/dist/assets/bibtex-YjwILF7F.js.map +1 -0
  50. package/dist/assets/bicep-C0D_R8_K.js +8 -0
  51. package/dist/assets/bicep-C0D_R8_K.js.map +1 -0
  52. package/dist/assets/bird2-DDRneDX_.js +8 -0
  53. package/dist/assets/bird2-DDRneDX_.js.map +1 -0
  54. package/dist/assets/blade-FnIjT1E3.js +23 -0
  55. package/dist/assets/blade-FnIjT1E3.js.map +1 -0
  56. package/dist/assets/bsl-DJzmyrer.js +10 -0
  57. package/dist/assets/bsl-DJzmyrer.js.map +1 -0
  58. package/dist/assets/c-xjDmHeY4.js +8 -0
  59. package/dist/assets/c-xjDmHeY4.js.map +1 -0
  60. package/dist/assets/c3-ifVI-lyl.js +8 -0
  61. package/dist/assets/c3-ifVI-lyl.js.map +1 -0
  62. package/dist/assets/cadence-4_3YDhNk.js +8 -0
  63. package/dist/assets/cadence-4_3YDhNk.js.map +1 -0
  64. package/dist/assets/cairo-CckC4pbv.js +10 -0
  65. package/dist/assets/cairo-CckC4pbv.js.map +1 -0
  66. package/dist/assets/catppuccin-frappe-B5VVdV_e.js +5 -0
  67. package/dist/assets/catppuccin-frappe-B5VVdV_e.js.map +1 -0
  68. package/dist/assets/catppuccin-latte-D8pvGdu1.js +5 -0
  69. package/dist/assets/catppuccin-latte-D8pvGdu1.js.map +1 -0
  70. package/dist/assets/catppuccin-macchiato-HRcjrIrY.js +5 -0
  71. package/dist/assets/catppuccin-macchiato-HRcjrIrY.js.map +1 -0
  72. package/dist/assets/catppuccin-mocha-CIwIEnSB.js +5 -0
  73. package/dist/assets/catppuccin-mocha-CIwIEnSB.js.map +1 -0
  74. package/dist/assets/clarity-LYkNoMZG.js +8 -0
  75. package/dist/assets/clarity-LYkNoMZG.js.map +1 -0
  76. package/dist/assets/clojure-BKPgNuET.js +8 -0
  77. package/dist/assets/clojure-BKPgNuET.js.map +1 -0
  78. package/dist/assets/cmake-DKfc4EHO.js +8 -0
  79. package/dist/assets/cmake-DKfc4EHO.js.map +1 -0
  80. package/dist/assets/cobol-BitaBRgT.js +14 -0
  81. package/dist/assets/cobol-BitaBRgT.js.map +1 -0
  82. package/dist/assets/codeowners-CGzOUqRt.js +8 -0
  83. package/dist/assets/codeowners-CGzOUqRt.js.map +1 -0
  84. package/dist/assets/codeql-CB2tU2yr.js +8 -0
  85. package/dist/assets/codeql-CB2tU2yr.js.map +1 -0
  86. package/dist/assets/coffee-CZwg37T3.js +10 -0
  87. package/dist/assets/coffee-CZwg37T3.js.map +1 -0
  88. package/dist/assets/common-lisp-Dpa6SDDF.js +8 -0
  89. package/dist/assets/common-lisp-Dpa6SDDF.js.map +1 -0
  90. package/dist/assets/coq-BcttDLdJ.js +8 -0
  91. package/dist/assets/coq-BcttDLdJ.js.map +1 -0
  92. package/dist/assets/cpp-BlAh3S4C.js +23 -0
  93. package/dist/assets/cpp-BlAh3S4C.js.map +1 -0
  94. package/dist/assets/crystal-Bs9TFo_P.js +20 -0
  95. package/dist/assets/crystal-Bs9TFo_P.js.map +1 -0
  96. package/dist/assets/csharp-DSxyDUiT.js +8 -0
  97. package/dist/assets/csharp-DSxyDUiT.js.map +1 -0
  98. package/dist/assets/css-C_jsWB7w.js +8 -0
  99. package/dist/assets/css-C_jsWB7w.js.map +1 -0
  100. package/dist/assets/csv-DH-1IWvI.js +8 -0
  101. package/dist/assets/csv-DH-1IWvI.js.map +1 -0
  102. package/dist/assets/cue-HSbRnhKw.js +8 -0
  103. package/dist/assets/cue-HSbRnhKw.js.map +1 -0
  104. package/dist/assets/cypher-DoZ7GUDp.js +8 -0
  105. package/dist/assets/cypher-DoZ7GUDp.js.map +1 -0
  106. package/dist/assets/d-CeeVpqRv.js +8 -0
  107. package/dist/assets/d-CeeVpqRv.js.map +1 -0
  108. package/dist/assets/dark-plus-BZtx1JS2.js +5 -0
  109. package/dist/assets/dark-plus-BZtx1JS2.js.map +1 -0
  110. package/dist/assets/dart-CfpH2ytW.js +8 -0
  111. package/dist/assets/dart-CfpH2ytW.js.map +1 -0
  112. package/dist/assets/dax-B2DK8VnI.js +8 -0
  113. package/dist/assets/dax-B2DK8VnI.js.map +1 -0
  114. package/dist/assets/desktop-C_92N0gp.js +8 -0
  115. package/dist/assets/desktop-C_92N0gp.js.map +1 -0
  116. package/dist/assets/diff-CIoVq7iw.js +8 -0
  117. package/dist/assets/diff-CIoVq7iw.js.map +1 -0
  118. package/dist/assets/docker-C_b4d5MG.js +8 -0
  119. package/dist/assets/docker-C_b4d5MG.js.map +1 -0
  120. package/dist/assets/dotenv-CTk-83yR.js +8 -0
  121. package/dist/assets/dotenv-CTk-83yR.js.map +1 -0
  122. package/dist/assets/dracula-C90mcX-J.js +5 -0
  123. package/dist/assets/dracula-C90mcX-J.js.map +1 -0
  124. package/dist/assets/dracula-soft-CfxSDbho.js +5 -0
  125. package/dist/assets/dracula-soft-CfxSDbho.js.map +1 -0
  126. package/dist/assets/dream-maker-BRhjIgJd.js +8 -0
  127. package/dist/assets/dream-maker-BRhjIgJd.js.map +1 -0
  128. package/dist/assets/edge-ChLL70qB.js +16 -0
  129. package/dist/assets/edge-ChLL70qB.js.map +1 -0
  130. package/dist/assets/elixir-Cn03DtOX.js +12 -0
  131. package/dist/assets/elixir-Cn03DtOX.js.map +1 -0
  132. package/dist/assets/elm-BIz5FEly.js +11 -0
  133. package/dist/assets/elm-BIz5FEly.js.map +1 -0
  134. package/dist/assets/emacs-lisp-BPa43G0X.js +8 -0
  135. package/dist/assets/emacs-lisp-BPa43G0X.js.map +1 -0
  136. package/dist/assets/erb-DnDXmOFA.js +29 -0
  137. package/dist/assets/erb-DnDXmOFA.js.map +1 -0
  138. package/dist/assets/erlang-Bs5tgDCH.js +10 -0
  139. package/dist/assets/erlang-Bs5tgDCH.js.map +1 -0
  140. package/dist/assets/everforest-dark-WkkMlVdr.js +5 -0
  141. package/dist/assets/everforest-dark-WkkMlVdr.js.map +1 -0
  142. package/dist/assets/everforest-light-BnEIoJmx.js +5 -0
  143. package/dist/assets/everforest-light-BnEIoJmx.js.map +1 -0
  144. package/dist/assets/fennel-Bcsiz5ip.js +8 -0
  145. package/dist/assets/fennel-Bcsiz5ip.js.map +1 -0
  146. package/dist/assets/fish-DHyTDlfQ.js +8 -0
  147. package/dist/assets/fish-DHyTDlfQ.js.map +1 -0
  148. package/dist/assets/fluent-4neBKDDj.js +8 -0
  149. package/dist/assets/fluent-4neBKDDj.js.map +1 -0
  150. package/dist/assets/fortran-fixed-form-CzBifAhA.js +10 -0
  151. package/dist/assets/fortran-fixed-form-CzBifAhA.js.map +1 -0
  152. package/dist/assets/fortran-free-form-CgyZ4k0y.js +8 -0
  153. package/dist/assets/fortran-free-form-CgyZ4k0y.js.map +1 -0
  154. package/dist/assets/fsharp-9GbbySMJ.js +10 -0
  155. package/dist/assets/fsharp-9GbbySMJ.js.map +1 -0
  156. package/dist/assets/gdresource-DNKHowPg.js +12 -0
  157. package/dist/assets/gdresource-DNKHowPg.js.map +1 -0
  158. package/dist/assets/gdscript-BsvbToqr.js +8 -0
  159. package/dist/assets/gdscript-BsvbToqr.js.map +1 -0
  160. package/dist/assets/gdshader-OUoLz6Pt.js +8 -0
  161. package/dist/assets/gdshader-OUoLz6Pt.js.map +1 -0
  162. package/dist/assets/genie-CCD_4Lwj.js +8 -0
  163. package/dist/assets/genie-CCD_4Lwj.js.map +1 -0
  164. package/dist/assets/gherkin-DtBWBYmY.js +8 -0
  165. package/dist/assets/gherkin-DtBWBYmY.js.map +1 -0
  166. package/dist/assets/git-commit-CIBsd3Oe.js +10 -0
  167. package/dist/assets/git-commit-CIBsd3Oe.js.map +1 -0
  168. package/dist/assets/git-rebase-Bsia5skB.js +10 -0
  169. package/dist/assets/git-rebase-Bsia5skB.js.map +1 -0
  170. package/dist/assets/github-dark-Crb_T9c1.js +5 -0
  171. package/dist/assets/github-dark-Crb_T9c1.js.map +1 -0
  172. package/dist/assets/github-dark-default-CrymNA3e.js +5 -0
  173. package/dist/assets/github-dark-default-CrymNA3e.js.map +1 -0
  174. package/dist/assets/github-dark-dimmed-DVypsQQ6.js +5 -0
  175. package/dist/assets/github-dark-dimmed-DVypsQQ6.js.map +1 -0
  176. package/dist/assets/github-dark-high-contrast-oosJriQF.js +5 -0
  177. package/dist/assets/github-dark-high-contrast-oosJriQF.js.map +1 -0
  178. package/dist/assets/github-light-DzgloXIJ.js +5 -0
  179. package/dist/assets/github-light-DzgloXIJ.js.map +1 -0
  180. package/dist/assets/github-light-default-BUaqj3Kk.js +5 -0
  181. package/dist/assets/github-light-default-BUaqj3Kk.js.map +1 -0
  182. package/dist/assets/github-light-high-contrast-Be7TuOaG.js +5 -0
  183. package/dist/assets/github-light-high-contrast-Be7TuOaG.js.map +1 -0
  184. package/dist/assets/gleam-Bby7sLtj.js +8 -0
  185. package/dist/assets/gleam-Bby7sLtj.js.map +1 -0
  186. package/dist/assets/glimmer-js-K1ky8h51.js +16 -0
  187. package/dist/assets/glimmer-js-K1ky8h51.js.map +1 -0
  188. package/dist/assets/glimmer-ts-Glf2iriO.js +16 -0
  189. package/dist/assets/glimmer-ts-Glf2iriO.js.map +1 -0
  190. package/dist/assets/glsl-B7qnt91l.js +10 -0
  191. package/dist/assets/glsl-B7qnt91l.js.map +1 -0
  192. package/dist/assets/gn-BZhHIoL6.js +8 -0
  193. package/dist/assets/gn-BZhHIoL6.js.map +1 -0
  194. package/dist/assets/gnuplot-ko8wwdty.js +8 -0
  195. package/dist/assets/gnuplot-ko8wwdty.js.map +1 -0
  196. package/dist/assets/go-bOxRwq8F.js +8 -0
  197. package/dist/assets/go-bOxRwq8F.js.map +1 -0
  198. package/dist/assets/graphql-DkLU_y6F.js +16 -0
  199. package/dist/assets/graphql-DkLU_y6F.js.map +1 -0
  200. package/dist/assets/groovy-CnONGBTg.js +8 -0
  201. package/dist/assets/groovy-CnONGBTg.js.map +1 -0
  202. package/dist/assets/gruvbox-dark-hard-w2v6PtUq.js +5 -0
  203. package/dist/assets/gruvbox-dark-hard-w2v6PtUq.js.map +1 -0
  204. package/dist/assets/gruvbox-dark-medium-BkadlV_U.js +5 -0
  205. package/dist/assets/gruvbox-dark-medium-BkadlV_U.js.map +1 -0
  206. package/dist/assets/gruvbox-dark-soft-BHFO6CEk.js +5 -0
  207. package/dist/assets/gruvbox-dark-soft-BHFO6CEk.js.map +1 -0
  208. package/dist/assets/gruvbox-light-hard-9A_pD-e-.js +5 -0
  209. package/dist/assets/gruvbox-light-hard-9A_pD-e-.js.map +1 -0
  210. package/dist/assets/gruvbox-light-medium-DS4uqfa1.js +5 -0
  211. package/dist/assets/gruvbox-light-medium-DS4uqfa1.js.map +1 -0
  212. package/dist/assets/gruvbox-light-soft-qMWiTKK4.js +5 -0
  213. package/dist/assets/gruvbox-light-soft-qMWiTKK4.js.map +1 -0
  214. package/dist/assets/hack-gfrPUlig.js +14 -0
  215. package/dist/assets/hack-gfrPUlig.js.map +1 -0
  216. package/dist/assets/haml-B4EqXRg_.js +12 -0
  217. package/dist/assets/haml-B4EqXRg_.js.map +1 -0
  218. package/dist/assets/handlebars-YxgQMD1d.js +16 -0
  219. package/dist/assets/handlebars-YxgQMD1d.js.map +1 -0
  220. package/dist/assets/haskell-2dsAc57b.js +8 -0
  221. package/dist/assets/haskell-2dsAc57b.js.map +1 -0
  222. package/dist/assets/haxe-OKRacM9E.js +8 -0
  223. package/dist/assets/haxe-OKRacM9E.js.map +1 -0
  224. package/dist/assets/hcl-DWQu2dqK.js +8 -0
  225. package/dist/assets/hcl-DWQu2dqK.js.map +1 -0
  226. package/dist/assets/hjson-By_UsfXI.js +8 -0
  227. package/dist/assets/hjson-By_UsfXI.js.map +1 -0
  228. package/dist/assets/hlsl-DA61eaD3.js +8 -0
  229. package/dist/assets/hlsl-DA61eaD3.js.map +1 -0
  230. package/dist/assets/horizon-BAcSmUQx.js +5 -0
  231. package/dist/assets/horizon-BAcSmUQx.js.map +1 -0
  232. package/dist/assets/horizon-bright-BIr1qV5K.js +5 -0
  233. package/dist/assets/horizon-bright-BIr1qV5K.js.map +1 -0
  234. package/dist/assets/houston-CK0N9cPp.js +5 -0
  235. package/dist/assets/houston-CK0N9cPp.js.map +1 -0
  236. package/dist/assets/html-derivative-DNVkVN8y.js +12 -0
  237. package/dist/assets/html-derivative-DNVkVN8y.js.map +1 -0
  238. package/dist/assets/html-hx4Wfyw6.js +12 -0
  239. package/dist/assets/html-hx4Wfyw6.js.map +1 -0
  240. package/dist/assets/http-CVXrBmpc.js +21 -0
  241. package/dist/assets/http-CVXrBmpc.js.map +1 -0
  242. package/dist/assets/hurl-B08iSRaK.js +19 -0
  243. package/dist/assets/hurl-B08iSRaK.js.map +1 -0
  244. package/dist/assets/hxml-CwhzGRqU.js +10 -0
  245. package/dist/assets/hxml-CwhzGRqU.js.map +1 -0
  246. package/dist/assets/hy-B23VqsRP.js +8 -0
  247. package/dist/assets/hy-B23VqsRP.js.map +1 -0
  248. package/dist/assets/imba-C1GSCVFf.js +8 -0
  249. package/dist/assets/imba-C1GSCVFf.js.map +1 -0
  250. package/dist/assets/ini-r1O4-awP.js +8 -0
  251. package/dist/assets/ini-r1O4-awP.js.map +1 -0
  252. package/dist/assets/java-Bl-5EZmB.js +8 -0
  253. package/dist/assets/java-Bl-5EZmB.js.map +1 -0
  254. package/dist/assets/javascript-Cq55jE6w.js +8 -0
  255. package/dist/assets/javascript-Cq55jE6w.js.map +1 -0
  256. package/dist/assets/jinja-hp_3bha4.js +17 -0
  257. package/dist/assets/jinja-hp_3bha4.js.map +1 -0
  258. package/dist/assets/jison-9WPWo0xg.js +10 -0
  259. package/dist/assets/jison-9WPWo0xg.js.map +1 -0
  260. package/dist/assets/json-CndaR9w5.js +8 -0
  261. package/dist/assets/json-CndaR9w5.js.map +1 -0
  262. package/dist/assets/json5-C8Jm9K5X.js +8 -0
  263. package/dist/assets/json5-C8Jm9K5X.js.map +1 -0
  264. package/dist/assets/jsonc-mlgADggJ.js +8 -0
  265. package/dist/assets/jsonc-mlgADggJ.js.map +1 -0
  266. package/dist/assets/jsonl-CBj3pbR_.js +8 -0
  267. package/dist/assets/jsonl-CBj3pbR_.js.map +1 -0
  268. package/dist/assets/jsonnet-B_sZ3RZB.js +8 -0
  269. package/dist/assets/jsonnet-B_sZ3RZB.js.map +1 -0
  270. package/dist/assets/jssm-CvtepJVU.js +8 -0
  271. package/dist/assets/jssm-CvtepJVU.js.map +1 -0
  272. package/dist/assets/jsx-BfjkQ0v5.js +8 -0
  273. package/dist/assets/jsx-BfjkQ0v5.js.map +1 -0
  274. package/dist/assets/julia-Dnhsueg9.js +21 -0
  275. package/dist/assets/julia-Dnhsueg9.js.map +1 -0
  276. package/dist/assets/just-6vIP7wP9.js +35 -0
  277. package/dist/assets/just-6vIP7wP9.js.map +1 -0
  278. package/dist/assets/kanagawa-dragon-Dgsvhj-I.js +5 -0
  279. package/dist/assets/kanagawa-dragon-Dgsvhj-I.js.map +1 -0
  280. package/dist/assets/kanagawa-lotus-bk4_W8LM.js +5 -0
  281. package/dist/assets/kanagawa-lotus-bk4_W8LM.js.map +1 -0
  282. package/dist/assets/kanagawa-wave-CVNUZ7bU.js +5 -0
  283. package/dist/assets/kanagawa-wave-CVNUZ7bU.js.map +1 -0
  284. package/dist/assets/kdl-CwdrBlJU.js +8 -0
  285. package/dist/assets/kdl-CwdrBlJU.js.map +1 -0
  286. package/dist/assets/kotlin-K4QQzEsQ.js +8 -0
  287. package/dist/assets/kotlin-K4QQzEsQ.js.map +1 -0
  288. package/dist/assets/kusto-CgER6Sxt.js +8 -0
  289. package/dist/assets/kusto-CgER6Sxt.js.map +1 -0
  290. package/dist/assets/laserwave-BU7zaG-q.js +5 -0
  291. package/dist/assets/laserwave-BU7zaG-q.js.map +1 -0
  292. package/dist/assets/latex-vw5kx6SC.js +11 -0
  293. package/dist/assets/latex-vw5kx6SC.js.map +1 -0
  294. package/dist/assets/lean-Cp_iMYZj.js +8 -0
  295. package/dist/assets/lean-Cp_iMYZj.js.map +1 -0
  296. package/dist/assets/less-CFxJbkOX.js +8 -0
  297. package/dist/assets/less-CFxJbkOX.js.map +1 -0
  298. package/dist/assets/light-plus-CCnaaxEe.js +5 -0
  299. package/dist/assets/light-plus-CCnaaxEe.js.map +1 -0
  300. package/dist/assets/liquid-ME1IH2EZ.js +16 -0
  301. package/dist/assets/liquid-ME1IH2EZ.js.map +1 -0
  302. package/dist/assets/llvm-DXF2zqxJ.js +8 -0
  303. package/dist/assets/llvm-DXF2zqxJ.js.map +1 -0
  304. package/dist/assets/log-BhdudKf6.js +8 -0
  305. package/dist/assets/log-BhdudKf6.js.map +1 -0
  306. package/dist/assets/logo-DdZuFRsA.js +8 -0
  307. package/dist/assets/logo-DdZuFRsA.js.map +1 -0
  308. package/dist/assets/lua-CNzUJNrS.js +10 -0
  309. package/dist/assets/lua-CNzUJNrS.js.map +1 -0
  310. package/dist/assets/luau-BbRxrK_-.js +8 -0
  311. package/dist/assets/luau-BbRxrK_-.js.map +1 -0
  312. package/dist/assets/make-CzMpGB61.js +8 -0
  313. package/dist/assets/make-CzMpGB61.js.map +1 -0
  314. package/dist/assets/markdown-BIyFz8QW.js +8 -0
  315. package/dist/assets/markdown-BIyFz8QW.js.map +1 -0
  316. package/dist/assets/marko-CDeO252B.js +16 -0
  317. package/dist/assets/marko-CDeO252B.js.map +1 -0
  318. package/dist/assets/material-theme-B-3T0qQC.js +5 -0
  319. package/dist/assets/material-theme-B-3T0qQC.js.map +1 -0
  320. package/dist/assets/material-theme-darker-DMHCIvq5.js +5 -0
  321. package/dist/assets/material-theme-darker-DMHCIvq5.js.map +1 -0
  322. package/dist/assets/material-theme-lighter-CnKSyNS5.js +5 -0
  323. package/dist/assets/material-theme-lighter-CnKSyNS5.js.map +1 -0
  324. package/dist/assets/material-theme-ocean-BKq6ZsFv.js +5 -0
  325. package/dist/assets/material-theme-ocean-BKq6ZsFv.js.map +1 -0
  326. package/dist/assets/material-theme-palenight-BaYUoLXq.js +5 -0
  327. package/dist/assets/material-theme-palenight-BaYUoLXq.js.map +1 -0
  328. package/dist/assets/matlab-CJkuh4eh.js +8 -0
  329. package/dist/assets/matlab-CJkuh4eh.js.map +1 -0
  330. package/dist/assets/mdc-DmwRfDxK.js +17 -0
  331. package/dist/assets/mdc-DmwRfDxK.js.map +1 -0
  332. package/dist/assets/mdx-DBtujtWe.js +8 -0
  333. package/dist/assets/mdx-DBtujtWe.js.map +1 -0
  334. package/dist/assets/mermaid-HX_erI9P.js +8 -0
  335. package/dist/assets/mermaid-HX_erI9P.js.map +1 -0
  336. package/dist/assets/min-dark-YawBJZLm.js +5 -0
  337. package/dist/assets/min-dark-YawBJZLm.js.map +1 -0
  338. package/dist/assets/min-light-CqsTzpMg.js +5 -0
  339. package/dist/assets/min-light-CqsTzpMg.js.map +1 -0
  340. package/dist/assets/mipsasm-CCIl-TEQ.js +8 -0
  341. package/dist/assets/mipsasm-CCIl-TEQ.js.map +1 -0
  342. package/dist/assets/mojo-0bwzCFgd.js +8 -0
  343. package/dist/assets/mojo-0bwzCFgd.js.map +1 -0
  344. package/dist/assets/monokai-DaNL4wHF.js +5 -0
  345. package/dist/assets/monokai-DaNL4wHF.js.map +1 -0
  346. package/dist/assets/moonbit-h33aWjYl.js +8 -0
  347. package/dist/assets/moonbit-h33aWjYl.js.map +1 -0
  348. package/dist/assets/move-B0UfBCDq.js +8 -0
  349. package/dist/assets/move-B0UfBCDq.js.map +1 -0
  350. package/dist/assets/narrat-yNVO4v0G.js +8 -0
  351. package/dist/assets/narrat-yNVO4v0G.js.map +1 -0
  352. package/dist/assets/nextflow-1-7NB-ni.js +10 -0
  353. package/dist/assets/nextflow-1-7NB-ni.js.map +1 -0
  354. package/dist/assets/nextflow-groovy-TPtoW2P_.js +8 -0
  355. package/dist/assets/nextflow-groovy-TPtoW2P_.js.map +1 -0
  356. package/dist/assets/nginx-C98jlNwk.js +11 -0
  357. package/dist/assets/nginx-C98jlNwk.js.map +1 -0
  358. package/dist/assets/night-owl-DEYddbGH.js +5 -0
  359. package/dist/assets/night-owl-DEYddbGH.js.map +1 -0
  360. package/dist/assets/night-owl-light-CgPgLhZe.js +5 -0
  361. package/dist/assets/night-owl-light-CgPgLhZe.js.map +1 -0
  362. package/dist/assets/nim-C-XJ5M42.js +23 -0
  363. package/dist/assets/nim-C-XJ5M42.js.map +1 -0
  364. package/dist/assets/nix-DPigNF-w.js +13 -0
  365. package/dist/assets/nix-DPigNF-w.js.map +1 -0
  366. package/dist/assets/nord-CUKU048J.js +5 -0
  367. package/dist/assets/nord-CUKU048J.js.map +1 -0
  368. package/dist/assets/nushell-TxwY6Pb5.js +8 -0
  369. package/dist/assets/nushell-TxwY6Pb5.js.map +1 -0
  370. package/dist/assets/objective-c-CGXCwEak.js +8 -0
  371. package/dist/assets/objective-c-CGXCwEak.js.map +1 -0
  372. package/dist/assets/objective-cpp-C6Ou-DLk.js +8 -0
  373. package/dist/assets/objective-cpp-C6Ou-DLk.js.map +1 -0
  374. package/dist/assets/ocaml-B8c2W4N8.js +8 -0
  375. package/dist/assets/ocaml-B8c2W4N8.js.map +1 -0
  376. package/dist/assets/odin-CZ4skJts.js +8 -0
  377. package/dist/assets/odin-CZ4skJts.js.map +1 -0
  378. package/dist/assets/one-dark-pro-XdKxImzj.js +5 -0
  379. package/dist/assets/one-dark-pro-XdKxImzj.js.map +1 -0
  380. package/dist/assets/one-light-BgKiLWqC.js +5 -0
  381. package/dist/assets/one-light-BgKiLWqC.js.map +1 -0
  382. package/dist/assets/openscad-jtaZZ0ry.js +8 -0
  383. package/dist/assets/openscad-jtaZZ0ry.js.map +1 -0
  384. package/dist/assets/pascal-Dyzoiklv.js +8 -0
  385. package/dist/assets/pascal-Dyzoiklv.js.map +1 -0
  386. package/dist/assets/perl-DZBQ1fP7.js +19 -0
  387. package/dist/assets/perl-DZBQ1fP7.js.map +1 -0
  388. package/dist/assets/php-B6rqs9dC.js +21 -0
  389. package/dist/assets/php-B6rqs9dC.js.map +1 -0
  390. package/dist/assets/pkl-B7NRYePu.js +8 -0
  391. package/dist/assets/pkl-B7NRYePu.js.map +1 -0
  392. package/dist/assets/plastic-lmGvlDWy.js +5 -0
  393. package/dist/assets/plastic-lmGvlDWy.js.map +1 -0
  394. package/dist/assets/plsql-ZYRyC0wP.js +8 -0
  395. package/dist/assets/plsql-ZYRyC0wP.js.map +1 -0
  396. package/dist/assets/po-CHOVNvtJ.js +8 -0
  397. package/dist/assets/po-CHOVNvtJ.js.map +1 -0
  398. package/dist/assets/poimandres-C_MUMTwG.js +5 -0
  399. package/dist/assets/poimandres-C_MUMTwG.js.map +1 -0
  400. package/dist/assets/polar-CElS9PCS.js +8 -0
  401. package/dist/assets/polar-CElS9PCS.js.map +1 -0
  402. package/dist/assets/postcss-DgldbzUq.js +8 -0
  403. package/dist/assets/postcss-DgldbzUq.js.map +1 -0
  404. package/dist/assets/powerquery-B6VmGZs1.js +8 -0
  405. package/dist/assets/powerquery-B6VmGZs1.js.map +1 -0
  406. package/dist/assets/powershell-Dp4oaXtH.js +8 -0
  407. package/dist/assets/powershell-Dp4oaXtH.js.map +1 -0
  408. package/dist/assets/prisma-CPG4K8GD.js +8 -0
  409. package/dist/assets/prisma-CPG4K8GD.js.map +1 -0
  410. package/dist/assets/prolog-BfH16pdb.js +8 -0
  411. package/dist/assets/prolog-BfH16pdb.js.map +1 -0
  412. package/dist/assets/proto-DRhBl2v_.js +8 -0
  413. package/dist/assets/proto-DRhBl2v_.js.map +1 -0
  414. package/dist/assets/pug-B5ZJTPhc.js +14 -0
  415. package/dist/assets/pug-B5ZJTPhc.js.map +1 -0
  416. package/dist/assets/puppet-D93mTCzv.js +8 -0
  417. package/dist/assets/puppet-D93mTCzv.js.map +1 -0
  418. package/dist/assets/purescript-BwFPZeJE.js +8 -0
  419. package/dist/assets/purescript-BwFPZeJE.js.map +1 -0
  420. package/dist/assets/python-hNCB2wYL.js +8 -0
  421. package/dist/assets/python-hNCB2wYL.js.map +1 -0
  422. package/dist/assets/qml-B7tPv6LL.js +10 -0
  423. package/dist/assets/qml-B7tPv6LL.js.map +1 -0
  424. package/dist/assets/qmldir-C_cCg2m9.js +8 -0
  425. package/dist/assets/qmldir-C_cCg2m9.js.map +1 -0
  426. package/dist/assets/qss-CXFHvGeG.js +8 -0
  427. package/dist/assets/qss-CXFHvGeG.js.map +1 -0
  428. package/dist/assets/r-DW2dRJNU.js +8 -0
  429. package/dist/assets/r-DW2dRJNU.js.map +1 -0
  430. package/dist/assets/racket-CElNGJsF.js +8 -0
  431. package/dist/assets/racket-CElNGJsF.js.map +1 -0
  432. package/dist/assets/raku-BGNf9XOF.js +8 -0
  433. package/dist/assets/raku-BGNf9XOF.js.map +1 -0
  434. package/dist/assets/razor-_hEMrIZE.js +14 -0
  435. package/dist/assets/razor-_hEMrIZE.js.map +1 -0
  436. package/dist/assets/red-AJNT05eU.js +5 -0
  437. package/dist/assets/red-AJNT05eU.js.map +1 -0
  438. package/dist/assets/reg-B1yGSPeX.js +8 -0
  439. package/dist/assets/reg-B1yGSPeX.js.map +1 -0
  440. package/dist/assets/regexp-DpBcpYls.js +8 -0
  441. package/dist/assets/regexp-DpBcpYls.js.map +1 -0
  442. package/dist/assets/rel-COHg19E9.js +8 -0
  443. package/dist/assets/rel-COHg19E9.js.map +1 -0
  444. package/dist/assets/riscv-DGE7iFEu.js +8 -0
  445. package/dist/assets/riscv-DGE7iFEu.js.map +1 -0
  446. package/dist/assets/ron-BU8eWRkc.js +8 -0
  447. package/dist/assets/ron-BU8eWRkc.js.map +1 -0
  448. package/dist/assets/rose-pine-BpSSTpDl.js +5 -0
  449. package/dist/assets/rose-pine-BpSSTpDl.js.map +1 -0
  450. package/dist/assets/rose-pine-dawn-JuXMWM7e.js +5 -0
  451. package/dist/assets/rose-pine-dawn-JuXMWM7e.js.map +1 -0
  452. package/dist/assets/rose-pine-moon-DfNEd67D.js +5 -0
  453. package/dist/assets/rose-pine-moon-DfNEd67D.js.map +1 -0
  454. package/dist/assets/rosmsg-DV4uqfTE.js +8 -0
  455. package/dist/assets/rosmsg-DV4uqfTE.js.map +1 -0
  456. package/dist/assets/rst-Dwts34Vp.js +38 -0
  457. package/dist/assets/rst-Dwts34Vp.js.map +1 -0
  458. package/dist/assets/ruby-BQIBxl9d.js +38 -0
  459. package/dist/assets/ruby-BQIBxl9d.js.map +1 -0
  460. package/dist/assets/rust-eyDPxu_F.js +8 -0
  461. package/dist/assets/rust-eyDPxu_F.js.map +1 -0
  462. package/dist/assets/sas-D42O7b-h.js +10 -0
  463. package/dist/assets/sas-D42O7b-h.js.map +1 -0
  464. package/dist/assets/sass-DgfD_AjS.js +8 -0
  465. package/dist/assets/sass-DgfD_AjS.js.map +1 -0
  466. package/dist/assets/scala-Bk1H2mSp.js +8 -0
  467. package/dist/assets/scala-Bk1H2mSp.js.map +1 -0
  468. package/dist/assets/scheme-CvUmbwed.js +8 -0
  469. package/dist/assets/scheme-CvUmbwed.js.map +1 -0
  470. package/dist/assets/scss-CuhcKk0L.js +10 -0
  471. package/dist/assets/scss-CuhcKk0L.js.map +1 -0
  472. package/dist/assets/sdbl-CsDj0b2n.js +8 -0
  473. package/dist/assets/sdbl-CsDj0b2n.js.map +1 -0
  474. package/dist/assets/shaderlab-BR6dybZt.js +10 -0
  475. package/dist/assets/shaderlab-BR6dybZt.js.map +1 -0
  476. package/dist/assets/shellscript-BFESB3IN.js +8 -0
  477. package/dist/assets/shellscript-BFESB3IN.js.map +1 -0
  478. package/dist/assets/shellsession-BUDs6Lj1.js +10 -0
  479. package/dist/assets/shellsession-BUDs6Lj1.js.map +1 -0
  480. package/dist/assets/shikiTokenizerWorker-BtjW_v9G.js +9878 -0
  481. package/dist/assets/shikiTokenizerWorker-BtjW_v9G.js.map +1 -0
  482. package/dist/assets/slack-dark-DWWJ5rYK.js +5 -0
  483. package/dist/assets/slack-dark-DWWJ5rYK.js.map +1 -0
  484. package/dist/assets/slack-ochin-Bq5JRIP5.js +5 -0
  485. package/dist/assets/slack-ochin-Bq5JRIP5.js.map +1 -0
  486. package/dist/assets/smalltalk-CepYz02F.js +8 -0
  487. package/dist/assets/smalltalk-CepYz02F.js.map +1 -0
  488. package/dist/assets/snazzy-light-CI6w30cq.js +5 -0
  489. package/dist/assets/snazzy-light-CI6w30cq.js.map +1 -0
  490. package/dist/assets/solarized-dark-Bgqg9546.js +5 -0
  491. package/dist/assets/solarized-dark-Bgqg9546.js.map +1 -0
  492. package/dist/assets/solarized-light-Cfhyx18w.js +5 -0
  493. package/dist/assets/solarized-light-Cfhyx18w.js.map +1 -0
  494. package/dist/assets/solidity-Dy7cwWHW.js +8 -0
  495. package/dist/assets/solidity-Dy7cwWHW.js.map +1 -0
  496. package/dist/assets/soy-CATG-zBT.js +12 -0
  497. package/dist/assets/soy-CATG-zBT.js.map +1 -0
  498. package/dist/assets/sparql-xS45ySCY.js +10 -0
  499. package/dist/assets/sparql-xS45ySCY.js.map +1 -0
  500. package/dist/assets/splunk-xsP0MVkt.js +8 -0
  501. package/dist/assets/splunk-xsP0MVkt.js.map +1 -0
  502. package/dist/assets/sql-kPnl9bgi.js +8 -0
  503. package/dist/assets/sql-kPnl9bgi.js.map +1 -0
  504. package/dist/assets/ssh-config-ehSXrtEV.js +8 -0
  505. package/dist/assets/ssh-config-ehSXrtEV.js.map +1 -0
  506. package/dist/assets/stata-CQNu_FgQ.js +10 -0
  507. package/dist/assets/stata-CQNu_FgQ.js.map +1 -0
  508. package/dist/assets/stylus-BoZJ_eV7.js +8 -0
  509. package/dist/assets/stylus-BoZJ_eV7.js.map +1 -0
  510. package/dist/assets/surrealql-BuAG2s0L.js +10 -0
  511. package/dist/assets/surrealql-BuAG2s0L.js.map +1 -0
  512. package/dist/assets/svelte-CnoxkKF2.js +16 -0
  513. package/dist/assets/svelte-CnoxkKF2.js.map +1 -0
  514. package/dist/assets/swift--o4OYIXX.js +8 -0
  515. package/dist/assets/swift--o4OYIXX.js.map +1 -0
  516. package/dist/assets/synthwave-84-DXKOZPq5.js +5 -0
  517. package/dist/assets/synthwave-84-DXKOZPq5.js.map +1 -0
  518. package/dist/assets/system-verilog-BEcmvm6Z.js +8 -0
  519. package/dist/assets/system-verilog-BEcmvm6Z.js.map +1 -0
  520. package/dist/assets/systemd-DJzDbKrW.js +8 -0
  521. package/dist/assets/systemd-DJzDbKrW.js.map +1 -0
  522. package/dist/assets/talonscript-Djb-VPry.js +8 -0
  523. package/dist/assets/talonscript-Djb-VPry.js.map +1 -0
  524. package/dist/assets/tasl-p9F3iH-j.js +8 -0
  525. package/dist/assets/tasl-p9F3iH-j.js.map +1 -0
  526. package/dist/assets/tcl-3f-uwoUo.js +8 -0
  527. package/dist/assets/tcl-3f-uwoUo.js.map +1 -0
  528. package/dist/assets/templ-B5LeC0kQ.js +14 -0
  529. package/dist/assets/templ-B5LeC0kQ.js.map +1 -0
  530. package/dist/assets/terraform-DgWhF4Yd.js +8 -0
  531. package/dist/assets/terraform-DgWhF4Yd.js.map +1 -0
  532. package/dist/assets/tex-CxL9S8Wd.js +10 -0
  533. package/dist/assets/tex-CxL9S8Wd.js.map +1 -0
  534. package/dist/assets/tokyo-night-BAQ_Myi4.js +5 -0
  535. package/dist/assets/tokyo-night-BAQ_Myi4.js.map +1 -0
  536. package/dist/assets/toml-BnyEyEPT.js +8 -0
  537. package/dist/assets/toml-BnyEyEPT.js.map +1 -0
  538. package/dist/assets/ts-tags-Bvk0ykl-.js +55 -0
  539. package/dist/assets/ts-tags-Bvk0ykl-.js.map +1 -0
  540. package/dist/assets/tsv-DY-yErdv.js +8 -0
  541. package/dist/assets/tsv-DY-yErdv.js.map +1 -0
  542. package/dist/assets/tsx-42HYAIDq.js +8 -0
  543. package/dist/assets/tsx-42HYAIDq.js.map +1 -0
  544. package/dist/assets/turtle-zqT8DlFI.js +8 -0
  545. package/dist/assets/turtle-zqT8DlFI.js.map +1 -0
  546. package/dist/assets/twig-uAs39d9k.js +37 -0
  547. package/dist/assets/twig-uAs39d9k.js.map +1 -0
  548. package/dist/assets/typescript-B2_-ihnN.js +8 -0
  549. package/dist/assets/typescript-B2_-ihnN.js.map +1 -0
  550. package/dist/assets/typespec-Kj54qpoq.js +8 -0
  551. package/dist/assets/typespec-Kj54qpoq.js.map +1 -0
  552. package/dist/assets/typst-BW5EogfV.js +8 -0
  553. package/dist/assets/typst-BW5EogfV.js.map +1 -0
  554. package/dist/assets/v-BMYuw6y3.js +8 -0
  555. package/dist/assets/v-BMYuw6y3.js.map +1 -0
  556. package/dist/assets/vala-DZNmMJCf.js +8 -0
  557. package/dist/assets/vala-DZNmMJCf.js.map +1 -0
  558. package/dist/assets/vb-6IyLx8lg.js +8 -0
  559. package/dist/assets/vb-6IyLx8lg.js.map +1 -0
  560. package/dist/assets/verilog-CBEeotQw.js +8 -0
  561. package/dist/assets/verilog-CBEeotQw.js.map +1 -0
  562. package/dist/assets/vesper-B_lKdhLz.js +5 -0
  563. package/dist/assets/vesper-B_lKdhLz.js.map +1 -0
  564. package/dist/assets/vhdl-Qbjr_6hW.js +8 -0
  565. package/dist/assets/vhdl-Qbjr_6hW.js.map +1 -0
  566. package/dist/assets/viml-Ce8qq_0D.js +8 -0
  567. package/dist/assets/viml-Ce8qq_0D.js.map +1 -0
  568. package/dist/assets/vitesse-black-BiRwe6jA.js +5 -0
  569. package/dist/assets/vitesse-black-BiRwe6jA.js.map +1 -0
  570. package/dist/assets/vitesse-dark-44qkAq30.js +5 -0
  571. package/dist/assets/vitesse-dark-44qkAq30.js.map +1 -0
  572. package/dist/assets/vitesse-light-KXY5XYnn.js +5 -0
  573. package/dist/assets/vitesse-light-KXY5XYnn.js.map +1 -0
  574. package/dist/assets/vue-DQvlk87_.js +41 -0
  575. package/dist/assets/vue-DQvlk87_.js.map +1 -0
  576. package/dist/assets/vue-html-DiaQkc4E.js +10 -0
  577. package/dist/assets/vue-html-DiaQkc4E.js.map +1 -0
  578. package/dist/assets/vue-vine-DgWfDcNr.js +20 -0
  579. package/dist/assets/vue-vine-DgWfDcNr.js.map +1 -0
  580. package/dist/assets/vyper-Bq7Z2-Ss.js +8 -0
  581. package/dist/assets/vyper-Bq7Z2-Ss.js.map +1 -0
  582. package/dist/assets/wasm-BdTJGc7T.js +8 -0
  583. package/dist/assets/wasm-BdTJGc7T.js.map +1 -0
  584. package/dist/assets/wenyan-ZWlLIQIr.js +8 -0
  585. package/dist/assets/wenyan-ZWlLIQIr.js.map +1 -0
  586. package/dist/assets/wgsl-C7jKgLAu.js +8 -0
  587. package/dist/assets/wgsl-C7jKgLAu.js.map +1 -0
  588. package/dist/assets/wikitext-Bd2wE6rj.js +8 -0
  589. package/dist/assets/wikitext-Bd2wE6rj.js.map +1 -0
  590. package/dist/assets/wit-14OfqCWW.js +8 -0
  591. package/dist/assets/wit-14OfqCWW.js.map +1 -0
  592. package/dist/assets/wolfram-RapNeSab.js +8 -0
  593. package/dist/assets/wolfram-RapNeSab.js.map +1 -0
  594. package/dist/assets/xml-Du1cw7kN.js +10 -0
  595. package/dist/assets/xml-Du1cw7kN.js.map +1 -0
  596. package/dist/assets/xsl-CfczXwS3.js +11 -0
  597. package/dist/assets/xsl-CfczXwS3.js.map +1 -0
  598. package/dist/assets/yaml-D_xpd4DU.js +8 -0
  599. package/dist/assets/yaml-D_xpd4DU.js.map +1 -0
  600. package/dist/assets/zenscript-DaonNBty.js +8 -0
  601. package/dist/assets/zenscript-DaonNBty.js.map +1 -0
  602. package/dist/assets/zig-DWvk_5e3.js +8 -0
  603. package/dist/assets/zig-DWvk_5e3.js.map +1 -0
  604. package/dist/bridge.cjs +1 -1
  605. package/dist/bridge.cjs.map +1 -1
  606. package/dist/bridge.d.ts +185 -2
  607. package/dist/bridge.js +3 -0
  608. package/dist/bridge.js.map +1 -1
  609. package/dist/core.d.ts +122 -2
  610. package/dist/dom.cjs +1 -1
  611. package/dist/dom.d.ts +122 -2
  612. package/dist/dom.js +2 -2
  613. package/dist/{index-McnGKzmi.cjs → index-79mXjylo.cjs} +2 -2
  614. package/dist/{index-McnGKzmi.cjs.map → index-79mXjylo.cjs.map} +1 -1
  615. package/dist/{index-DARGQA9p.js → index-BHrFfZ7O.js} +2 -2
  616. package/dist/{index-DARGQA9p.js.map → index-BHrFfZ7O.js.map} +1 -1
  617. package/dist/{index-BiehJaHJ.js → index-CCAOnvex.js} +2666 -2023
  618. package/dist/index-CCAOnvex.js.map +1 -0
  619. package/dist/index-CQx3NGKY.cjs +7 -0
  620. package/dist/index-CQx3NGKY.cjs.map +1 -0
  621. package/dist/index-DF8OhKI4.cjs.map +1 -1
  622. package/dist/index-sbZNOcCB.js.map +1 -1
  623. package/dist/index.cjs +1 -1
  624. package/dist/index.d.ts +189 -2
  625. package/dist/index.js +2 -2
  626. package/dist/native-spec.d.ts +122 -2
  627. package/dist/shikiHighlightData-DU78Iupf.cjs +2 -0
  628. package/dist/shikiHighlightData-DU78Iupf.cjs.map +1 -0
  629. package/dist/shikiHighlightData-Dn-hlfiF.js +28 -0
  630. package/dist/shikiHighlightData-Dn-hlfiF.js.map +1 -0
  631. package/dist/shikiTokenizerRuntime.cjs +3 -0
  632. package/dist/shikiTokenizerRuntime.cjs.map +1 -0
  633. package/dist/shikiTokenizerRuntime.js +72 -0
  634. package/dist/shikiTokenizerRuntime.js.map +1 -0
  635. package/dist/style.css +1 -1
  636. package/dist/webview.cjs +1 -1
  637. package/dist/webview.d.ts +189 -2
  638. package/dist/webview.js +1 -1
  639. package/package.json +7 -3
  640. package/dist/index-BiehJaHJ.js.map +0 -1
  641. package/dist/index-DL8eNafR.cjs +0 -4
  642. package/dist/index-DL8eNafR.cjs.map +0 -1
package/dist/core.d.ts CHANGED
@@ -455,6 +455,9 @@ export type EditorCommand = {
455
455
  type: 'media.pickImage';
456
456
  } | {
457
457
  type: 'media.pickVideo';
458
+ } | {
459
+ type: 'media.view';
460
+ assetId: string;
458
461
  } | {
459
462
  type: 'media.retry';
460
463
  assetId: string;
@@ -677,7 +680,7 @@ export type PayloadPanelSchemaConfig = {
677
680
  /**
678
681
  * 参数面板配置表。
679
682
  *
680
- * 第一层 key 使用 `PayloadPanelSchema.id`,让 toolbar、hoverbar、code block header
683
+ * 第一层 key 使用 `PayloadPanelSchema.id`,让 toolbar、hoverbar、code block 语言 controls
681
684
  * WebView 和业务自绘都能对同一份 panel schema 做一致裁剪。
682
685
  */
683
686
  export type PayloadPanelConfig = Record<string, PayloadPanelSchemaConfig>;
@@ -723,7 +726,7 @@ export type PayloadPanelRequest = PayloadPanelOpenRequest & {
723
726
  * 解析参数面板 schema。
724
727
  *
725
728
  * 这个纯函数只处理 schema 数据,不理解 DOM、Lexical 或具体命令;toolbar、hoverbar、
726
- * code block header 和 WebView host request 都应先走这里,保证默认 UI 和业务自绘同源。
729
+ * code block 语言 controls 和 WebView host request 都应先走这里,保证默认 UI 和业务自绘同源。
727
730
  */
728
731
  export declare const resolvePayloadPanelSchema: (panel: PayloadPanelSchema, config?: PayloadPanelConfig) => PayloadPanelSchema;
729
732
 
@@ -758,6 +761,103 @@ export type FloatingMenusConfig = {
758
761
  * 原生菜单可以忽略这个字段并用同一个 key 映射平台 icon。
759
762
  */
760
763
  export type RichTextEditorIcons = Partial<Record<string, string>>;
764
+ /**
765
+ * 自绘菜单提交目标。
766
+ *
767
+ * 业务侧通常只需要回传 `MenuItem.id`;保留完整 `MenuItem` 是为了 PC/H5 自绘层在同进程内
768
+ * 直接复用 request.items 中的对象,WebView bridge 仍只通过 id 回传。
769
+ */
770
+ export type MenuControlSubmitTarget = string | MenuItem;
771
+ export type MenuControlButtonItem = {
772
+ type: 'button';
773
+ item: MenuItem;
774
+ active: boolean;
775
+ disabled: boolean;
776
+ };
777
+ export type MenuControlSeparatorItem = {
778
+ type: 'separator';
779
+ key: string;
780
+ };
781
+ export type MenuControlGroupItem = {
782
+ type: 'group';
783
+ key: string;
784
+ title: string;
785
+ icon?: string;
786
+ items: MenuControlButtonItem[];
787
+ };
788
+ /**
789
+ * 自绘菜单的跨端显示协议。
790
+ *
791
+ * DOM 默认 UI、PC/H5 自绘和 RN/Flutter 原生菜单都消费解析后的同一份结构;
792
+ * 这里不携带 DOM 节点、SVG 字符串或定位实现,只保留 schema/config 解析结果和状态。
793
+ */
794
+ export type MenuControlDisplayItem = MenuControlButtonItem | MenuControlSeparatorItem | MenuControlGroupItem;
795
+ export type HoverbarMenuRequest = {
796
+ id: string;
797
+ items: MenuControlDisplayItem[];
798
+ commandStates: CommandState[];
799
+ readonly: boolean;
800
+ anchorRect?: PayloadPanelOpenRequest['anchorRect'];
801
+ /**
802
+ * 订阅这次菜单请求被编辑器侧关闭或替换。
803
+ *
804
+ * 宿主自绘菜单可以据此清理自己的浮层;WebView runtime 也用它通知 RN/Flutter
805
+ * 旧 request 已失效,避免晚到提交命中悬空菜单。
806
+ */
807
+ subscribeDismiss(listener: () => void): () => void;
808
+ submit(target: MenuControlSubmitTarget): void;
809
+ cancel(): void;
810
+ };
811
+ export type MediaControlsRequest = {
812
+ id: string;
813
+ assetId: string;
814
+ mediaType: 'image' | 'video';
815
+ status: string;
816
+ displayWidthPercent: MediaDisplayWidthPercent;
817
+ align: MediaAlign;
818
+ items: MenuControlDisplayItem[];
819
+ readonly: boolean;
820
+ anchorRect?: PayloadPanelOpenRequest['anchorRect'];
821
+ /**
822
+ * 媒体资源 URL。
823
+ *
824
+ * 从 DOM 读取,可用于业务自绘层的预览、下载或分享。
825
+ */
826
+ url?: string;
827
+ title?: string;
828
+ alt?: string;
829
+ poster?: string;
830
+ width?: number;
831
+ height?: number;
832
+ /** 视频时长(秒),仅 video 节点 loadedmetadata 后可读。 */
833
+ duration?: number;
834
+ /** 媒体 MIME 类型,DOM 不保证一定可读。 */
835
+ mimeType?: string;
836
+ /** 文件大小(字节),DOM 不保证一定可读。 */
837
+ size?: number;
838
+ /**
839
+ * 订阅这次菜单请求被编辑器侧关闭或替换。
840
+ *
841
+ * 媒体节点切换、点击正文或节点销毁都会让旧自绘菜单失效;监听方需要同步关闭外部 UI。
842
+ */
843
+ subscribeDismiss(listener: () => void): () => void;
844
+ submit(target: MenuControlSubmitTarget): void;
845
+ cancel(): void;
846
+ };
847
+ export type TableControlsRequest = {
848
+ id: string;
849
+ items: MenuControlDisplayItem[];
850
+ readonly: boolean;
851
+ anchorRect?: PayloadPanelOpenRequest['anchorRect'];
852
+ /**
853
+ * 订阅这次菜单请求被编辑器侧关闭或替换。
854
+ *
855
+ * 表格激活态变化时会触发 dismiss,保证业务自绘和 DOM 内部 controls 生命周期一致。
856
+ */
857
+ subscribeDismiss(listener: () => void): () => void;
858
+ submit(target: MenuControlSubmitTarget): void;
859
+ cancel(): void;
860
+ };
761
861
  export type RichTextEditorOptions = {
762
862
  value?: Partial<EditorContent>;
763
863
  readonly?: boolean;
@@ -847,6 +947,26 @@ export type RichTextEditorOptions = {
847
947
  slashCommandProvider?: SlashCommandProvider;
848
948
  slashCommandMenuConfig?: SlashCommandMenuConfig;
849
949
  onSlashCommandMenuRequest?: (request: SlashCommandMenuRequest) => boolean | void;
950
+ /**
951
+ * 选中文本 hoverbar 自绘接管。
952
+ *
953
+ * 返回 true 时 DOM 不渲染默认 hoverbar;业务侧需要调用 request.submit(id) 执行菜单,
954
+ * 或调用 request.cancel() 关闭这次自绘菜单。
955
+ */
956
+ onHoverbarMenuRequest?: (request: HoverbarMenuRequest) => boolean | void;
957
+ /**
958
+ * 图片/视频 overlay controls 自绘接管。
959
+ *
960
+ * 返回 true 时 DOM 不渲染默认媒体浮条;同一份 items 可用于 PC/H5 浮窗或 RN/Flutter
961
+ * 原生面板,提交时回传菜单 id 即可。
962
+ */
963
+ onMediaControlsRequest?: (request: MediaControlsRequest) => boolean | void;
964
+ /**
965
+ * 表格 controls 自绘接管。
966
+ *
967
+ * 返回 true 时 DOM 不渲染默认表格浮条,业务菜单提交后仍复用 BridgeRTE 内部表格命令执行。
968
+ */
969
+ onTableControlsRequest?: (request: TableControlsRequest) => boolean | void;
850
970
  placeholder?: string;
851
971
  maxLength?: number;
852
972
  /**
package/dist/dom.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-DL8eNafR.cjs"),t=require("./index-McnGKzmi.cjs");exports.createFloatingLayer=e.createFloatingLayer;exports.createRichTextEditor=e.createRichTextEditor;exports.createWebViewBridgeRuntime=e.createWebViewBridgeRuntime;exports.createRichTextToolbar=t.createRichTextToolbar;exports.hasMeaningfulHtmlContent=t.hasMeaningfulHtmlContent;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-CQx3NGKY.cjs"),t=require("./index-79mXjylo.cjs");exports.createFloatingLayer=e.createFloatingLayer;exports.createRichTextEditor=e.createRichTextEditor;exports.createWebViewBridgeRuntime=e.createWebViewBridgeRuntime;exports.createRichTextToolbar=t.createRichTextToolbar;exports.hasMeaningfulHtmlContent=t.hasMeaningfulHtmlContent;
2
2
  //# sourceMappingURL=dom.cjs.map
package/dist/dom.d.ts CHANGED
@@ -455,6 +455,9 @@ export type EditorCommand = {
455
455
  type: 'media.pickImage';
456
456
  } | {
457
457
  type: 'media.pickVideo';
458
+ } | {
459
+ type: 'media.view';
460
+ assetId: string;
458
461
  } | {
459
462
  type: 'media.retry';
460
463
  assetId: string;
@@ -677,7 +680,7 @@ export type PayloadPanelSchemaConfig = {
677
680
  /**
678
681
  * 参数面板配置表。
679
682
  *
680
- * 第一层 key 使用 `PayloadPanelSchema.id`,让 toolbar、hoverbar、code block header
683
+ * 第一层 key 使用 `PayloadPanelSchema.id`,让 toolbar、hoverbar、code block 语言 controls
681
684
  * WebView 和业务自绘都能对同一份 panel schema 做一致裁剪。
682
685
  */
683
686
  export type PayloadPanelConfig = Record<string, PayloadPanelSchemaConfig>;
@@ -723,7 +726,7 @@ export type PayloadPanelRequest = PayloadPanelOpenRequest & {
723
726
  * 解析参数面板 schema。
724
727
  *
725
728
  * 这个纯函数只处理 schema 数据,不理解 DOM、Lexical 或具体命令;toolbar、hoverbar、
726
- * code block header 和 WebView host request 都应先走这里,保证默认 UI 和业务自绘同源。
729
+ * code block 语言 controls 和 WebView host request 都应先走这里,保证默认 UI 和业务自绘同源。
727
730
  */
728
731
  export declare const resolvePayloadPanelSchema: (panel: PayloadPanelSchema, config?: PayloadPanelConfig) => PayloadPanelSchema;
729
732
 
@@ -758,6 +761,103 @@ export type FloatingMenusConfig = {
758
761
  * 原生菜单可以忽略这个字段并用同一个 key 映射平台 icon。
759
762
  */
760
763
  export type RichTextEditorIcons = Partial<Record<string, string>>;
764
+ /**
765
+ * 自绘菜单提交目标。
766
+ *
767
+ * 业务侧通常只需要回传 `MenuItem.id`;保留完整 `MenuItem` 是为了 PC/H5 自绘层在同进程内
768
+ * 直接复用 request.items 中的对象,WebView bridge 仍只通过 id 回传。
769
+ */
770
+ export type MenuControlSubmitTarget = string | MenuItem;
771
+ export type MenuControlButtonItem = {
772
+ type: 'button';
773
+ item: MenuItem;
774
+ active: boolean;
775
+ disabled: boolean;
776
+ };
777
+ export type MenuControlSeparatorItem = {
778
+ type: 'separator';
779
+ key: string;
780
+ };
781
+ export type MenuControlGroupItem = {
782
+ type: 'group';
783
+ key: string;
784
+ title: string;
785
+ icon?: string;
786
+ items: MenuControlButtonItem[];
787
+ };
788
+ /**
789
+ * 自绘菜单的跨端显示协议。
790
+ *
791
+ * DOM 默认 UI、PC/H5 自绘和 RN/Flutter 原生菜单都消费解析后的同一份结构;
792
+ * 这里不携带 DOM 节点、SVG 字符串或定位实现,只保留 schema/config 解析结果和状态。
793
+ */
794
+ export type MenuControlDisplayItem = MenuControlButtonItem | MenuControlSeparatorItem | MenuControlGroupItem;
795
+ export type HoverbarMenuRequest = {
796
+ id: string;
797
+ items: MenuControlDisplayItem[];
798
+ commandStates: CommandState[];
799
+ readonly: boolean;
800
+ anchorRect?: PayloadPanelOpenRequest['anchorRect'];
801
+ /**
802
+ * 订阅这次菜单请求被编辑器侧关闭或替换。
803
+ *
804
+ * 宿主自绘菜单可以据此清理自己的浮层;WebView runtime 也用它通知 RN/Flutter
805
+ * 旧 request 已失效,避免晚到提交命中悬空菜单。
806
+ */
807
+ subscribeDismiss(listener: () => void): () => void;
808
+ submit(target: MenuControlSubmitTarget): void;
809
+ cancel(): void;
810
+ };
811
+ export type MediaControlsRequest = {
812
+ id: string;
813
+ assetId: string;
814
+ mediaType: 'image' | 'video';
815
+ status: string;
816
+ displayWidthPercent: MediaDisplayWidthPercent;
817
+ align: MediaAlign;
818
+ items: MenuControlDisplayItem[];
819
+ readonly: boolean;
820
+ anchorRect?: PayloadPanelOpenRequest['anchorRect'];
821
+ /**
822
+ * 媒体资源 URL。
823
+ *
824
+ * 从 DOM 读取,可用于业务自绘层的预览、下载或分享。
825
+ */
826
+ url?: string;
827
+ title?: string;
828
+ alt?: string;
829
+ poster?: string;
830
+ width?: number;
831
+ height?: number;
832
+ /** 视频时长(秒),仅 video 节点 loadedmetadata 后可读。 */
833
+ duration?: number;
834
+ /** 媒体 MIME 类型,DOM 不保证一定可读。 */
835
+ mimeType?: string;
836
+ /** 文件大小(字节),DOM 不保证一定可读。 */
837
+ size?: number;
838
+ /**
839
+ * 订阅这次菜单请求被编辑器侧关闭或替换。
840
+ *
841
+ * 媒体节点切换、点击正文或节点销毁都会让旧自绘菜单失效;监听方需要同步关闭外部 UI。
842
+ */
843
+ subscribeDismiss(listener: () => void): () => void;
844
+ submit(target: MenuControlSubmitTarget): void;
845
+ cancel(): void;
846
+ };
847
+ export type TableControlsRequest = {
848
+ id: string;
849
+ items: MenuControlDisplayItem[];
850
+ readonly: boolean;
851
+ anchorRect?: PayloadPanelOpenRequest['anchorRect'];
852
+ /**
853
+ * 订阅这次菜单请求被编辑器侧关闭或替换。
854
+ *
855
+ * 表格激活态变化时会触发 dismiss,保证业务自绘和 DOM 内部 controls 生命周期一致。
856
+ */
857
+ subscribeDismiss(listener: () => void): () => void;
858
+ submit(target: MenuControlSubmitTarget): void;
859
+ cancel(): void;
860
+ };
761
861
  export type RichTextEditorOptions = {
762
862
  value?: Partial<EditorContent>;
763
863
  readonly?: boolean;
@@ -847,6 +947,26 @@ export type RichTextEditorOptions = {
847
947
  slashCommandProvider?: SlashCommandProvider;
848
948
  slashCommandMenuConfig?: SlashCommandMenuConfig;
849
949
  onSlashCommandMenuRequest?: (request: SlashCommandMenuRequest) => boolean | void;
950
+ /**
951
+ * 选中文本 hoverbar 自绘接管。
952
+ *
953
+ * 返回 true 时 DOM 不渲染默认 hoverbar;业务侧需要调用 request.submit(id) 执行菜单,
954
+ * 或调用 request.cancel() 关闭这次自绘菜单。
955
+ */
956
+ onHoverbarMenuRequest?: (request: HoverbarMenuRequest) => boolean | void;
957
+ /**
958
+ * 图片/视频 overlay controls 自绘接管。
959
+ *
960
+ * 返回 true 时 DOM 不渲染默认媒体浮条;同一份 items 可用于 PC/H5 浮窗或 RN/Flutter
961
+ * 原生面板,提交时回传菜单 id 即可。
962
+ */
963
+ onMediaControlsRequest?: (request: MediaControlsRequest) => boolean | void;
964
+ /**
965
+ * 表格 controls 自绘接管。
966
+ *
967
+ * 返回 true 时 DOM 不渲染默认表格浮条,业务菜单提交后仍复用 BridgeRTE 内部表格命令执行。
968
+ */
969
+ onTableControlsRequest?: (request: TableControlsRequest) => boolean | void;
850
970
  placeholder?: string;
851
971
  maxLength?: number;
852
972
  /**
package/dist/dom.js CHANGED
@@ -1,5 +1,5 @@
1
- import { c as t, a as r, b as o } from "./index-BiehJaHJ.js";
2
- import { c as i, h as n } from "./index-DARGQA9p.js";
1
+ import { c as t, a as r, b as o } from "./index-CCAOnvex.js";
2
+ import { c as i, h as n } from "./index-BHrFfZ7O.js";
3
3
  export {
4
4
  t as createFloatingLayer,
5
5
  r as createRichTextEditor,
@@ -1,4 +1,4 @@
1
- "use strict";const q=require("./native-spec.cjs"),f=require("./index-DL8eNafR.cjs"),O={toolbarGroup:`
1
+ "use strict";const q=require("./native-spec.cjs"),f=require("./index-CQx3NGKY.cjs"),O={toolbarGroup:`
2
2
  <svg
3
3
  aria-hidden="true"
4
4
  class="lucide lucide-ellipsis"
@@ -33,4 +33,4 @@
33
33
  <path d="m6 9 6 6 6-6" />
34
34
  </svg>
35
35
  `},V=t=>Array.from(t.querySelectorAll(".bridgerte__toolbar-group-menu-item")).filter(e=>!e.disabled),j=(t,e)=>{const l=V(t)[e];l&&l.focus()},Z=(t,e,i,l,u)=>{var s,d;const n=V(e),r=document.activeElement instanceof HTMLButtonElement?n.indexOf(document.activeElement):-1,m=v=>{var o;if(n.length===0)return;const h=((r>=0?r:0)+v+n.length)%n.length;(o=n[h])==null||o.focus()};switch(t.key){case"ArrowDown":t.preventDefault(),m(1);break;case"ArrowUp":t.preventDefault(),m(-1);break;case"Home":t.preventDefault(),(s=n[0])==null||s.focus();break;case"End":t.preventDefault(),(d=n.at(-1))==null||d.focus();break;case"Enter":case" ":document.activeElement instanceof HTMLButtonElement&&(t.preventDefault(),l(document.activeElement),u(),i.focus());break;case"Escape":t.preventDefault(),i.focus(),u();break}},x="button[data-bridgerte-toolbar-group-id]",tt="button[data-bridgerte-toolbar-item-id]",M=[tt,".bridgerte__toolbar-group-menu-item"].join(","),et=(t,e)=>{const i=t.map(l=>f.getMenuStateForItem(l,e));return{active:i.some(l=>l.active),disabled:i.length>0&&i.every(l=>l.disabled)}},ot=(t,e,i,l,u)=>{const n=f.getMenuStateForItem(e,i),r=document.createElement("button"),m=l[e.icon]??f.defaultMenuIcons[e.icon];r.type="button",r.className="bridgerte__toolbar-button",r.disabled=n.disabled,r.dataset.active=String(n.active),r.dataset.bridgerteToolbarItemId=e.id,r.setAttribute("aria-label",e.label),r.setAttribute("aria-pressed",String(n.active)),u&&(r.dataset.tooltip=e.label),f.appendMenuIcon(r,m,e.label),t.append(r)},nt=(t,e,i,l,u)=>{const n=document.createElement("button"),r=et(e.items,i),m=e.icon?l[e.icon]??f.defaultMenuIcons[e.icon]:O.toolbarGroup,s=document.createElement("span");n.type="button",n.className="bridgerte__toolbar-button bridgerte__toolbar-group-button",n.disabled=r.disabled,n.dataset.active=String(r.active),n.dataset.bridgerteToolbarGroupId=e.key,n.dataset.open="false",n.setAttribute("aria-label",e.title),n.setAttribute("aria-haspopup","menu"),n.setAttribute("aria-expanded","false"),n.setAttribute("aria-pressed",String(r.active)),u&&(n.dataset.tooltip=e.title),f.appendMenuIcon(n,m,e.title),s.className="bridgerte__toolbar-group-indicator",s.setAttribute("aria-hidden","true"),s.innerHTML=O.chevronDown,n.append(s),t.append(n)},rt=(t,e,i,l,u)=>{t.textContent="",e.forEach(n=>{if(n.type==="separator"){const m=document.createElement("span");m.className="bridgerte__toolbar-separator",m.dataset.separatorId=n.key,m.setAttribute("aria-hidden","true"),t.append(m);return}if(n.type==="button"){ot(t,n.item,i,l,u);return}const r=document.createElement("div");r.className="bridgerte__toolbar-group",r.dataset.group=n.key,r.setAttribute("aria-label",n.title),t.append(r),nt(r,n,i,l,u)})},G=(t,e,i,l)=>{if(t.textContent="",!e){t.dataset.visible="false";return}e.items.forEach(u=>{const n=f.getMenuStateForItem(u,i),r=document.createElement("button"),m=l[u.icon]??f.defaultMenuIcons[u.icon],s=document.createElement("span");r.type="button",r.className="bridgerte__menu-item bridgerte__toolbar-group-menu-item",r.disabled=n.disabled,r.dataset.active=String(n.active),r.dataset.bridgerteToolbarItemId=u.id,r.setAttribute("role","menuitem"),r.setAttribute("aria-label",u.label),r.setAttribute("aria-pressed",String(n.active)),f.appendMenuIcon(r,m,u.label),s.className="bridgerte__toolbar-group-menu-label",s.textContent=u.label,r.append(s),t.append(r)}),t.dataset.visible="true",t.style.minWidth=`${e.button.offsetWidth}px`},I=(t,e)=>{t.querySelectorAll(x).forEach(i=>{const l=(e==null?void 0:e.groupKey)===i.dataset.bridgerteToolbarGroupId;i.dataset.open=String(l),i.setAttribute("aria-expanded",String(l))})},X=(t,e)=>t.find(i=>i.type==="group"&&i.key===e),Y=8,_=(t,e)=>e instanceof Node&&t.contains(e),B=(t,e)=>t instanceof Element?t.closest(e):null,at=(t,e,i,l,u)=>{let n=null,r=null;const m=o=>B(o,x)??(_(e,o)?B(o,M):null),s=o=>{m(o.target)&&(o instanceof PointerEvent&&o.pointerType!=="mouse"||o.preventDefault())},d=o=>{const p=o.touches[0],y=B(o.target,x),w=_(e,o.target)?B(o.target,M):null,T=y??w;!T||!p||(n={button:T,kind:y?"group":"menu-item",startX:p.clientX,startY:p.clientY})},v=()=>{n=null},g=o=>{if(!n)return;const p=n,y=o.changedTouches[0],w=m(o.target);if(n=null,!y||w!==p.button)return;const T=Math.abs(y.clientX-p.startX),L=Math.abs(y.clientY-p.startY);if(!(T>Y||L>Y)){if(o.preventDefault(),o.stopPropagation(),r=p.button,p.kind==="group"){i(p.button);return}l(p.button),u()}},h=o=>{_(t,o.target)||_(e,o.target)||u()};return t.addEventListener("pointerdown",s),t.addEventListener("mousedown",s),t.addEventListener("touchstart",d,{passive:!1}),t.addEventListener("touchend",g),t.addEventListener("touchcancel",v),e.addEventListener("pointerdown",s),e.addEventListener("mousedown",s),e.addEventListener("touchstart",d,{passive:!1}),e.addEventListener("touchend",g),e.addEventListener("touchcancel",v),document.addEventListener("pointerdown",h,!0),{consumeSuppressedClick(o){return r!==o?!1:(r=null,!0)},destroy(){t.removeEventListener("pointerdown",s),t.removeEventListener("mousedown",s),t.removeEventListener("touchstart",d),t.removeEventListener("touchend",g),t.removeEventListener("touchcancel",v),e.removeEventListener("pointerdown",s),e.removeEventListener("mousedown",s),e.removeEventListener("touchstart",d),e.removeEventListener("touchend",g),e.removeEventListener("touchcancel",v),document.removeEventListener("pointerdown",h,!0)}}},st=8,it=6,ct=()=>{var t;return typeof window<"u"&&((t=window.matchMedia)==null?void 0:t.call(window,"(hover: hover) and (pointer: fine)").matches)===!0},D=t=>{const e=t instanceof Element?t.closest(M):null;return e instanceof HTMLButtonElement?e:null},U=t=>{const e=t instanceof Element?t.closest(x):null;return e instanceof HTMLButtonElement?e:null};function lt(t,e){const i=e.placement??"top",l=f.resolveMenuSchemaForDom(e.menuSchema??q.defaultMenuSchema,{menuLabels:e.menuLabels,payloadPanelConfig:e.payloadPanelConfig}),u=q.resolveToolbarMenu(e.toolbarConfig,l),n=u.flatMap(a=>a.type==="button"?[a.item]:a.type==="group"?a.items:[]),r=e.icons??{},m=ct(),s=document.createElement("div"),d=document.createElement("div"),v=t.closest(".bridgerte")??t;let g=!1,h=e.editor.getCommandStates(),o=null,p=null;const y=f.bindTouchPressedState(t,{targetSelector:["button[data-bridgerte-toolbar-item-id]","button[data-bridgerte-toolbar-group-id]"].join(",")}),w=f.bindTouchPressedState(d,{targetSelector:".bridgerte__toolbar-group-menu-item"}),T=()=>{v.append(s),v.append(d)},L=()=>{p==null||p.setOpen(!1),p==null||p.destroy(),p=null},H=()=>{o&&(L(),p=f.createFloatingLayer(o.button,d,{placement:i==="bottom"?"top-start":"bottom-start",offset:it,strategy:"fixed"}),p.setOpen(!0))},E=()=>{!o&&!p||(L(),o=null,G(d,o,h,r),I(t,o))},N=a=>{if(!g&&(h=a,o&&L(),rt(t,u,a,r,m),T(),o)){const c=Array.from(t.querySelectorAll(x)).find(Q=>Q.dataset.bridgerteToolbarGroupId===(o==null?void 0:o.groupKey)),b=X(u,o.groupKey);o=c&&b?{groupKey:o.groupKey,button:c,items:b.items}:null,G(d,o,h,r),I(t,o),o&&H()}},W=()=>{g||N(e.editor.getCommandStates())},S=()=>{s.dataset.visible="false",s.textContent=""},z=a=>{const c=a.dataset.tooltip;if(!m||!c)return;const b=a.getBoundingClientRect();s.textContent=c,s.dataset.visible="true",s.style.left=`${b.left+b.width/2}px`,s.style.top=`${b.top-st}px`},F=a=>{const c=D(a.target);c&&z(c)},K=a=>{const c=a.relatedTarget,b=D(a.target);b&&c instanceof Node&&b.contains(c)||S()},C=a=>{if(!(a instanceof HTMLButtonElement)||a.disabled)return;const c=n.find(b=>b.id===a.dataset.bridgerteToolbarItemId);if(c){if(c.payloadPanel){const b=a.getBoundingClientRect();e.editor.requestPayloadPanel({menuId:c.id,command:c.command,panel:c.payloadPanel,currentValues:f.getPayloadPanelCurrentValues(c,e.editor.getCommandStates()),anchorRect:{x:b.left,y:b.top,width:b.width,height:b.height}});return}e.editor.executeCommand(c.command)}},A=(a,c=!1)=>{const b=X(u,a.dataset.bridgerteToolbarGroupId);if(!(!b||a.disabled)){if((o==null?void 0:o.groupKey)===b.key){if(c){j(d,0);return}E();return}o={groupKey:b.key,button:a,items:b.items},S(),G(d,o,h,r),I(t,o),H(),c&&j(d,0)}},k=a=>{const c=U(a.target);if(c){if(a.preventDefault(),a.stopPropagation(),P.consumeSuppressedClick(c))return;A(c);return}const b=D(a.target);b&&(a.preventDefault(),a.stopPropagation(),!P.consumeSuppressedClick(b)&&(C(b),E()))},R=a=>{if(o&&d.contains(document.activeElement)){Z(a,d,o.button,C,E);return}const c=U(a.target);if(c&&(a.key==="Enter"||a.key===" "||a.key==="ArrowDown")){a.preventDefault(),a.stopPropagation(),A(c,!0);return}a.key==="Escape"&&E()};t.classList.add("bridgerte__toolbar"),s.className="bridgerte__toolbar-tooltip",s.dataset.visible="false",d.className="bridgerte__floating-menu bridgerte__toolbar-group-menu",d.dataset.visible="false",d.setAttribute("role","menu"),t.dataset.placement=i,t.setAttribute("role","toolbar"),t.setAttribute("aria-label",i==="bottom"?"BridgeRTE tabbar":"BridgeRTE toolbar"),t.addEventListener("click",k),d.addEventListener("click",k),document.addEventListener("keydown",R),m&&(t.addEventListener("mouseover",F),t.addEventListener("mouseout",K)),t.addEventListener("focusout",S),T();const P=at(t,d,A,C,E),J=e.editor.subscribeCommandStateChange(N);return{update:W,destroy(){g||(g=!0,J(),E(),t.removeEventListener("click",k),d.removeEventListener("click",k),document.removeEventListener("keydown",R),P.destroy(),m&&(t.removeEventListener("mouseover",F),t.removeEventListener("mouseout",K)),y(),w(),t.removeEventListener("focusout",S),s.remove(),d.remove(),t.classList.remove("bridgerte__toolbar"),delete t.dataset.placement,t.textContent="",t.removeAttribute("role"),t.removeAttribute("aria-label"))}}}const ut=/[\u200B-\u200D\uFEFF]/g,dt=["img","video","audio","iframe","table","pre","code","hr","figure","canvas","svg","math",'[data-type="mention"]'].join(","),$=t=>(t==null?void 0:t.replace(ut,"").trim())??"",bt=t=>{if(!$(t))return!1;const e=document.createElement("template");return e.innerHTML=t,!!($(e.content.textContent)||e.content.querySelector(dt))};exports.createRichTextToolbar=lt;exports.hasMeaningfulHtmlContent=bt;
36
- //# sourceMappingURL=index-McnGKzmi.cjs.map
36
+ //# sourceMappingURL=index-79mXjylo.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-McnGKzmi.cjs","sources":["../../dom/src/menuIcon/uiIcons.ts","../../dom/src/richTextToolbar/groupMenuKeyboard.ts","../../dom/src/richTextToolbar/render.ts","../../dom/src/richTextToolbar/groupMenuInteraction.ts","../../dom/src/richTextToolbar/index.ts","../../dom/src/htmlContent/index.ts"],"sourcesContent":["/**\n * DOM UI chrome icon 表。\n *\n * 这里放 toolbar 收纳入口、下拉箭头这类控件自身图标。它们不属于 `MenuItem.icon`\n * 跨端 schema,也不应该进入 `defaultMenuIcons` 的 schema 对齐检查。\n */\nexport const defaultMenuUiIcons = {\n toolbarGroup: `\n <svg\n aria-hidden=\"true\"\n class=\"lucide lucide-ellipsis\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </svg>\n `,\n chevronDown: `\n <svg\n aria-hidden=\"true\"\n class=\"lucide lucide-chevron-down\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n `\n} as const;\n","export const getEnabledGroupMenuButtons = (menuElement: HTMLElement) => (\n Array.from(\n menuElement.querySelectorAll<HTMLButtonElement>('.bridgerte__toolbar-group-menu-item')\n ).filter((button) => !button.disabled)\n);\n\nexport const focusToolbarGroupMenuItem = (menuElement: HTMLElement, index: number) => {\n const buttons = getEnabledGroupMenuButtons(menuElement);\n const nextButton = buttons[index];\n\n if (nextButton) nextButton.focus();\n};\n\nexport const handleToolbarGroupMenuKeyDown = (\n event: KeyboardEvent,\n menuElement: HTMLElement,\n returnButton: HTMLButtonElement,\n executeToolbarButton: (button: HTMLButtonElement) => void,\n closeGroupMenu: () => void\n) => {\n const buttons = getEnabledGroupMenuButtons(menuElement);\n const activeIndex = document.activeElement instanceof HTMLButtonElement\n ? buttons.indexOf(document.activeElement)\n : -1;\n const focusByOffset = (offset: number) => {\n if (buttons.length === 0) return;\n\n const baseIndex = activeIndex >= 0 ? activeIndex : 0;\n const nextIndex = (baseIndex + offset + buttons.length) % buttons.length;\n\n buttons[nextIndex]?.focus();\n };\n\n /*\n * ARIA menu 语义要求支持 roving focus。这里不改 toolbar 的横向键盘模型,\n * 只在已打开的纵向收纳菜单内处理上下方向、首尾跳转和执行/关闭。\n */\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n focusByOffset(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n focusByOffset(-1);\n break;\n case 'Home':\n event.preventDefault();\n buttons[0]?.focus();\n break;\n case 'End':\n event.preventDefault();\n buttons.at(-1)?.focus();\n break;\n case 'Enter':\n case ' ':\n if (document.activeElement instanceof HTMLButtonElement) {\n event.preventDefault();\n executeToolbarButton(document.activeElement);\n closeGroupMenu();\n returnButton.focus();\n }\n break;\n case 'Escape':\n event.preventDefault();\n returnButton.focus();\n closeGroupMenu();\n break;\n default:\n break;\n }\n};\n","import type { CommandState } from '@bridgerte/core';\nimport type { MenuItem, ResolvedToolbarItem } from '@bridgerte/native-spec';\nimport {\n appendMenuIcon,\n defaultMenuIcons,\n defaultMenuUiIcons\n} from './icons';\nimport { getMenuStateForItem } from '../menuRuntime';\nimport type {\n RichTextToolbarIcons,\n ToolbarGroupMenuState\n} from './type';\n\nexport const toolbarGroupButtonSelector = 'button[data-bridgerte-toolbar-group-id]';\nexport const toolbarButtonSelector = 'button[data-bridgerte-toolbar-item-id]';\n// 可执行按钮同时覆盖 toolbar 主按钮和 group menu 子项,避免浮层子菜单绕过统一命令入口。\nexport const toolbarExecutableButtonSelector = [\n toolbarButtonSelector,\n '.bridgerte__toolbar-group-menu-item'\n].join(',');\n\nconst getGroupMenuState = (items: MenuItem[], commandStates: CommandState[]) => {\n const itemStates = items.map((item) => getMenuStateForItem(item, commandStates));\n\n return {\n active: itemStates.some((state) => state.active),\n disabled: itemStates.length > 0 && itemStates.every((state) => state.disabled)\n };\n};\n\nconst renderToolbarButton = (\n groupElement: HTMLElement,\n item: MenuItem,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n const state = getMenuStateForItem(item, commandStates);\n const button = document.createElement('button');\n // icon 兜底顺序固定为:业务覆盖 > DOM 默认 SVG > label 文本。\n const iconSvg = icons[item.icon] ?? defaultMenuIcons[item.icon];\n\n button.type = 'button';\n button.className = 'bridgerte__toolbar-button';\n button.disabled = state.disabled;\n button.dataset.active = String(state.active);\n button.dataset.bridgerteToolbarItemId = item.id;\n button.setAttribute('aria-label', item.label);\n button.setAttribute('aria-pressed', String(state.active));\n if (enableTooltip) button.dataset.tooltip = item.label;\n\n appendMenuIcon(button, iconSvg, item.label);\n\n groupElement.append(button);\n};\n\nconst renderToolbarGroupButton = (\n groupElement: HTMLElement,\n toolbarItem: Extract<ResolvedToolbarItem, { type: 'group' }>,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n const button = document.createElement('button');\n const groupState = getGroupMenuState(toolbarItem.items, commandStates);\n const iconSvg = toolbarItem.icon\n ? icons[toolbarItem.icon] ?? defaultMenuIcons[toolbarItem.icon]\n : defaultMenuUiIcons.toolbarGroup;\n const indicator = document.createElement('span');\n\n button.type = 'button';\n button.className = 'bridgerte__toolbar-button bridgerte__toolbar-group-button';\n button.disabled = groupState.disabled;\n button.dataset.active = String(groupState.active);\n button.dataset.bridgerteToolbarGroupId = toolbarItem.key;\n button.dataset.open = 'false';\n button.setAttribute('aria-label', toolbarItem.title);\n button.setAttribute('aria-haspopup', 'menu');\n button.setAttribute('aria-expanded', 'false');\n button.setAttribute('aria-pressed', String(groupState.active));\n if (enableTooltip) button.dataset.tooltip = toolbarItem.title;\n\n appendMenuIcon(button, iconSvg, toolbarItem.title);\n\n indicator.className = 'bridgerte__toolbar-group-indicator';\n indicator.setAttribute('aria-hidden', 'true');\n indicator.innerHTML = defaultMenuUiIcons.chevronDown;\n button.append(indicator);\n groupElement.append(button);\n};\n\n/**\n * 渲染 toolbar 横向主入口。\n *\n * 字符串菜单直接渲染为按钮,`|` 渲染分割线。\n * 只有用户显式声明的 group 配置才生成收纳入口,避免 schema 隐式改变 DOM 结构。\n */\nexport const renderToolbar = (\n toolbarElement: HTMLElement,\n toolbarItems: ResolvedToolbarItem[],\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n toolbarElement.textContent = '';\n\n toolbarItems.forEach((toolbarItem) => {\n if (toolbarItem.type === 'separator') {\n const separatorElement = document.createElement('span');\n\n separatorElement.className = 'bridgerte__toolbar-separator';\n separatorElement.dataset.separatorId = toolbarItem.key;\n separatorElement.setAttribute('aria-hidden', 'true');\n toolbarElement.append(separatorElement);\n return;\n }\n\n if (toolbarItem.type === 'button') {\n renderToolbarButton(\n toolbarElement,\n toolbarItem.item,\n commandStates,\n icons,\n enableTooltip\n );\n return;\n }\n\n /*\n * 收纳菜单是用户在 toolbarConfig 里显式声明的结构;普通菜单不会自动生成 DOM 包裹,\n * 显示分组完全交给用户用 group 配置或 `|` 控制。\n */\n const groupElement = document.createElement('div');\n\n groupElement.className = 'bridgerte__toolbar-group';\n groupElement.dataset.group = toolbarItem.key;\n groupElement.setAttribute('aria-label', toolbarItem.title);\n toolbarElement.append(groupElement);\n\n renderToolbarGroupButton(\n groupElement,\n toolbarItem,\n commandStates,\n icons,\n enableTooltip\n );\n });\n};\n\n/**\n * 渲染 group button 打开的纵向收纳菜单。\n *\n * 浮层只展示 MenuItem 子项并复用现有 item id,点击执行仍由 index.ts 统一走 EditorAPI。\n */\nexport const renderToolbarGroupMenu = (\n menuElement: HTMLElement,\n groupMenuState: ToolbarGroupMenuState | null,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons\n) => {\n menuElement.textContent = '';\n\n if (!groupMenuState) {\n menuElement.dataset.visible = 'false';\n return;\n }\n\n groupMenuState.items.forEach((item) => {\n const state = getMenuStateForItem(item, commandStates);\n const button = document.createElement('button');\n const iconSvg = icons[item.icon] ?? defaultMenuIcons[item.icon];\n const labelElement = document.createElement('span');\n\n button.type = 'button';\n button.className = 'bridgerte__menu-item bridgerte__toolbar-group-menu-item';\n button.disabled = state.disabled;\n button.dataset.active = String(state.active);\n button.dataset.bridgerteToolbarItemId = item.id;\n button.setAttribute('role', 'menuitem');\n button.setAttribute('aria-label', item.label);\n button.setAttribute('aria-pressed', String(state.active));\n\n appendMenuIcon(button, iconSvg, item.label);\n labelElement.className = 'bridgerte__toolbar-group-menu-label';\n labelElement.textContent = item.label;\n button.append(labelElement);\n menuElement.append(button);\n });\n\n menuElement.dataset.visible = 'true';\n menuElement.style.minWidth = `${groupMenuState.button.offsetWidth}px`;\n};\n\nexport const syncToolbarGroupButtonState = (\n container: HTMLElement,\n groupMenuState: ToolbarGroupMenuState | null\n) => {\n container.querySelectorAll<HTMLButtonElement>(toolbarGroupButtonSelector).forEach((button) => {\n const open = groupMenuState?.groupKey === button.dataset.bridgerteToolbarGroupId;\n\n button.dataset.open = String(open);\n button.setAttribute('aria-expanded', String(open));\n });\n};\n\nexport const findToolbarGroupMenuItem = (\n toolbarItems: ResolvedToolbarItem[],\n groupKey: string | undefined\n) => toolbarItems.find((item): item is Extract<ResolvedToolbarItem, { type: 'group' }> => (\n item.type === 'group' && item.key === groupKey\n));\n","import {\n toolbarExecutableButtonSelector,\n toolbarGroupButtonSelector\n} from './render';\n\nconst toolbarGroupTouchMoveTolerancePx = 8;\n\nconst isInsideNode = (container: HTMLElement, target: EventTarget | null) => (\n target instanceof Node && container.contains(target)\n);\n\nconst getClosestButton = (\n target: EventTarget | null,\n selector: string\n) => (\n target instanceof Element ? target.closest<HTMLButtonElement>(selector) : null\n);\n\n/**\n * 创建 toolbar 收纳菜单交互控制器。\n *\n * 这个控制器只接管收纳菜单链路:更多入口和收纳菜单项。\n * 普通 toolbar 按钮保留原生 click,避免 H5 横向滚动和点击链路被菜单控制器误拦;\n * 收纳菜单仍在 PC 鼠标按下阶段保护 selection,H5 tap 在 touchend 判定后提交。\n */\nexport const createToolbarGroupMenuInteraction = (\n container: HTMLElement,\n groupMenuElement: HTMLElement,\n toggleGroupMenu: (button: HTMLButtonElement) => void,\n executeToolbarButton: (button: HTMLButtonElement) => void,\n closeGroupMenu: () => void\n) => {\n let pendingTouch: {\n button: HTMLButtonElement;\n kind: 'group' | 'menu-item';\n startX: number;\n startY: number;\n } | null = null;\n let suppressNextClickButton: HTMLButtonElement | null = null;\n\n const getInteractiveButtonFromTarget = (target: EventTarget | null) => (\n getClosestButton(target, toolbarGroupButtonSelector)\n ?? (\n isInsideNode(groupMenuElement, target)\n ? getClosestButton(target, toolbarExecutableButtonSelector)\n : null\n )\n );\n\n const handlePressStart = (event: PointerEvent | MouseEvent) => {\n const button = getInteractiveButtonFromTarget(event.target);\n\n if (!button) return;\n\n /*\n * toolbar 按钮属于编辑器工具区。鼠标按下阶段阻止默认 focus 转移,保留正文\n * selection;触屏不能在这里拦截,否则 H5 横向滚动会被当成按钮按下吞掉。\n */\n if (event instanceof PointerEvent && event.pointerType !== 'mouse') return;\n\n event.preventDefault();\n };\n\n const handleTouchStart = (event: TouchEvent) => {\n const touch = event.touches[0];\n const groupButton = getClosestButton(event.target, toolbarGroupButtonSelector);\n const menuItemButton = isInsideNode(groupMenuElement, event.target)\n ? getClosestButton(event.target, toolbarExecutableButtonSelector)\n : null;\n const button = groupButton ?? menuItemButton;\n\n if (!button || !touch) return;\n\n /*\n * touchstart 只记录候选 tap,不阻止默认行为。移动端需要先让浏览器识别横向滚动;\n * 真正的点击会在 touchend 里按位移阈值提交并拦截尾随 click。\n */\n pendingTouch = {\n button,\n kind: groupButton ? 'group' : 'menu-item',\n startX: touch.clientX,\n startY: touch.clientY\n };\n };\n\n const clearPendingTouch = () => {\n pendingTouch = null;\n };\n\n const handleTouchEnd = (event: TouchEvent) => {\n if (!pendingTouch) return;\n\n const touchState = pendingTouch;\n const touch = event.changedTouches[0];\n const endButton = getInteractiveButtonFromTarget(event.target);\n\n pendingTouch = null;\n if (!touch || endButton !== touchState.button) return;\n\n const deltaX = Math.abs(touch.clientX - touchState.startX);\n const deltaY = Math.abs(touch.clientY - touchState.startY);\n\n if (\n deltaX > toolbarGroupTouchMoveTolerancePx\n || deltaY > toolbarGroupTouchMoveTolerancePx\n ) return;\n\n event.preventDefault();\n event.stopPropagation();\n suppressNextClickButton = touchState.button;\n\n if (touchState.kind === 'group') {\n toggleGroupMenu(touchState.button);\n return;\n }\n\n executeToolbarButton(touchState.button);\n closeGroupMenu();\n };\n\n const handleDocumentPointerDown = (event: PointerEvent) => {\n if (\n isInsideNode(container, event.target)\n || isInsideNode(groupMenuElement, event.target)\n ) return;\n\n closeGroupMenu();\n };\n\n container.addEventListener('pointerdown', handlePressStart);\n container.addEventListener('mousedown', handlePressStart);\n container.addEventListener('touchstart', handleTouchStart, { passive: false });\n container.addEventListener('touchend', handleTouchEnd);\n container.addEventListener('touchcancel', clearPendingTouch);\n groupMenuElement.addEventListener('pointerdown', handlePressStart);\n groupMenuElement.addEventListener('mousedown', handlePressStart);\n groupMenuElement.addEventListener('touchstart', handleTouchStart, { passive: false });\n groupMenuElement.addEventListener('touchend', handleTouchEnd);\n groupMenuElement.addEventListener('touchcancel', clearPendingTouch);\n document.addEventListener('pointerdown', handleDocumentPointerDown, true);\n\n return {\n consumeSuppressedClick(button: HTMLButtonElement) {\n if (suppressNextClickButton !== button) return false;\n\n suppressNextClickButton = null;\n return true;\n },\n destroy() {\n container.removeEventListener('pointerdown', handlePressStart);\n container.removeEventListener('mousedown', handlePressStart);\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchend', handleTouchEnd);\n container.removeEventListener('touchcancel', clearPendingTouch);\n groupMenuElement.removeEventListener('pointerdown', handlePressStart);\n groupMenuElement.removeEventListener('mousedown', handlePressStart);\n groupMenuElement.removeEventListener('touchstart', handleTouchStart);\n groupMenuElement.removeEventListener('touchend', handleTouchEnd);\n groupMenuElement.removeEventListener('touchcancel', clearPendingTouch);\n document.removeEventListener('pointerdown', handleDocumentPointerDown, true);\n }\n };\n};\n","import type { CommandState } from '@bridgerte/core';\nimport {\n defaultMenuSchema,\n resolveToolbarMenu\n} from '@bridgerte/native-spec';\nimport { createFloatingLayer, type RichTextFloatingLayer } from '../floatingLayer';\nimport { bindTouchPressedState } from '../interactionState';\nimport {\n getPayloadPanelCurrentValues,\n resolveMenuSchemaForDom\n} from '../menuRuntime';\nimport {\n focusToolbarGroupMenuItem,\n handleToolbarGroupMenuKeyDown\n} from './groupMenuKeyboard';\nimport { createToolbarGroupMenuInteraction } from './groupMenuInteraction';\nimport {\n findToolbarGroupMenuItem,\n renderToolbar,\n renderToolbarGroupMenu,\n syncToolbarGroupButtonState,\n toolbarExecutableButtonSelector,\n toolbarGroupButtonSelector\n} from './render';\nimport type {\n RichTextToolbarAPI,\n ToolbarGroupMenuState,\n RichTextToolbarOptions\n} from './type';\n\nconst toolbarTooltipOffsetPx = 8;\nconst toolbarGroupMenuOffsetPx = 6;\n\nexport type * from './type';\n\nconst canUseHoverTooltip = () => (\n typeof window !== 'undefined'\n && window.matchMedia?.('(hover: hover) and (pointer: fine)').matches === true\n);\n\nconst getToolbarButtonFromTarget = (target: EventTarget | null) => {\n /*\n * 图标覆盖常用 SVG,H5 pointer 事件可能落在 svg/path 上。\n * 这里用 Element 而不是 HTMLElement,保证触屏兜底和 click 都能向上命中真实按钮。\n */\n const button = target instanceof Element\n ? target.closest<HTMLButtonElement>(toolbarExecutableButtonSelector)\n : null;\n\n return button instanceof HTMLButtonElement ? button : null;\n};\n\nconst getToolbarGroupButtonFromTarget = (target: EventTarget | null) => {\n const button = target instanceof Element\n ? target.closest<HTMLButtonElement>(toolbarGroupButtonSelector)\n : null;\n\n return button instanceof HTMLButtonElement ? button : null;\n};\n\n/**\n * 创建独立菜单实例。\n *\n * toolbar/tabbar 只订阅 EditorAPI 状态并派发命令,不接触编辑器内部 DOM 或 Lexical 实例。\n */\nexport function createRichTextToolbar(\n container: HTMLElement,\n options: RichTextToolbarOptions\n): RichTextToolbarAPI {\n const placement = options.placement ?? 'top';\n const menuSchema = resolveMenuSchemaForDom(options.menuSchema ?? defaultMenuSchema, {\n menuLabels: options.menuLabels,\n payloadPanelConfig: options.payloadPanelConfig\n });\n const toolbarItems = resolveToolbarMenu(options.toolbarConfig, menuSchema);\n /*\n * click 事件只需要能执行命令的菜单项。分割线和 group 容器是渲染结构,\n * 先在这里摊平,后续点击时就不用理解 toolbarConfig 的展示层级。\n */\n const executableMenuItems = toolbarItems.flatMap((toolbarItem) => (\n toolbarItem.type === 'button' ? [toolbarItem.item]\n : toolbarItem.type === 'group' ? toolbarItem.items\n : []\n ));\n const icons = options.icons ?? {};\n /*\n * tooltip 只属于 PC 精细指针体验。H5 上即使没有原生 title,部分浏览器也会把 hover/mouseover\n * 模拟成首触摸状态,导致第一次点像是只唤醒提示;所以触屏端不写 tooltip 数据也不挂监听。\n */\n const enableTooltip = canUseHoverTooltip();\n const tooltipElement = document.createElement('div');\n const groupMenuElement = document.createElement('div');\n const overlayHost = container.closest('.bridgerte') ?? container;\n let destroyed = false;\n let latestCommandStates = options.editor.getCommandStates();\n let groupMenuState: ToolbarGroupMenuState | null = null;\n let groupMenuFloatingLayer: RichTextFloatingLayer | null = null;\n const clearToolbarPressedState = bindTouchPressedState(container, {\n targetSelector: [\n 'button[data-bridgerte-toolbar-item-id]',\n 'button[data-bridgerte-toolbar-group-id]'\n ].join(',')\n });\n const clearGroupMenuPressedState = bindTouchPressedState(groupMenuElement, {\n targetSelector: '.bridgerte__toolbar-group-menu-item'\n });\n\n const mountToolbarOverlays = () => {\n // 独立 toolbar 可能不在 `.bridgerte` 内,渲染按钮会清空 container,需要把浮层重新挂回去。\n overlayHost.append(tooltipElement);\n overlayHost.append(groupMenuElement);\n };\n\n const closeGroupMenuFloatingLayer = () => {\n groupMenuFloatingLayer?.setOpen(false);\n groupMenuFloatingLayer?.destroy();\n groupMenuFloatingLayer = null;\n };\n\n const openGroupMenuFloatingLayer = () => {\n if (!groupMenuState) return;\n\n closeGroupMenuFloatingLayer();\n /*\n * group menu 和 hoverbar/mention/slash 一样属于轻浮层,必须走 floatingLayer。\n * 这里按 toolbar placement 给出首选方向,真正的翻转、键盘可视区和左右夹紧交给\n * createFloatingLayer 内部的 visualViewport + flip + shift + clamp 统一处理。\n */\n groupMenuFloatingLayer = createFloatingLayer(groupMenuState.button, groupMenuElement, {\n placement: placement === 'bottom' ? 'top-start' : 'bottom-start',\n offset: toolbarGroupMenuOffsetPx,\n strategy: 'fixed'\n });\n groupMenuFloatingLayer.setOpen(true);\n };\n\n const closeGroupMenu = () => {\n if (!groupMenuState && !groupMenuFloatingLayer) return;\n\n closeGroupMenuFloatingLayer();\n groupMenuState = null;\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n };\n\n const renderStates = (states: CommandState[]) => {\n if (destroyed) return;\n\n latestCommandStates = states;\n if (groupMenuState) closeGroupMenuFloatingLayer();\n renderToolbar(container, toolbarItems, states, icons, enableTooltip);\n mountToolbarOverlays();\n if (groupMenuState) {\n const nextButton = Array.from(\n container.querySelectorAll<HTMLButtonElement>(toolbarGroupButtonSelector)\n ).find((button) => button.dataset.bridgerteToolbarGroupId === groupMenuState?.groupKey);\n const nextGroupItem = findToolbarGroupMenuItem(toolbarItems, groupMenuState.groupKey);\n\n groupMenuState = nextButton && nextGroupItem\n ? {\n groupKey: groupMenuState.groupKey,\n button: nextButton,\n items: nextGroupItem.items\n }\n : null;\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n if (groupMenuState) openGroupMenuFloatingLayer();\n }\n };\n\n const update = () => {\n if (destroyed) return;\n\n renderStates(options.editor.getCommandStates());\n };\n\n const hideTooltip = () => {\n tooltipElement.dataset.visible = 'false';\n tooltipElement.textContent = '';\n };\n\n const showTooltip = (button: HTMLButtonElement) => {\n const tooltipText = button.dataset.tooltip;\n\n if (!enableTooltip || !tooltipText) return;\n\n const buttonRect = button.getBoundingClientRect();\n\n tooltipElement.textContent = tooltipText;\n tooltipElement.dataset.visible = 'true';\n tooltipElement.style.left = `${buttonRect.left + buttonRect.width / 2}px`;\n tooltipElement.style.top = `${buttonRect.top - toolbarTooltipOffsetPx}px`;\n };\n\n const handleTooltipTarget = (event: Event) => {\n const button = getToolbarButtonFromTarget(event.target);\n\n if (button) {\n showTooltip(button);\n }\n };\n\n const handleTooltipLeave = (event: MouseEvent) => {\n const relatedTarget = event.relatedTarget;\n const button = getToolbarButtonFromTarget(event.target);\n\n if (\n button\n && relatedTarget instanceof Node\n && button.contains(relatedTarget)\n ) return;\n\n hideTooltip();\n };\n\n const executeToolbarButton = (button: HTMLButtonElement) => {\n if (!(button instanceof HTMLButtonElement) || button.disabled) return;\n\n const menuItem = executableMenuItems.find((item) => (\n item.id === button.dataset.bridgerteToolbarItemId\n ));\n\n if (!menuItem) return;\n\n if (menuItem.payloadPanel) {\n const buttonRect = button.getBoundingClientRect();\n\n /*\n * 带 payloadPanel 的菜单不直接执行基础 command,而是发起参数请求。\n * DOM 内置面板和业务/RN/Flutter 自绘都走同一个 request,避免后续颜色、\n * 字体、链接等参数菜单各自发明一套协议。\n */\n options.editor.requestPayloadPanel({\n menuId: menuItem.id,\n command: menuItem.command,\n panel: menuItem.payloadPanel,\n currentValues: getPayloadPanelCurrentValues(menuItem, options.editor.getCommandStates()),\n anchorRect: {\n x: buttonRect.left,\n y: buttonRect.top,\n width: buttonRect.width,\n height: buttonRect.height\n }\n });\n return;\n }\n\n options.editor.executeCommand(menuItem.command);\n };\n\n const toggleGroupMenu = (button: HTMLButtonElement, shouldFocusMenu = false) => {\n const groupItem = findToolbarGroupMenuItem(\n toolbarItems,\n button.dataset.bridgerteToolbarGroupId\n );\n\n if (!groupItem || button.disabled) return;\n\n if (groupMenuState?.groupKey === groupItem.key) {\n if (shouldFocusMenu) {\n focusToolbarGroupMenuItem(groupMenuElement, 0);\n return;\n }\n closeGroupMenu();\n return;\n }\n\n groupMenuState = {\n groupKey: groupItem.key,\n button,\n items: groupItem.items\n };\n hideTooltip();\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n openGroupMenuFloatingLayer();\n if (shouldFocusMenu) focusToolbarGroupMenuItem(groupMenuElement, 0);\n };\n\n const handleClick = (event: MouseEvent) => {\n const groupButton = getToolbarGroupButtonFromTarget(event.target);\n if (groupButton) {\n event.preventDefault();\n event.stopPropagation();\n if (groupMenuInteraction.consumeSuppressedClick(groupButton)) return;\n\n toggleGroupMenu(groupButton);\n return;\n }\n\n const button = getToolbarButtonFromTarget(event.target);\n if (!button) return;\n\n event.preventDefault();\n event.stopPropagation();\n if (groupMenuInteraction.consumeSuppressedClick(button)) return;\n\n executeToolbarButton(button);\n closeGroupMenu();\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (groupMenuState && groupMenuElement.contains(document.activeElement)) {\n handleToolbarGroupMenuKeyDown(\n event,\n groupMenuElement,\n groupMenuState.button,\n executeToolbarButton,\n closeGroupMenu\n );\n return;\n }\n\n const groupButton = getToolbarGroupButtonFromTarget(event.target);\n if (\n groupButton\n && (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown')\n ) {\n /*\n * 指针点击收纳菜单不能抢编辑器焦点;键盘从入口按钮打开时则进入菜单项,\n * 保留 PC 可访问性和方向键 roving focus。\n */\n event.preventDefault();\n event.stopPropagation();\n toggleGroupMenu(groupButton, true);\n return;\n }\n\n if (event.key !== 'Escape') return;\n\n closeGroupMenu();\n };\n\n container.classList.add('bridgerte__toolbar');\n tooltipElement.className = 'bridgerte__toolbar-tooltip';\n tooltipElement.dataset.visible = 'false';\n groupMenuElement.className = 'bridgerte__floating-menu bridgerte__toolbar-group-menu';\n groupMenuElement.dataset.visible = 'false';\n groupMenuElement.setAttribute('role', 'menu');\n container.dataset.placement = placement;\n container.setAttribute('role', 'toolbar');\n container.setAttribute(\n 'aria-label',\n placement === 'bottom' ? 'BridgeRTE tabbar' : 'BridgeRTE toolbar'\n );\n container.addEventListener('click', handleClick);\n groupMenuElement.addEventListener('click', handleClick);\n document.addEventListener('keydown', handleKeyDown);\n if (enableTooltip) {\n container.addEventListener('mouseover', handleTooltipTarget);\n container.addEventListener('mouseout', handleTooltipLeave);\n }\n container.addEventListener('focusout', hideTooltip);\n // 浮层挂在最近的编辑器根容器下,既能继承变量,也不会操作编辑内容 DOM。\n mountToolbarOverlays();\n const groupMenuInteraction = createToolbarGroupMenuInteraction(\n container,\n groupMenuElement,\n toggleGroupMenu,\n executeToolbarButton,\n closeGroupMenu\n );\n\n // 独立 toolbar 只订阅 public API 状态,不依赖 DOM 编辑器内部实现。\n const unsubscribe = options.editor.subscribeCommandStateChange(renderStates);\n\n return {\n update,\n destroy() {\n if (destroyed) return;\n\n destroyed = true;\n unsubscribe();\n closeGroupMenu();\n container.removeEventListener('click', handleClick);\n groupMenuElement.removeEventListener('click', handleClick);\n document.removeEventListener('keydown', handleKeyDown);\n groupMenuInteraction.destroy();\n if (enableTooltip) {\n container.removeEventListener('mouseover', handleTooltipTarget);\n container.removeEventListener('mouseout', handleTooltipLeave);\n }\n clearToolbarPressedState();\n clearGroupMenuPressedState();\n container.removeEventListener('focusout', hideTooltip);\n tooltipElement.remove();\n groupMenuElement.remove();\n container.classList.remove('bridgerte__toolbar');\n delete container.dataset.placement;\n container.textContent = '';\n container.removeAttribute('role');\n container.removeAttribute('aria-label');\n }\n };\n}\n","const invisibleTextPattern = /[\\u200B-\\u200D\\uFEFF]/g;\n\n/*\n * HTML 片段里这些元素没有 textContent 也应算有效内容。\n * 纯排版容器不放进来,避免 `<p><br></p>`、空列表项这类编辑器占位被误判为非空。\n */\nconst meaningfulHtmlContentSelector = [\n 'img',\n 'video',\n 'audio',\n 'iframe',\n 'table',\n 'pre',\n 'code',\n 'hr',\n 'figure',\n 'canvas',\n 'svg',\n 'math',\n '[data-type=\"mention\"]'\n].join(',');\n\nconst normalizeHtmlText = (text: string | null | undefined): string => (\n text?.replace(invisibleTextPattern, '').trim() ?? ''\n);\n\n/**\n * 判断一段 HTML 片段是否包含可保存的富文本内容。\n *\n * 这个工具会使用浏览器 template 解析 HTML,适合只拿到 HTML 字符串的业务表单;如果已经持有\n * `EditorContent`,优先使用 core 的 `isEditorContentEmpty()`,避免额外 DOM parse。\n */\nexport const hasMeaningfulHtmlContent = (html: string): boolean => {\n if (!normalizeHtmlText(html)) return false;\n\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n return Boolean(\n normalizeHtmlText(template.content.textContent)\n || template.content.querySelector(meaningfulHtmlContentSelector)\n );\n};\n"],"names":["defaultMenuUiIcons","getEnabledGroupMenuButtons","menuElement","button","focusToolbarGroupMenuItem","index","nextButton","handleToolbarGroupMenuKeyDown","event","returnButton","executeToolbarButton","closeGroupMenu","buttons","activeIndex","focusByOffset","offset","nextIndex","_a","_b","toolbarGroupButtonSelector","toolbarButtonSelector","toolbarExecutableButtonSelector","getGroupMenuState","items","commandStates","itemStates","item","getMenuStateForItem","state","renderToolbarButton","groupElement","icons","enableTooltip","iconSvg","defaultMenuIcons","appendMenuIcon","renderToolbarGroupButton","toolbarItem","groupState","indicator","renderToolbar","toolbarElement","toolbarItems","separatorElement","renderToolbarGroupMenu","groupMenuState","labelElement","syncToolbarGroupButtonState","container","open","findToolbarGroupMenuItem","groupKey","toolbarGroupTouchMoveTolerancePx","isInsideNode","target","getClosestButton","selector","createToolbarGroupMenuInteraction","groupMenuElement","toggleGroupMenu","pendingTouch","suppressNextClickButton","getInteractiveButtonFromTarget","handlePressStart","handleTouchStart","touch","groupButton","menuItemButton","clearPendingTouch","handleTouchEnd","touchState","endButton","deltaX","deltaY","handleDocumentPointerDown","toolbarTooltipOffsetPx","toolbarGroupMenuOffsetPx","canUseHoverTooltip","getToolbarButtonFromTarget","getToolbarGroupButtonFromTarget","createRichTextToolbar","options","placement","menuSchema","resolveMenuSchemaForDom","defaultMenuSchema","resolveToolbarMenu","executableMenuItems","tooltipElement","overlayHost","destroyed","latestCommandStates","groupMenuFloatingLayer","clearToolbarPressedState","bindTouchPressedState","clearGroupMenuPressedState","mountToolbarOverlays","closeGroupMenuFloatingLayer","openGroupMenuFloatingLayer","createFloatingLayer","renderStates","states","nextGroupItem","update","hideTooltip","showTooltip","tooltipText","buttonRect","handleTooltipTarget","handleTooltipLeave","relatedTarget","menuItem","getPayloadPanelCurrentValues","shouldFocusMenu","groupItem","handleClick","groupMenuInteraction","handleKeyDown","unsubscribe","invisibleTextPattern","meaningfulHtmlContentSelector","normalizeHtmlText","text","hasMeaningfulHtmlContent","html","template"],"mappings":"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"}
1
+ {"version":3,"file":"index-79mXjylo.cjs","sources":["../../dom/src/menuIcon/uiIcons.ts","../../dom/src/richTextToolbar/groupMenuKeyboard.ts","../../dom/src/richTextToolbar/render.ts","../../dom/src/richTextToolbar/groupMenuInteraction.ts","../../dom/src/richTextToolbar/index.ts","../../dom/src/htmlContent/index.ts"],"sourcesContent":["/**\n * DOM UI chrome icon 表。\n *\n * 这里放 toolbar 收纳入口、下拉箭头这类控件自身图标。它们不属于 `MenuItem.icon`\n * 跨端 schema,也不应该进入 `defaultMenuIcons` 的 schema 对齐检查。\n */\nexport const defaultMenuUiIcons = {\n toolbarGroup: `\n <svg\n aria-hidden=\"true\"\n class=\"lucide lucide-ellipsis\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </svg>\n `,\n chevronDown: `\n <svg\n aria-hidden=\"true\"\n class=\"lucide lucide-chevron-down\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n `\n} as const;\n","export const getEnabledGroupMenuButtons = (menuElement: HTMLElement) => (\n Array.from(\n menuElement.querySelectorAll<HTMLButtonElement>('.bridgerte__toolbar-group-menu-item')\n ).filter((button) => !button.disabled)\n);\n\nexport const focusToolbarGroupMenuItem = (menuElement: HTMLElement, index: number) => {\n const buttons = getEnabledGroupMenuButtons(menuElement);\n const nextButton = buttons[index];\n\n if (nextButton) nextButton.focus();\n};\n\nexport const handleToolbarGroupMenuKeyDown = (\n event: KeyboardEvent,\n menuElement: HTMLElement,\n returnButton: HTMLButtonElement,\n executeToolbarButton: (button: HTMLButtonElement) => void,\n closeGroupMenu: () => void\n) => {\n const buttons = getEnabledGroupMenuButtons(menuElement);\n const activeIndex = document.activeElement instanceof HTMLButtonElement\n ? buttons.indexOf(document.activeElement)\n : -1;\n const focusByOffset = (offset: number) => {\n if (buttons.length === 0) return;\n\n const baseIndex = activeIndex >= 0 ? activeIndex : 0;\n const nextIndex = (baseIndex + offset + buttons.length) % buttons.length;\n\n buttons[nextIndex]?.focus();\n };\n\n /*\n * ARIA menu 语义要求支持 roving focus。这里不改 toolbar 的横向键盘模型,\n * 只在已打开的纵向收纳菜单内处理上下方向、首尾跳转和执行/关闭。\n */\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n focusByOffset(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n focusByOffset(-1);\n break;\n case 'Home':\n event.preventDefault();\n buttons[0]?.focus();\n break;\n case 'End':\n event.preventDefault();\n buttons.at(-1)?.focus();\n break;\n case 'Enter':\n case ' ':\n if (document.activeElement instanceof HTMLButtonElement) {\n event.preventDefault();\n executeToolbarButton(document.activeElement);\n closeGroupMenu();\n returnButton.focus();\n }\n break;\n case 'Escape':\n event.preventDefault();\n returnButton.focus();\n closeGroupMenu();\n break;\n default:\n break;\n }\n};\n","import type { CommandState } from '@bridgerte/core';\nimport type { MenuItem, ResolvedToolbarItem } from '@bridgerte/native-spec';\nimport {\n appendMenuIcon,\n defaultMenuIcons,\n defaultMenuUiIcons\n} from './icons';\nimport { getMenuStateForItem } from '../menuRuntime';\nimport type {\n RichTextToolbarIcons,\n ToolbarGroupMenuState\n} from './type';\n\nexport const toolbarGroupButtonSelector = 'button[data-bridgerte-toolbar-group-id]';\nexport const toolbarButtonSelector = 'button[data-bridgerte-toolbar-item-id]';\n// 可执行按钮同时覆盖 toolbar 主按钮和 group menu 子项,避免浮层子菜单绕过统一命令入口。\nexport const toolbarExecutableButtonSelector = [\n toolbarButtonSelector,\n '.bridgerte__toolbar-group-menu-item'\n].join(',');\n\nconst getGroupMenuState = (items: MenuItem[], commandStates: CommandState[]) => {\n const itemStates = items.map((item) => getMenuStateForItem(item, commandStates));\n\n return {\n active: itemStates.some((state) => state.active),\n disabled: itemStates.length > 0 && itemStates.every((state) => state.disabled)\n };\n};\n\nconst renderToolbarButton = (\n groupElement: HTMLElement,\n item: MenuItem,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n const state = getMenuStateForItem(item, commandStates);\n const button = document.createElement('button');\n // icon 兜底顺序固定为:业务覆盖 > DOM 默认 SVG > label 文本。\n const iconSvg = icons[item.icon] ?? defaultMenuIcons[item.icon];\n\n button.type = 'button';\n button.className = 'bridgerte__toolbar-button';\n button.disabled = state.disabled;\n button.dataset.active = String(state.active);\n button.dataset.bridgerteToolbarItemId = item.id;\n button.setAttribute('aria-label', item.label);\n button.setAttribute('aria-pressed', String(state.active));\n if (enableTooltip) button.dataset.tooltip = item.label;\n\n appendMenuIcon(button, iconSvg, item.label);\n\n groupElement.append(button);\n};\n\nconst renderToolbarGroupButton = (\n groupElement: HTMLElement,\n toolbarItem: Extract<ResolvedToolbarItem, { type: 'group' }>,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n const button = document.createElement('button');\n const groupState = getGroupMenuState(toolbarItem.items, commandStates);\n const iconSvg = toolbarItem.icon\n ? icons[toolbarItem.icon] ?? defaultMenuIcons[toolbarItem.icon]\n : defaultMenuUiIcons.toolbarGroup;\n const indicator = document.createElement('span');\n\n button.type = 'button';\n button.className = 'bridgerte__toolbar-button bridgerte__toolbar-group-button';\n button.disabled = groupState.disabled;\n button.dataset.active = String(groupState.active);\n button.dataset.bridgerteToolbarGroupId = toolbarItem.key;\n button.dataset.open = 'false';\n button.setAttribute('aria-label', toolbarItem.title);\n button.setAttribute('aria-haspopup', 'menu');\n button.setAttribute('aria-expanded', 'false');\n button.setAttribute('aria-pressed', String(groupState.active));\n if (enableTooltip) button.dataset.tooltip = toolbarItem.title;\n\n appendMenuIcon(button, iconSvg, toolbarItem.title);\n\n indicator.className = 'bridgerte__toolbar-group-indicator';\n indicator.setAttribute('aria-hidden', 'true');\n indicator.innerHTML = defaultMenuUiIcons.chevronDown;\n button.append(indicator);\n groupElement.append(button);\n};\n\n/**\n * 渲染 toolbar 横向主入口。\n *\n * 字符串菜单直接渲染为按钮,`|` 渲染分割线。\n * 只有用户显式声明的 group 配置才生成收纳入口,避免 schema 隐式改变 DOM 结构。\n */\nexport const renderToolbar = (\n toolbarElement: HTMLElement,\n toolbarItems: ResolvedToolbarItem[],\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n toolbarElement.textContent = '';\n\n toolbarItems.forEach((toolbarItem) => {\n if (toolbarItem.type === 'separator') {\n const separatorElement = document.createElement('span');\n\n separatorElement.className = 'bridgerte__toolbar-separator';\n separatorElement.dataset.separatorId = toolbarItem.key;\n separatorElement.setAttribute('aria-hidden', 'true');\n toolbarElement.append(separatorElement);\n return;\n }\n\n if (toolbarItem.type === 'button') {\n renderToolbarButton(\n toolbarElement,\n toolbarItem.item,\n commandStates,\n icons,\n enableTooltip\n );\n return;\n }\n\n /*\n * 收纳菜单是用户在 toolbarConfig 里显式声明的结构;普通菜单不会自动生成 DOM 包裹,\n * 显示分组完全交给用户用 group 配置或 `|` 控制。\n */\n const groupElement = document.createElement('div');\n\n groupElement.className = 'bridgerte__toolbar-group';\n groupElement.dataset.group = toolbarItem.key;\n groupElement.setAttribute('aria-label', toolbarItem.title);\n toolbarElement.append(groupElement);\n\n renderToolbarGroupButton(\n groupElement,\n toolbarItem,\n commandStates,\n icons,\n enableTooltip\n );\n });\n};\n\n/**\n * 渲染 group button 打开的纵向收纳菜单。\n *\n * 浮层只展示 MenuItem 子项并复用现有 item id,点击执行仍由 index.ts 统一走 EditorAPI。\n */\nexport const renderToolbarGroupMenu = (\n menuElement: HTMLElement,\n groupMenuState: ToolbarGroupMenuState | null,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons\n) => {\n menuElement.textContent = '';\n\n if (!groupMenuState) {\n menuElement.dataset.visible = 'false';\n return;\n }\n\n groupMenuState.items.forEach((item) => {\n const state = getMenuStateForItem(item, commandStates);\n const button = document.createElement('button');\n const iconSvg = icons[item.icon] ?? defaultMenuIcons[item.icon];\n const labelElement = document.createElement('span');\n\n button.type = 'button';\n button.className = 'bridgerte__menu-item bridgerte__toolbar-group-menu-item';\n button.disabled = state.disabled;\n button.dataset.active = String(state.active);\n button.dataset.bridgerteToolbarItemId = item.id;\n button.setAttribute('role', 'menuitem');\n button.setAttribute('aria-label', item.label);\n button.setAttribute('aria-pressed', String(state.active));\n\n appendMenuIcon(button, iconSvg, item.label);\n labelElement.className = 'bridgerte__toolbar-group-menu-label';\n labelElement.textContent = item.label;\n button.append(labelElement);\n menuElement.append(button);\n });\n\n menuElement.dataset.visible = 'true';\n menuElement.style.minWidth = `${groupMenuState.button.offsetWidth}px`;\n};\n\nexport const syncToolbarGroupButtonState = (\n container: HTMLElement,\n groupMenuState: ToolbarGroupMenuState | null\n) => {\n container.querySelectorAll<HTMLButtonElement>(toolbarGroupButtonSelector).forEach((button) => {\n const open = groupMenuState?.groupKey === button.dataset.bridgerteToolbarGroupId;\n\n button.dataset.open = String(open);\n button.setAttribute('aria-expanded', String(open));\n });\n};\n\nexport const findToolbarGroupMenuItem = (\n toolbarItems: ResolvedToolbarItem[],\n groupKey: string | undefined\n) => toolbarItems.find((item): item is Extract<ResolvedToolbarItem, { type: 'group' }> => (\n item.type === 'group' && item.key === groupKey\n));\n","import {\n toolbarExecutableButtonSelector,\n toolbarGroupButtonSelector\n} from './render';\n\nconst toolbarGroupTouchMoveTolerancePx = 8;\n\nconst isInsideNode = (container: HTMLElement, target: EventTarget | null) => (\n target instanceof Node && container.contains(target)\n);\n\nconst getClosestButton = (\n target: EventTarget | null,\n selector: string\n) => (\n target instanceof Element ? target.closest<HTMLButtonElement>(selector) : null\n);\n\n/**\n * 创建 toolbar 收纳菜单交互控制器。\n *\n * 这个控制器只接管收纳菜单链路:更多入口和收纳菜单项。\n * 普通 toolbar 按钮保留原生 click,避免 H5 横向滚动和点击链路被菜单控制器误拦;\n * 收纳菜单仍在 PC 鼠标按下阶段保护 selection,H5 tap 在 touchend 判定后提交。\n */\nexport const createToolbarGroupMenuInteraction = (\n container: HTMLElement,\n groupMenuElement: HTMLElement,\n toggleGroupMenu: (button: HTMLButtonElement) => void,\n executeToolbarButton: (button: HTMLButtonElement) => void,\n closeGroupMenu: () => void\n) => {\n let pendingTouch: {\n button: HTMLButtonElement;\n kind: 'group' | 'menu-item';\n startX: number;\n startY: number;\n } | null = null;\n let suppressNextClickButton: HTMLButtonElement | null = null;\n\n const getInteractiveButtonFromTarget = (target: EventTarget | null) => (\n getClosestButton(target, toolbarGroupButtonSelector)\n ?? (\n isInsideNode(groupMenuElement, target)\n ? getClosestButton(target, toolbarExecutableButtonSelector)\n : null\n )\n );\n\n const handlePressStart = (event: PointerEvent | MouseEvent) => {\n const button = getInteractiveButtonFromTarget(event.target);\n\n if (!button) return;\n\n /*\n * toolbar 按钮属于编辑器工具区。鼠标按下阶段阻止默认 focus 转移,保留正文\n * selection;触屏不能在这里拦截,否则 H5 横向滚动会被当成按钮按下吞掉。\n */\n if (event instanceof PointerEvent && event.pointerType !== 'mouse') return;\n\n event.preventDefault();\n };\n\n const handleTouchStart = (event: TouchEvent) => {\n const touch = event.touches[0];\n const groupButton = getClosestButton(event.target, toolbarGroupButtonSelector);\n const menuItemButton = isInsideNode(groupMenuElement, event.target)\n ? getClosestButton(event.target, toolbarExecutableButtonSelector)\n : null;\n const button = groupButton ?? menuItemButton;\n\n if (!button || !touch) return;\n\n /*\n * touchstart 只记录候选 tap,不阻止默认行为。移动端需要先让浏览器识别横向滚动;\n * 真正的点击会在 touchend 里按位移阈值提交并拦截尾随 click。\n */\n pendingTouch = {\n button,\n kind: groupButton ? 'group' : 'menu-item',\n startX: touch.clientX,\n startY: touch.clientY\n };\n };\n\n const clearPendingTouch = () => {\n pendingTouch = null;\n };\n\n const handleTouchEnd = (event: TouchEvent) => {\n if (!pendingTouch) return;\n\n const touchState = pendingTouch;\n const touch = event.changedTouches[0];\n const endButton = getInteractiveButtonFromTarget(event.target);\n\n pendingTouch = null;\n if (!touch || endButton !== touchState.button) return;\n\n const deltaX = Math.abs(touch.clientX - touchState.startX);\n const deltaY = Math.abs(touch.clientY - touchState.startY);\n\n if (\n deltaX > toolbarGroupTouchMoveTolerancePx\n || deltaY > toolbarGroupTouchMoveTolerancePx\n ) return;\n\n event.preventDefault();\n event.stopPropagation();\n suppressNextClickButton = touchState.button;\n\n if (touchState.kind === 'group') {\n toggleGroupMenu(touchState.button);\n return;\n }\n\n executeToolbarButton(touchState.button);\n closeGroupMenu();\n };\n\n const handleDocumentPointerDown = (event: PointerEvent) => {\n if (\n isInsideNode(container, event.target)\n || isInsideNode(groupMenuElement, event.target)\n ) return;\n\n closeGroupMenu();\n };\n\n container.addEventListener('pointerdown', handlePressStart);\n container.addEventListener('mousedown', handlePressStart);\n container.addEventListener('touchstart', handleTouchStart, { passive: false });\n container.addEventListener('touchend', handleTouchEnd);\n container.addEventListener('touchcancel', clearPendingTouch);\n groupMenuElement.addEventListener('pointerdown', handlePressStart);\n groupMenuElement.addEventListener('mousedown', handlePressStart);\n groupMenuElement.addEventListener('touchstart', handleTouchStart, { passive: false });\n groupMenuElement.addEventListener('touchend', handleTouchEnd);\n groupMenuElement.addEventListener('touchcancel', clearPendingTouch);\n document.addEventListener('pointerdown', handleDocumentPointerDown, true);\n\n return {\n consumeSuppressedClick(button: HTMLButtonElement) {\n if (suppressNextClickButton !== button) return false;\n\n suppressNextClickButton = null;\n return true;\n },\n destroy() {\n container.removeEventListener('pointerdown', handlePressStart);\n container.removeEventListener('mousedown', handlePressStart);\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchend', handleTouchEnd);\n container.removeEventListener('touchcancel', clearPendingTouch);\n groupMenuElement.removeEventListener('pointerdown', handlePressStart);\n groupMenuElement.removeEventListener('mousedown', handlePressStart);\n groupMenuElement.removeEventListener('touchstart', handleTouchStart);\n groupMenuElement.removeEventListener('touchend', handleTouchEnd);\n groupMenuElement.removeEventListener('touchcancel', clearPendingTouch);\n document.removeEventListener('pointerdown', handleDocumentPointerDown, true);\n }\n };\n};\n","import type { CommandState } from '@bridgerte/core';\nimport {\n defaultMenuSchema,\n resolveToolbarMenu\n} from '@bridgerte/native-spec';\nimport { createFloatingLayer, type RichTextFloatingLayer } from '../floatingLayer';\nimport { bindTouchPressedState } from '../interactionState';\nimport {\n getPayloadPanelCurrentValues,\n resolveMenuSchemaForDom\n} from '../menuRuntime';\nimport {\n focusToolbarGroupMenuItem,\n handleToolbarGroupMenuKeyDown\n} from './groupMenuKeyboard';\nimport { createToolbarGroupMenuInteraction } from './groupMenuInteraction';\nimport {\n findToolbarGroupMenuItem,\n renderToolbar,\n renderToolbarGroupMenu,\n syncToolbarGroupButtonState,\n toolbarExecutableButtonSelector,\n toolbarGroupButtonSelector\n} from './render';\nimport type {\n RichTextToolbarAPI,\n ToolbarGroupMenuState,\n RichTextToolbarOptions\n} from './type';\n\nconst toolbarTooltipOffsetPx = 8;\nconst toolbarGroupMenuOffsetPx = 6;\n\nexport type * from './type';\n\nconst canUseHoverTooltip = () => (\n typeof window !== 'undefined'\n && window.matchMedia?.('(hover: hover) and (pointer: fine)').matches === true\n);\n\nconst getToolbarButtonFromTarget = (target: EventTarget | null) => {\n /*\n * 图标覆盖常用 SVG,H5 pointer 事件可能落在 svg/path 上。\n * 这里用 Element 而不是 HTMLElement,保证触屏兜底和 click 都能向上命中真实按钮。\n */\n const button = target instanceof Element\n ? target.closest<HTMLButtonElement>(toolbarExecutableButtonSelector)\n : null;\n\n return button instanceof HTMLButtonElement ? button : null;\n};\n\nconst getToolbarGroupButtonFromTarget = (target: EventTarget | null) => {\n const button = target instanceof Element\n ? target.closest<HTMLButtonElement>(toolbarGroupButtonSelector)\n : null;\n\n return button instanceof HTMLButtonElement ? button : null;\n};\n\n/**\n * 创建独立菜单实例。\n *\n * toolbar/tabbar 只订阅 EditorAPI 状态并派发命令,不接触编辑器内部 DOM 或 Lexical 实例。\n */\nexport function createRichTextToolbar(\n container: HTMLElement,\n options: RichTextToolbarOptions\n): RichTextToolbarAPI {\n const placement = options.placement ?? 'top';\n const menuSchema = resolveMenuSchemaForDom(options.menuSchema ?? defaultMenuSchema, {\n menuLabels: options.menuLabels,\n payloadPanelConfig: options.payloadPanelConfig\n });\n const toolbarItems = resolveToolbarMenu(options.toolbarConfig, menuSchema);\n /*\n * click 事件只需要能执行命令的菜单项。分割线和 group 容器是渲染结构,\n * 先在这里摊平,后续点击时就不用理解 toolbarConfig 的展示层级。\n */\n const executableMenuItems = toolbarItems.flatMap((toolbarItem) => (\n toolbarItem.type === 'button' ? [toolbarItem.item]\n : toolbarItem.type === 'group' ? toolbarItem.items\n : []\n ));\n const icons = options.icons ?? {};\n /*\n * tooltip 只属于 PC 精细指针体验。H5 上即使没有原生 title,部分浏览器也会把 hover/mouseover\n * 模拟成首触摸状态,导致第一次点像是只唤醒提示;所以触屏端不写 tooltip 数据也不挂监听。\n */\n const enableTooltip = canUseHoverTooltip();\n const tooltipElement = document.createElement('div');\n const groupMenuElement = document.createElement('div');\n const overlayHost = container.closest('.bridgerte') ?? container;\n let destroyed = false;\n let latestCommandStates = options.editor.getCommandStates();\n let groupMenuState: ToolbarGroupMenuState | null = null;\n let groupMenuFloatingLayer: RichTextFloatingLayer | null = null;\n const clearToolbarPressedState = bindTouchPressedState(container, {\n targetSelector: [\n 'button[data-bridgerte-toolbar-item-id]',\n 'button[data-bridgerte-toolbar-group-id]'\n ].join(',')\n });\n const clearGroupMenuPressedState = bindTouchPressedState(groupMenuElement, {\n targetSelector: '.bridgerte__toolbar-group-menu-item'\n });\n\n const mountToolbarOverlays = () => {\n // 独立 toolbar 可能不在 `.bridgerte` 内,渲染按钮会清空 container,需要把浮层重新挂回去。\n overlayHost.append(tooltipElement);\n overlayHost.append(groupMenuElement);\n };\n\n const closeGroupMenuFloatingLayer = () => {\n groupMenuFloatingLayer?.setOpen(false);\n groupMenuFloatingLayer?.destroy();\n groupMenuFloatingLayer = null;\n };\n\n const openGroupMenuFloatingLayer = () => {\n if (!groupMenuState) return;\n\n closeGroupMenuFloatingLayer();\n /*\n * group menu 和 hoverbar/mention/slash 一样属于轻浮层,必须走 floatingLayer。\n * 这里按 toolbar placement 给出首选方向,真正的翻转、键盘可视区和左右夹紧交给\n * createFloatingLayer 内部的 visualViewport + flip + shift + clamp 统一处理。\n */\n groupMenuFloatingLayer = createFloatingLayer(groupMenuState.button, groupMenuElement, {\n placement: placement === 'bottom' ? 'top-start' : 'bottom-start',\n offset: toolbarGroupMenuOffsetPx,\n strategy: 'fixed'\n });\n groupMenuFloatingLayer.setOpen(true);\n };\n\n const closeGroupMenu = () => {\n if (!groupMenuState && !groupMenuFloatingLayer) return;\n\n closeGroupMenuFloatingLayer();\n groupMenuState = null;\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n };\n\n const renderStates = (states: CommandState[]) => {\n if (destroyed) return;\n\n latestCommandStates = states;\n if (groupMenuState) closeGroupMenuFloatingLayer();\n renderToolbar(container, toolbarItems, states, icons, enableTooltip);\n mountToolbarOverlays();\n if (groupMenuState) {\n const nextButton = Array.from(\n container.querySelectorAll<HTMLButtonElement>(toolbarGroupButtonSelector)\n ).find((button) => button.dataset.bridgerteToolbarGroupId === groupMenuState?.groupKey);\n const nextGroupItem = findToolbarGroupMenuItem(toolbarItems, groupMenuState.groupKey);\n\n groupMenuState = nextButton && nextGroupItem\n ? {\n groupKey: groupMenuState.groupKey,\n button: nextButton,\n items: nextGroupItem.items\n }\n : null;\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n if (groupMenuState) openGroupMenuFloatingLayer();\n }\n };\n\n const update = () => {\n if (destroyed) return;\n\n renderStates(options.editor.getCommandStates());\n };\n\n const hideTooltip = () => {\n tooltipElement.dataset.visible = 'false';\n tooltipElement.textContent = '';\n };\n\n const showTooltip = (button: HTMLButtonElement) => {\n const tooltipText = button.dataset.tooltip;\n\n if (!enableTooltip || !tooltipText) return;\n\n const buttonRect = button.getBoundingClientRect();\n\n tooltipElement.textContent = tooltipText;\n tooltipElement.dataset.visible = 'true';\n tooltipElement.style.left = `${buttonRect.left + buttonRect.width / 2}px`;\n tooltipElement.style.top = `${buttonRect.top - toolbarTooltipOffsetPx}px`;\n };\n\n const handleTooltipTarget = (event: Event) => {\n const button = getToolbarButtonFromTarget(event.target);\n\n if (button) {\n showTooltip(button);\n }\n };\n\n const handleTooltipLeave = (event: MouseEvent) => {\n const relatedTarget = event.relatedTarget;\n const button = getToolbarButtonFromTarget(event.target);\n\n if (\n button\n && relatedTarget instanceof Node\n && button.contains(relatedTarget)\n ) return;\n\n hideTooltip();\n };\n\n const executeToolbarButton = (button: HTMLButtonElement) => {\n if (!(button instanceof HTMLButtonElement) || button.disabled) return;\n\n const menuItem = executableMenuItems.find((item) => (\n item.id === button.dataset.bridgerteToolbarItemId\n ));\n\n if (!menuItem) return;\n\n if (menuItem.payloadPanel) {\n const buttonRect = button.getBoundingClientRect();\n\n /*\n * 带 payloadPanel 的菜单不直接执行基础 command,而是发起参数请求。\n * DOM 内置面板和业务/RN/Flutter 自绘都走同一个 request,避免后续颜色、\n * 字体、链接等参数菜单各自发明一套协议。\n */\n options.editor.requestPayloadPanel({\n menuId: menuItem.id,\n command: menuItem.command,\n panel: menuItem.payloadPanel,\n currentValues: getPayloadPanelCurrentValues(menuItem, options.editor.getCommandStates()),\n anchorRect: {\n x: buttonRect.left,\n y: buttonRect.top,\n width: buttonRect.width,\n height: buttonRect.height\n }\n });\n return;\n }\n\n options.editor.executeCommand(menuItem.command);\n };\n\n const toggleGroupMenu = (button: HTMLButtonElement, shouldFocusMenu = false) => {\n const groupItem = findToolbarGroupMenuItem(\n toolbarItems,\n button.dataset.bridgerteToolbarGroupId\n );\n\n if (!groupItem || button.disabled) return;\n\n if (groupMenuState?.groupKey === groupItem.key) {\n if (shouldFocusMenu) {\n focusToolbarGroupMenuItem(groupMenuElement, 0);\n return;\n }\n closeGroupMenu();\n return;\n }\n\n groupMenuState = {\n groupKey: groupItem.key,\n button,\n items: groupItem.items\n };\n hideTooltip();\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n openGroupMenuFloatingLayer();\n if (shouldFocusMenu) focusToolbarGroupMenuItem(groupMenuElement, 0);\n };\n\n const handleClick = (event: MouseEvent) => {\n const groupButton = getToolbarGroupButtonFromTarget(event.target);\n if (groupButton) {\n event.preventDefault();\n event.stopPropagation();\n if (groupMenuInteraction.consumeSuppressedClick(groupButton)) return;\n\n toggleGroupMenu(groupButton);\n return;\n }\n\n const button = getToolbarButtonFromTarget(event.target);\n if (!button) return;\n\n event.preventDefault();\n event.stopPropagation();\n if (groupMenuInteraction.consumeSuppressedClick(button)) return;\n\n executeToolbarButton(button);\n closeGroupMenu();\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (groupMenuState && groupMenuElement.contains(document.activeElement)) {\n handleToolbarGroupMenuKeyDown(\n event,\n groupMenuElement,\n groupMenuState.button,\n executeToolbarButton,\n closeGroupMenu\n );\n return;\n }\n\n const groupButton = getToolbarGroupButtonFromTarget(event.target);\n if (\n groupButton\n && (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown')\n ) {\n /*\n * 指针点击收纳菜单不能抢编辑器焦点;键盘从入口按钮打开时则进入菜单项,\n * 保留 PC 可访问性和方向键 roving focus。\n */\n event.preventDefault();\n event.stopPropagation();\n toggleGroupMenu(groupButton, true);\n return;\n }\n\n if (event.key !== 'Escape') return;\n\n closeGroupMenu();\n };\n\n container.classList.add('bridgerte__toolbar');\n tooltipElement.className = 'bridgerte__toolbar-tooltip';\n tooltipElement.dataset.visible = 'false';\n groupMenuElement.className = 'bridgerte__floating-menu bridgerte__toolbar-group-menu';\n groupMenuElement.dataset.visible = 'false';\n groupMenuElement.setAttribute('role', 'menu');\n container.dataset.placement = placement;\n container.setAttribute('role', 'toolbar');\n container.setAttribute(\n 'aria-label',\n placement === 'bottom' ? 'BridgeRTE tabbar' : 'BridgeRTE toolbar'\n );\n container.addEventListener('click', handleClick);\n groupMenuElement.addEventListener('click', handleClick);\n document.addEventListener('keydown', handleKeyDown);\n if (enableTooltip) {\n container.addEventListener('mouseover', handleTooltipTarget);\n container.addEventListener('mouseout', handleTooltipLeave);\n }\n container.addEventListener('focusout', hideTooltip);\n // 浮层挂在最近的编辑器根容器下,既能继承变量,也不会操作编辑内容 DOM。\n mountToolbarOverlays();\n const groupMenuInteraction = createToolbarGroupMenuInteraction(\n container,\n groupMenuElement,\n toggleGroupMenu,\n executeToolbarButton,\n closeGroupMenu\n );\n\n // 独立 toolbar 只订阅 public API 状态,不依赖 DOM 编辑器内部实现。\n const unsubscribe = options.editor.subscribeCommandStateChange(renderStates);\n\n return {\n update,\n destroy() {\n if (destroyed) return;\n\n destroyed = true;\n unsubscribe();\n closeGroupMenu();\n container.removeEventListener('click', handleClick);\n groupMenuElement.removeEventListener('click', handleClick);\n document.removeEventListener('keydown', handleKeyDown);\n groupMenuInteraction.destroy();\n if (enableTooltip) {\n container.removeEventListener('mouseover', handleTooltipTarget);\n container.removeEventListener('mouseout', handleTooltipLeave);\n }\n clearToolbarPressedState();\n clearGroupMenuPressedState();\n container.removeEventListener('focusout', hideTooltip);\n tooltipElement.remove();\n groupMenuElement.remove();\n container.classList.remove('bridgerte__toolbar');\n delete container.dataset.placement;\n container.textContent = '';\n container.removeAttribute('role');\n container.removeAttribute('aria-label');\n }\n };\n}\n","const invisibleTextPattern = /[\\u200B-\\u200D\\uFEFF]/g;\n\n/*\n * HTML 片段里这些元素没有 textContent 也应算有效内容。\n * 纯排版容器不放进来,避免 `<p><br></p>`、空列表项这类编辑器占位被误判为非空。\n */\nconst meaningfulHtmlContentSelector = [\n 'img',\n 'video',\n 'audio',\n 'iframe',\n 'table',\n 'pre',\n 'code',\n 'hr',\n 'figure',\n 'canvas',\n 'svg',\n 'math',\n '[data-type=\"mention\"]'\n].join(',');\n\nconst normalizeHtmlText = (text: string | null | undefined): string => (\n text?.replace(invisibleTextPattern, '').trim() ?? ''\n);\n\n/**\n * 判断一段 HTML 片段是否包含可保存的富文本内容。\n *\n * 这个工具会使用浏览器 template 解析 HTML,适合只拿到 HTML 字符串的业务表单;如果已经持有\n * `EditorContent`,优先使用 core 的 `isEditorContentEmpty()`,避免额外 DOM parse。\n */\nexport const hasMeaningfulHtmlContent = (html: string): boolean => {\n if (!normalizeHtmlText(html)) return false;\n\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n return Boolean(\n normalizeHtmlText(template.content.textContent)\n || template.content.querySelector(meaningfulHtmlContentSelector)\n );\n};\n"],"names":["defaultMenuUiIcons","getEnabledGroupMenuButtons","menuElement","button","focusToolbarGroupMenuItem","index","nextButton","handleToolbarGroupMenuKeyDown","event","returnButton","executeToolbarButton","closeGroupMenu","buttons","activeIndex","focusByOffset","offset","nextIndex","_a","_b","toolbarGroupButtonSelector","toolbarButtonSelector","toolbarExecutableButtonSelector","getGroupMenuState","items","commandStates","itemStates","item","getMenuStateForItem","state","renderToolbarButton","groupElement","icons","enableTooltip","iconSvg","defaultMenuIcons","appendMenuIcon","renderToolbarGroupButton","toolbarItem","groupState","indicator","renderToolbar","toolbarElement","toolbarItems","separatorElement","renderToolbarGroupMenu","groupMenuState","labelElement","syncToolbarGroupButtonState","container","open","findToolbarGroupMenuItem","groupKey","toolbarGroupTouchMoveTolerancePx","isInsideNode","target","getClosestButton","selector","createToolbarGroupMenuInteraction","groupMenuElement","toggleGroupMenu","pendingTouch","suppressNextClickButton","getInteractiveButtonFromTarget","handlePressStart","handleTouchStart","touch","groupButton","menuItemButton","clearPendingTouch","handleTouchEnd","touchState","endButton","deltaX","deltaY","handleDocumentPointerDown","toolbarTooltipOffsetPx","toolbarGroupMenuOffsetPx","canUseHoverTooltip","getToolbarButtonFromTarget","getToolbarGroupButtonFromTarget","createRichTextToolbar","options","placement","menuSchema","resolveMenuSchemaForDom","defaultMenuSchema","resolveToolbarMenu","executableMenuItems","tooltipElement","overlayHost","destroyed","latestCommandStates","groupMenuFloatingLayer","clearToolbarPressedState","bindTouchPressedState","clearGroupMenuPressedState","mountToolbarOverlays","closeGroupMenuFloatingLayer","openGroupMenuFloatingLayer","createFloatingLayer","renderStates","states","nextGroupItem","update","hideTooltip","showTooltip","tooltipText","buttonRect","handleTooltipTarget","handleTooltipLeave","relatedTarget","menuItem","getPayloadPanelCurrentValues","shouldFocusMenu","groupItem","handleClick","groupMenuInteraction","handleKeyDown","unsubscribe","invisibleTextPattern","meaningfulHtmlContentSelector","normalizeHtmlText","text","hasMeaningfulHtmlContent","html","template"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { defaultMenuSchema as et, resolveToolbarMenu as ot } from "./native-spec.js";
2
- import { g as H, d as N, e as K, r as nt, f as q, h as rt, c as at } from "./index-BiehJaHJ.js";
2
+ import { g as H, d as N, e as K, r as nt, f as q, h as rt, c as at } from "./index-CCAOnvex.js";
3
3
  const X = {
4
4
  toolbarGroup: `
5
5
  <svg
@@ -334,4 +334,4 @@ export {
334
334
  Et as c,
335
335
  Tt as h
336
336
  };
337
- //# sourceMappingURL=index-DARGQA9p.js.map
337
+ //# sourceMappingURL=index-BHrFfZ7O.js.map