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.
- package/README.md +55 -9
- package/dist/assets/abap-5JJ_uXwM.js +8 -0
- package/dist/assets/abap-5JJ_uXwM.js.map +1 -0
- package/dist/assets/actionscript-3-DE1C41bY.js +8 -0
- package/dist/assets/actionscript-3-DE1C41bY.js.map +1 -0
- package/dist/assets/ada-BG05PpOB.js +8 -0
- package/dist/assets/ada-BG05PpOB.js.map +1 -0
- package/dist/assets/andromeeda-BY_rNuBQ.js +5 -0
- package/dist/assets/andromeeda-BY_rNuBQ.js.map +1 -0
- package/dist/assets/angular-html-aal4wZP4.js +42 -0
- package/dist/assets/angular-html-aal4wZP4.js.map +1 -0
- package/dist/assets/angular-ts-DAE48Xv3.js +30 -0
- package/dist/assets/angular-ts-DAE48Xv3.js.map +1 -0
- package/dist/assets/apache-D7jlTOw0.js +8 -0
- package/dist/assets/apache-D7jlTOw0.js.map +1 -0
- package/dist/assets/apex-B5cHO7Zb.js +8 -0
- package/dist/assets/apex-B5cHO7Zb.js.map +1 -0
- package/dist/assets/apl-KqhKRlqN.js +19 -0
- package/dist/assets/apl-KqhKRlqN.js.map +1 -0
- package/dist/assets/applescript-guFn5j4s.js +8 -0
- package/dist/assets/applescript-guFn5j4s.js.map +1 -0
- package/dist/assets/ara-D87wAYhe.js +8 -0
- package/dist/assets/ara-D87wAYhe.js.map +1 -0
- package/dist/assets/asciidoc-DHU272__.js +8 -0
- package/dist/assets/asciidoc-DHU272__.js.map +1 -0
- package/dist/assets/asm-BIl1E4lX.js +8 -0
- package/dist/assets/asm-BIl1E4lX.js.map +1 -0
- package/dist/assets/astro-CoyRAbIC.js +20 -0
- package/dist/assets/astro-CoyRAbIC.js.map +1 -0
- package/dist/assets/aurora-x-C6DmnWDt.js +5 -0
- package/dist/assets/aurora-x-C6DmnWDt.js.map +1 -0
- package/dist/assets/awk-x1P7Yy6J.js +8 -0
- package/dist/assets/awk-x1P7Yy6J.js.map +1 -0
- package/dist/assets/ayu-dark-DwU3UN-n.js +5 -0
- package/dist/assets/ayu-dark-DwU3UN-n.js.map +1 -0
- package/dist/assets/ayu-light-BeSY2ZJx.js +5 -0
- package/dist/assets/ayu-light-BeSY2ZJx.js.map +1 -0
- package/dist/assets/ayu-mirage-EiPwM0mG.js +5 -0
- package/dist/assets/ayu-mirage-EiPwM0mG.js.map +1 -0
- package/dist/assets/ballerina-D1k6pTDA.js +8 -0
- package/dist/assets/ballerina-D1k6pTDA.js.map +1 -0
- package/dist/assets/bat-CKn1WSW3.js +8 -0
- package/dist/assets/bat-CKn1WSW3.js.map +1 -0
- package/dist/assets/beancount-1v_PY4BB.js +8 -0
- package/dist/assets/beancount-1v_PY4BB.js.map +1 -0
- package/dist/assets/berry-ChXc1sMd.js +8 -0
- package/dist/assets/berry-ChXc1sMd.js.map +1 -0
- package/dist/assets/bibtex-YjwILF7F.js +8 -0
- package/dist/assets/bibtex-YjwILF7F.js.map +1 -0
- package/dist/assets/bicep-C0D_R8_K.js +8 -0
- package/dist/assets/bicep-C0D_R8_K.js.map +1 -0
- package/dist/assets/bird2-DDRneDX_.js +8 -0
- package/dist/assets/bird2-DDRneDX_.js.map +1 -0
- package/dist/assets/blade-FnIjT1E3.js +23 -0
- package/dist/assets/blade-FnIjT1E3.js.map +1 -0
- package/dist/assets/bsl-DJzmyrer.js +10 -0
- package/dist/assets/bsl-DJzmyrer.js.map +1 -0
- package/dist/assets/c-xjDmHeY4.js +8 -0
- package/dist/assets/c-xjDmHeY4.js.map +1 -0
- package/dist/assets/c3-ifVI-lyl.js +8 -0
- package/dist/assets/c3-ifVI-lyl.js.map +1 -0
- package/dist/assets/cadence-4_3YDhNk.js +8 -0
- package/dist/assets/cadence-4_3YDhNk.js.map +1 -0
- package/dist/assets/cairo-CckC4pbv.js +10 -0
- package/dist/assets/cairo-CckC4pbv.js.map +1 -0
- package/dist/assets/catppuccin-frappe-B5VVdV_e.js +5 -0
- package/dist/assets/catppuccin-frappe-B5VVdV_e.js.map +1 -0
- package/dist/assets/catppuccin-latte-D8pvGdu1.js +5 -0
- package/dist/assets/catppuccin-latte-D8pvGdu1.js.map +1 -0
- package/dist/assets/catppuccin-macchiato-HRcjrIrY.js +5 -0
- package/dist/assets/catppuccin-macchiato-HRcjrIrY.js.map +1 -0
- package/dist/assets/catppuccin-mocha-CIwIEnSB.js +5 -0
- package/dist/assets/catppuccin-mocha-CIwIEnSB.js.map +1 -0
- package/dist/assets/clarity-LYkNoMZG.js +8 -0
- package/dist/assets/clarity-LYkNoMZG.js.map +1 -0
- package/dist/assets/clojure-BKPgNuET.js +8 -0
- package/dist/assets/clojure-BKPgNuET.js.map +1 -0
- package/dist/assets/cmake-DKfc4EHO.js +8 -0
- package/dist/assets/cmake-DKfc4EHO.js.map +1 -0
- package/dist/assets/cobol-BitaBRgT.js +14 -0
- package/dist/assets/cobol-BitaBRgT.js.map +1 -0
- package/dist/assets/codeowners-CGzOUqRt.js +8 -0
- package/dist/assets/codeowners-CGzOUqRt.js.map +1 -0
- package/dist/assets/codeql-CB2tU2yr.js +8 -0
- package/dist/assets/codeql-CB2tU2yr.js.map +1 -0
- package/dist/assets/coffee-CZwg37T3.js +10 -0
- package/dist/assets/coffee-CZwg37T3.js.map +1 -0
- package/dist/assets/common-lisp-Dpa6SDDF.js +8 -0
- package/dist/assets/common-lisp-Dpa6SDDF.js.map +1 -0
- package/dist/assets/coq-BcttDLdJ.js +8 -0
- package/dist/assets/coq-BcttDLdJ.js.map +1 -0
- package/dist/assets/cpp-BlAh3S4C.js +23 -0
- package/dist/assets/cpp-BlAh3S4C.js.map +1 -0
- package/dist/assets/crystal-Bs9TFo_P.js +20 -0
- package/dist/assets/crystal-Bs9TFo_P.js.map +1 -0
- package/dist/assets/csharp-DSxyDUiT.js +8 -0
- package/dist/assets/csharp-DSxyDUiT.js.map +1 -0
- package/dist/assets/css-C_jsWB7w.js +8 -0
- package/dist/assets/css-C_jsWB7w.js.map +1 -0
- package/dist/assets/csv-DH-1IWvI.js +8 -0
- package/dist/assets/csv-DH-1IWvI.js.map +1 -0
- package/dist/assets/cue-HSbRnhKw.js +8 -0
- package/dist/assets/cue-HSbRnhKw.js.map +1 -0
- package/dist/assets/cypher-DoZ7GUDp.js +8 -0
- package/dist/assets/cypher-DoZ7GUDp.js.map +1 -0
- package/dist/assets/d-CeeVpqRv.js +8 -0
- package/dist/assets/d-CeeVpqRv.js.map +1 -0
- package/dist/assets/dark-plus-BZtx1JS2.js +5 -0
- package/dist/assets/dark-plus-BZtx1JS2.js.map +1 -0
- package/dist/assets/dart-CfpH2ytW.js +8 -0
- package/dist/assets/dart-CfpH2ytW.js.map +1 -0
- package/dist/assets/dax-B2DK8VnI.js +8 -0
- package/dist/assets/dax-B2DK8VnI.js.map +1 -0
- package/dist/assets/desktop-C_92N0gp.js +8 -0
- package/dist/assets/desktop-C_92N0gp.js.map +1 -0
- package/dist/assets/diff-CIoVq7iw.js +8 -0
- package/dist/assets/diff-CIoVq7iw.js.map +1 -0
- package/dist/assets/docker-C_b4d5MG.js +8 -0
- package/dist/assets/docker-C_b4d5MG.js.map +1 -0
- package/dist/assets/dotenv-CTk-83yR.js +8 -0
- package/dist/assets/dotenv-CTk-83yR.js.map +1 -0
- package/dist/assets/dracula-C90mcX-J.js +5 -0
- package/dist/assets/dracula-C90mcX-J.js.map +1 -0
- package/dist/assets/dracula-soft-CfxSDbho.js +5 -0
- package/dist/assets/dracula-soft-CfxSDbho.js.map +1 -0
- package/dist/assets/dream-maker-BRhjIgJd.js +8 -0
- package/dist/assets/dream-maker-BRhjIgJd.js.map +1 -0
- package/dist/assets/edge-ChLL70qB.js +16 -0
- package/dist/assets/edge-ChLL70qB.js.map +1 -0
- package/dist/assets/elixir-Cn03DtOX.js +12 -0
- package/dist/assets/elixir-Cn03DtOX.js.map +1 -0
- package/dist/assets/elm-BIz5FEly.js +11 -0
- package/dist/assets/elm-BIz5FEly.js.map +1 -0
- package/dist/assets/emacs-lisp-BPa43G0X.js +8 -0
- package/dist/assets/emacs-lisp-BPa43G0X.js.map +1 -0
- package/dist/assets/erb-DnDXmOFA.js +29 -0
- package/dist/assets/erb-DnDXmOFA.js.map +1 -0
- package/dist/assets/erlang-Bs5tgDCH.js +10 -0
- package/dist/assets/erlang-Bs5tgDCH.js.map +1 -0
- package/dist/assets/everforest-dark-WkkMlVdr.js +5 -0
- package/dist/assets/everforest-dark-WkkMlVdr.js.map +1 -0
- package/dist/assets/everforest-light-BnEIoJmx.js +5 -0
- package/dist/assets/everforest-light-BnEIoJmx.js.map +1 -0
- package/dist/assets/fennel-Bcsiz5ip.js +8 -0
- package/dist/assets/fennel-Bcsiz5ip.js.map +1 -0
- package/dist/assets/fish-DHyTDlfQ.js +8 -0
- package/dist/assets/fish-DHyTDlfQ.js.map +1 -0
- package/dist/assets/fluent-4neBKDDj.js +8 -0
- package/dist/assets/fluent-4neBKDDj.js.map +1 -0
- package/dist/assets/fortran-fixed-form-CzBifAhA.js +10 -0
- package/dist/assets/fortran-fixed-form-CzBifAhA.js.map +1 -0
- package/dist/assets/fortran-free-form-CgyZ4k0y.js +8 -0
- package/dist/assets/fortran-free-form-CgyZ4k0y.js.map +1 -0
- package/dist/assets/fsharp-9GbbySMJ.js +10 -0
- package/dist/assets/fsharp-9GbbySMJ.js.map +1 -0
- package/dist/assets/gdresource-DNKHowPg.js +12 -0
- package/dist/assets/gdresource-DNKHowPg.js.map +1 -0
- package/dist/assets/gdscript-BsvbToqr.js +8 -0
- package/dist/assets/gdscript-BsvbToqr.js.map +1 -0
- package/dist/assets/gdshader-OUoLz6Pt.js +8 -0
- package/dist/assets/gdshader-OUoLz6Pt.js.map +1 -0
- package/dist/assets/genie-CCD_4Lwj.js +8 -0
- package/dist/assets/genie-CCD_4Lwj.js.map +1 -0
- package/dist/assets/gherkin-DtBWBYmY.js +8 -0
- package/dist/assets/gherkin-DtBWBYmY.js.map +1 -0
- package/dist/assets/git-commit-CIBsd3Oe.js +10 -0
- package/dist/assets/git-commit-CIBsd3Oe.js.map +1 -0
- package/dist/assets/git-rebase-Bsia5skB.js +10 -0
- package/dist/assets/git-rebase-Bsia5skB.js.map +1 -0
- package/dist/assets/github-dark-Crb_T9c1.js +5 -0
- package/dist/assets/github-dark-Crb_T9c1.js.map +1 -0
- package/dist/assets/github-dark-default-CrymNA3e.js +5 -0
- package/dist/assets/github-dark-default-CrymNA3e.js.map +1 -0
- package/dist/assets/github-dark-dimmed-DVypsQQ6.js +5 -0
- package/dist/assets/github-dark-dimmed-DVypsQQ6.js.map +1 -0
- package/dist/assets/github-dark-high-contrast-oosJriQF.js +5 -0
- package/dist/assets/github-dark-high-contrast-oosJriQF.js.map +1 -0
- package/dist/assets/github-light-DzgloXIJ.js +5 -0
- package/dist/assets/github-light-DzgloXIJ.js.map +1 -0
- package/dist/assets/github-light-default-BUaqj3Kk.js +5 -0
- package/dist/assets/github-light-default-BUaqj3Kk.js.map +1 -0
- package/dist/assets/github-light-high-contrast-Be7TuOaG.js +5 -0
- package/dist/assets/github-light-high-contrast-Be7TuOaG.js.map +1 -0
- package/dist/assets/gleam-Bby7sLtj.js +8 -0
- package/dist/assets/gleam-Bby7sLtj.js.map +1 -0
- package/dist/assets/glimmer-js-K1ky8h51.js +16 -0
- package/dist/assets/glimmer-js-K1ky8h51.js.map +1 -0
- package/dist/assets/glimmer-ts-Glf2iriO.js +16 -0
- package/dist/assets/glimmer-ts-Glf2iriO.js.map +1 -0
- package/dist/assets/glsl-B7qnt91l.js +10 -0
- package/dist/assets/glsl-B7qnt91l.js.map +1 -0
- package/dist/assets/gn-BZhHIoL6.js +8 -0
- package/dist/assets/gn-BZhHIoL6.js.map +1 -0
- package/dist/assets/gnuplot-ko8wwdty.js +8 -0
- package/dist/assets/gnuplot-ko8wwdty.js.map +1 -0
- package/dist/assets/go-bOxRwq8F.js +8 -0
- package/dist/assets/go-bOxRwq8F.js.map +1 -0
- package/dist/assets/graphql-DkLU_y6F.js +16 -0
- package/dist/assets/graphql-DkLU_y6F.js.map +1 -0
- package/dist/assets/groovy-CnONGBTg.js +8 -0
- package/dist/assets/groovy-CnONGBTg.js.map +1 -0
- package/dist/assets/gruvbox-dark-hard-w2v6PtUq.js +5 -0
- package/dist/assets/gruvbox-dark-hard-w2v6PtUq.js.map +1 -0
- package/dist/assets/gruvbox-dark-medium-BkadlV_U.js +5 -0
- package/dist/assets/gruvbox-dark-medium-BkadlV_U.js.map +1 -0
- package/dist/assets/gruvbox-dark-soft-BHFO6CEk.js +5 -0
- package/dist/assets/gruvbox-dark-soft-BHFO6CEk.js.map +1 -0
- package/dist/assets/gruvbox-light-hard-9A_pD-e-.js +5 -0
- package/dist/assets/gruvbox-light-hard-9A_pD-e-.js.map +1 -0
- package/dist/assets/gruvbox-light-medium-DS4uqfa1.js +5 -0
- package/dist/assets/gruvbox-light-medium-DS4uqfa1.js.map +1 -0
- package/dist/assets/gruvbox-light-soft-qMWiTKK4.js +5 -0
- package/dist/assets/gruvbox-light-soft-qMWiTKK4.js.map +1 -0
- package/dist/assets/hack-gfrPUlig.js +14 -0
- package/dist/assets/hack-gfrPUlig.js.map +1 -0
- package/dist/assets/haml-B4EqXRg_.js +12 -0
- package/dist/assets/haml-B4EqXRg_.js.map +1 -0
- package/dist/assets/handlebars-YxgQMD1d.js +16 -0
- package/dist/assets/handlebars-YxgQMD1d.js.map +1 -0
- package/dist/assets/haskell-2dsAc57b.js +8 -0
- package/dist/assets/haskell-2dsAc57b.js.map +1 -0
- package/dist/assets/haxe-OKRacM9E.js +8 -0
- package/dist/assets/haxe-OKRacM9E.js.map +1 -0
- package/dist/assets/hcl-DWQu2dqK.js +8 -0
- package/dist/assets/hcl-DWQu2dqK.js.map +1 -0
- package/dist/assets/hjson-By_UsfXI.js +8 -0
- package/dist/assets/hjson-By_UsfXI.js.map +1 -0
- package/dist/assets/hlsl-DA61eaD3.js +8 -0
- package/dist/assets/hlsl-DA61eaD3.js.map +1 -0
- package/dist/assets/horizon-BAcSmUQx.js +5 -0
- package/dist/assets/horizon-BAcSmUQx.js.map +1 -0
- package/dist/assets/horizon-bright-BIr1qV5K.js +5 -0
- package/dist/assets/horizon-bright-BIr1qV5K.js.map +1 -0
- package/dist/assets/houston-CK0N9cPp.js +5 -0
- package/dist/assets/houston-CK0N9cPp.js.map +1 -0
- package/dist/assets/html-derivative-DNVkVN8y.js +12 -0
- package/dist/assets/html-derivative-DNVkVN8y.js.map +1 -0
- package/dist/assets/html-hx4Wfyw6.js +12 -0
- package/dist/assets/html-hx4Wfyw6.js.map +1 -0
- package/dist/assets/http-CVXrBmpc.js +21 -0
- package/dist/assets/http-CVXrBmpc.js.map +1 -0
- package/dist/assets/hurl-B08iSRaK.js +19 -0
- package/dist/assets/hurl-B08iSRaK.js.map +1 -0
- package/dist/assets/hxml-CwhzGRqU.js +10 -0
- package/dist/assets/hxml-CwhzGRqU.js.map +1 -0
- package/dist/assets/hy-B23VqsRP.js +8 -0
- package/dist/assets/hy-B23VqsRP.js.map +1 -0
- package/dist/assets/imba-C1GSCVFf.js +8 -0
- package/dist/assets/imba-C1GSCVFf.js.map +1 -0
- package/dist/assets/ini-r1O4-awP.js +8 -0
- package/dist/assets/ini-r1O4-awP.js.map +1 -0
- package/dist/assets/java-Bl-5EZmB.js +8 -0
- package/dist/assets/java-Bl-5EZmB.js.map +1 -0
- package/dist/assets/javascript-Cq55jE6w.js +8 -0
- package/dist/assets/javascript-Cq55jE6w.js.map +1 -0
- package/dist/assets/jinja-hp_3bha4.js +17 -0
- package/dist/assets/jinja-hp_3bha4.js.map +1 -0
- package/dist/assets/jison-9WPWo0xg.js +10 -0
- package/dist/assets/jison-9WPWo0xg.js.map +1 -0
- package/dist/assets/json-CndaR9w5.js +8 -0
- package/dist/assets/json-CndaR9w5.js.map +1 -0
- package/dist/assets/json5-C8Jm9K5X.js +8 -0
- package/dist/assets/json5-C8Jm9K5X.js.map +1 -0
- package/dist/assets/jsonc-mlgADggJ.js +8 -0
- package/dist/assets/jsonc-mlgADggJ.js.map +1 -0
- package/dist/assets/jsonl-CBj3pbR_.js +8 -0
- package/dist/assets/jsonl-CBj3pbR_.js.map +1 -0
- package/dist/assets/jsonnet-B_sZ3RZB.js +8 -0
- package/dist/assets/jsonnet-B_sZ3RZB.js.map +1 -0
- package/dist/assets/jssm-CvtepJVU.js +8 -0
- package/dist/assets/jssm-CvtepJVU.js.map +1 -0
- package/dist/assets/jsx-BfjkQ0v5.js +8 -0
- package/dist/assets/jsx-BfjkQ0v5.js.map +1 -0
- package/dist/assets/julia-Dnhsueg9.js +21 -0
- package/dist/assets/julia-Dnhsueg9.js.map +1 -0
- package/dist/assets/just-6vIP7wP9.js +35 -0
- package/dist/assets/just-6vIP7wP9.js.map +1 -0
- package/dist/assets/kanagawa-dragon-Dgsvhj-I.js +5 -0
- package/dist/assets/kanagawa-dragon-Dgsvhj-I.js.map +1 -0
- package/dist/assets/kanagawa-lotus-bk4_W8LM.js +5 -0
- package/dist/assets/kanagawa-lotus-bk4_W8LM.js.map +1 -0
- package/dist/assets/kanagawa-wave-CVNUZ7bU.js +5 -0
- package/dist/assets/kanagawa-wave-CVNUZ7bU.js.map +1 -0
- package/dist/assets/kdl-CwdrBlJU.js +8 -0
- package/dist/assets/kdl-CwdrBlJU.js.map +1 -0
- package/dist/assets/kotlin-K4QQzEsQ.js +8 -0
- package/dist/assets/kotlin-K4QQzEsQ.js.map +1 -0
- package/dist/assets/kusto-CgER6Sxt.js +8 -0
- package/dist/assets/kusto-CgER6Sxt.js.map +1 -0
- package/dist/assets/laserwave-BU7zaG-q.js +5 -0
- package/dist/assets/laserwave-BU7zaG-q.js.map +1 -0
- package/dist/assets/latex-vw5kx6SC.js +11 -0
- package/dist/assets/latex-vw5kx6SC.js.map +1 -0
- package/dist/assets/lean-Cp_iMYZj.js +8 -0
- package/dist/assets/lean-Cp_iMYZj.js.map +1 -0
- package/dist/assets/less-CFxJbkOX.js +8 -0
- package/dist/assets/less-CFxJbkOX.js.map +1 -0
- package/dist/assets/light-plus-CCnaaxEe.js +5 -0
- package/dist/assets/light-plus-CCnaaxEe.js.map +1 -0
- package/dist/assets/liquid-ME1IH2EZ.js +16 -0
- package/dist/assets/liquid-ME1IH2EZ.js.map +1 -0
- package/dist/assets/llvm-DXF2zqxJ.js +8 -0
- package/dist/assets/llvm-DXF2zqxJ.js.map +1 -0
- package/dist/assets/log-BhdudKf6.js +8 -0
- package/dist/assets/log-BhdudKf6.js.map +1 -0
- package/dist/assets/logo-DdZuFRsA.js +8 -0
- package/dist/assets/logo-DdZuFRsA.js.map +1 -0
- package/dist/assets/lua-CNzUJNrS.js +10 -0
- package/dist/assets/lua-CNzUJNrS.js.map +1 -0
- package/dist/assets/luau-BbRxrK_-.js +8 -0
- package/dist/assets/luau-BbRxrK_-.js.map +1 -0
- package/dist/assets/make-CzMpGB61.js +8 -0
- package/dist/assets/make-CzMpGB61.js.map +1 -0
- package/dist/assets/markdown-BIyFz8QW.js +8 -0
- package/dist/assets/markdown-BIyFz8QW.js.map +1 -0
- package/dist/assets/marko-CDeO252B.js +16 -0
- package/dist/assets/marko-CDeO252B.js.map +1 -0
- package/dist/assets/material-theme-B-3T0qQC.js +5 -0
- package/dist/assets/material-theme-B-3T0qQC.js.map +1 -0
- package/dist/assets/material-theme-darker-DMHCIvq5.js +5 -0
- package/dist/assets/material-theme-darker-DMHCIvq5.js.map +1 -0
- package/dist/assets/material-theme-lighter-CnKSyNS5.js +5 -0
- package/dist/assets/material-theme-lighter-CnKSyNS5.js.map +1 -0
- package/dist/assets/material-theme-ocean-BKq6ZsFv.js +5 -0
- package/dist/assets/material-theme-ocean-BKq6ZsFv.js.map +1 -0
- package/dist/assets/material-theme-palenight-BaYUoLXq.js +5 -0
- package/dist/assets/material-theme-palenight-BaYUoLXq.js.map +1 -0
- package/dist/assets/matlab-CJkuh4eh.js +8 -0
- package/dist/assets/matlab-CJkuh4eh.js.map +1 -0
- package/dist/assets/mdc-DmwRfDxK.js +17 -0
- package/dist/assets/mdc-DmwRfDxK.js.map +1 -0
- package/dist/assets/mdx-DBtujtWe.js +8 -0
- package/dist/assets/mdx-DBtujtWe.js.map +1 -0
- package/dist/assets/mermaid-HX_erI9P.js +8 -0
- package/dist/assets/mermaid-HX_erI9P.js.map +1 -0
- package/dist/assets/min-dark-YawBJZLm.js +5 -0
- package/dist/assets/min-dark-YawBJZLm.js.map +1 -0
- package/dist/assets/min-light-CqsTzpMg.js +5 -0
- package/dist/assets/min-light-CqsTzpMg.js.map +1 -0
- package/dist/assets/mipsasm-CCIl-TEQ.js +8 -0
- package/dist/assets/mipsasm-CCIl-TEQ.js.map +1 -0
- package/dist/assets/mojo-0bwzCFgd.js +8 -0
- package/dist/assets/mojo-0bwzCFgd.js.map +1 -0
- package/dist/assets/monokai-DaNL4wHF.js +5 -0
- package/dist/assets/monokai-DaNL4wHF.js.map +1 -0
- package/dist/assets/moonbit-h33aWjYl.js +8 -0
- package/dist/assets/moonbit-h33aWjYl.js.map +1 -0
- package/dist/assets/move-B0UfBCDq.js +8 -0
- package/dist/assets/move-B0UfBCDq.js.map +1 -0
- package/dist/assets/narrat-yNVO4v0G.js +8 -0
- package/dist/assets/narrat-yNVO4v0G.js.map +1 -0
- package/dist/assets/nextflow-1-7NB-ni.js +10 -0
- package/dist/assets/nextflow-1-7NB-ni.js.map +1 -0
- package/dist/assets/nextflow-groovy-TPtoW2P_.js +8 -0
- package/dist/assets/nextflow-groovy-TPtoW2P_.js.map +1 -0
- package/dist/assets/nginx-C98jlNwk.js +11 -0
- package/dist/assets/nginx-C98jlNwk.js.map +1 -0
- package/dist/assets/night-owl-DEYddbGH.js +5 -0
- package/dist/assets/night-owl-DEYddbGH.js.map +1 -0
- package/dist/assets/night-owl-light-CgPgLhZe.js +5 -0
- package/dist/assets/night-owl-light-CgPgLhZe.js.map +1 -0
- package/dist/assets/nim-C-XJ5M42.js +23 -0
- package/dist/assets/nim-C-XJ5M42.js.map +1 -0
- package/dist/assets/nix-DPigNF-w.js +13 -0
- package/dist/assets/nix-DPigNF-w.js.map +1 -0
- package/dist/assets/nord-CUKU048J.js +5 -0
- package/dist/assets/nord-CUKU048J.js.map +1 -0
- package/dist/assets/nushell-TxwY6Pb5.js +8 -0
- package/dist/assets/nushell-TxwY6Pb5.js.map +1 -0
- package/dist/assets/objective-c-CGXCwEak.js +8 -0
- package/dist/assets/objective-c-CGXCwEak.js.map +1 -0
- package/dist/assets/objective-cpp-C6Ou-DLk.js +8 -0
- package/dist/assets/objective-cpp-C6Ou-DLk.js.map +1 -0
- package/dist/assets/ocaml-B8c2W4N8.js +8 -0
- package/dist/assets/ocaml-B8c2W4N8.js.map +1 -0
- package/dist/assets/odin-CZ4skJts.js +8 -0
- package/dist/assets/odin-CZ4skJts.js.map +1 -0
- package/dist/assets/one-dark-pro-XdKxImzj.js +5 -0
- package/dist/assets/one-dark-pro-XdKxImzj.js.map +1 -0
- package/dist/assets/one-light-BgKiLWqC.js +5 -0
- package/dist/assets/one-light-BgKiLWqC.js.map +1 -0
- package/dist/assets/openscad-jtaZZ0ry.js +8 -0
- package/dist/assets/openscad-jtaZZ0ry.js.map +1 -0
- package/dist/assets/pascal-Dyzoiklv.js +8 -0
- package/dist/assets/pascal-Dyzoiklv.js.map +1 -0
- package/dist/assets/perl-DZBQ1fP7.js +19 -0
- package/dist/assets/perl-DZBQ1fP7.js.map +1 -0
- package/dist/assets/php-B6rqs9dC.js +21 -0
- package/dist/assets/php-B6rqs9dC.js.map +1 -0
- package/dist/assets/pkl-B7NRYePu.js +8 -0
- package/dist/assets/pkl-B7NRYePu.js.map +1 -0
- package/dist/assets/plastic-lmGvlDWy.js +5 -0
- package/dist/assets/plastic-lmGvlDWy.js.map +1 -0
- package/dist/assets/plsql-ZYRyC0wP.js +8 -0
- package/dist/assets/plsql-ZYRyC0wP.js.map +1 -0
- package/dist/assets/po-CHOVNvtJ.js +8 -0
- package/dist/assets/po-CHOVNvtJ.js.map +1 -0
- package/dist/assets/poimandres-C_MUMTwG.js +5 -0
- package/dist/assets/poimandres-C_MUMTwG.js.map +1 -0
- package/dist/assets/polar-CElS9PCS.js +8 -0
- package/dist/assets/polar-CElS9PCS.js.map +1 -0
- package/dist/assets/postcss-DgldbzUq.js +8 -0
- package/dist/assets/postcss-DgldbzUq.js.map +1 -0
- package/dist/assets/powerquery-B6VmGZs1.js +8 -0
- package/dist/assets/powerquery-B6VmGZs1.js.map +1 -0
- package/dist/assets/powershell-Dp4oaXtH.js +8 -0
- package/dist/assets/powershell-Dp4oaXtH.js.map +1 -0
- package/dist/assets/prisma-CPG4K8GD.js +8 -0
- package/dist/assets/prisma-CPG4K8GD.js.map +1 -0
- package/dist/assets/prolog-BfH16pdb.js +8 -0
- package/dist/assets/prolog-BfH16pdb.js.map +1 -0
- package/dist/assets/proto-DRhBl2v_.js +8 -0
- package/dist/assets/proto-DRhBl2v_.js.map +1 -0
- package/dist/assets/pug-B5ZJTPhc.js +14 -0
- package/dist/assets/pug-B5ZJTPhc.js.map +1 -0
- package/dist/assets/puppet-D93mTCzv.js +8 -0
- package/dist/assets/puppet-D93mTCzv.js.map +1 -0
- package/dist/assets/purescript-BwFPZeJE.js +8 -0
- package/dist/assets/purescript-BwFPZeJE.js.map +1 -0
- package/dist/assets/python-hNCB2wYL.js +8 -0
- package/dist/assets/python-hNCB2wYL.js.map +1 -0
- package/dist/assets/qml-B7tPv6LL.js +10 -0
- package/dist/assets/qml-B7tPv6LL.js.map +1 -0
- package/dist/assets/qmldir-C_cCg2m9.js +8 -0
- package/dist/assets/qmldir-C_cCg2m9.js.map +1 -0
- package/dist/assets/qss-CXFHvGeG.js +8 -0
- package/dist/assets/qss-CXFHvGeG.js.map +1 -0
- package/dist/assets/r-DW2dRJNU.js +8 -0
- package/dist/assets/r-DW2dRJNU.js.map +1 -0
- package/dist/assets/racket-CElNGJsF.js +8 -0
- package/dist/assets/racket-CElNGJsF.js.map +1 -0
- package/dist/assets/raku-BGNf9XOF.js +8 -0
- package/dist/assets/raku-BGNf9XOF.js.map +1 -0
- package/dist/assets/razor-_hEMrIZE.js +14 -0
- package/dist/assets/razor-_hEMrIZE.js.map +1 -0
- package/dist/assets/red-AJNT05eU.js +5 -0
- package/dist/assets/red-AJNT05eU.js.map +1 -0
- package/dist/assets/reg-B1yGSPeX.js +8 -0
- package/dist/assets/reg-B1yGSPeX.js.map +1 -0
- package/dist/assets/regexp-DpBcpYls.js +8 -0
- package/dist/assets/regexp-DpBcpYls.js.map +1 -0
- package/dist/assets/rel-COHg19E9.js +8 -0
- package/dist/assets/rel-COHg19E9.js.map +1 -0
- package/dist/assets/riscv-DGE7iFEu.js +8 -0
- package/dist/assets/riscv-DGE7iFEu.js.map +1 -0
- package/dist/assets/ron-BU8eWRkc.js +8 -0
- package/dist/assets/ron-BU8eWRkc.js.map +1 -0
- package/dist/assets/rose-pine-BpSSTpDl.js +5 -0
- package/dist/assets/rose-pine-BpSSTpDl.js.map +1 -0
- package/dist/assets/rose-pine-dawn-JuXMWM7e.js +5 -0
- package/dist/assets/rose-pine-dawn-JuXMWM7e.js.map +1 -0
- package/dist/assets/rose-pine-moon-DfNEd67D.js +5 -0
- package/dist/assets/rose-pine-moon-DfNEd67D.js.map +1 -0
- package/dist/assets/rosmsg-DV4uqfTE.js +8 -0
- package/dist/assets/rosmsg-DV4uqfTE.js.map +1 -0
- package/dist/assets/rst-Dwts34Vp.js +38 -0
- package/dist/assets/rst-Dwts34Vp.js.map +1 -0
- package/dist/assets/ruby-BQIBxl9d.js +38 -0
- package/dist/assets/ruby-BQIBxl9d.js.map +1 -0
- package/dist/assets/rust-eyDPxu_F.js +8 -0
- package/dist/assets/rust-eyDPxu_F.js.map +1 -0
- package/dist/assets/sas-D42O7b-h.js +10 -0
- package/dist/assets/sas-D42O7b-h.js.map +1 -0
- package/dist/assets/sass-DgfD_AjS.js +8 -0
- package/dist/assets/sass-DgfD_AjS.js.map +1 -0
- package/dist/assets/scala-Bk1H2mSp.js +8 -0
- package/dist/assets/scala-Bk1H2mSp.js.map +1 -0
- package/dist/assets/scheme-CvUmbwed.js +8 -0
- package/dist/assets/scheme-CvUmbwed.js.map +1 -0
- package/dist/assets/scss-CuhcKk0L.js +10 -0
- package/dist/assets/scss-CuhcKk0L.js.map +1 -0
- package/dist/assets/sdbl-CsDj0b2n.js +8 -0
- package/dist/assets/sdbl-CsDj0b2n.js.map +1 -0
- package/dist/assets/shaderlab-BR6dybZt.js +10 -0
- package/dist/assets/shaderlab-BR6dybZt.js.map +1 -0
- package/dist/assets/shellscript-BFESB3IN.js +8 -0
- package/dist/assets/shellscript-BFESB3IN.js.map +1 -0
- package/dist/assets/shellsession-BUDs6Lj1.js +10 -0
- package/dist/assets/shellsession-BUDs6Lj1.js.map +1 -0
- package/dist/assets/shikiTokenizerWorker-BtjW_v9G.js +9878 -0
- package/dist/assets/shikiTokenizerWorker-BtjW_v9G.js.map +1 -0
- package/dist/assets/slack-dark-DWWJ5rYK.js +5 -0
- package/dist/assets/slack-dark-DWWJ5rYK.js.map +1 -0
- package/dist/assets/slack-ochin-Bq5JRIP5.js +5 -0
- package/dist/assets/slack-ochin-Bq5JRIP5.js.map +1 -0
- package/dist/assets/smalltalk-CepYz02F.js +8 -0
- package/dist/assets/smalltalk-CepYz02F.js.map +1 -0
- package/dist/assets/snazzy-light-CI6w30cq.js +5 -0
- package/dist/assets/snazzy-light-CI6w30cq.js.map +1 -0
- package/dist/assets/solarized-dark-Bgqg9546.js +5 -0
- package/dist/assets/solarized-dark-Bgqg9546.js.map +1 -0
- package/dist/assets/solarized-light-Cfhyx18w.js +5 -0
- package/dist/assets/solarized-light-Cfhyx18w.js.map +1 -0
- package/dist/assets/solidity-Dy7cwWHW.js +8 -0
- package/dist/assets/solidity-Dy7cwWHW.js.map +1 -0
- package/dist/assets/soy-CATG-zBT.js +12 -0
- package/dist/assets/soy-CATG-zBT.js.map +1 -0
- package/dist/assets/sparql-xS45ySCY.js +10 -0
- package/dist/assets/sparql-xS45ySCY.js.map +1 -0
- package/dist/assets/splunk-xsP0MVkt.js +8 -0
- package/dist/assets/splunk-xsP0MVkt.js.map +1 -0
- package/dist/assets/sql-kPnl9bgi.js +8 -0
- package/dist/assets/sql-kPnl9bgi.js.map +1 -0
- package/dist/assets/ssh-config-ehSXrtEV.js +8 -0
- package/dist/assets/ssh-config-ehSXrtEV.js.map +1 -0
- package/dist/assets/stata-CQNu_FgQ.js +10 -0
- package/dist/assets/stata-CQNu_FgQ.js.map +1 -0
- package/dist/assets/stylus-BoZJ_eV7.js +8 -0
- package/dist/assets/stylus-BoZJ_eV7.js.map +1 -0
- package/dist/assets/surrealql-BuAG2s0L.js +10 -0
- package/dist/assets/surrealql-BuAG2s0L.js.map +1 -0
- package/dist/assets/svelte-CnoxkKF2.js +16 -0
- package/dist/assets/svelte-CnoxkKF2.js.map +1 -0
- package/dist/assets/swift--o4OYIXX.js +8 -0
- package/dist/assets/swift--o4OYIXX.js.map +1 -0
- package/dist/assets/synthwave-84-DXKOZPq5.js +5 -0
- package/dist/assets/synthwave-84-DXKOZPq5.js.map +1 -0
- package/dist/assets/system-verilog-BEcmvm6Z.js +8 -0
- package/dist/assets/system-verilog-BEcmvm6Z.js.map +1 -0
- package/dist/assets/systemd-DJzDbKrW.js +8 -0
- package/dist/assets/systemd-DJzDbKrW.js.map +1 -0
- package/dist/assets/talonscript-Djb-VPry.js +8 -0
- package/dist/assets/talonscript-Djb-VPry.js.map +1 -0
- package/dist/assets/tasl-p9F3iH-j.js +8 -0
- package/dist/assets/tasl-p9F3iH-j.js.map +1 -0
- package/dist/assets/tcl-3f-uwoUo.js +8 -0
- package/dist/assets/tcl-3f-uwoUo.js.map +1 -0
- package/dist/assets/templ-B5LeC0kQ.js +14 -0
- package/dist/assets/templ-B5LeC0kQ.js.map +1 -0
- package/dist/assets/terraform-DgWhF4Yd.js +8 -0
- package/dist/assets/terraform-DgWhF4Yd.js.map +1 -0
- package/dist/assets/tex-CxL9S8Wd.js +10 -0
- package/dist/assets/tex-CxL9S8Wd.js.map +1 -0
- package/dist/assets/tokyo-night-BAQ_Myi4.js +5 -0
- package/dist/assets/tokyo-night-BAQ_Myi4.js.map +1 -0
- package/dist/assets/toml-BnyEyEPT.js +8 -0
- package/dist/assets/toml-BnyEyEPT.js.map +1 -0
- package/dist/assets/ts-tags-Bvk0ykl-.js +55 -0
- package/dist/assets/ts-tags-Bvk0ykl-.js.map +1 -0
- package/dist/assets/tsv-DY-yErdv.js +8 -0
- package/dist/assets/tsv-DY-yErdv.js.map +1 -0
- package/dist/assets/tsx-42HYAIDq.js +8 -0
- package/dist/assets/tsx-42HYAIDq.js.map +1 -0
- package/dist/assets/turtle-zqT8DlFI.js +8 -0
- package/dist/assets/turtle-zqT8DlFI.js.map +1 -0
- package/dist/assets/twig-uAs39d9k.js +37 -0
- package/dist/assets/twig-uAs39d9k.js.map +1 -0
- package/dist/assets/typescript-B2_-ihnN.js +8 -0
- package/dist/assets/typescript-B2_-ihnN.js.map +1 -0
- package/dist/assets/typespec-Kj54qpoq.js +8 -0
- package/dist/assets/typespec-Kj54qpoq.js.map +1 -0
- package/dist/assets/typst-BW5EogfV.js +8 -0
- package/dist/assets/typst-BW5EogfV.js.map +1 -0
- package/dist/assets/v-BMYuw6y3.js +8 -0
- package/dist/assets/v-BMYuw6y3.js.map +1 -0
- package/dist/assets/vala-DZNmMJCf.js +8 -0
- package/dist/assets/vala-DZNmMJCf.js.map +1 -0
- package/dist/assets/vb-6IyLx8lg.js +8 -0
- package/dist/assets/vb-6IyLx8lg.js.map +1 -0
- package/dist/assets/verilog-CBEeotQw.js +8 -0
- package/dist/assets/verilog-CBEeotQw.js.map +1 -0
- package/dist/assets/vesper-B_lKdhLz.js +5 -0
- package/dist/assets/vesper-B_lKdhLz.js.map +1 -0
- package/dist/assets/vhdl-Qbjr_6hW.js +8 -0
- package/dist/assets/vhdl-Qbjr_6hW.js.map +1 -0
- package/dist/assets/viml-Ce8qq_0D.js +8 -0
- package/dist/assets/viml-Ce8qq_0D.js.map +1 -0
- package/dist/assets/vitesse-black-BiRwe6jA.js +5 -0
- package/dist/assets/vitesse-black-BiRwe6jA.js.map +1 -0
- package/dist/assets/vitesse-dark-44qkAq30.js +5 -0
- package/dist/assets/vitesse-dark-44qkAq30.js.map +1 -0
- package/dist/assets/vitesse-light-KXY5XYnn.js +5 -0
- package/dist/assets/vitesse-light-KXY5XYnn.js.map +1 -0
- package/dist/assets/vue-DQvlk87_.js +41 -0
- package/dist/assets/vue-DQvlk87_.js.map +1 -0
- package/dist/assets/vue-html-DiaQkc4E.js +10 -0
- package/dist/assets/vue-html-DiaQkc4E.js.map +1 -0
- package/dist/assets/vue-vine-DgWfDcNr.js +20 -0
- package/dist/assets/vue-vine-DgWfDcNr.js.map +1 -0
- package/dist/assets/vyper-Bq7Z2-Ss.js +8 -0
- package/dist/assets/vyper-Bq7Z2-Ss.js.map +1 -0
- package/dist/assets/wasm-BdTJGc7T.js +8 -0
- package/dist/assets/wasm-BdTJGc7T.js.map +1 -0
- package/dist/assets/wenyan-ZWlLIQIr.js +8 -0
- package/dist/assets/wenyan-ZWlLIQIr.js.map +1 -0
- package/dist/assets/wgsl-C7jKgLAu.js +8 -0
- package/dist/assets/wgsl-C7jKgLAu.js.map +1 -0
- package/dist/assets/wikitext-Bd2wE6rj.js +8 -0
- package/dist/assets/wikitext-Bd2wE6rj.js.map +1 -0
- package/dist/assets/wit-14OfqCWW.js +8 -0
- package/dist/assets/wit-14OfqCWW.js.map +1 -0
- package/dist/assets/wolfram-RapNeSab.js +8 -0
- package/dist/assets/wolfram-RapNeSab.js.map +1 -0
- package/dist/assets/xml-Du1cw7kN.js +10 -0
- package/dist/assets/xml-Du1cw7kN.js.map +1 -0
- package/dist/assets/xsl-CfczXwS3.js +11 -0
- package/dist/assets/xsl-CfczXwS3.js.map +1 -0
- package/dist/assets/yaml-D_xpd4DU.js +8 -0
- package/dist/assets/yaml-D_xpd4DU.js.map +1 -0
- package/dist/assets/zenscript-DaonNBty.js +8 -0
- package/dist/assets/zenscript-DaonNBty.js.map +1 -0
- package/dist/assets/zig-DWvk_5e3.js +8 -0
- package/dist/assets/zig-DWvk_5e3.js.map +1 -0
- package/dist/bridge.cjs +1 -1
- package/dist/bridge.cjs.map +1 -1
- package/dist/bridge.d.ts +185 -2
- package/dist/bridge.js +3 -0
- package/dist/bridge.js.map +1 -1
- package/dist/core.d.ts +122 -2
- package/dist/dom.cjs +1 -1
- package/dist/dom.d.ts +122 -2
- package/dist/dom.js +2 -2
- package/dist/{index-McnGKzmi.cjs → index-79mXjylo.cjs} +2 -2
- package/dist/{index-McnGKzmi.cjs.map → index-79mXjylo.cjs.map} +1 -1
- package/dist/{index-DARGQA9p.js → index-BHrFfZ7O.js} +2 -2
- package/dist/{index-DARGQA9p.js.map → index-BHrFfZ7O.js.map} +1 -1
- package/dist/{index-BiehJaHJ.js → index-CCAOnvex.js} +2666 -2023
- package/dist/index-CCAOnvex.js.map +1 -0
- package/dist/index-CQx3NGKY.cjs +7 -0
- package/dist/index-CQx3NGKY.cjs.map +1 -0
- package/dist/index-DF8OhKI4.cjs.map +1 -1
- package/dist/index-sbZNOcCB.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +189 -2
- package/dist/index.js +2 -2
- package/dist/native-spec.d.ts +122 -2
- package/dist/shikiHighlightData-DU78Iupf.cjs +2 -0
- package/dist/shikiHighlightData-DU78Iupf.cjs.map +1 -0
- package/dist/shikiHighlightData-Dn-hlfiF.js +28 -0
- package/dist/shikiHighlightData-Dn-hlfiF.js.map +1 -0
- package/dist/shikiTokenizerRuntime.cjs +3 -0
- package/dist/shikiTokenizerRuntime.cjs.map +1 -0
- package/dist/shikiTokenizerRuntime.js +72 -0
- package/dist/shikiTokenizerRuntime.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/webview.cjs +1 -1
- package/dist/webview.d.ts +189 -2
- package/dist/webview.js +1 -1
- package/package.json +7 -3
- package/dist/index-BiehJaHJ.js.map +0 -1
- package/dist/index-DL8eNafR.cjs +0 -4
- package/dist/index-DL8eNafR.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-DARGQA9p.js","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":";;AAMO,MAAMA,IAAqB;AAAA,EAChC,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBd,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBf,GC3CaC,IAA6B,CAACC,MACzC,MAAM;AAAA,EACJA,EAAY,iBAAoC,qCAAqC;AACvF,EAAE,OAAO,CAACC,MAAW,CAACA,EAAO,QAAQ,GAG1BC,IAA4B,CAACF,GAA0BG,MAAkB;AAEpF,QAAMC,IADUL,EAA2BC,CAAW,EAC3BG,CAAK;AAEhC,EAAIC,OAAuB,MAAA;AAC7B,GAEaC,KAAgC,CAC3CC,GACAN,GACAO,GACAC,GACAC,MACG;;AACH,QAAMC,IAAUX,EAA2BC,CAAW,GAChDW,IAAc,SAAS,yBAAyB,oBAClDD,EAAQ,QAAQ,SAAS,aAAa,IACtC,IACEE,IAAgB,CAACC,MAAmB;;AACxC,QAAIH,EAAQ,WAAW,EAAG;AAG1B,UAAMI,MADYH,KAAe,IAAIA,IAAc,KACpBE,IAASH,EAAQ,UAAUA,EAAQ;AAElE,KAAAK,IAAAL,EAAQI,CAAS,MAAjB,QAAAC,EAAoB;AAAA,EACtB;AAMA,UAAQT,EAAM,KAAA;AAAA,IACZ,KAAK;AACH,MAAAA,EAAM,eAAA,GACNM,EAAc,CAAC;AACf;AAAA,IACF,KAAK;AACH,MAAAN,EAAM,eAAA,GACNM,EAAc,EAAE;AAChB;AAAA,IACF,KAAK;AACH,MAAAN,EAAM,eAAA,IACNS,IAAAL,EAAQ,CAAC,MAAT,QAAAK,EAAY;AACZ;AAAA,IACF,KAAK;AACH,MAAAT,EAAM,eAAA,IACNU,IAAAN,EAAQ,GAAG,EAAE,MAAb,QAAAM,EAAgB;AAChB;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,MAAI,SAAS,yBAAyB,sBACpCV,EAAM,eAAA,GACNE,EAAqB,SAAS,aAAa,GAC3CC,EAAA,GACAF,EAAa,MAAA;AAEf;AAAA,IACF,KAAK;AACH,MAAAD,EAAM,eAAA,GACNC,EAAa,MAAA,GACbE,EAAA;AACA;AAAA,EAEA;AAEN,GC1DaQ,IAA6B,2CAC7BC,KAAwB,0CAExBC,IAAkC;AAAA,EAC7CD;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJE,KAAoB,CAACC,GAAmBC,MAAkC;AAC9E,QAAMC,IAAaF,EAAM,IAAI,CAACG,MAASC,EAAoBD,GAAMF,CAAa,CAAC;AAE/E,SAAO;AAAA,IACL,QAAQC,EAAW,KAAK,CAACG,MAAUA,EAAM,MAAM;AAAA,IAC/C,UAAUH,EAAW,SAAS,KAAKA,EAAW,MAAM,CAACG,MAAUA,EAAM,QAAQ;AAAA,EAAA;AAEjF,GAEMC,KAAsB,CAC1BC,GACAJ,GACAF,GACAO,GACAC,MACG;AACH,QAAMJ,IAAQD,EAAoBD,GAAMF,CAAa,GAC/CrB,IAAS,SAAS,cAAc,QAAQ,GAExC8B,IAAUF,EAAML,EAAK,IAAI,KAAKQ,EAAiBR,EAAK,IAAI;AAE9D,EAAAvB,EAAO,OAAO,UACdA,EAAO,YAAY,6BACnBA,EAAO,WAAWyB,EAAM,UACxBzB,EAAO,QAAQ,SAAS,OAAOyB,EAAM,MAAM,GAC3CzB,EAAO,QAAQ,yBAAyBuB,EAAK,IAC7CvB,EAAO,aAAa,cAAcuB,EAAK,KAAK,GAC5CvB,EAAO,aAAa,gBAAgB,OAAOyB,EAAM,MAAM,CAAC,GACpDI,MAAe7B,EAAO,QAAQ,UAAUuB,EAAK,QAEjDS,EAAehC,GAAQ8B,GAASP,EAAK,KAAK,GAE1CI,EAAa,OAAO3B,CAAM;AAC5B,GAEMiC,KAA2B,CAC/BN,GACAO,GACAb,GACAO,GACAC,MACG;AACH,QAAM7B,IAAS,SAAS,cAAc,QAAQ,GACxCmC,IAAahB,GAAkBe,EAAY,OAAOb,CAAa,GAC/DS,IAAUI,EAAY,OACxBN,EAAMM,EAAY,IAAI,KAAKH,EAAiBG,EAAY,IAAI,IAC5DrC,EAAmB,cACjBuC,IAAY,SAAS,cAAc,MAAM;AAE/C,EAAApC,EAAO,OAAO,UACdA,EAAO,YAAY,6DACnBA,EAAO,WAAWmC,EAAW,UAC7BnC,EAAO,QAAQ,SAAS,OAAOmC,EAAW,MAAM,GAChDnC,EAAO,QAAQ,0BAA0BkC,EAAY,KACrDlC,EAAO,QAAQ,OAAO,SACtBA,EAAO,aAAa,cAAckC,EAAY,KAAK,GACnDlC,EAAO,aAAa,iBAAiB,MAAM,GAC3CA,EAAO,aAAa,iBAAiB,OAAO,GAC5CA,EAAO,aAAa,gBAAgB,OAAOmC,EAAW,MAAM,CAAC,GACzDN,MAAe7B,EAAO,QAAQ,UAAUkC,EAAY,QAExDF,EAAehC,GAAQ8B,GAASI,EAAY,KAAK,GAEjDE,EAAU,YAAY,sCACtBA,EAAU,aAAa,eAAe,MAAM,GAC5CA,EAAU,YAAYvC,EAAmB,aACzCG,EAAO,OAAOoC,CAAS,GACvBT,EAAa,OAAO3B,CAAM;AAC5B,GAQaqC,KAAgB,CAC3BC,GACAC,GACAlB,GACAO,GACAC,MACG;AACH,EAAAS,EAAe,cAAc,IAE7BC,EAAa,QAAQ,CAACL,MAAgB;AACpC,QAAIA,EAAY,SAAS,aAAa;AACpC,YAAMM,IAAmB,SAAS,cAAc,MAAM;AAEtD,MAAAA,EAAiB,YAAY,gCAC7BA,EAAiB,QAAQ,cAAcN,EAAY,KACnDM,EAAiB,aAAa,eAAe,MAAM,GACnDF,EAAe,OAAOE,CAAgB;AACtC;AAAA,IACF;AAEA,QAAIN,EAAY,SAAS,UAAU;AACjC,MAAAR;AAAA,QACEY;AAAA,QACAJ,EAAY;AAAA,QACZb;AAAA,QACAO;AAAA,QACAC;AAAA,MAAA;AAEF;AAAA,IACF;AAMA,UAAMF,IAAe,SAAS,cAAc,KAAK;AAEjD,IAAAA,EAAa,YAAY,4BACzBA,EAAa,QAAQ,QAAQO,EAAY,KACzCP,EAAa,aAAa,cAAcO,EAAY,KAAK,GACzDI,EAAe,OAAOX,CAAY,GAElCM;AAAA,MACEN;AAAA,MACAO;AAAA,MACAb;AAAA,MACAO;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH,GAOaY,IAAyB,CACpC1C,GACA2C,GACArB,GACAO,MACG;AAGH,MAFA7B,EAAY,cAAc,IAEtB,CAAC2C,GAAgB;AACnB,IAAA3C,EAAY,QAAQ,UAAU;AAC9B;AAAA,EACF;AAEA,EAAA2C,EAAe,MAAM,QAAQ,CAACnB,MAAS;AACrC,UAAME,IAAQD,EAAoBD,GAAMF,CAAa,GAC/CrB,IAAS,SAAS,cAAc,QAAQ,GACxC8B,IAAUF,EAAML,EAAK,IAAI,KAAKQ,EAAiBR,EAAK,IAAI,GACxDoB,IAAe,SAAS,cAAc,MAAM;AAElD,IAAA3C,EAAO,OAAO,UACdA,EAAO,YAAY,2DACnBA,EAAO,WAAWyB,EAAM,UACxBzB,EAAO,QAAQ,SAAS,OAAOyB,EAAM,MAAM,GAC3CzB,EAAO,QAAQ,yBAAyBuB,EAAK,IAC7CvB,EAAO,aAAa,QAAQ,UAAU,GACtCA,EAAO,aAAa,cAAcuB,EAAK,KAAK,GAC5CvB,EAAO,aAAa,gBAAgB,OAAOyB,EAAM,MAAM,CAAC,GAExDO,EAAehC,GAAQ8B,GAASP,EAAK,KAAK,GAC1CoB,EAAa,YAAY,uCACzBA,EAAa,cAAcpB,EAAK,OAChCvB,EAAO,OAAO2C,CAAY,GAC1B5C,EAAY,OAAOC,CAAM;AAAA,EAC3B,CAAC,GAEDD,EAAY,QAAQ,UAAU,QAC9BA,EAAY,MAAM,WAAW,GAAG2C,EAAe,OAAO,WAAW;AACnE,GAEaE,IAA8B,CACzCC,GACAH,MACG;AACH,EAAAG,EAAU,iBAAoC7B,CAA0B,EAAE,QAAQ,CAAChB,MAAW;AAC5F,UAAM8C,KAAOJ,KAAA,gBAAAA,EAAgB,cAAa1C,EAAO,QAAQ;AAEzD,IAAAA,EAAO,QAAQ,OAAO,OAAO8C,CAAI,GACjC9C,EAAO,aAAa,iBAAiB,OAAO8C,CAAI,CAAC;AAAA,EACnD,CAAC;AACH,GAEaC,IAA2B,CACtCR,GACAS,MACGT,EAAa,KAAK,CAAChB,MACtBA,EAAK,SAAS,WAAWA,EAAK,QAAQyB,CACvC,GC7MKC,IAAmC,GAEnCC,IAAe,CAACL,GAAwBM,MAC5CA,aAAkB,QAAQN,EAAU,SAASM,CAAM,GAG/CC,IAAmB,CACvBD,GACAE,MAEAF,aAAkB,UAAUA,EAAO,QAA2BE,CAAQ,IAAI,MAU/DC,KAAoC,CAC/CT,GACAU,GACAC,GACAjD,GACAC,MACG;AACH,MAAIiD,IAKO,MACPC,IAAoD;AAExD,QAAMC,IAAiC,CAACR,MACtCC,EAAiBD,GAAQnC,CAA0B,MAE/CkC,EAAaK,GAAkBJ,CAAM,IACjCC,EAAiBD,GAAQjC,CAA+B,IACxD,OAIJ0C,IAAmB,CAACvD,MAAqC;AAG7D,IAFesD,EAA+BtD,EAAM,MAAM,MAQtDA,aAAiB,gBAAgBA,EAAM,gBAAgB,WAE3DA,EAAM,eAAA;AAAA,EACR,GAEMwD,IAAmB,CAACxD,MAAsB;AAC9C,UAAMyD,IAAQzD,EAAM,QAAQ,CAAC,GACvB0D,IAAcX,EAAiB/C,EAAM,QAAQW,CAA0B,GACvEgD,IAAiBd,EAAaK,GAAkBlD,EAAM,MAAM,IAC9D+C,EAAiB/C,EAAM,QAAQa,CAA+B,IAC9D,MACElB,IAAS+D,KAAeC;AAE9B,IAAI,CAAChE,KAAU,CAAC8D,MAMhBL,IAAe;AAAA,MACb,QAAAzD;AAAA,MACA,MAAM+D,IAAc,UAAU;AAAA,MAC9B,QAAQD,EAAM;AAAA,MACd,QAAQA,EAAM;AAAA,IAAA;AAAA,EAElB,GAEMG,IAAoB,MAAM;AAC9B,IAAAR,IAAe;AAAA,EACjB,GAEMS,IAAiB,CAAC7D,MAAsB;AAC5C,QAAI,CAACoD,EAAc;AAEnB,UAAMU,IAAaV,GACbK,IAAQzD,EAAM,eAAe,CAAC,GAC9B+D,IAAYT,EAA+BtD,EAAM,MAAM;AAG7D,QADAoD,IAAe,MACX,CAACK,KAASM,MAAcD,EAAW,OAAQ;AAE/C,UAAME,IAAS,KAAK,IAAIP,EAAM,UAAUK,EAAW,MAAM,GACnDG,IAAS,KAAK,IAAIR,EAAM,UAAUK,EAAW,MAAM;AAEzD,QACE,EAAAE,IAASpB,KACJqB,IAASrB,IAOhB;AAAA,UAJA5C,EAAM,eAAA,GACNA,EAAM,gBAAA,GACNqD,IAA0BS,EAAW,QAEjCA,EAAW,SAAS,SAAS;AAC/B,QAAAX,EAAgBW,EAAW,MAAM;AACjC;AAAA,MACF;AAEA,MAAA5D,EAAqB4D,EAAW,MAAM,GACtC3D,EAAA;AAAA;AAAA,EACF,GAEM+D,IAA4B,CAAClE,MAAwB;AACzD,IACE6C,EAAaL,GAAWxC,EAAM,MAAM,KAC/B6C,EAAaK,GAAkBlD,EAAM,MAAM,KAGlDG,EAAA;AAAA,EACF;AAEA,SAAAqC,EAAU,iBAAiB,eAAee,CAAgB,GAC1Df,EAAU,iBAAiB,aAAae,CAAgB,GACxDf,EAAU,iBAAiB,cAAcgB,GAAkB,EAAE,SAAS,IAAO,GAC7EhB,EAAU,iBAAiB,YAAYqB,CAAc,GACrDrB,EAAU,iBAAiB,eAAeoB,CAAiB,GAC3DV,EAAiB,iBAAiB,eAAeK,CAAgB,GACjEL,EAAiB,iBAAiB,aAAaK,CAAgB,GAC/DL,EAAiB,iBAAiB,cAAcM,GAAkB,EAAE,SAAS,IAAO,GACpFN,EAAiB,iBAAiB,YAAYW,CAAc,GAC5DX,EAAiB,iBAAiB,eAAeU,CAAiB,GAClE,SAAS,iBAAiB,eAAeM,GAA2B,EAAI,GAEjE;AAAA,IACL,uBAAuBvE,GAA2B;AAChD,aAAI0D,MAA4B1D,IAAe,MAE/C0D,IAA0B,MACnB;AAAA,IACT;AAAA,IACA,UAAU;AACR,MAAAb,EAAU,oBAAoB,eAAee,CAAgB,GAC7Df,EAAU,oBAAoB,aAAae,CAAgB,GAC3Df,EAAU,oBAAoB,cAAcgB,CAAgB,GAC5DhB,EAAU,oBAAoB,YAAYqB,CAAc,GACxDrB,EAAU,oBAAoB,eAAeoB,CAAiB,GAC9DV,EAAiB,oBAAoB,eAAeK,CAAgB,GACpEL,EAAiB,oBAAoB,aAAaK,CAAgB,GAClEL,EAAiB,oBAAoB,cAAcM,CAAgB,GACnEN,EAAiB,oBAAoB,YAAYW,CAAc,GAC/DX,EAAiB,oBAAoB,eAAeU,CAAiB,GACrE,SAAS,oBAAoB,eAAeM,GAA2B,EAAI;AAAA,IAC7E;AAAA,EAAA;AAEJ,GCpIMC,KAAyB,GACzBC,KAA2B,GAI3BC,KAAqB,MAAA;;AACzB,gBAAO,SAAW,SACb5D,IAAA,OAAO,eAAP,gBAAAA,EAAA,aAAoB,sCAAsC,aAAY;AAAA,GAGvE6D,IAA6B,CAACxB,MAA+B;AAKjE,QAAMnD,IAASmD,aAAkB,UAC7BA,EAAO,QAA2BjC,CAA+B,IACjE;AAEJ,SAAOlB,aAAkB,oBAAoBA,IAAS;AACxD,GAEM4E,IAAkC,CAACzB,MAA+B;AACtE,QAAMnD,IAASmD,aAAkB,UAC7BA,EAAO,QAA2BnC,CAA0B,IAC5D;AAEJ,SAAOhB,aAAkB,oBAAoBA,IAAS;AACxD;AAOO,SAAS6E,GACdhC,GACAiC,GACoB;AACpB,QAAMC,IAAYD,EAAQ,aAAa,OACjCE,IAAaC,GAAwBH,EAAQ,cAAcI,IAAmB;AAAA,IAClF,YAAYJ,EAAQ;AAAA,IACpB,oBAAoBA,EAAQ;AAAA,EAAA,CAC7B,GACKvC,IAAe4C,GAAmBL,EAAQ,eAAeE,CAAU,GAKnEI,IAAsB7C,EAAa,QAAQ,CAACL,MAChDA,EAAY,SAAS,WAAW,CAACA,EAAY,IAAI,IAC7CA,EAAY,SAAS,UAAUA,EAAY,QACzC,EACP,GACKN,IAAQkD,EAAQ,SAAS,CAAA,GAKzBjD,IAAgB6C,GAAA,GAChBW,IAAiB,SAAS,cAAc,KAAK,GAC7C9B,IAAmB,SAAS,cAAc,KAAK,GAC/C+B,IAAczC,EAAU,QAAQ,YAAY,KAAKA;AACvD,MAAI0C,IAAY,IACZC,IAAsBV,EAAQ,OAAO,iBAAA,GACrCpC,IAA+C,MAC/C+C,IAAuD;AAC3D,QAAMC,IAA2BC,EAAsB9C,GAAW;AAAA,IAChE,gBAAgB;AAAA,MACd;AAAA,MACA;AAAA,IAAA,EACA,KAAK,GAAG;AAAA,EAAA,CACX,GACK+C,IAA6BD,EAAsBpC,GAAkB;AAAA,IACzE,gBAAgB;AAAA,EAAA,CACjB,GAEKsC,IAAuB,MAAM;AAEjC,IAAAP,EAAY,OAAOD,CAAc,GACjCC,EAAY,OAAO/B,CAAgB;AAAA,EACrC,GAEMuC,IAA8B,MAAM;AACxC,IAAAL,KAAA,QAAAA,EAAwB,QAAQ,KAChCA,KAAA,QAAAA,EAAwB,WACxBA,IAAyB;AAAA,EAC3B,GAEMM,IAA6B,MAAM;AACvC,IAAKrD,MAELoD,EAAA,GAMAL,IAAyBO,GAAoBtD,EAAe,QAAQa,GAAkB;AAAA,MACpF,WAAWwB,MAAc,WAAW,cAAc;AAAA,MAClD,QAAQN;AAAA,MACR,UAAU;AAAA,IAAA,CACX,GACDgB,EAAuB,QAAQ,EAAI;AAAA,EACrC,GAEMjF,IAAiB,MAAM;AAC3B,IAAI,CAACkC,KAAkB,CAAC+C,MAExBK,EAAA,GACApD,IAAiB,MACjBD,EAAuBc,GAAkBb,GAAgB8C,GAAqB5D,CAAK,GACnFgB,EAA4BC,GAAWH,CAAc;AAAA,EACvD,GAEMuD,IAAe,CAACC,MAA2B;AAC/C,QAAI,CAAAX,MAEJC,IAAsBU,GAClBxD,KAAgBoD,EAAA,GACpBzD,GAAcQ,GAAWN,GAAc2D,GAAQtE,GAAOC,CAAa,GACnEgE,EAAA,GACInD,IAAgB;AAClB,YAAMvC,IAAa,MAAM;AAAA,QACvB0C,EAAU,iBAAoC7B,CAA0B;AAAA,MAAA,EACxE,KAAK,CAAChB,OAAWA,GAAO,QAAQ,6BAA4B0C,KAAA,gBAAAA,EAAgB,SAAQ,GAChFyD,IAAgBpD,EAAyBR,GAAcG,EAAe,QAAQ;AAEpF,MAAAA,IAAiBvC,KAAcgG,IAC3B;AAAA,QACA,UAAUzD,EAAe;AAAA,QACzB,QAAQvC;AAAA,QACR,OAAOgG,EAAc;AAAA,MAAA,IAErB,MACJ1D,EAAuBc,GAAkBb,GAAgB8C,GAAqB5D,CAAK,GACnFgB,EAA4BC,GAAWH,CAAc,GACjDA,KAAgBqD,EAAA;AAAA,IACtB;AAAA,EACF,GAEMK,IAAS,MAAM;AACnB,IAAIb,KAEJU,EAAanB,EAAQ,OAAO,kBAAkB;AAAA,EAChD,GAEMuB,IAAc,MAAM;AACxB,IAAAhB,EAAe,QAAQ,UAAU,SACjCA,EAAe,cAAc;AAAA,EAC/B,GAEMiB,IAAc,CAACtG,MAA8B;AACjD,UAAMuG,IAAcvG,EAAO,QAAQ;AAEnC,QAAI,CAAC6B,KAAiB,CAAC0E,EAAa;AAEpC,UAAMC,IAAaxG,EAAO,sBAAA;AAE1B,IAAAqF,EAAe,cAAckB,GAC7BlB,EAAe,QAAQ,UAAU,QACjCA,EAAe,MAAM,OAAO,GAAGmB,EAAW,OAAOA,EAAW,QAAQ,CAAC,MACrEnB,EAAe,MAAM,MAAM,GAAGmB,EAAW,MAAMhC,EAAsB;AAAA,EACvE,GAEMiC,IAAsB,CAACpG,MAAiB;AAC5C,UAAML,IAAS2E,EAA2BtE,EAAM,MAAM;AAEtD,IAAIL,KACFsG,EAAYtG,CAAM;AAAA,EAEtB,GAEM0G,IAAqB,CAACrG,MAAsB;AAChD,UAAMsG,IAAgBtG,EAAM,eACtBL,IAAS2E,EAA2BtE,EAAM,MAAM;AAEtD,IACEL,KACK2G,aAAyB,QACzB3G,EAAO,SAAS2G,CAAa,KAGpCN,EAAA;AAAA,EACF,GAEM9F,IAAuB,CAACP,MAA8B;AAC1D,QAAI,EAAEA,aAAkB,sBAAsBA,EAAO,SAAU;AAE/D,UAAM4G,IAAWxB,EAAoB,KAAK,CAAC7D,MACzCA,EAAK,OAAOvB,EAAO,QAAQ,sBAC5B;AAED,QAAK4G,GAEL;AAAA,UAAIA,EAAS,cAAc;AACzB,cAAMJ,IAAaxG,EAAO,sBAAA;AAO1B,QAAA8E,EAAQ,OAAO,oBAAoB;AAAA,UACjC,QAAQ8B,EAAS;AAAA,UACjB,SAASA,EAAS;AAAA,UAClB,OAAOA,EAAS;AAAA,UAChB,eAAeC,GAA6BD,GAAU9B,EAAQ,OAAO,kBAAkB;AAAA,UACvF,YAAY;AAAA,YACV,GAAG0B,EAAW;AAAA,YACd,GAAGA,EAAW;AAAA,YACd,OAAOA,EAAW;AAAA,YAClB,QAAQA,EAAW;AAAA,UAAA;AAAA,QACrB,CACD;AACD;AAAA,MACF;AAEA,MAAA1B,EAAQ,OAAO,eAAe8B,EAAS,OAAO;AAAA;AAAA,EAChD,GAEMpD,IAAkB,CAACxD,GAA2B8G,IAAkB,OAAU;AAC9E,UAAMC,IAAYhE;AAAA,MAChBR;AAAA,MACAvC,EAAO,QAAQ;AAAA,IAAA;AAGjB,QAAI,GAAC+G,KAAa/G,EAAO,WAEzB;AAAA,WAAI0C,KAAA,gBAAAA,EAAgB,cAAaqE,EAAU,KAAK;AAC9C,YAAID,GAAiB;AACnB,UAAA7G,EAA0BsD,GAAkB,CAAC;AAC7C;AAAA,QACF;AACA,QAAA/C,EAAA;AACA;AAAA,MACF;AAEA,MAAAkC,IAAiB;AAAA,QACf,UAAUqE,EAAU;AAAA,QACpB,QAAA/G;AAAA,QACA,OAAO+G,EAAU;AAAA,MAAA,GAEnBV,EAAA,GACA5D,EAAuBc,GAAkBb,GAAgB8C,GAAqB5D,CAAK,GACnFgB,EAA4BC,GAAWH,CAAc,GACrDqD,EAAA,GACIe,KAAiB7G,EAA0BsD,GAAkB,CAAC;AAAA;AAAA,EACpE,GAEMyD,IAAc,CAAC3G,MAAsB;AACzC,UAAM0D,IAAca,EAAgCvE,EAAM,MAAM;AAChE,QAAI0D,GAAa;AAGf,UAFA1D,EAAM,eAAA,GACNA,EAAM,gBAAA,GACF4G,EAAqB,uBAAuBlD,CAAW,EAAG;AAE9D,MAAAP,EAAgBO,CAAW;AAC3B;AAAA,IACF;AAEA,UAAM/D,IAAS2E,EAA2BtE,EAAM,MAAM;AACtD,IAAKL,MAELK,EAAM,eAAA,GACNA,EAAM,gBAAA,GACF,CAAA4G,EAAqB,uBAAuBjH,CAAM,MAEtDO,EAAqBP,CAAM,GAC3BQ,EAAA;AAAA,EACF,GAEM0G,IAAgB,CAAC7G,MAAyB;AAC9C,QAAIqC,KAAkBa,EAAiB,SAAS,SAAS,aAAa,GAAG;AACvE,MAAAnD;AAAA,QACEC;AAAA,QACAkD;AAAA,QACAb,EAAe;AAAA,QACfnC;AAAA,QACAC;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,UAAMuD,IAAca,EAAgCvE,EAAM,MAAM;AAChE,QACE0D,MACM1D,EAAM,QAAQ,WAAWA,EAAM,QAAQ,OAAOA,EAAM,QAAQ,cAClE;AAKA,MAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA,GACNmD,EAAgBO,GAAa,EAAI;AACjC;AAAA,IACF;AAEA,IAAI1D,EAAM,QAAQ,YAElBG,EAAA;AAAA,EACF;AAEA,EAAAqC,EAAU,UAAU,IAAI,oBAAoB,GAC5CwC,EAAe,YAAY,8BAC3BA,EAAe,QAAQ,UAAU,SACjC9B,EAAiB,YAAY,0DAC7BA,EAAiB,QAAQ,UAAU,SACnCA,EAAiB,aAAa,QAAQ,MAAM,GAC5CV,EAAU,QAAQ,YAAYkC,GAC9BlC,EAAU,aAAa,QAAQ,SAAS,GACxCA,EAAU;AAAA,IACR;AAAA,IACAkC,MAAc,WAAW,qBAAqB;AAAA,EAAA,GAEhDlC,EAAU,iBAAiB,SAASmE,CAAW,GAC/CzD,EAAiB,iBAAiB,SAASyD,CAAW,GACtD,SAAS,iBAAiB,WAAWE,CAAa,GAC9CrF,MACFgB,EAAU,iBAAiB,aAAa4D,CAAmB,GAC3D5D,EAAU,iBAAiB,YAAY6D,CAAkB,IAE3D7D,EAAU,iBAAiB,YAAYwD,CAAW,GAElDR,EAAA;AACA,QAAMoB,IAAuB3D;AAAA,IAC3BT;AAAA,IACAU;AAAA,IACAC;AAAA,IACAjD;AAAA,IACAC;AAAA,EAAA,GAII2G,IAAcrC,EAAQ,OAAO,4BAA4BmB,CAAY;AAE3E,SAAO;AAAA,IACL,QAAAG;AAAA,IACA,UAAU;AACR,MAAIb,MAEJA,IAAY,IACZ4B,EAAA,GACA3G,EAAA,GACAqC,EAAU,oBAAoB,SAASmE,CAAW,GAClDzD,EAAiB,oBAAoB,SAASyD,CAAW,GACzD,SAAS,oBAAoB,WAAWE,CAAa,GACrDD,EAAqB,QAAA,GACjBpF,MACFgB,EAAU,oBAAoB,aAAa4D,CAAmB,GAC9D5D,EAAU,oBAAoB,YAAY6D,CAAkB,IAE9DhB,EAAA,GACAE,EAAA,GACA/C,EAAU,oBAAoB,YAAYwD,CAAW,GACrDhB,EAAe,OAAA,GACf9B,EAAiB,OAAA,GACjBV,EAAU,UAAU,OAAO,oBAAoB,GAC/C,OAAOA,EAAU,QAAQ,WACzBA,EAAU,cAAc,IACxBA,EAAU,gBAAgB,MAAM,GAChCA,EAAU,gBAAgB,YAAY;AAAA,IACxC;AAAA,EAAA;AAEJ;AC3YA,MAAMuE,KAAuB,0BAMvBC,KAAgC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,IAAoB,CAACC,OACzBA,KAAA,gBAAAA,EAAM,QAAQH,IAAsB,IAAI,WAAU,IASvCI,KAA2B,CAACC,MAA0B;AACjE,MAAI,CAACH,EAAkBG,CAAI,EAAG,QAAO;AAErC,QAAMC,IAAW,SAAS,cAAc,UAAU;AAElD,SAAAA,EAAS,YAAYD,GAEd,GACLH,EAAkBI,EAAS,QAAQ,WAAW,KAC3CA,EAAS,QAAQ,cAAcL,EAA6B;AAEnE;"}
|
|
1
|
+
{"version":3,"file":"index-BHrFfZ7O.js","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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"}
|