@kubed.io/cdn 0.0.4 → 0.0.6
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 +11 -0
- package/dist/chunks/1c-Cg7z75RR.js +94 -0
- package/dist/chunks/1c-Cg7z75RR.js.map +1 -0
- package/dist/chunks/abnf-DjOFdYyB.js +59 -0
- package/dist/chunks/abnf-DjOFdYyB.js.map +1 -0
- package/dist/chunks/accesslog-CT59MCIO.js +72 -0
- package/dist/chunks/accesslog-CT59MCIO.js.map +1 -0
- package/dist/chunks/actionscript-BF7IWfId.js +85 -0
- package/dist/chunks/actionscript-BF7IWfId.js.map +1 -0
- package/dist/chunks/ada-BW8u8CRX.js +107 -0
- package/dist/chunks/ada-BW8u8CRX.js.map +1 -0
- package/dist/chunks/angelscript-2l-XM2Vw.js +91 -0
- package/dist/chunks/angelscript-2l-XM2Vw.js.map +1 -0
- package/dist/chunks/apache-ClDRwhlj.js +87 -0
- package/dist/chunks/apache-ClDRwhlj.js.map +1 -0
- package/dist/chunks/applescript-BnCdU8ml.js +57 -0
- package/dist/chunks/applescript-BnCdU8ml.js.map +1 -0
- package/dist/chunks/arcade-BtIJZuSq.js +157 -0
- package/dist/chunks/arcade-BtIJZuSq.js.map +1 -0
- package/dist/chunks/arduino-xB3NbW4M.js +272 -0
- package/dist/chunks/arduino-xB3NbW4M.js.map +1 -0
- package/dist/chunks/armasm-Dg5wPE4N.js +66 -0
- package/dist/chunks/armasm-Dg5wPE4N.js.map +1 -0
- package/dist/chunks/asciidoc-ZAddoC6x.js +178 -0
- package/dist/chunks/asciidoc-ZAddoC6x.js.map +1 -0
- package/dist/chunks/aspectj-Dfd0IA-3.js +126 -0
- package/dist/chunks/aspectj-Dfd0IA-3.js.map +1 -0
- package/dist/chunks/autohotkey-tKEhIrY9.js +55 -0
- package/dist/chunks/autohotkey-tKEhIrY9.js.map +1 -0
- package/dist/chunks/autoit-BPoYFiDT.js +123 -0
- package/dist/chunks/autoit-BPoYFiDT.js.map +1 -0
- package/dist/chunks/avrasm-DcwC__J5.js +47 -0
- package/dist/chunks/avrasm-DcwC__J5.js.map +1 -0
- package/dist/chunks/awk-B0eiS31p.js +56 -0
- package/dist/chunks/awk-B0eiS31p.js.map +1 -0
- package/dist/chunks/axapta-BZnaEvVa.js +65 -0
- package/dist/chunks/axapta-BZnaEvVa.js.map +1 -0
- package/dist/chunks/bash-SfqkqXwO.js +171 -0
- package/dist/chunks/bash-SfqkqXwO.js.map +1 -0
- package/dist/chunks/basic-hK9i76TR.js +44 -0
- package/dist/chunks/basic-hK9i76TR.js.map +1 -0
- package/dist/chunks/bnf-CT5PE87o.js +28 -0
- package/dist/chunks/bnf-CT5PE87o.js.map +1 -0
- package/dist/chunks/brainfuck-Cix81oQc.js +41 -0
- package/dist/chunks/brainfuck-Cix81oQc.js.map +1 -0
- package/dist/chunks/c-DqpMY-rp.js +189 -0
- package/dist/chunks/c-DqpMY-rp.js.map +1 -0
- package/dist/chunks/cal-C-xic9Tn.js +91 -0
- package/dist/chunks/cal-C-xic9Tn.js.map +1 -0
- package/dist/chunks/capnproto-Bte6wB8g.js +84 -0
- package/dist/chunks/capnproto-Bte6wB8g.js.map +1 -0
- package/dist/chunks/ceylon-B5xM3rkd.js +77 -0
- package/dist/chunks/ceylon-B5xM3rkd.js.map +1 -0
- package/dist/chunks/clean-58wPfVlT.js +24 -0
- package/dist/chunks/clean-58wPfVlT.js.map +1 -0
- package/dist/chunks/clojure-DnooNAlk.js +114 -0
- package/dist/chunks/clojure-DnooNAlk.js.map +1 -0
- package/dist/chunks/clojure-repl-BOwc5f8V.js +18 -0
- package/dist/chunks/clojure-repl-BOwc5f8V.js.map +1 -0
- package/dist/chunks/cmake-CmXecy9B.js +28 -0
- package/dist/chunks/cmake-CmXecy9B.js.map +1 -0
- package/dist/chunks/coffeescript-BxFWPVxK.js +199 -0
- package/dist/chunks/coffeescript-BxFWPVxK.js.map +1 -0
- package/dist/chunks/coq-q80xvjL8.js +26 -0
- package/dist/chunks/coq-q80xvjL8.js.map +1 -0
- package/dist/chunks/core-BSQzrNYA.js +853 -0
- package/dist/chunks/core-BSQzrNYA.js.map +1 -0
- package/dist/chunks/cos-DiRYB57M.js +78 -0
- package/dist/chunks/cos-DiRYB57M.js.map +1 -0
- package/dist/chunks/cpp-BvOt3G_R.js +238 -0
- package/dist/chunks/cpp-BvOt3G_R.js.map +1 -0
- package/dist/chunks/crmsh-h8TY8H79.js +80 -0
- package/dist/chunks/crmsh-h8TY8H79.js.map +1 -0
- package/dist/chunks/crystal-Cn8iNhTZ.js +247 -0
- package/dist/chunks/crystal-Cn8iNhTZ.js.map +1 -0
- package/dist/chunks/csharp-BUAiXZio.js +262 -0
- package/dist/chunks/csharp-BUAiXZio.js.map +1 -0
- package/dist/chunks/csp-BP06y0Ba.js +25 -0
- package/dist/chunks/csp-BP06y0Ba.js.map +1 -0
- package/dist/chunks/css-CuP2L3Vg.js +147 -0
- package/dist/chunks/css-CuP2L3Vg.js.map +1 -0
- package/dist/chunks/d-C0cOEHlZ.js +87 -0
- package/dist/chunks/d-C0cOEHlZ.js.map +1 -0
- package/dist/chunks/dart-DOyn4FWh.js +136 -0
- package/dist/chunks/dart-DOyn4FWh.js.map +1 -0
- package/dist/chunks/{define-XzEniRJH.js → define-DqUpowD9.js} +3 -3
- package/dist/chunks/{define-XzEniRJH.js.map → define-DqUpowD9.js.map} +1 -1
- package/dist/chunks/delphi-BL8QbVUL.js +95 -0
- package/dist/chunks/delphi-BL8QbVUL.js.map +1 -0
- package/dist/chunks/diff-DMbO7OaS.js +41 -0
- package/dist/chunks/diff-DMbO7OaS.js.map +1 -0
- package/dist/chunks/django-CnvXUSpm.js +44 -0
- package/dist/chunks/django-CnvXUSpm.js.map +1 -0
- package/dist/chunks/dns-DpaEqlb1.js +73 -0
- package/dist/chunks/dns-DpaEqlb1.js.map +1 -0
- package/dist/chunks/dockerfile-D9WngOli.js +36 -0
- package/dist/chunks/dockerfile-D9WngOli.js.map +1 -0
- package/dist/chunks/dos-w6Vxr4_L.js +59 -0
- package/dist/chunks/dos-w6Vxr4_L.js.map +1 -0
- package/dist/chunks/dsconfig-Dq_NzMQE.js +56 -0
- package/dist/chunks/dsconfig-Dq_NzMQE.js.map +1 -0
- package/dist/chunks/dts-CpWaLhGr.js +117 -0
- package/dist/chunks/dts-CpWaLhGr.js.map +1 -0
- package/dist/chunks/dust-C4uDg2L0.js +34 -0
- package/dist/chunks/dust-C4uDg2L0.js.map +1 -0
- package/dist/chunks/ebnf-ByjV7C32.js +41 -0
- package/dist/chunks/ebnf-ByjV7C32.js.map +1 -0
- package/dist/chunks/{element-ChNBLJ5X.js → element-CaN9ZVoe.js} +60 -60
- package/dist/chunks/element-CaN9ZVoe.js.map +1 -0
- package/dist/chunks/elixir-DkdYO0Vr.js +191 -0
- package/dist/chunks/elixir-DkdYO0Vr.js.map +1 -0
- package/dist/chunks/elm-Clms-iZw.js +101 -0
- package/dist/chunks/elm-Clms-iZw.js.map +1 -0
- package/dist/chunks/erb-BC3HNNgp.js +18 -0
- package/dist/chunks/erb-BC3HNNgp.js.map +1 -0
- package/dist/chunks/erlang-Cu0IlQov.js +220 -0
- package/dist/chunks/erlang-Cu0IlQov.js.map +1 -0
- package/dist/chunks/erlang-repl-5hCt0uhz.js +42 -0
- package/dist/chunks/erlang-repl-5hCt0uhz.js.map +1 -0
- package/dist/chunks/excel-BIDJpxSu.js +49 -0
- package/dist/chunks/excel-BIDJpxSu.js.map +1 -0
- package/dist/chunks/fix-C0h50qaq.js +31 -0
- package/dist/chunks/fix-C0h50qaq.js.map +1 -0
- package/dist/chunks/flix-BCyKzKuw.js +61 -0
- package/dist/chunks/flix-BCyKzKuw.js.map +1 -0
- package/dist/chunks/fortran-DJ9If3VL.js +55 -0
- package/dist/chunks/fortran-DJ9If3VL.js.map +1 -0
- package/dist/chunks/freedesktop-DY5X71dr.js +88 -0
- package/dist/chunks/freedesktop-DY5X71dr.js.map +1 -0
- package/dist/chunks/fsharp-B-zxwYyG.js +243 -0
- package/dist/chunks/fsharp-B-zxwYyG.js.map +1 -0
- package/dist/chunks/gams-Bk-CWpk3.js +128 -0
- package/dist/chunks/gams-Bk-CWpk3.js.map +1 -0
- package/dist/chunks/gauss-DoDOans8.js +154 -0
- package/dist/chunks/gauss-DoDOans8.js.map +1 -0
- package/dist/chunks/gcode-BUHWwtTe.js +123 -0
- package/dist/chunks/gcode-BUHWwtTe.js.map +1 -0
- package/dist/chunks/gherkin-Wzf9M781.js +70 -0
- package/dist/chunks/gherkin-Wzf9M781.js.map +1 -0
- package/dist/chunks/glsl-CUb3B_sB.js +27 -0
- package/dist/chunks/glsl-CUb3B_sB.js.map +1 -0
- package/dist/chunks/gml-BS5lKjIV.js +24 -0
- package/dist/chunks/gml-BS5lKjIV.js.map +1 -0
- package/dist/chunks/go-BUD6D8kx.js +146 -0
- package/dist/chunks/go-BUD6D8kx.js.map +1 -0
- package/dist/chunks/golo-CeWwUkIr.js +27 -0
- package/dist/chunks/golo-CeWwUkIr.js.map +1 -0
- package/dist/chunks/gradle-BoqM74sD.js +20 -0
- package/dist/chunks/gradle-BoqM74sD.js.map +1 -0
- package/dist/chunks/graphql-j3kf95P9.js +69 -0
- package/dist/chunks/graphql-j3kf95P9.js.map +1 -0
- package/dist/chunks/groovy-B3DHxrmD.js +129 -0
- package/dist/chunks/groovy-B3DHxrmD.js.map +1 -0
- package/dist/chunks/haml-CgF67t0s.js +98 -0
- package/dist/chunks/haml-CgF67t0s.js.map +1 -0
- package/dist/chunks/handlebars-Bp8_IuhA.js +146 -0
- package/dist/chunks/handlebars-Bp8_IuhA.js.map +1 -0
- package/dist/chunks/haskell-2oFXwht3.js +140 -0
- package/dist/chunks/haskell-2oFXwht3.js.map +1 -0
- package/dist/chunks/haxe-BWUFK1R1.js +144 -0
- package/dist/chunks/haxe-BWUFK1R1.js.map +1 -0
- package/dist/chunks/highlight-D54M45bZ.js +328 -0
- package/dist/chunks/highlight-D54M45bZ.js.map +1 -0
- package/dist/chunks/hsp-YaLnMBmw.js +47 -0
- package/dist/chunks/hsp-YaLnMBmw.js.map +1 -0
- package/dist/chunks/http-D1Jx4NCy.js +76 -0
- package/dist/chunks/http-D1Jx4NCy.js.map +1 -0
- package/dist/chunks/hy-W6RLRSst.js +75 -0
- package/dist/chunks/hy-W6RLRSst.js.map +1 -0
- package/dist/chunks/inform7-Cqmf6Xxi.js +45 -0
- package/dist/chunks/inform7-Cqmf6Xxi.js.map +1 -0
- package/dist/chunks/ini-C_A9yUHA.js +90 -0
- package/dist/chunks/ini-C_A9yUHA.js.map +1 -0
- package/dist/chunks/irpf90-CFKe0d2G.js +49 -0
- package/dist/chunks/irpf90-CFKe0d2G.js.map +1 -0
- package/dist/chunks/isbl-DRZZfDZN.js +98 -0
- package/dist/chunks/isbl-DRZZfDZN.js.map +1 -0
- package/dist/chunks/java-DH7DXQTB.js +176 -0
- package/dist/chunks/java-DH7DXQTB.js.map +1 -0
- package/dist/chunks/javascript-D-ispHLP.js +433 -0
- package/dist/chunks/javascript-D-ispHLP.js.map +1 -0
- package/dist/chunks/jboss-cli-DwoEMfEn.js +48 -0
- package/dist/chunks/jboss-cli-DwoEMfEn.js.map +1 -0
- package/dist/chunks/json-BrJhaXJI.js +44 -0
- package/dist/chunks/json-BrJhaXJI.js.map +1 -0
- package/dist/chunks/julia-DUM4uO0n.js +82 -0
- package/dist/chunks/julia-DUM4uO0n.js.map +1 -0
- package/dist/chunks/julia-repl-DkEOqH-L.js +20 -0
- package/dist/chunks/julia-repl-DkEOqH-L.js.map +1 -0
- package/dist/chunks/kd-B0BcpOG_.js +2662 -0
- package/dist/chunks/kd-B0BcpOG_.js.map +1 -0
- package/dist/chunks/kotlin-BvSvL3hH.js +208 -0
- package/dist/chunks/kotlin-BvSvL3hH.js.map +1 -0
- package/dist/chunks/lasso-BixBtX3R.js +122 -0
- package/dist/chunks/lasso-BixBtX3R.js.map +1 -0
- package/dist/chunks/latex-BNm-5qSt.js +188 -0
- package/dist/chunks/latex-BNm-5qSt.js.map +1 -0
- package/dist/chunks/ldif-D2VChYy1.js +26 -0
- package/dist/chunks/ldif-D2VChYy1.js.map +1 -0
- package/dist/chunks/leaf-DZ17MVc2.js +67 -0
- package/dist/chunks/leaf-DZ17MVc2.js.map +1 -0
- package/dist/chunks/less-Cj7NvTiz.js +198 -0
- package/dist/chunks/less-Cj7NvTiz.js.map +1 -0
- package/dist/chunks/lisp-0CHBhNkP.js +105 -0
- package/dist/chunks/lisp-0CHBhNkP.js.map +1 -0
- package/dist/chunks/livecodeserver-f04_o5o0.js +85 -0
- package/dist/chunks/livecodeserver-f04_o5o0.js.map +1 -0
- package/dist/chunks/livescript-DnaWcjJC.js +192 -0
- package/dist/chunks/livescript-DnaWcjJC.js.map +1 -0
- package/dist/chunks/llvm-CD_EQmwW.js +71 -0
- package/dist/chunks/llvm-CD_EQmwW.js.map +1 -0
- package/dist/chunks/lsl-BjbA45DV.js +56 -0
- package/dist/chunks/lsl-BjbA45DV.js.map +1 -0
- package/dist/chunks/lua-C8cmPpDf.js +48 -0
- package/dist/chunks/lua-C8cmPpDf.js.map +1 -0
- package/dist/chunks/makefile-vKf6Crs_.js +59 -0
- package/dist/chunks/makefile-vKf6Crs_.js.map +1 -0
- package/dist/chunks/markdown-D1MbcAo6.js +180 -0
- package/dist/chunks/markdown-D1MbcAo6.js.map +1 -0
- package/dist/chunks/marked.esm-BrPimSW6.js +1494 -0
- package/dist/chunks/marked.esm-BrPimSW6.js.map +1 -0
- package/dist/chunks/mathematica-BAI0dr8P.js +71 -0
- package/dist/chunks/mathematica-BAI0dr8P.js.map +1 -0
- package/dist/chunks/matlab-tHkexNRr.js +72 -0
- package/dist/chunks/matlab-tHkexNRr.js.map +1 -0
- package/dist/chunks/maxima-DBb1On73.js +40 -0
- package/dist/chunks/maxima-DBb1On73.js.map +1 -0
- package/dist/chunks/mel-DQ2XEeJZ.js +26 -0
- package/dist/chunks/mel-DQ2XEeJZ.js.map +1 -0
- package/dist/chunks/mercury-DB7FwEBk.js +57 -0
- package/dist/chunks/mercury-DB7FwEBk.js.map +1 -0
- package/dist/chunks/mipsasm-Bnw9lQ6-.js +55 -0
- package/dist/chunks/mipsasm-Bnw9lQ6-.js.map +1 -0
- package/dist/chunks/mizar-CKEtvqV9.js +12 -0
- package/dist/chunks/mizar-CKEtvqV9.js.map +1 -0
- package/dist/chunks/mojolicious-FvfVuUnD.js +29 -0
- package/dist/chunks/mojolicious-FvfVuUnD.js.map +1 -0
- package/dist/chunks/monkey-DaGzblyK.js +73 -0
- package/dist/chunks/monkey-DaGzblyK.js.map +1 -0
- package/dist/chunks/moonscript-B9xmaKDF.js +99 -0
- package/dist/chunks/moonscript-B9xmaKDF.js.map +1 -0
- package/dist/chunks/n1ql-h7HuiOG_.js +47 -0
- package/dist/chunks/n1ql-h7HuiOG_.js.map +1 -0
- package/dist/chunks/nestedtext-z3hOUdBb.js +67 -0
- package/dist/chunks/nestedtext-z3hOUdBb.js.map +1 -0
- package/dist/chunks/nginx-Cscn9g8k.js +126 -0
- package/dist/chunks/nginx-Cscn9g8k.js.map +1 -0
- package/dist/chunks/nim-DuEHXsfI.js +57 -0
- package/dist/chunks/nim-DuEHXsfI.js.map +1 -0
- package/dist/chunks/nix-CK-JoV_w.js +176 -0
- package/dist/chunks/nix-CK-JoV_w.js.map +1 -0
- package/dist/chunks/node-repl-YPgIlFR4.js +21 -0
- package/dist/chunks/node-repl-YPgIlFR4.js.map +1 -0
- package/dist/chunks/nsis-C2knGE1f.js +103 -0
- package/dist/chunks/nsis-C2knGE1f.js.map +1 -0
- package/dist/chunks/objectivec-CUvPbZB7.js +119 -0
- package/dist/chunks/objectivec-CUvPbZB7.js.map +1 -0
- package/dist/chunks/ocaml-CJnlG7MK.js +54 -0
- package/dist/chunks/ocaml-CJnlG7MK.js.map +1 -0
- package/dist/chunks/openscad-B7xqzB_t.js +61 -0
- package/dist/chunks/openscad-B7xqzB_t.js.map +1 -0
- package/dist/chunks/oxygene-y7G7cOvu.js +55 -0
- package/dist/chunks/oxygene-y7G7cOvu.js.map +1 -0
- package/dist/chunks/parser3-BO1P2QTe.js +42 -0
- package/dist/chunks/parser3-BO1P2QTe.js.map +1 -0
- package/dist/chunks/perl-CIZiAqA2.js +194 -0
- package/dist/chunks/perl-CIZiAqA2.js.map +1 -0
- package/dist/chunks/pf-DtIBAeXH.js +32 -0
- package/dist/chunks/pf-DtIBAeXH.js.map +1 -0
- package/dist/chunks/pgsql-DhvwSgY7.js +193 -0
- package/dist/chunks/pgsql-DhvwSgY7.js.map +1 -0
- package/dist/chunks/php-Df419x2P.js +302 -0
- package/dist/chunks/php-Df419x2P.js.map +1 -0
- package/dist/chunks/php-template-NGWDJ4ZL.js +45 -0
- package/dist/chunks/php-template-NGWDJ4ZL.js.map +1 -0
- package/dist/chunks/plaintext-DI9-6uUK.js +12 -0
- package/dist/chunks/plaintext-DI9-6uUK.js.map +1 -0
- package/dist/chunks/pony-DWRlzIm6.js +52 -0
- package/dist/chunks/pony-DWRlzIm6.js.map +1 -0
- package/dist/chunks/powershell-Bi81KJvX.js +190 -0
- package/dist/chunks/powershell-Bi81KJvX.js.map +1 -0
- package/dist/chunks/processing-NRILzl6W.js +100 -0
- package/dist/chunks/processing-NRILzl6W.js.map +1 -0
- package/dist/chunks/profile-C5HdUz2O.js +40 -0
- package/dist/chunks/profile-C5HdUz2O.js.map +1 -0
- package/dist/chunks/prolog-CSxvOOUl.js +56 -0
- package/dist/chunks/prolog-CSxvOOUl.js.map +1 -0
- package/dist/chunks/properties-DVff9GiD.js +40 -0
- package/dist/chunks/properties-DVff9GiD.js.map +1 -0
- package/dist/chunks/protobuf-CwPeazJT.js +63 -0
- package/dist/chunks/protobuf-CwPeazJT.js.map +1 -0
- package/dist/chunks/puppet-wWT6-WaD.js +84 -0
- package/dist/chunks/puppet-wWT6-WaD.js.map +1 -0
- package/dist/chunks/purebasic-HWZkxa8e.js +44 -0
- package/dist/chunks/purebasic-HWZkxa8e.js.map +1 -0
- package/dist/chunks/purify.es-C_X9UTsz.js +846 -0
- package/dist/chunks/purify.es-C_X9UTsz.js.map +1 -0
- package/dist/chunks/python-B3xOtrtl.js +240 -0
- package/dist/chunks/python-B3xOtrtl.js.map +1 -0
- package/dist/chunks/python-repl-DFMVj5e5.js +21 -0
- package/dist/chunks/python-repl-DFMVj5e5.js.map +1 -0
- package/dist/chunks/q-DOHmm85f.js +23 -0
- package/dist/chunks/q-DOHmm85f.js.map +1 -0
- package/dist/chunks/qml-LsukXoE-.js +129 -0
- package/dist/chunks/qml-LsukXoE-.js.map +1 -0
- package/dist/chunks/r-qBqOPbmv.js +142 -0
- package/dist/chunks/r-qBqOPbmv.js.map +1 -0
- package/dist/chunks/reasonml-D25FoGuQ.js +80 -0
- package/dist/chunks/reasonml-D25FoGuQ.js.map +1 -0
- package/dist/chunks/rib-C3T5JisO.js +18 -0
- package/dist/chunks/rib-C3T5JisO.js.map +1 -0
- package/dist/chunks/roboconf-Ckycnnun.js +55 -0
- package/dist/chunks/roboconf-Ckycnnun.js.map +1 -0
- package/dist/chunks/routeros-DIBiqeDi.js +104 -0
- package/dist/chunks/routeros-DIBiqeDi.js.map +1 -0
- package/dist/chunks/rsl-C2V3vKIN.js +61 -0
- package/dist/chunks/rsl-C2V3vKIN.js.map +1 -0
- package/dist/chunks/ruby-C7c-uCk8.js +264 -0
- package/dist/chunks/ruby-C7c-uCk8.js.map +1 -0
- package/dist/chunks/ruleslanguage-IlptjHhp.js +28 -0
- package/dist/chunks/ruleslanguage-IlptjHhp.js.map +1 -0
- package/dist/chunks/rust-D-q21Dm6.js +184 -0
- package/dist/chunks/rust-D-q21Dm6.js.map +1 -0
- package/dist/chunks/sas-ObguUuPf.js +80 -0
- package/dist/chunks/sas-ObguUuPf.js.map +1 -0
- package/dist/chunks/scala-DVAYHay6.js +164 -0
- package/dist/chunks/scala-DVAYHay6.js.map +1 -0
- package/dist/chunks/scheme-DIcGbflN.js +106 -0
- package/dist/chunks/scheme-DIcGbflN.js.map +1 -0
- package/dist/chunks/scilab-ilneDJJS.js +47 -0
- package/dist/chunks/scilab-ilneDJJS.js.map +1 -0
- package/dist/chunks/scss-BP8UD0nN.js +157 -0
- package/dist/chunks/scss-BP8UD0nN.js.map +1 -0
- package/dist/chunks/shell-DBkgOY0Y.js +19 -0
- package/dist/chunks/shell-DBkgOY0Y.js.map +1 -0
- package/dist/chunks/smali-De20QX07.js +85 -0
- package/dist/chunks/smali-De20QX07.js.map +1 -0
- package/dist/chunks/smalltalk-DWMPo-qT.js +59 -0
- package/dist/chunks/smalltalk-DWMPo-qT.js.map +1 -0
- package/dist/chunks/sml-yOrArwoc.js +51 -0
- package/dist/chunks/sml-yOrArwoc.js.map +1 -0
- package/dist/chunks/sqf-BCN5uwk_.js +78 -0
- package/dist/chunks/sqf-BCN5uwk_.js.map +1 -0
- package/dist/chunks/sql-CmVzGP4w.js +120 -0
- package/dist/chunks/sql-CmVzGP4w.js.map +1 -0
- package/dist/chunks/stan-BSt7sG8M.js +142 -0
- package/dist/chunks/stan-BSt7sG8M.js.map +1 -0
- package/dist/chunks/stata-sbG438-7.js +35 -0
- package/dist/chunks/stata-sbG438-7.js.map +1 -0
- package/dist/chunks/step21-Cfi2MQDZ.js +55 -0
- package/dist/chunks/step21-Cfi2MQDZ.js.map +1 -0
- package/dist/chunks/stylus-CiBDFhBN.js +185 -0
- package/dist/chunks/stylus-CiBDFhBN.js.map +1 -0
- package/dist/chunks/subunit-DWjzVCiA.js +36 -0
- package/dist/chunks/subunit-DWjzVCiA.js.map +1 -0
- package/dist/chunks/swift-Qo_eIir5.js +577 -0
- package/dist/chunks/swift-Qo_eIir5.js.map +1 -0
- package/dist/chunks/taggerscript-BvuLYKHz.js +39 -0
- package/dist/chunks/taggerscript-BvuLYKHz.js.map +1 -0
- package/dist/chunks/tap-uMi8uF_X.js +32 -0
- package/dist/chunks/tap-uMi8uF_X.js.map +1 -0
- package/dist/chunks/tcl-DMPG3T59.js +46 -0
- package/dist/chunks/tcl-DMPG3T59.js.map +1 -0
- package/dist/chunks/thrift-DAA8HOe8.js +67 -0
- package/dist/chunks/thrift-DAA8HOe8.js.map +1 -0
- package/dist/chunks/tp-46SXlDZT.js +87 -0
- package/dist/chunks/tp-46SXlDZT.js.map +1 -0
- package/dist/chunks/twig-Cf_tZ_wH.js +84 -0
- package/dist/chunks/twig-Cf_tZ_wH.js.map +1 -0
- package/dist/chunks/typescript-Dc6pBLOZ.js +518 -0
- package/dist/chunks/typescript-Dc6pBLOZ.js.map +1 -0
- package/dist/chunks/vala-C2GHqzgV.js +41 -0
- package/dist/chunks/vala-C2GHqzgV.js.map +1 -0
- package/dist/chunks/vbnet-DgQ7B7yi.js +71 -0
- package/dist/chunks/vbnet-DgQ7B7yi.js.map +1 -0
- package/dist/chunks/vbscript-Bid2w6kd.js +43 -0
- package/dist/chunks/vbscript-Bid2w6kd.js.map +1 -0
- package/dist/chunks/vbscript-html-DznzJpE3.js +16 -0
- package/dist/chunks/vbscript-html-DznzJpE3.js.map +1 -0
- package/dist/chunks/verilog-Cfn8vMNy.js +58 -0
- package/dist/chunks/verilog-Cfn8vMNy.js.map +1 -0
- package/dist/chunks/vhdl-DjBWCsn1.js +48 -0
- package/dist/chunks/vhdl-DjBWCsn1.js.map +1 -0
- package/dist/chunks/vim-DtRU07HQ.js +56 -0
- package/dist/chunks/vim-DtRU07HQ.js.map +1 -0
- package/dist/chunks/wasm-CavVFuAK.js +65 -0
- package/dist/chunks/wasm-CavVFuAK.js.map +1 -0
- package/dist/chunks/wren-BKTRrWxW.js +210 -0
- package/dist/chunks/wren-BKTRrWxW.js.map +1 -0
- package/dist/chunks/x86asm-D3FT8ZrX.js +66 -0
- package/dist/chunks/x86asm-D3FT8ZrX.js.map +1 -0
- package/dist/chunks/xl-O8DviBwg.js +85 -0
- package/dist/chunks/xl-O8DviBwg.js.map +1 -0
- package/dist/chunks/xml-UTtAqziF.js +164 -0
- package/dist/chunks/xml-UTtAqziF.js.map +1 -0
- package/dist/chunks/xquery-Ybt8-gzE.js +149 -0
- package/dist/chunks/xquery-Ybt8-gzE.js.map +1 -0
- package/dist/chunks/yaml-DT7UV549.js +146 -0
- package/dist/chunks/yaml-DT7UV549.js.map +1 -0
- package/dist/chunks/zephir-Dsfqs5td.js +72 -0
- package/dist/chunks/zephir-Dsfqs5td.js.map +1 -0
- package/dist/github/activity.d.ts +49 -0
- package/dist/github/hash.d.ts +8 -0
- package/dist/github/index.d.ts +10 -0
- package/dist/github/tree.d.ts +26 -0
- package/dist/github/urls.d.ts +34 -0
- package/dist/github.js +253 -0
- package/dist/github.js.map +1 -0
- package/dist/k8s.js +6 -6
- package/dist/k8s.js.map +1 -1
- package/dist/kd/elements/code.d.ts +53 -0
- package/dist/kd/elements/markdown.d.ts +55 -0
- package/dist/kd/feed.d.ts +31 -0
- package/dist/kd/files/explorer.d.ts +88 -0
- package/dist/kd/files/file.d.ts +84 -0
- package/dist/kd/files/index.d.ts +6 -0
- package/dist/kd/files/static.d.ts +12 -0
- package/dist/kd/files/types.d.ts +51 -0
- package/dist/kd/highlight.d.ts +26 -0
- package/dist/kd/index.d.ts +8 -0
- package/dist/kd.js +5 -5
- package/dist/n8n/config.d.ts +3 -2
- package/dist/n8n.js +4 -4
- package/dist/n8n.js.map +1 -1
- package/dist/openapi.js +4 -4
- package/dist/openapi.js.map +1 -1
- package/package.json +18 -3
- package/dist/chunks/element-ChNBLJ5X.js.map +0 -1
- package/dist/chunks/kd-Bbw0GeQ5.js +0 -1149
- package/dist/chunks/kd-Bbw0GeQ5.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kd-B0BcpOG_.js","names":["o","t","nothing","IMAGE","nothing","ifDefined","nothing","ifDefined","nothing","e","i","s","t","n","i","o","r","nothing","unsafeHTML","nothing","nothing","e","r","t","s","nothing","styleMap","nothing","nothing","ifDefined","nothing","LitElement","nothing","ifDefined","ifDefined","nothing","nothing","ifDefined","i$3","b","applyTheme","w","base","A","json","KdElement","i$2","define","setVariable","kdjson","value","registerHelpers","o$2","o","RESERVED","NUMBER","DATE","INDICATOR","CONTROL","needsQuotes","s","quote","token","isBlock","v","isLiteral","scalar","literal","chomp","lines","l","inline","gap","head","header","inner","block","item","sub","indent","out","key","yamlLines","toYaml","line","t","KdData","pre","i","n","summary","TONES","tone","fallback","tones","IMAGE$1","renderIcon","cls","safeHref","href","here","loc","win","m","linkUrl","link","at","cut","path","params","name","vars","k","query","runtimes","preload","rt","navigate","event","service","to","url","prefix","KdLink","d","body","title","#click","#refresh","KdPill","isEmpty","cell","renderCell","c","cellStyles","KdBar","chips","chain","e$1","e","i$1","r","E","o$1","highlighter","MAX_CHARS","MAX_LINES","flag","lineSet","part","a","normal","text","KdCode","done","#pending","changed","language","filename","#key","#result","lang","result","#copy","clipboard","#copied","start","marks","gutter","group","groups","raw","data","g","jsonValue","parsed","CLIP","KdGroups","#tree","#pills","parser","purifiers","markdownParser","purifier","found","view","SANITIZE","UNSAFE_TAGS","URL_ATTRS","scrub","el","root","lower","ABSOLUTE","rebase","from","slug","KdMarkdown","code","ticket","#ticket","linkBase","imageBase","job","markdown","#render","src","response","#note","#doc","doc","p","marked","purify","fragment","#finish","links","images","ids","heading","id","attr","img","set","size","candidate","input","target","KdMask","t$1","number","KdMeter","unit","largest","scale","clamp","f","fill","KdSheet","rows","row","STATUS","glyph","KdSteps","steps","step","KdTable","cols","columns","align","col","label","pane","KdTabs","#observer","#storage","stored","selected","byLabel","panes","index","#panes","open","#index","count","#select","slots","KdTile","external","feed","context","fed","selector","props","map","variable","expression","normalizePath","dirname","basename","entryName","entry","formatSize","bytes","modifiedTime","isFolder","node","staticProvider","folders","folder","parent","given","entries","existing","rollUp","newest","newestTime","stats","child","options","DEFAULT_COLUMNS","SEARCH_LIMIT","kindOf","byName","cellText","sortValue","kind","one","many","FOLDER","FILE","icon","dir","formatModified","KdFiles","#folder","suffix","relist","had","#source","#listed","#load","#sort","sel","#fromStorage","#storedSelected","#sameSelection","#seen","first","keep","#picked","#navigated","#query","#matches","#list","#save","source","#listTicket","#listing","pending","fresh","#error","#cursor","#search","error","#searchTicket","seen","queue","under","#opened","#remember","#go","#pick","#columns","sorted","depth","x","y","move","#scroll","#activate","#setQuery","parts","crumb","last","isSelected","#cell","#rows","listed","items","dirs","total","sum","sort","tip","num","#sortBy","current","#emptyNote","none","#keydown","#row","#crumbs","#filterKey","opened","MARKDOWN","IMAGE","BINARY","TEXTUAL","SNIFF","extension","dot","fileKind","ext","type","looksBinary","sample","odd","blobText","blob","imageSrc","KdFile","#given","#readTicket","#read","#reading","provider","content","#revoke","#url","#svgText","#sniffed","read","image","#svg","#objectUrl","sniffed","#sniff","#header"],"sources":["../../src/kd/helpers.ts","../../node_modules/lit-html/directives/if-defined.js","../../src/kd/yaml.ts","../../src/kd/elements/data.ts","../../src/kd/parts.ts","../../src/kd/elements/link.ts","../../src/kd/elements/pill.ts","../../src/kd/cell.ts","../../src/kd/elements/bar.ts","../../node_modules/lit-html/directive.js","../../node_modules/lit-html/directives/unsafe-html.js","../../src/kd/elements/code.ts","../../src/kd/elements/groups.ts","../../src/kd/elements/markdown.ts","../../src/kd/elements/mask.ts","../../node_modules/lit-html/directives/style-map.js","../../src/kd/elements/meter.ts","../../src/kd/elements/sheet.ts","../../src/kd/elements/steps.ts","../../src/kd/elements/table.ts","../../src/kd/elements/tabs.ts","../../src/kd/elements/tile.ts","../../src/kd/feed.ts","../../src/kd/files/types.ts","../../src/kd/files/static.ts","../../src/kd/files/explorer.ts","../../src/kd/files/file.ts"],"sourcesContent":["/**\n * Data for a JSON attribute. Double-stash it so Handlebars escapes the quotes:\n * `<kd-table data=\"{{kdjson rows}}\">`. Never triple-stash JSON into an\n * attribute: one `'` in the data turns the whole tag into escaped text.\n */\nexport function kdjson(value: unknown): string {\n return JSON.stringify(value ?? null);\n}\n\ninterface Handlebars {\n registerHelper(name: string, helper: (...args: unknown[]) => unknown): void;\n}\n\n/** Registers `kdjson` on Business Text's `context.handlebars`. */\nexport function registerHelpers(handlebars: Handlebars): void {\n handlebars.registerHelper('kdjson', (value) => kdjson(value));\n}\n","import{nothing as t}from\"../lit-html.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o=o=>o??t;export{o as ifDefined};\n//# sourceMappingURL=if-defined.js.map\n","// A small YAML dumper for JSON values: block style, kubectl's layout (a list\n// sits at its key's indent), quotes only where a plain scalar would be misread.\n\n/** What a token is, for highlighting. Punctuation and indentation are `plain`. */\nexport type YamlKind = 'key' | 'str' | 'num' | 'bool' | 'null' | 'plain';\n\nexport interface YamlToken {\n kind: YamlKind;\n text: string;\n}\n\n/** One output line: its indentation (with any `- ` markers), then its tokens. */\nexport interface YamlLine {\n prefix: string;\n tokens: YamlToken[];\n}\n\nconst RESERVED = /^(~|null|true|false|yes|no|on|off|y|n)$/i;\nconst NUMBER =\n /^([-+]?(\\.\\d+|\\d[\\d_]*(\\.\\d*)?)([eE][-+]?\\d+)?|0x[0-9a-f]+|0o[0-7]+|[-+]?\\.(inf|nan)|[-+]?\\d+(:[0-5]?\\d)+(\\.\\d*)?)$/i;\nconst DATE = /^\\d{4}-\\d\\d?-\\d\\d?([Tt ]|$)/;\nconst INDICATOR = /^([,[\\]{}#&*!|>'\"%@`]|[-?:](\\s|$))/;\nconst CONTROL = /[\\u0000-\\u0008\\u000b-\\u001f\\u007f]/;\n\nfunction needsQuotes(s: string): boolean {\n return (\n s === '' ||\n RESERVED.test(s) ||\n NUMBER.test(s) ||\n DATE.test(s) ||\n INDICATOR.test(s) ||\n /^\\s|\\s$/.test(s) ||\n s.includes(': ') ||\n s.includes(' #') ||\n s.endsWith(':') ||\n s.includes('\\n') ||\n s.includes('\\t') ||\n CONTROL.test(s)\n );\n}\n\n/** A string as a YAML scalar, double-quoted (JSON's escapes are YAML's) only when it must be. */\nexport function quote(s: string): string {\n return needsQuotes(s) ? JSON.stringify(s) : s;\n}\n\nconst token = (kind: YamlKind, text: string): YamlToken => ({ kind, text });\n\nfunction isBlock(value: unknown): value is object {\n if (Array.isArray(value)) return value.length > 0;\n return value !== null && typeof value === 'object' && Object.values(value).some((v) => v !== undefined);\n}\n\nfunction isLiteral(value: unknown): value is string {\n return typeof value === 'string' && value.includes('\\n') && !CONTROL.test(value);\n}\n\nfunction scalar(value: unknown): YamlToken {\n if (value === null || value === undefined) return token('null', 'null');\n if (typeof value === 'boolean') return token('bool', String(value));\n if (typeof value === 'number' || typeof value === 'bigint') return token('num', String(value));\n if (Array.isArray(value)) return token('plain', '[]');\n if (typeof value === 'object') return token('plain', '{}');\n return token('str', quote(String(value)));\n}\n\n// A multi-line string as a literal block: `|` keeps one final newline, `|-`\n// none and `|+` all; a leading space on the first line needs the indent stated.\nfunction literal(s: string): { header: string; lines: string[] } {\n const chomp = s.endsWith('\\n') ? (s.endsWith('\\n\\n') ? '+' : '') : '-';\n const body = chomp === '-' ? s : s.slice(0, -1);\n const lines = body.split('\\n');\n const first = lines.find((l) => l !== '');\n return { header: `|${first?.startsWith(' ') ? '2' : ''}${chomp}`, lines };\n}\n\n// A scalar, an empty collection or a literal block after `head` (`key:` or nothing).\nfunction inline(prefix: string, head: YamlToken[], value: unknown, inner: string): YamlLine[] {\n const gap = head.length ? [token('plain', ' ')] : [];\n if (isLiteral(value)) {\n const { header, lines } = literal(value);\n return [\n { prefix, tokens: [...head, ...gap, token('plain', header)] },\n ...lines.map((l) => ({ prefix: l ? inner : '', tokens: [token('str', l)] })),\n ];\n }\n return [{ prefix, tokens: [...head, ...gap, scalar(value)] }];\n}\n\n// A non-empty object or array at `indent`.\nfunction block(value: object, indent: string, out: YamlLine[]): void {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (isBlock(item)) {\n const sub: YamlLine[] = [];\n block(item, `${indent} `, sub);\n sub[0].prefix = `${indent}- ${sub[0].prefix.slice(indent.length + 2)}`;\n out.push(...sub);\n } else {\n out.push(...inline(`${indent}- `, [], item, `${indent} `));\n }\n }\n return;\n }\n for (const [key, item] of Object.entries(value)) {\n if (item === undefined) continue;\n const head = [token('key', quote(key)), token('plain', ':')];\n if (isBlock(item)) {\n out.push({ prefix: indent, tokens: head });\n block(item, Array.isArray(item) ? indent : `${indent} `, out);\n } else {\n out.push(...inline(indent, head, item, `${indent} `));\n }\n }\n}\n\n/** A JSON value as YAML lines of tokens, for rendering with highlighting. */\nexport function yamlLines(value: unknown): YamlLine[] {\n const out: YamlLine[] = [];\n if (isBlock(value)) block(value, '', out);\n else out.push(...inline('', [], value, ' '));\n return out;\n}\n\n/** A JSON value as YAML text. */\nexport function toYaml(value: unknown): string {\n return yamlLines(value)\n .map((line) => line.prefix + line.tokens.map((t) => t.text).join(''))\n .join('\\n');\n}\n","import { css, html, nothing } from 'lit';\n\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\nimport { yamlLines } from '../yaml';\n\n/**\n * Any JSON value as YAML. An object or array longer than `fold` lines (default\n * 10; 0 never folds) collapses under a \"{ } n keys\" / \"[ ] n items\" line.\n *\n * `<kd-data data=\"{{kdjson spec}}\" fold=\"20\">`\n */\nexport class KdData extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n fold: { type: Number },\n };\n static override styles = [\n base,\n css`\n pre {\n margin: 0;\n font-family: var(--kd-font-mono, monospace);\n font-size: 12px;\n line-height: 1.5;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n }\n .key {\n color: color-mix(in srgb, var(--kd-info, currentColor) 75%, var(--kd-text, currentColor));\n }\n .str {\n color: color-mix(in srgb, var(--kd-success, currentColor) 70%, var(--kd-text, currentColor));\n }\n .num {\n color: color-mix(in srgb, var(--kd-warning, currentColor) 55%, var(--kd-text, currentColor));\n }\n .bool,\n .null {\n color: color-mix(in srgb, var(--kd-primary, currentColor) 70%, var(--kd-text, currentColor));\n }\n summary {\n width: max-content;\n color: var(--kd-text-2, inherit);\n font-family: var(--kd-font-mono, monospace);\n font-size: 12px;\n cursor: pointer;\n list-style: none;\n }\n summary::-webkit-details-marker {\n display: none;\n }\n summary::before {\n content: '▸ ';\n }\n details[open] > summary::before {\n content: '▾ ';\n }\n details > pre {\n margin-top: 2px;\n }\n `,\n ];\n\n declare data: unknown;\n declare fold: number;\n\n constructor() {\n super();\n this.fold = 10;\n }\n\n override render() {\n const value = this.data;\n if (value === undefined) return nothing;\n const lines = yamlLines(value);\n const pre = html`<pre>${lines.map(\n (line, i) =>\n html`${i ? '\\n' : ''}${line.prefix}${line.tokens.map((t) =>\n t.kind === 'plain' ? t.text : html`<span class=${t.kind}>${t.text}</span>`,\n )}`,\n )}</pre>`;\n if (!(this.fold > 0 && lines.length > this.fold && value !== null && typeof value === 'object')) return pre;\n const n = Object.keys(value).length;\n const summary = Array.isArray(value) ? `[ ] ${n} item${n === 1 ? '' : 's'}` : `{ } ${n} key${n === 1 ? '' : 's'}`;\n return html`<details><summary>${summary}</summary>${pre}</details>`;\n }\n}\n\ndefine('kd-data', KdData);\n","// Small pieces several elements share: tones, icons and link safety.\nimport { css, html, nothing, type TemplateResult } from 'lit';\n\n/** A semantic colour. Each maps to `--kd-<tone>`; neutral is the secondary text colour. */\nexport type Tone = 'primary' | 'success' | 'warning' | 'error' | 'info' | 'neutral';\n\nconst TONES = new Set<string>(['primary', 'success', 'warning', 'error', 'info', 'neutral']);\n\n/** `value` when it names a tone, else `fallback`. */\nexport function tone(value: unknown, fallback: Tone = 'neutral'): Tone {\n return typeof value === 'string' && TONES.has(value) ? (value as Tone) : fallback;\n}\n\n/**\n * Tone classes. Each sets `--tone` (the colour), `--tone-ink` (text in that\n * colour, pulled towards the text colour so it reads on either theme) and\n * `--tone-line` (a border in that colour).\n */\nexport const tones = css`\n .primary {\n --tone: var(--kd-primary, currentColor);\n }\n .success {\n --tone: var(--kd-success, currentColor);\n }\n .warning {\n --tone: var(--kd-warning, currentColor);\n }\n .error {\n --tone: var(--kd-error, currentColor);\n }\n .info {\n --tone: var(--kd-info, currentColor);\n }\n .primary,\n .success,\n .warning,\n .error,\n .info {\n --tone-ink: color-mix(in srgb, var(--tone) 75%, var(--kd-text, currentColor));\n --tone-line: color-mix(in srgb, var(--tone) 50%, transparent);\n }\n .neutral {\n --tone: var(--kd-text-2, currentColor);\n --tone-ink: var(--kd-text-2, currentColor);\n --tone-line: var(--kd-border-strong, currentColor);\n }\n`;\n\nconst IMAGE = /^(https?:|data:image\\/|\\/|\\.\\.?\\/)/i;\n\n/** An icon that is either an image URL or a short text such as an emoji. */\nexport function renderIcon(value: string | null | undefined, cls = 'icon'): TemplateResult | typeof nothing {\n if (!value) return nothing;\n return IMAGE.test(value) ? html`<img class=${cls} src=${value} alt=\"\" />` : html`<span class=${cls}>${value}</span>`;\n}\n\n/** `href` unless it is a script or data URL, which data must never smuggle into a link. */\nexport function safeHref(href: string | null | undefined): string | undefined {\n if (href == null || href === '') return undefined;\n return /^\\s*(javascript|vbscript|data):/i.test(href) ? undefined : href;\n}\n","import { css, html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\nimport { renderIcon, safeHref } from '../parts';\n\n/** Dashboard variables, without the `var-` prefix (one is added when missing). A list repeats the variable. */\nexport type Vars = Record<string, string | number | boolean | null | undefined | readonly (string | number | boolean)[]>;\n\nexport interface LinkData {\n /** A dashboard uid (optionally `uid/slug`, optionally followed by `?query`, as a `back` value is). */\n dashboard?: string;\n /** A plain URL, used when there is no `dashboard`. */\n href?: string;\n vars?: Vars;\n text?: string;\n /** An image URL or an emoji. */\n icon?: string;\n /** Tooltip. */\n title?: string;\n /** Pass this dashboard and its variables as `var-back`, so the target can link back. */\n back?: boolean;\n}\n\ninterface Here {\n /** Grafana's sub-path, the part of the path before `/d/`. */\n prefix: string;\n uid?: string;\n params: URLSearchParams;\n}\n\n// The current dashboard, read from the page URL. Outside a dashboard (or\n// outside Grafana) there is no uid and no time range to keep.\nfunction here(win: Window | null | undefined): Here {\n try {\n const loc = win?.location;\n const m = /^(.*?)\\/d\\/([^/?#]+)/.exec(loc?.pathname ?? '');\n return {\n prefix: m?.[1] ?? '',\n uid: m ? decodeURIComponent(m[2]) : undefined,\n params: new URLSearchParams(loc?.search ?? ''),\n };\n } catch {\n return { prefix: '', params: new URLSearchParams() };\n }\n}\n\n/**\n * The URL a link goes to: `<sub-path>/d/<dashboard>?var-k=v…` keeping the\n * current `from`/`to`, plus `var-back=<this uid>?<this page's var-* query>`\n * when `back` is set; or the plain `href`. Undefined when there is neither.\n */\nexport function linkUrl(link: LinkData, win?: Window | null): string | undefined {\n if (!link.dashboard) return safeHref(link.href);\n const at = here(win);\n const cut = link.dashboard.indexOf('?');\n const path = cut < 0 ? link.dashboard : link.dashboard.slice(0, cut);\n const params = new URLSearchParams(cut < 0 ? '' : link.dashboard.slice(cut + 1));\n for (const [name, value] of Object.entries(link.vars ?? {})) {\n if (value === null || value === undefined) continue;\n const key = name.startsWith('var-') ? name : `var-${name}`;\n params.delete(key);\n for (const v of Array.isArray(value) ? value : [value]) params.append(key, String(v));\n }\n for (const name of ['from', 'to']) {\n const value = at.params.get(name);\n if (value !== null && !params.has(name)) params.set(name, value);\n }\n if (link.back && at.uid) {\n const vars = new URLSearchParams([...at.params].filter(([k]) => k.startsWith('var-'))).toString();\n params.set('var-back', vars ? `${at.uid}?${vars}` : at.uid);\n }\n const query = params.toString();\n return `${at.prefix}/d/${path}${query ? `?${query}` : ''}`;\n}\n\ninterface Runtime {\n locationService?: { push(to: string): void };\n}\ntype GrafanaWindow = Window & { System?: { import?(id: string): Promise<unknown> } };\n\nconst runtimes = new WeakMap<Window, Runtime | null>();\n\n// Grafana turns clicks on its own links into in-app navigation, but it finds\n// the anchor from the event target, which a shadow root retargets to the host.\n// So a kd-link does it itself, through the same location service; until the\n// runtime has loaded (or outside Grafana) the browser simply follows the link.\nfunction preload(win: GrafanaWindow | null | undefined): void {\n if (!win || runtimes.has(win) || !win.System?.import) return;\n runtimes.set(win, null);\n win.System.import('@grafana/runtime').then(\n (rt) => runtimes.set(win, rt as Runtime),\n () => {},\n );\n}\n\nfunction navigate(win: Window | null | undefined, url: string, event: MouseEvent): void {\n if (!win || event.defaultPrevented || event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n const service = runtimes.get(win)?.locationService;\n if (!service) return;\n const to = new URL(url, win.location.href);\n if (to.origin !== win.location.origin) return;\n const { prefix } = here(win);\n const path = prefix && to.pathname.startsWith(prefix) ? to.pathname.slice(prefix.length) : to.pathname;\n event.preventDefault();\n service.push(path + to.search + to.hash);\n}\n\n/**\n * A link to a dashboard (or any URL) with an optional icon. Set `data`, or the\n * attributes of the same names (`vars` as JSON, `back` as a boolean). Without\n * `text`, the slot is the label.\n *\n * `<kd-link dashboard=\"k8s-pod\" vars='{\"pod\":\"web-0\"}' back>web-0</kd-link>`\n */\nexport class KdLink extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n dashboard: {},\n href: {},\n vars: { converter: json },\n text: {},\n icon: {},\n back: { type: Boolean },\n };\n static override styles = [\n base,\n css`\n :host {\n display: inline;\n }\n /* One line: a long name ends in an ellipsis with the full text on hover.\n A table caps links with --kd-link-max, since 100% means nothing to an\n auto-layout column. */\n a,\n span.link {\n display: inline-flex;\n align-items: baseline;\n max-width: var(--kd-link-max, 100%);\n min-width: 0;\n vertical-align: bottom;\n }\n .text {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n a {\n color: var(--kd-link, inherit);\n text-decoration: none;\n }\n a:hover {\n text-decoration: underline;\n }\n .icon {\n width: 16px;\n height: 16px;\n margin-right: 4px;\n vertical-align: -3px;\n }\n `,\n ];\n\n declare data: LinkData | undefined;\n declare dashboard: string | undefined;\n declare href: string | undefined;\n declare vars: Vars | undefined;\n declare text: string | undefined;\n declare icon: string | undefined;\n declare back: boolean | undefined;\n\n /** The link, `data` taking precedence over the attributes field by field. */\n get link(): LinkData {\n const d = this.data ?? {};\n return {\n dashboard: d.dashboard ?? this.dashboard,\n href: d.href ?? this.href,\n vars: d.vars ?? this.vars,\n text: d.text ?? this.text,\n icon: d.icon ?? this.icon,\n title: d.title,\n back: d.back ?? this.back,\n };\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n preload(this.ownerDocument?.defaultView);\n }\n\n // Variables can change without the panel re-rendering this element, so the\n // URL is rebuilt when the pointer or focus arrives and again on the click.\n #refresh = () => this.requestUpdate();\n\n #click = (event: MouseEvent) => {\n const win = this.ownerDocument?.defaultView;\n const url = linkUrl(this.link, win);\n if (url === undefined) return;\n (event.currentTarget as HTMLAnchorElement).setAttribute('href', url);\n navigate(win, url, event);\n };\n\n override render() {\n const link = this.link;\n const url = linkUrl(link, this.ownerDocument?.defaultView);\n // The text carries its full self on hover (it may be cut short); the link's\n // own title (a kind, say) shows over the icon.\n const body = html`${renderIcon(link.icon)}<span class=\"text\" title=${ifDefined(link.text)}\n ><slot>${link.text ?? ''}</slot></span\n >`;\n const title = link.title ?? link.text;\n if (url === undefined) return html`<span class=\"link\" title=${ifDefined(title)}>${body}</span>`;\n return html`<a\n href=${url}\n title=${ifDefined(title)}\n @click=${this.#click}\n @mouseenter=${this.#refresh}\n @focus=${this.#refresh}\n >${body}</a\n >`;\n }\n}\n\ndefine('kd-link', KdLink);\n","import { css, html } from 'lit';\n\nimport { define } from '../define';\nimport { KdElement, base } from '../element';\nimport { tone, tones, type Tone } from '../parts';\n\n/**\n * A pill or badge. The slot is its text; `title` is the native tooltip.\n *\n * `<kd-pill tone=\"success\" title=\"all containers ready\">Running</kd-pill>`\n */\nexport class KdPill extends KdElement {\n static override properties = { tone: {} };\n static override styles = [\n base,\n tones,\n css`\n :host {\n display: inline-block;\n margin: 1px 4px 1px 0;\n vertical-align: baseline;\n }\n span {\n display: inline-block;\n padding: 0 8px;\n border: 1px solid var(--tone-line);\n border-radius: 10px;\n background: color-mix(in srgb, var(--tone) 14%, transparent);\n color: var(--tone-ink);\n font-size: 11px;\n line-height: 18px;\n white-space: nowrap;\n }\n `,\n ];\n\n declare tone: Tone | undefined;\n\n override render() {\n return html`<span class=${tone(this.tone)}><slot></slot></span>`;\n }\n}\n\ndefine('kd-pill', KdPill);\n","// What a sheet value or a table cell may be, and how each shape renders.\nimport { css, html, nothing, type TemplateResult } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport './elements/data';\nimport './elements/link';\nimport './elements/pill';\nimport type { Vars } from './elements/link';\nimport type { Tone } from './parts';\n\nexport type { Tone };\n\n/** A pill: `<kd-pill>`. */\nexport interface PillCell {\n text: string;\n tone?: Tone;\n title?: string;\n}\n\n/** A plain link: `<kd-link>` with an `href`. */\nexport interface HrefCell {\n href: string;\n text: string;\n icon?: string;\n title?: string;\n}\n\n/** A dashboard link: `<kd-link>`. */\nexport interface DashboardCell {\n dashboard: string;\n vars?: Vars;\n text: string;\n icon?: string;\n title?: string;\n back?: boolean;\n}\n\n/** Any JSON value as YAML: `<kd-data>`. */\nexport interface DataCell {\n data: unknown;\n}\n\n/** Monospace text. */\nexport interface CodeCell {\n code: string;\n}\n\n/** A scalar is text; an array renders its cells inline, wrapped. */\nexport type Cell =\n | string\n | number\n | boolean\n | null\n | undefined\n | PillCell\n | HrefCell\n | DashboardCell\n | DataCell\n | CodeCell\n | Cell[];\n\n/** Whether a cell has nothing to show. */\nexport function isEmpty(cell: Cell): boolean {\n return cell === null || cell === undefined || cell === '' || (Array.isArray(cell) && cell.every(isEmpty));\n}\n\n/** One cell. An object of no known shape is shown as data. */\nexport function renderCell(cell: Cell): TemplateResult | string | typeof nothing {\n if (cell === null || cell === undefined) return nothing;\n if (Array.isArray(cell)) {\n return html`<span class=\"cells\">${cell.filter((c) => !isEmpty(c)).map((c) => html`<span>${renderCell(c)}</span>`)}</span>`;\n }\n if (typeof cell !== 'object') return String(cell);\n if ('dashboard' in cell || 'href' in cell) return html`<kd-link .data=${cell}></kd-link>`;\n if ('data' in cell) return html`<kd-data .data=${cell.data}></kd-data>`;\n if ('code' in cell) return html`<code>${String(cell.code)}</code>`;\n if ('text' in cell) {\n return html`<kd-pill tone=${ifDefined(cell.tone)} title=${ifDefined(cell.title)}>${String(cell.text)}</kd-pill>`;\n }\n return html`<kd-data .data=${cell}></kd-data>`;\n}\n\n/** Styles an element that renders cells adds to its own. */\nexport const cellStyles = css`\n .cells {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 2px 6px;\n }\n code {\n font-family: var(--kd-font-mono, monospace);\n font-size: 12px;\n overflow-wrap: anywhere;\n }\n`;\n","import { css, html, nothing } from 'lit';\n\nimport { cellStyles, isEmpty, renderCell, type Cell } from '../cell';\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\nimport { renderIcon } from '../parts';\n\nexport interface BarData {\n /** An image URL or an emoji. */\n icon?: string;\n /** The line above the title, e.g. the kind and namespace. */\n eyebrow?: Cell;\n title: string;\n /** Pills beside the title. */\n chips?: Cell[];\n /** A breadcrumb at the far end, e.g. the owner chain. */\n chain?: Cell[];\n}\n\n/**\n * A title bar or masthead.\n *\n * `el.data = { icon: '🐘', eyebrow: 'StatefulSet', title: 'postgresql', chips: [{ text: '1/1', tone: 'success' }] }`\n */\nexport class KdBar extends KdElement {\n static override properties = { data: { attribute: 'data', converter: json } };\n static override styles = [\n base,\n cellStyles,\n css`\n .bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px 16px;\n padding: 0 4px;\n }\n img.icon {\n width: 42px;\n height: 42px;\n }\n span.icon {\n font-size: 34px;\n line-height: 1;\n }\n .eyebrow {\n color: var(--kd-text-2, inherit);\n font-size: 11px;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n }\n .title {\n font-size: 22px;\n font-weight: 500;\n line-height: 1.2;\n overflow-wrap: anywhere;\n }\n .grow {\n flex: 1;\n }\n .chain {\n font-size: 13px;\n }\n .sep {\n margin: 0 6px;\n color: var(--kd-text-dim, inherit);\n }\n `,\n ];\n\n declare data: BarData | undefined;\n\n override render() {\n const d = this.data;\n if (!d) return nothing;\n const chips = (d.chips ?? []).filter((c) => !isEmpty(c));\n const chain = (d.chain ?? []).filter((c) => !isEmpty(c));\n return html`<div class=\"bar\">\n ${renderIcon(d.icon)}\n <div class=\"id\">\n ${isEmpty(d.eyebrow) ? nothing : html`<div class=\"eyebrow\">${renderCell(d.eyebrow)}</div>`}\n <div class=\"title\">${d.title ?? ''}</div>\n </div>\n ${chips.length ? html`<div class=\"chips\">${chips.map((c) => renderCell(c))}</div>` : nothing}\n <div class=\"grow\"></div>\n ${chain.length\n ? html`<nav class=\"chain\">\n ${chain.map((c, i) => html`${i ? html`<span class=\"sep\">›</span>` : nothing}${renderCell(c)}`)}\n </nav>`\n : nothing}\n </div>`;\n }\n}\n\ndefine('kd-bar', KdBar);\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{nothing as t,noChange as i}from\"../lit-html.js\";import{directive as r,Directive as s,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends s{constructor(i){if(super(i),this.it=t,i.type!==n.CHILD)throw Error(this.constructor.directiveName+\"() can only be used in child bindings\")}render(r){if(r===t||null==r)return this._t=void 0,this.it=r;if(r===i)return r;if(\"string\"!=typeof r)throw Error(this.constructor.directiveName+\"() called with a non-string value\");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName=\"unsafeHTML\",e.resultType=1;const o=r(e);export{e as UnsafeHTMLDirective,o as unsafeHTML};\n//# sourceMappingURL=unsafe-html.js.map\n","import { css, html, nothing, type PropertyValues } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\n\nimport { define } from '../define';\nimport { KdElement, base } from '../element';\nimport type { Highlighted } from '../highlight';\n\n/** The highlighter, loaded on first use: language lookup by name or file name, and `highlight()`. */\nexport const highlighter = () => import('../highlight');\n\n// Past either limit a file shows as plain text. highlight.js itself takes\n// 25-50 ms on 200 KB of JSON or JavaScript (Node, 2026-10-08), but its markup\n// is 2-5x the text and every token is a DOM node, so the page, not the\n// highlighter, is what stalls on a bigger file.\nconst MAX_CHARS = 256 * 1024;\nconst MAX_LINES = 10_000;\n\n/** A boolean attribute that can also be switched off: `lines=\"false\"`. */\nconst flag = {\n fromAttribute: (value: string | null) => value !== null && value !== 'false' && value !== '0',\n toAttribute: (value: boolean) => (value ? '' : 'false'),\n};\n\n/** Line numbers from `\"3,7-9\"` (or `\"L3-L9\"`) or `[3, 7, 8, 9]`. */\nexport function lineSet(value: string | number | number[] | null | undefined): Set<number> {\n const out = new Set<number>();\n if (Array.isArray(value) || typeof value === 'number') {\n for (const n of [value].flat()) if (Number.isInteger(n)) out.add(n);\n return out;\n }\n for (const part of String(value ?? '').split(',')) {\n const m = /^\\s*L?(\\d+)\\s*(?:-\\s*L?(\\d+)\\s*)?$/i.exec(part);\n if (!m) continue;\n const a = Number(m[1]);\n const b = m[2] ? Number(m[2]) : a;\n for (let n = Math.min(a, b); n <= Math.max(a, b) && out.size < MAX_LINES; n++) out.add(n);\n }\n return out;\n}\n\n// Newlines as \\n, and no last empty line for the file's final newline.\nconst normal = (text: string) => text.replace(/\\r\\n?/g, '\\n').replace(/\\n$/, '');\n\n/**\n * Source code with syntax colours from highlight.js, themed from `--kd-*`.\n * The language comes from `language` (a name or alias: `yaml`, `js`) or else\n * from `filename`; only that language's chunk loads, and an unknown one shows\n * as plain text. So does a file past 256 KB or 10,000 lines.\n *\n * `<kd-code filename=\"deploy.yaml\" highlight=\"3,7-9\"></kd-code>` with `text`\n * set from afterRender.\n */\nexport class KdCode extends KdElement {\n static override properties = {\n text: {},\n language: {},\n filename: {},\n lines: { converter: flag },\n wrap: { converter: flag },\n highlight: {},\n start: { type: Number },\n };\n static override styles = [\n base,\n css`\n :host {\n position: relative;\n }\n pre {\n margin: 0;\n padding: 8px 0;\n border: 1px solid var(--kd-border, transparent);\n border-radius: var(--kd-radius, 4px);\n background: var(--kd-canvas, transparent);\n font-family: var(--kd-font-mono, monospace);\n font-size: 12.5px;\n line-height: 1.5;\n tab-size: 4;\n overflow: auto;\n }\n code {\n display: block;\n min-width: max-content;\n font: inherit;\n }\n .wrap code {\n min-width: 0;\n }\n .line {\n display: block;\n min-height: 1.5em;\n padding: 0 12px;\n white-space: pre;\n }\n .wrap .line {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n }\n .numbered .line {\n position: relative;\n padding-left: calc(var(--gutter) + 28px);\n }\n .numbered .line::before {\n position: absolute;\n left: 0;\n width: calc(var(--gutter) + 12px);\n color: var(--kd-text-dim, inherit);\n text-align: right;\n counter-increment: line;\n content: counter(line);\n user-select: none;\n }\n .hl {\n background: color-mix(in srgb, var(--kd-warning, transparent) 16%, transparent);\n box-shadow: inset 2px 0 var(--kd-warning, currentColor);\n }\n /* Above the numbered lines, which are positioned too and come later. */\n .tools {\n position: absolute;\n z-index: 1;\n top: 5px;\n right: 5px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 2px;\n border-radius: var(--kd-radius, 4px);\n background: color-mix(in srgb, var(--kd-bg-2, transparent) 85%, var(--kd-bg, transparent));\n opacity: 0;\n transition: opacity 0.15s;\n }\n :host(:hover) .tools,\n .tools:focus-within {\n opacity: 1;\n }\n .lang {\n margin-right: 2px;\n color: var(--kd-text-dim, inherit);\n font-size: 11px;\n }\n button {\n padding: 1px 7px;\n border: 1px solid var(--kd-border, transparent);\n border-radius: var(--kd-radius, 4px);\n background: var(--kd-bg-2, transparent);\n color: var(--kd-text-2, inherit);\n font: inherit;\n font-size: 11px;\n cursor: pointer;\n }\n button:hover,\n button[aria-pressed='true'] {\n border-color: var(--kd-border-strong, currentColor);\n color: var(--kd-text, inherit);\n }\n\n /* highlight.js scopes, onto the theme's tones as kd-data colours YAML */\n .hljs-keyword,\n .hljs-literal,\n .hljs-selector-tag,\n .hljs-name,\n .hljs-doctag {\n color: color-mix(in srgb, var(--kd-primary, currentColor) 75%, var(--kd-text, currentColor));\n }\n .hljs-string,\n .hljs-regexp,\n .hljs-char,\n .hljs-meta .hljs-string {\n color: color-mix(in srgb, var(--kd-success, currentColor) 70%, var(--kd-text, currentColor));\n }\n .hljs-number,\n .hljs-symbol,\n .hljs-bullet,\n .hljs-built_in,\n .hljs-type,\n .hljs-title.class_ {\n color: color-mix(in srgb, var(--kd-warning, currentColor) 60%, var(--kd-text, currentColor));\n }\n .hljs-title,\n .hljs-title.function_,\n .hljs-section {\n color: color-mix(in srgb, var(--kd-error, currentColor) 60%, var(--kd-text, currentColor));\n }\n .hljs-attr,\n .hljs-attribute,\n .hljs-property,\n .hljs-variable,\n .hljs-template-variable,\n .hljs-selector-attr,\n .hljs-selector-class,\n .hljs-selector-id,\n .hljs-selector-pseudo,\n .hljs-link {\n color: color-mix(in srgb, var(--kd-info, currentColor) 75%, var(--kd-text, currentColor));\n }\n .hljs-comment,\n .hljs-quote,\n .hljs-meta {\n color: var(--kd-text-dim, inherit);\n }\n .hljs-comment,\n .hljs-quote,\n .hljs-emphasis {\n font-style: italic;\n }\n .hljs-section,\n .hljs-strong {\n font-weight: 600;\n }\n .hljs-addition {\n background: color-mix(in srgb, var(--kd-success, transparent) 15%, transparent);\n color: color-mix(in srgb, var(--kd-success, currentColor) 70%, var(--kd-text, currentColor));\n }\n .hljs-deletion {\n background: color-mix(in srgb, var(--kd-error, transparent) 15%, transparent);\n color: color-mix(in srgb, var(--kd-error, currentColor) 70%, var(--kd-text, currentColor));\n }\n .hljs-subst,\n .hljs-params {\n color: inherit;\n }\n `,\n ];\n\n declare text: string | undefined;\n declare language: string | undefined;\n declare filename: string | undefined;\n declare lines: boolean;\n declare wrap: boolean;\n declare highlight: string | number[] | undefined;\n declare start: number;\n\n #key: string | undefined;\n #result: Highlighted | null = null;\n #pending: Promise<void> | undefined;\n #copied: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n super();\n this.lines = true;\n this.wrap = false;\n this.start = 1;\n }\n\n /** Also waits for the highlighting, so a test or a probe sees the coloured result. */\n protected override async getUpdateComplete(): Promise<boolean> {\n let done = await super.getUpdateComplete();\n while (this.#pending) {\n await this.#pending;\n done = await super.getUpdateComplete();\n }\n return done;\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (!changed.has('text') && !changed.has('language') && !changed.has('filename')) return;\n const text = typeof this.text === 'string' ? normal(this.text) : '';\n const { language, filename } = this;\n const key = JSON.stringify([text, language, filename]);\n if (key === this.#key) return;\n this.#key = key;\n this.#result = null;\n this.#pending = undefined;\n if (!text || (!language && !filename) || text.length > MAX_CHARS || text.split('\\n').length > MAX_LINES) return;\n this.#pending = highlighter()\n .then((m) => {\n const lang = m.languageOf(language) ?? m.languageOfFile(filename);\n return lang ? m.highlight(text, lang) : null;\n })\n .catch(() => null)\n .then((result) => {\n if (key !== this.#key) return;\n this.#result = result;\n this.#pending = undefined;\n this.requestUpdate();\n });\n }\n\n async #copy(): Promise<void> {\n const clipboard = this.ownerDocument.defaultView?.navigator?.clipboard;\n if (!clipboard || typeof this.text !== 'string') return;\n try {\n await clipboard.writeText(this.text);\n } catch {\n return;\n }\n clearTimeout(this.#copied);\n this.#copied = setTimeout(() => {\n this.#copied = undefined;\n this.requestUpdate();\n }, 1500);\n this.requestUpdate();\n }\n\n override render() {\n if (typeof this.text !== 'string') return nothing;\n const result = this.#result;\n const lines = result ? result.lines : normal(this.text).split('\\n');\n const start = Number.isFinite(this.start) ? Math.trunc(this.start) : 1;\n const marks = lineSet(this.highlight);\n const cls = (i: number) => (marks.has(start + i) ? 'line hl' : 'line');\n // highlight.js's lines are its own escaped markup (see splitLines); plain\n // text goes through Lit as text.\n const body = result\n ? unsafeHTML(lines.map((line, i) => `<span class=\"${cls(i)}\">${line}</span>`).join(''))\n : lines.map((line, i) => html`<span class=${cls(i)}>${line}</span>`);\n const gutter = String(start + lines.length - 1).length;\n const pre = [this.lines ? 'numbered' : '', this.wrap ? 'wrap' : ''].join(' ');\n return html`<div class=\"tools\">\n ${result ? html`<span class=\"lang\">${result.name}</span>` : nothing}\n <button type=\"button\" aria-pressed=${this.wrap ? 'true' : 'false'} @click=${() => (this.wrap = !this.wrap)}>\n Wrap\n </button>\n <button type=\"button\" @click=${() => this.#copy()}>${this.#copied ? 'Copied' : 'Copy'}</button>\n </div>\n <pre class=${pre} style=\"counter-reset: line ${start - 1}; --gutter: ${gutter}ch\"><code>${body}</code></pre>`;\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n clearTimeout(this.#copied);\n this.#copied = undefined;\n }\n}\n\ndefine('kd-code', KdCode);\n","import { css, html, nothing } from 'lit';\n\nimport './data';\nimport './pill';\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\n\n/** A string map, such as labels or annotations. */\nexport type GroupsData = Record<string, string>;\n\ninterface Group {\n prefix: string;\n entries: { key: string; name: string; value: string }[];\n}\n\n// Grouped by the prefix before \"/\"; unprefixed keys first, then by prefix.\nfunction group(data: GroupsData): Group[] {\n const groups = new Map<string, Group>();\n for (const [key, raw] of Object.entries(data)) {\n const cut = key.indexOf('/');\n const prefix = cut < 0 ? '' : key.slice(0, cut);\n const value = raw === null || raw === undefined ? '' : typeof raw === 'string' ? raw : JSON.stringify(raw);\n let g = groups.get(prefix);\n if (!g) groups.set(prefix, (g = { prefix, entries: [] }));\n g.entries.push({ key, name: key.slice(cut + 1), value });\n }\n return [...groups.values()].sort((a, b) => (a.prefix < b.prefix ? -1 : a.prefix > b.prefix ? 1 : 0));\n}\n\n/** A value that is a JSON object or array, parsed; undefined for anything else. */\nexport function jsonValue(value: string): object | undefined {\n if (!/^\\s*[[{]/.test(value)) return undefined;\n try {\n const parsed: unknown = JSON.parse(value);\n return parsed !== null && typeof parsed === 'object' ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nconst CLIP = 600;\n\n/**\n * A string map grouped by key prefix: as pills (`mode=\"pills\"`, the default,\n * for labels) or as a key/value tree (`mode=\"tree\"`, for annotations, where a\n * value holding a JSON object or array is shown as folded YAML).\n *\n * `<kd-groups mode=\"tree\" data=\"{{kdjson metadata.annotations}}\">`\n */\nexport class KdGroups extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n mode: {},\n };\n static override styles = [\n base,\n css`\n .group + .group {\n margin-top: 12px;\n }\n div.head,\n tr.head td {\n padding-bottom: 3px;\n border-bottom: 1px solid var(--kd-border, transparent);\n color: var(--kd-text-2, inherit);\n font-family: var(--kd-font-mono, monospace);\n font-size: 11px;\n }\n div.head {\n margin-bottom: 6px;\n }\n table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n td {\n padding: 2px 12px 2px 0;\n vertical-align: top;\n }\n tr.head td {\n padding-top: 12px;\n }\n tr.head:first-child td {\n padding-top: 0;\n }\n tr.head + tr td {\n padding-top: 6px;\n }\n .k {\n white-space: nowrap;\n }\n code {\n font-family: var(--kd-font-mono, monospace);\n font-size: 12px;\n }\n .twig {\n margin: 0 8px 0 4px;\n color: var(--kd-text-dim, inherit);\n font-family: var(--kd-font-mono, monospace);\n }\n .v {\n width: 100%;\n color: color-mix(in srgb, var(--kd-success, currentColor) 70%, var(--kd-text, currentColor));\n font-family: var(--kd-font-mono, monospace);\n font-size: 12px;\n overflow-wrap: anywhere;\n word-break: break-word;\n }\n .none {\n padding: 8px 0;\n color: var(--kd-text-dim, inherit);\n }\n `,\n ];\n\n declare data: GroupsData | undefined;\n declare mode: 'pills' | 'tree' | undefined;\n\n override render() {\n const d = this.data;\n if (!d || typeof d !== 'object') return nothing;\n const groups = group(d);\n if (!groups.length) return html`<div class=\"none\">none</div>`;\n return this.mode === 'tree' ? this.#tree(groups) : this.#pills(groups);\n }\n\n #pills(groups: Group[]) {\n return groups.map(\n (g) => html`<div class=\"group\">\n ${g.prefix ? html`<div class=\"head\">${g.prefix}</div>` : nothing}\n <div>\n ${g.entries.map(\n (e) => html`<kd-pill tone=\"info\" title=${e.key}>${e.value === '' ? e.name : `${e.name}=${e.value}`}</kd-pill>`,\n )}\n </div>\n </div>`,\n );\n }\n\n #tree(groups: Group[]) {\n return html`<table>\n <tbody>\n ${groups.map(\n (g) => html`${g.prefix ? html`<tr class=\"head\"><td colspan=\"2\">${g.prefix}</td></tr>` : nothing}\n ${g.entries.map((e, i) => {\n const parsed = jsonValue(e.value);\n return html`<tr>\n <td class=\"k\">\n ${g.prefix ? html`<span class=\"twig\">${i === g.entries.length - 1 ? '└' : '├'}</span>` : nothing}<code\n >${e.name}</code\n >\n </td>\n <td class=\"v\">\n ${parsed\n ? html`<kd-data .data=${parsed}></kd-data>`\n : e.value.length > CLIP\n ? `${e.value.slice(0, CLIP)} …`\n : e.value}\n </td>\n </tr>`;\n })}`,\n )}\n </tbody>\n </table>`;\n }\n}\n\ndefine('kd-groups', KdGroups);\n","import { css, html, nothing, type PropertyValues } from 'lit';\n\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\nimport { safeHref } from '../parts';\nimport './code';\nimport type { KdCode } from './code';\n\n/** URL prefixes that relative links and images in the document resolve against. */\nexport interface MarkdownBase {\n links?: string;\n images?: string;\n}\n\ntype Purify = typeof import('dompurify').default;\ntype Marked = import('marked').Marked;\n\n// marked and DOMPurify each load once, on the first document, as their own chunks.\nlet parser: Promise<Marked> | undefined;\nconst purifiers = new WeakMap<Window, Promise<Purify>>();\n\nfunction markdownParser(): Promise<Marked> {\n parser ??= import('marked').then((m) => new m.Marked({ gfm: true }));\n return parser;\n}\n\nfunction purifier(view: Window): Promise<Purify> {\n let found = purifiers.get(view);\n if (!found) {\n found = import('dompurify').then((m) => m.default(view as unknown as Parameters<Purify>[0]));\n purifiers.set(view, found);\n }\n return found;\n}\n\n// What DOMPurify keeps is HTML only (no SVG or MathML), without scripts and\n// event handlers (its defaults), and without the tags and the style attribute\n// that would let a document restyle or cover the panel, or post a form.\nconst SANITIZE = {\n USE_PROFILES: { html: true },\n FORBID_TAGS: ['style', 'form', 'button', 'textarea', 'select', 'option', 'dialog', 'iframe', 'frame', 'object', 'embed'],\n FORBID_ATTR: ['style', 'action', 'formaction'],\n RETURN_DOM_FRAGMENT: true as const,\n};\n\nconst UNSAFE_TAGS = new Set([\n ...SANITIZE.FORBID_TAGS,\n 'script', 'noscript', 'template', 'svg', 'math', 'link', 'meta', 'base', 'frameset', 'applet', 'portal',\n]);\nconst URL_ATTRS = new Set(['href', 'src', 'srcset', 'action', 'formaction', 'poster', 'background', 'cite', 'data', 'xlink:href']);\n\n/**\n * A second pass over DOMPurify's output, which must already be clean: drops\n * any script-capable tag, event handler, style or script URL left in `root`.\n * It costs one walk, and it holds where DOMPurify cannot run properly (happy-dom,\n * whose NodeIterator loses its place on a removal, makes DOMPurify return\n * scripts untouched).\n */\nexport function scrub(root: Element | DocumentFragment): void {\n for (const el of [...root.querySelectorAll('*')]) {\n if (UNSAFE_TAGS.has(el.localName)) {\n el.remove();\n continue;\n }\n for (const { name, value } of [...el.attributes]) {\n const lower = name.toLowerCase();\n if (lower.startsWith('on') || lower === 'style' || lower === 'srcdoc') el.removeAttribute(name);\n else if (URL_ATTRS.has(lower) && /(^|,)\\s*(javascript|vbscript|data):/i.test(value.replace(/[\\0-\\x20]/g, ''))) {\n if (!(lower === 'src' && el.localName === 'img' && /^\\s*data:image\\/(png|gif|jpe?g|webp);/i.test(value))) {\n el.removeAttribute(name);\n }\n }\n }\n }\n}\n\n// Already absolute, protocol-relative or an in-page anchor.\nconst ABSOLUTE = /^([a-z][a-z\\d+.-]*:|\\/\\/|#)/i;\n\n/**\n * `url` resolved against `base`, a URL prefix: `docs/a.md` and `/docs/a.md`\n * both land under it. Without a prefix, a document fetched from `from`\n * resolves the usual web way, against its own URL.\n */\nexport function rebase(url: string, base: string | undefined, from?: string): string {\n if ((!base && !from) || ABSOLUTE.test(url.trim())) return url;\n try {\n if (!base) return new URL(url, from).href;\n return new URL(url.replace(/^\\/+/, ''), base.endsWith('/') ? base : `${base}/`).href;\n } catch {\n return url;\n }\n}\n\n/** GitHub's heading anchor: lower case, punctuation dropped, spaces to dashes. */\nexport function slug(text: string): string {\n return text\n .trim()\n .toLowerCase()\n .replace(/[^\\p{L}\\p{M}\\p{N}\\s_-]/gu, '')\n .replace(/\\s/g, '-');\n}\n\n/**\n * Markdown, GitHub-flavoured (tables, task lists, autolinks), rendered by\n * marked and sanitised by DOMPurify before it reaches the shadow root. Code\n * fences render through `kd-code`; headings get anchors; links open in a new\n * tab. Relative links and images resolve against `base` (URL prefixes), or,\n * for a document fetched from `src`, against that URL.\n *\n * `<kd-markdown src=\"https://…/README.md\"></kd-markdown>`, or `markdown` and\n * `base` set from afterRender.\n */\nexport class KdMarkdown extends KdElement {\n static override properties = {\n markdown: {},\n src: {},\n base: { converter: json },\n };\n static override styles = [\n base,\n css`\n .doc {\n font-size: 14px;\n line-height: 1.65;\n overflow-wrap: break-word;\n }\n .doc > :first-child {\n margin-top: 0;\n }\n .doc > :last-child {\n margin-bottom: 0;\n }\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin: 1.4em 0 0.6em;\n font-weight: 600;\n line-height: 1.25;\n }\n h1,\n h2 {\n padding-bottom: 0.3em;\n border-bottom: 1px solid var(--kd-border, transparent);\n }\n h1 {\n font-size: 1.9em;\n }\n h2 {\n font-size: 1.5em;\n }\n h3 {\n font-size: 1.2em;\n }\n h4 {\n font-size: 1em;\n }\n h5,\n h6 {\n font-size: 0.9em;\n }\n h6 {\n color: var(--kd-text-2, inherit);\n }\n p,\n ul,\n ol,\n dl,\n table,\n blockquote,\n details,\n kd-code {\n margin: 0 0 1em;\n }\n ul,\n ol {\n padding-left: 2em;\n }\n li + li,\n li > ul,\n li > ol {\n margin-top: 0.25em;\n }\n li > ul,\n li > ol {\n margin-bottom: 0;\n }\n li:has(> input[type='checkbox']) {\n list-style: none;\n }\n li > input[type='checkbox'] {\n margin: 0 0.4em 0.2em -1.5em;\n vertical-align: middle;\n }\n a {\n color: var(--kd-link, inherit);\n text-decoration: none;\n }\n a:hover {\n text-decoration: underline;\n }\n code {\n padding: 0.15em 0.35em;\n border-radius: var(--kd-radius, 4px);\n background: var(--kd-bg-2, transparent);\n font-family: var(--kd-font-mono, monospace);\n font-size: 85%;\n }\n pre {\n padding: 12px 14px;\n border: 1px solid var(--kd-border, transparent);\n border-radius: var(--kd-radius, 4px);\n background: var(--kd-canvas, transparent);\n overflow: auto;\n }\n pre code {\n padding: 0;\n background: none;\n font-size: 100%;\n }\n table {\n display: block;\n width: max-content;\n max-width: 100%;\n border-collapse: collapse;\n overflow: auto;\n }\n th,\n td {\n padding: 6px 13px;\n border: 1px solid var(--kd-border, transparent);\n }\n th {\n background: var(--kd-bg-2, transparent);\n font-weight: 600;\n }\n blockquote {\n padding: 0 1em;\n border-left: 4px solid var(--kd-border-strong, currentColor);\n color: var(--kd-text-2, inherit);\n }\n hr {\n height: 0;\n margin: 1.5em 0;\n border: 0;\n border-top: 1px solid var(--kd-border, transparent);\n }\n img {\n max-width: 100%;\n box-sizing: content-box;\n }\n summary {\n cursor: pointer;\n }\n .none {\n color: var(--kd-text-dim, inherit);\n }\n .raw {\n margin: 0;\n font-family: var(--kd-font-mono, monospace);\n font-size: 12.5px;\n white-space: pre-wrap;\n }\n `,\n ];\n\n declare markdown: string | undefined;\n declare src: string | undefined;\n declare base: MarkdownBase | undefined;\n\n #ticket = 0;\n #pending: Promise<void> | undefined;\n #doc: Node | undefined;\n\n /** Also waits for the document and the code in it to render. */\n protected override async getUpdateComplete(): Promise<boolean> {\n let done = await super.getUpdateComplete();\n while (this.#pending) {\n await this.#pending;\n done = await super.getUpdateComplete();\n }\n await Promise.all([...this.renderRoot.querySelectorAll<KdCode>('kd-code')].map((code) => code.updateComplete));\n return done;\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (!changed.has('markdown') && !changed.has('src') && !changed.has('base')) return;\n const ticket = ++this.#ticket;\n const { markdown, src } = this;\n const linkBase = this.base?.links;\n const imageBase = this.base?.images;\n const job = async (): Promise<Node | undefined> => {\n if (typeof markdown === 'string') return this.#render(markdown, linkBase, imageBase);\n if (!src) return undefined;\n const view = this.ownerDocument.defaultView;\n const url = new URL(src, this.ownerDocument.baseURI).href;\n try {\n const response = await (view?.fetch ?? fetch)(url);\n if (!response.ok) return this.#note(`${response.status} ${src}`);\n const text = await response.text();\n if (ticket !== this.#ticket) return undefined;\n return this.#render(text, linkBase, imageBase, url);\n } catch {\n return this.#note(src);\n }\n };\n this.#pending = job().then((doc) => {\n if (ticket !== this.#ticket) return;\n this.#doc = doc;\n this.#pending = undefined;\n this.requestUpdate();\n });\n }\n\n #note(text: string): Node {\n const p = this.ownerDocument.createElement('p');\n p.className = 'none';\n p.textContent = text;\n return p;\n }\n\n async #render(markdown: string, links?: string, images?: string, from?: string): Promise<Node> {\n const doc = this.ownerDocument;\n const view = doc.defaultView;\n try {\n if (!view) throw new Error('no window');\n const [marked, purify] = await Promise.all([markdownParser(), purifier(view)]);\n // A DOMPurify that cannot run in this window hands its input back untouched.\n if (!purify.isSupported) throw new Error('DOMPurify is not supported here');\n // The leading newline costs nothing in a browser; without it happy-dom,\n // which the tests run in, drops the document's first element.\n const fragment = purify.sanitize(`\\n${marked.parse(markdown, { async: false })}`, SANITIZE);\n const root = doc.createElement('div');\n root.className = 'doc';\n root.append(fragment);\n scrub(root);\n this.#finish(root, links, images, from);\n return root;\n } catch {\n // No renderer: the text itself, as text.\n const pre = doc.createElement('pre');\n pre.className = 'raw';\n pre.textContent = markdown;\n return pre;\n }\n }\n\n // Everything here works on the sanitised tree with DOM methods; nothing is\n // parsed as HTML again.\n #finish(root: HTMLElement, links?: string, images?: string, from?: string): void {\n const doc = this.ownerDocument;\n const ids = new Map<string, number>();\n for (const heading of root.querySelectorAll('h1, h2, h3, h4, h5, h6')) {\n if (heading.id) continue;\n const id = slug(heading.textContent ?? '') || 'section';\n const n = ids.get(id) ?? 0;\n ids.set(id, n + 1);\n heading.id = n ? `${id}-${n}` : id;\n }\n const url = (el: Element, attr: string, prefix: string | undefined) => {\n const value = rebase(el.getAttribute(attr) ?? '', prefix, from);\n if (safeHref(value)) el.setAttribute(attr, value);\n else el.removeAttribute(attr);\n };\n for (const a of root.querySelectorAll('a[href]')) {\n if (a.getAttribute('href')?.startsWith('#')) continue;\n url(a, 'href', links);\n a.setAttribute('target', '_blank');\n a.setAttribute('rel', 'noopener');\n }\n for (const img of root.querySelectorAll('img[src]')) url(img, 'src', images);\n for (const el of root.querySelectorAll('img[srcset], source[srcset]')) {\n const set = (el.getAttribute('srcset') ?? '')\n .split(',')\n .map((candidate) => {\n const [src, ...size] = candidate.trim().split(/\\s+/);\n return [rebase(src, images, from), ...size].join(' ');\n })\n .filter((candidate) => safeHref(candidate));\n el.setAttribute('srcset', set.join(', '));\n }\n for (const input of root.querySelectorAll('input')) {\n if (input.type === 'checkbox') input.disabled = true;\n else input.remove();\n }\n for (const code of root.querySelectorAll('pre > code')) {\n const pre = code.parentElement as HTMLElement;\n const block = doc.createElement('kd-code') as KdCode;\n block.text = (code.textContent ?? '').replace(/\\n$/, '');\n block.language = /(?:^|\\s)language-(\\S+)/.exec(code.className)?.[1];\n block.lines = false;\n pre.replaceWith(block);\n }\n }\n\n // An in-page anchor scrolls within the shadow root, where the page's own\n // fragment navigation cannot see.\n #click(event: MouseEvent): void {\n const a = (event.target as Element | null)?.closest?.('a[href^=\"#\"]');\n if (!a) return;\n let id = a.getAttribute('href')!.slice(1);\n try {\n id = decodeURIComponent(id);\n } catch {\n // as written\n }\n const target = (this.renderRoot as ShadowRoot).getElementById(id);\n if (!target) return;\n event.preventDefault();\n target.scrollIntoView({ block: 'start' });\n }\n\n override render() {\n return this.#doc ? html`<div @click=${(e: MouseEvent) => this.#click(e)}>${this.#doc}</div>` : nothing;\n }\n}\n\ndefine('kd-markdown', KdMarkdown);\n","import { css, html, type PropertyValues } from 'lit';\n\nimport { define } from '../define';\nimport { KdElement, base } from '../element';\n\n/**\n * A secret value, hidden until clicked. The value never reaches a tooltip, the\n * console or any other attribute, and the dots do not give away its length.\n *\n * `<kd-mask value=\"{{password}}\"></kd-mask>`\n */\nexport class KdMask extends KdElement {\n static override properties = { value: {}, shown: { state: true } };\n static override styles = [\n base,\n css`\n :host {\n display: inline-block;\n }\n button {\n padding: 0;\n border: none;\n background: none;\n color: inherit;\n font: inherit;\n cursor: pointer;\n }\n .dots {\n color: var(--kd-text-2, inherit);\n letter-spacing: 0.1em;\n }\n code {\n font-family: var(--kd-font-mono, monospace);\n font-size: 12px;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n user-select: all;\n }\n .hide {\n margin-left: 6px;\n color: var(--kd-text-dim, inherit);\n }\n `,\n ];\n\n declare value: string | undefined;\n declare shown: boolean;\n\n constructor() {\n super();\n this.shown = false;\n }\n\n // A new value starts hidden again.\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('value') && changed.get('value') !== undefined) this.shown = false;\n }\n\n override render() {\n if (!this.shown) {\n return html`<button type=\"button\" aria-label=\"show\" @click=${() => (this.shown = true)}>\n <span class=\"dots\">••••••••</span>\n </button>`;\n }\n return html`<code>${this.value ?? ''}</code\n ><button type=\"button\" class=\"hide\" aria-label=\"hide\" @click=${() => (this.shown = false)}>×</button>`;\n }\n}\n\ndefine('kd-mask', KdMask);\n","import{noChange as t}from\"../lit-html.js\";import{directive as e,Directive as r,PartType as s}from\"../directive.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const n=\"important\",i=\" !\"+n,o=e(class extends r{constructor(t){if(super(t),t.type!==s.ATTRIBUTE||\"style\"!==t.name||t.strings?.length>2)throw Error(\"The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.\")}render(t){return Object.keys(t).reduce((e,r)=>{const s=t[r];return null==s?e:e+`${r=r.includes(\"-\")?r:r.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,\"-$&\").toLowerCase()}:${s};`},\"\")}update(e,[r]){const{style:s}=e.element;if(void 0===this.ft)return this.ft=new Set(Object.keys(r)),this.render(r);for(const t of this.ft)null==r[t]&&(this.ft.delete(t),t.includes(\"-\")?s.removeProperty(t):s[t]=null);for(const t in r){const e=r[t];if(null!=e){this.ft.add(t);const r=\"string\"==typeof e&&e.endsWith(i);t.includes(\"-\")||r?s.setProperty(t,r?e.slice(0,-11):e,r?n:\"\"):s[t]=e}}return t}});export{o as styleMap};\n//# sourceMappingURL=style-map.js.map\n","import { css, html, nothing } from 'lit';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\nimport { tone, tones, type Tone } from '../parts';\n\nexport interface MeterMark {\n label: string;\n value: number;\n tone?: Tone;\n}\n\nexport interface MeterData {\n /** The measured value; null or missing shows only the marks. */\n value?: number | null;\n /** The full scale; defaults to the largest of the value and the marks. */\n max?: number;\n /** Appended to every number as is, e.g. `Mi`, `m` or ` cores`. */\n unit?: string;\n marks?: MeterMark[];\n}\n\nconst number = (n: number) => new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 }).format(n);\n\n/**\n * A value against request/limit-style marks. The fill takes the tone of the\n * highest toned mark it has reached, else primary.\n *\n * `el.data = { value: 412, unit: 'Mi', marks: [{ label: 'request', value: 256 }, { label: 'limit', value: 512, tone: 'error' }] }`\n */\nexport class KdMeter extends KdElement {\n static override properties = { data: { attribute: 'data', converter: json } };\n static override styles = [\n base,\n tones,\n css`\n .track {\n position: relative;\n height: 8px;\n margin: 6px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--kd-border-strong, currentColor) 35%, transparent);\n }\n .fill {\n height: 100%;\n border-radius: 4px;\n background: var(--tone);\n }\n .mark {\n position: absolute;\n top: -3px;\n bottom: -3px;\n width: 2px;\n background: var(--tone);\n box-shadow: 0 0 0 1px var(--kd-bg, transparent);\n }\n .legend {\n display: flex;\n flex-wrap: wrap;\n gap: 2px 20px;\n font-size: 12px;\n }\n .value {\n font-family: var(--kd-font-mono, monospace);\n font-size: 14px;\n }\n .legend .mark-label {\n color: var(--kd-text-2, inherit);\n }\n .legend .num {\n color: var(--tone-ink);\n font-family: var(--kd-font-mono, monospace);\n }\n .none {\n color: var(--kd-text-dim, inherit);\n }\n `,\n ];\n\n declare data: MeterData | undefined;\n\n override render() {\n const d = this.data;\n if (!d || typeof d !== 'object') return nothing;\n const value = typeof d.value === 'number' && Number.isFinite(d.value) ? d.value : undefined;\n const marks = (d.marks ?? []).filter((m) => m && Number.isFinite(m.value));\n const unit = d.unit ?? '';\n const largest = Math.max(value ?? 0, ...marks.map((m) => m.value));\n const scale = typeof d.max === 'number' && d.max > 0 ? d.max : largest > 0 ? largest : 1;\n // A mark's left edge moves from 0 to 100% - its width, so one at the maximum stays inside.\n const clamp = (f: number) => Math.min(1, Math.max(0, f));\n const at = (n: number) => `${Math.min(100, Math.max(0, (n / scale) * 100))}%`;\n const reached = value === undefined ? [] : marks.filter((m) => m.tone && value >= m.value);\n const fill = tone(reached.sort((a, b) => b.value - a.value)[0]?.tone, 'primary');\n return html`<div\n role=\"meter\"\n aria-valuemin=\"0\"\n aria-valuemax=${scale}\n aria-valuenow=${value ?? nothing}\n >\n <div class=\"track\">\n ${value === undefined ? nothing : html`<div class=\"fill ${fill}\" style=${styleMap({ width: at(value) })}></div>`}\n ${marks.map(\n (m) =>\n html`<div\n class=\"mark ${tone(m.tone)}\"\n style=${styleMap({ left: `calc(${at(m.value)} - ${clamp(m.value / scale) * 2}px)` })}\n title=\"${m.label} ${number(m.value)}${unit}\"\n ></div>`,\n )}\n </div>\n <div class=\"legend\">\n <span class=\"value ${value === undefined ? 'none' : ''}\">${value === undefined ? '–' : `${number(value)}${unit}`}</span>\n ${marks.map(\n (m) =>\n html`<span class=${tone(m.tone)}\n ><span class=\"mark-label\">${m.label}</span> <span class=\"num\">${number(m.value)}${unit}</span></span\n >`,\n )}\n </div>\n </div>`;\n }\n}\n\ndefine('kd-meter', KdMeter);\n","import { css, html, nothing } from 'lit';\n\nimport { cellStyles, isEmpty, renderCell, type Cell } from '../cell';\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\n\nexport interface SheetRow {\n key: string;\n value: Cell;\n}\n\n/** Rows in order, or a plain object (its keys in order). */\nexport type SheetData = SheetRow[] | Record<string, Cell>;\n\n/**\n * A two-column property sheet. A row whose value is empty is left out.\n *\n * `el.data = [{ key: 'Node', value: 'node-1' }, { key: 'Phase', value: { text: 'Running', tone: 'success' } }]`\n */\nexport class KdSheet extends KdElement {\n static override properties = { data: { attribute: 'data', converter: json } };\n static override styles = [\n base,\n cellStyles,\n css`\n dl {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n margin: 0;\n font-size: 13px;\n }\n dt,\n dd {\n margin: 0;\n padding: 5px 12px 5px 0;\n border-bottom: 1px solid var(--kd-border, transparent);\n }\n dt {\n color: var(--kd-text-2, inherit);\n }\n dd {\n overflow-wrap: anywhere;\n }\n `,\n ];\n\n declare data: SheetData | undefined;\n\n override render() {\n const d = this.data;\n if (!d || typeof d !== 'object') return nothing;\n const rows = Array.isArray(d) ? d : Object.entries(d).map(([key, value]) => ({ key, value }));\n return html`<dl>\n ${rows\n .filter((row) => row && !isEmpty(row.value))\n .map((row) => html`<dt>${row.key}</dt><dd>${renderCell(row.value)}</dd>`)}\n </dl>`;\n }\n}\n\ndefine('kd-sheet', KdSheet);\n","import { css, html, nothing } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\nimport { tone, tones, type Tone } from '../parts';\n\nexport type StepStatus = 'done' | 'active' | 'failed' | 'pending' | Tone;\n\nexport interface Step {\n label: string;\n status: StepStatus;\n time?: string;\n detail?: string;\n}\n\nconst STATUS: Record<string, Tone> = { done: 'success', active: 'primary', failed: 'error', pending: 'neutral' };\n\nfunction glyph(t: Tone, n: number): string {\n if (t === 'success') return '✓';\n if (t === 'error') return '✗';\n if (t === 'warning') return '!';\n return String(n);\n}\n\n/**\n * A stepper or state stripe: ordered steps, each with a status (a lifecycle\n * word or a tone), an optional time and a detail line.\n *\n * `el.data = [{ label: 'Scheduled', status: 'done', time: '2m' }, { label: 'Ready', status: 'failed', detail: 'probe failed' }]`\n */\nexport class KdSteps extends KdElement {\n static override properties = { data: { attribute: 'data', converter: json } };\n static override styles = [\n base,\n tones,\n css`\n ol {\n display: flex;\n margin: 0;\n padding: 0;\n list-style: none;\n }\n li {\n position: relative;\n flex: 1;\n min-width: 0;\n text-align: center;\n }\n li + li::before {\n content: '';\n position: absolute;\n top: 12px;\n right: 50%;\n width: 100%;\n height: 2px;\n background: var(--kd-border-strong, currentColor);\n opacity: 0.6;\n }\n li.reached::before {\n background: var(--tone);\n opacity: 1;\n }\n .dot {\n position: relative;\n z-index: 1;\n width: 26px;\n height: 26px;\n margin: 0 auto;\n border-radius: 50%;\n background: var(--tone);\n color: var(--kd-bg, inherit);\n font-size: 13px;\n font-weight: 700;\n line-height: 26px;\n }\n .neutral .dot {\n border: 2px solid var(--tone-line);\n background: var(--kd-bg, transparent);\n color: var(--kd-text-2, inherit);\n line-height: 22px;\n }\n .active .dot {\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--tone) 30%, transparent);\n }\n .label {\n margin-top: 4px;\n font-size: 12px;\n }\n .time,\n .detail {\n color: var(--kd-text-2, inherit);\n font-size: 11px;\n }\n .detail {\n display: -webkit-box;\n overflow: hidden;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow-wrap: anywhere;\n }\n `,\n ];\n\n declare data: Step[] | undefined;\n\n override render() {\n const steps = Array.isArray(this.data) ? this.data : [];\n if (!steps.length) return nothing;\n return html`<ol>\n ${steps.map((step, i) => {\n const t = tone(STATUS[step.status] ?? step.status);\n const reached = step.status === 'done' || step.status === 'success';\n const cls = `${t}${reached ? ' reached' : ''}${step.status === 'active' ? ' active' : ''}`;\n return html`<li class=${cls} title=${ifDefined(step.detail)}>\n <div class=\"dot\">${glyph(t, i + 1)}</div>\n <div class=\"label\">${step.label}</div>\n ${step.time ? html`<div class=\"time\">${step.time}</div>` : nothing}\n ${step.detail ? html`<div class=\"detail\">${step.detail}</div>` : nothing}\n </li>`;\n })}\n </ol>`;\n }\n}\n\ndefine('kd-steps', KdSteps);\n","import { css, html, nothing } from 'lit';\n\nimport { cellStyles, renderCell, type Cell } from '../cell';\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\n\nexport interface TableColumn {\n key: string;\n /** Defaults to the key. */\n label?: string;\n align?: 'left' | 'center' | 'right';\n /** Keep the cell on one line (counts, times, short pills). */\n nowrap?: boolean;\n}\n\nexport interface TableData {\n /** Defaults to every key of the rows, in order of first appearance. */\n columns?: TableColumn[];\n rows: Record<string, Cell>[];\n}\n\n/**\n * A small table of cells. `data` may also be just the rows. With no rows it\n * shows `empty` (default \"none\").\n *\n * `el.data = { columns: [{ key: 'reason', label: 'Reason' }, { key: 'n', align: 'right' }], rows }`\n */\nexport class KdTable extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n empty: {},\n };\n static override styles = [\n base,\n cellStyles,\n css`\n table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n th,\n td {\n padding: 6px 12px 6px 0;\n border-bottom: 1px solid var(--kd-border, transparent);\n text-align: left;\n vertical-align: top;\n }\n th {\n color: var(--kd-text-2, inherit);\n font-size: 10px;\n font-weight: 500;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n .center {\n text-align: center;\n }\n .right {\n text-align: right;\n }\n /* Prose breaks anywhere so one hash in a message cannot widen the table;\n links keep whole words and stop at 40ch with an ellipsis instead. */\n td {\n --kd-link-max: 40ch;\n overflow-wrap: anywhere;\n }\n .nowrap {\n white-space: nowrap;\n }\n .nowrap .cells {\n flex-wrap: nowrap;\n }\n .none {\n padding: 8px 0;\n color: var(--kd-text-dim, inherit);\n }\n `,\n ];\n\n declare data: TableData | TableData['rows'] | undefined;\n declare empty: string | undefined;\n\n override render() {\n const d = this.data;\n if (!d || typeof d !== 'object') return nothing;\n const { columns, rows = [] } = Array.isArray(d) ? { columns: undefined, rows: d } : d;\n if (!rows.length) return html`<div class=\"none\">${this.empty ?? 'none'}</div>`;\n const cols = columns ?? [...new Set(rows.flatMap((row) => Object.keys(row ?? {})))].map((key) => ({ key }) as TableColumn);\n const align = (col: TableColumn) => (col.align === 'right' || col.align === 'center' ? col.align : '');\n const cls = (col: TableColumn) => [align(col), col.nowrap ? 'nowrap' : ''].filter(Boolean).join(' ');\n return html`<table>\n <thead>\n <tr>\n ${cols.map((col) => html`<th class=${align(col)}>${col.label ?? col.key}</th>`)}\n </tr>\n </thead>\n <tbody>\n ${rows.map(\n (row) => html`<tr>\n ${cols.map((col) => html`<td class=${cls(col)}>${renderCell(row?.[col.key])}</td>`)}\n </tr>`,\n )}\n </tbody>\n </table>`;\n }\n}\n\ndefine('kd-table', KdTable);\n","import { LitElement, css, html, nothing, type PropertyValues } from 'lit';\n\nimport { define } from '../define';\nimport { KdElement, base } from '../element';\n\nconst label = (pane: Element, i: number) => pane.getAttribute('label') || `Tab ${i + 1}`;\n\n/**\n * Tabs over its child elements, any number of them: each child is a pane,\n * labelled by its `label` attribute, with an optional `count` beside it.\n * `selected` names the open pane by label (or by index). With a `key`, the\n * choice is kept in sessionStorage, so it survives the panel recreating the\n * element. A change dispatches `change` with `{ label, index }`.\n *\n * `<kd-tabs key=\"pod-tabs\"><section label=\"Events\" count=\"3\">…</section>…</kd-tabs>`\n */\nexport class KdTabs extends KdElement {\n static override properties = { selected: {}, key: {} };\n // Panes are assigned to slots by hand, so the light DOM is never touched.\n static override shadowRootOptions: ShadowRootInit = { ...LitElement.shadowRootOptions, slotAssignment: 'manual' };\n static override styles = [\n base,\n css`\n [role='tablist'] {\n display: flex;\n flex-wrap: wrap;\n gap: 0 22px;\n margin-bottom: 10px;\n border-bottom: 1px solid var(--kd-border, transparent);\n }\n button {\n margin: 0 0 -1px;\n padding: 6px 1px;\n border: none;\n border-bottom: 2px solid transparent;\n background: none;\n color: var(--kd-text-2, inherit);\n font: inherit;\n font-size: 13px;\n cursor: pointer;\n }\n button:hover {\n color: var(--kd-text, inherit);\n }\n /* Grafana's own active tab is underlined in this orange. */\n button[aria-selected='true'] {\n border-bottom-color: var(--kd-warning, currentColor);\n color: var(--kd-text, inherit);\n }\n .count {\n margin-left: 2px;\n color: var(--kd-text-dim, inherit);\n font-size: 11px;\n }\n `,\n ];\n\n declare selected: string | undefined;\n declare key: string | undefined;\n\n #observer: MutationObserver | undefined;\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Panes may arrive or be relabelled after the element is created.\n this.#observer ??= new MutationObserver(() => this.requestUpdate());\n this.#observer.observe(this, { childList: true, subtree: true, attributes: true, attributeFilter: ['label', 'count'] });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#observer?.disconnect();\n }\n\n get #storage(): Storage | undefined {\n try {\n return this.ownerDocument?.defaultView?.sessionStorage ?? undefined;\n } catch {\n return undefined;\n }\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (!changed.has('key') || !this.key) return;\n try {\n const stored = this.#storage?.getItem(`kd-tabs:${this.key}`);\n if (stored !== null && stored !== undefined) this.selected = stored;\n } catch {\n // Storage can be blocked; the tab simply is not remembered.\n }\n }\n\n #panes(): Element[] {\n return [...this.children];\n }\n\n #index(panes: Element[]): number {\n const selected = this.selected;\n if (selected === undefined || selected === null || selected === '') return 0;\n const byLabel = panes.findIndex((pane, i) => label(pane, i) === selected);\n if (byLabel >= 0) return byLabel;\n const n = Number(selected);\n return Number.isInteger(n) && n >= 0 && n < panes.length ? n : 0;\n }\n\n #select(panes: Element[], index: number): void {\n const name = label(panes[index], index);\n if (this.key) {\n try {\n this.#storage?.setItem(`kd-tabs:${this.key}`, name);\n } catch {\n // as above\n }\n }\n if (name === this.selected) return;\n this.selected = name;\n this.dispatchEvent(new CustomEvent('change', { detail: { label: name, index }, bubbles: true, composed: true }));\n }\n\n override render() {\n const panes = this.#panes();\n if (!panes.length) return nothing;\n const open = this.#index(panes);\n return html`<div role=\"tablist\">\n ${panes.map((pane, i) => {\n const count = pane.getAttribute('count');\n return html`<button\n type=\"button\"\n role=\"tab\"\n aria-selected=${i === open ? 'true' : 'false'}\n @click=${() => this.#select(panes, i)}\n >\n ${label(pane, i)}${count ? html`<span class=\"count\">${count}</span>` : nothing}\n </button>`;\n })}\n </div>\n ${panes.map((_, i) => html`<div role=\"tabpanel\" ?hidden=${i !== open}><slot></slot></div>`)}`;\n }\n\n // One slot per pane, assigned by hand; switching tabs only hides the others.\n protected override updated(): void {\n const slots = this.renderRoot.querySelectorAll('slot');\n this.#panes().forEach((pane, i) => slots[i]?.assign(pane));\n }\n}\n\ndefine('kd-tabs', KdTabs);\n","import { css, html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { define } from '../define';\nimport { KdElement, base } from '../element';\nimport { renderIcon, safeHref } from '../parts';\n\n/**\n * The chat tile's header link: a large icon (an image URL or an emoji) over a\n * small label. An `http(s)` link opens in a new tab.\n *\n * `<kd-tile icon=\"🤖\" label=\"Ask\" href=\"https://…\"></kd-tile>`\n */\nexport class KdTile extends KdElement {\n static override properties = { icon: {}, label: {}, href: {} };\n static override styles = [\n base,\n css`\n a,\n div {\n display: block;\n padding-top: 6px;\n color: inherit;\n text-align: center;\n text-decoration: none;\n }\n .icon {\n display: block;\n height: 30px;\n margin: 0 auto;\n font-size: 30px;\n line-height: 1;\n }\n .label {\n display: block;\n margin-top: 6px;\n color: var(--kd-text-2, inherit);\n font-size: 12px;\n }\n `,\n ];\n\n declare icon: string | undefined;\n declare label: string | undefined;\n declare href: string | undefined;\n\n override render() {\n const body = html`${renderIcon(this.icon)}<span class=\"label\">${this.label ?? ''}</span>`;\n const href = safeHref(this.href);\n if (!href) return html`<div>${body}</div>`;\n const external = /^https?:/i.test(href);\n return html`<a\n href=${href}\n target=${ifDefined(external ? '_blank' : undefined)}\n rel=${ifDefined(external ? 'noopener' : undefined)}\n >${body}</a\n >`;\n }\n}\n\ndefine('kd-tile', KdTile);\n","// The afterRender one-liner: theme the panel, hand each element its data.\nimport { applyTheme, type ThemeLike } from './theme';\n\n/** The parts of Business Text's `context` that feed and variable read. */\nexport interface FeedContext {\n element?: HTMLElement | null;\n grafana?: {\n theme?: ThemeLike;\n replaceVariables?(text: string): string;\n } | null;\n}\n\n/** Properties to set, by CSS selector: `{ 'kd-files': { entries, selected } }`. */\nexport type FeedMap = Record<string, Record<string, unknown>>;\n\n/**\n * Applies the theme to the panel root, then sets each selector's properties on\n * every element under the root that matches it. Idempotent, as afterRender\n * runs twice per refresh.\n *\n * It merges (`Object.assign`): a key left out keeps the value an earlier call\n * gave it. A panel should pass every key it manages each time, `undefined`\n * where one does not apply, or the last file's `type` or `src` sticks to the next.\n *\n * `afterRender: import(assets + '/kd.js').then((m) => m.feed(context, { 'kd-markdown': { markdown } }))`\n *\n * @returns the elements it set properties on\n */\nexport function feed(context: FeedContext | null | undefined, map: FeedMap = {}): Element[] {\n const root = context?.element;\n if (!root) return [];\n applyTheme(root, context.grafana?.theme);\n const fed: Element[] = [];\n for (const [selector, props] of Object.entries(map)) {\n let found: NodeListOf<Element>;\n try {\n found = root.querySelectorAll(selector);\n } catch {\n console.warn(`[kd] feed: not a selector: ${selector}`);\n continue;\n }\n for (const el of found) {\n Object.assign(el, props);\n fed.push(el);\n }\n }\n return fed;\n}\n\n/**\n * A dashboard variable's value as the panel sees it, through\n * `context.grafana.replaceVariables`: '' when the variable is not set or does\n * not exist.\n */\nexport function variable(context: FeedContext | null | undefined, name: string): string {\n const expression = '${' + name + '}';\n let value: unknown;\n try {\n value = context?.grafana?.replaceVariables?.(expression);\n } catch {\n return '';\n }\n return typeof value === 'string' && value !== expression ? value : '';\n}\n","// The provider contract kd-files and kd-file read through. A static list ships\n// now; anything that can list a folder (WebDAV, say) fits the same shape.\nimport type { Cell } from '../cell';\n\n/** One file or folder. Paths are `/`-separated with no leading slash; the root is `''`. */\nexport interface Entry {\n path: string;\n /** Defaults to the last segment of `path`. */\n name?: string;\n type: 'file' | 'dir';\n /** Bytes. A folder's is the sum of what is below it. */\n size?: number;\n /** An ISO time or epoch milliseconds. A folder's is its newest. */\n modified?: string | number;\n /** Where the entry opens elsewhere (GitHub, say), shown beside its name. */\n href?: string;\n /** Numbers a column can show; a folder's are the sums of what is below it. */\n stats?: Record<string, number>;\n /** Anything else a column can show, as a kd cell. Not rolled up. */\n cells?: Record<string, Cell>;\n /** A folder the provider could not list (deeper than it loaded, say). */\n partial?: boolean;\n}\n\n/** What `read` resolves to: text, or a blob with its type. */\nexport interface FileContent {\n text?: string;\n blob?: Blob;\n /** A MIME type or a kind (`markdown`, `code`, `text`, `image`, `binary`). */\n type?: string;\n size?: number;\n}\n\nexport interface Capabilities {\n read?: boolean;\n write?: boolean;\n rename?: boolean;\n}\n\nexport interface Provider {\n /** The entries directly in a folder; rejects for a folder that does not exist. */\n list(path: string): Promise<Entry[]>;\n read?(path: string): Promise<FileContent>;\n capabilities?: Capabilities;\n}\n\n/** A path with no leading, trailing or doubled slashes. */\nexport function normalizePath(path: string | null | undefined): string {\n return String(path ?? '')\n .split('/')\n .filter((part) => part !== '' && part !== '.')\n .join('/');\n}\n\n/** The folder a path is in; the root's parent is the root. */\nexport function dirname(path: string): string {\n const p = normalizePath(path);\n const cut = p.lastIndexOf('/');\n return cut < 0 ? '' : p.slice(0, cut);\n}\n\n/** The last segment of a path. */\nexport function basename(path: string): string {\n const p = normalizePath(path);\n return p.slice(p.lastIndexOf('/') + 1);\n}\n\n/** An entry's display name. */\nexport function entryName(entry: Entry): string {\n return entry.name ?? basename(entry.path);\n}\n\n/** `1536` -> `1.5 KiB`. */\nexport function formatSize(bytes: number | null | undefined): string {\n const b = Number(bytes) || 0;\n if (b >= 1073741824) return `${(b / 1073741824).toFixed(1)} GiB`;\n if (b >= 1048576) return `${(b / 1048576).toFixed(1)} MiB`;\n if (b >= 1024) return `${(b / 1024).toFixed(1)} KiB`;\n return `${b} B`;\n}\n\n/** A `modified` value as epoch milliseconds; NaN when unreadable. */\nexport function modifiedTime(value: string | number | null | undefined): number {\n if (value === null || value === undefined || value === '') return NaN;\n return typeof value === 'number' ? value : Date.parse(value);\n}\n","// A provider that answers from a flat list held in memory, such as a git tree.\nimport { basename, modifiedTime, normalizePath, type Entry, type FileContent, type Provider } from './types';\n\ninterface Folder {\n entry: Entry;\n /** Folders and files directly in it, by name. */\n children: Map<string, Folder | Entry>;\n}\n\nconst isFolder = (node: Folder | Entry): node is Folder => 'children' in node;\n\nexport interface StaticOptions {\n /** Reads a file, when the caller has a way to (a fetch, say). */\n read?(path: string): Promise<FileContent>;\n}\n\n/**\n * A provider over a flat list. Folders that are only implied by a path are\n * made up; each folder's `size`, every numeric stat and the newest `modified`\n * are rolled up from everything below it (a folder with nothing listed below\n * it keeps whatever it was given). Later entries for a path win.\n */\nexport function staticProvider(entries: readonly Entry[] | null | undefined, options: StaticOptions = {}): Provider {\n const root: Folder = { entry: { path: '', type: 'dir' }, children: new Map() };\n const folders = new Map<string, Folder>([['', root]]);\n\n const folder = (path: string): Folder => {\n let node = folders.get(path);\n if (node) return node;\n const parent = folder(path.includes('/') ? path.slice(0, path.lastIndexOf('/')) : '');\n node = { entry: { path, type: 'dir' }, children: new Map() };\n folders.set(path, node);\n parent.children.set(basename(path), node);\n return node;\n };\n\n for (const given of entries ?? []) {\n if (!given || typeof given !== 'object') continue;\n const path = normalizePath(given.path);\n if (!path) continue;\n if (given.type === 'dir') {\n const node = folder(path);\n node.entry = { ...given, path };\n } else {\n const parent = folder(path.includes('/') ? path.slice(0, path.lastIndexOf('/')) : '');\n const name = basename(path);\n const existing = parent.children.get(name);\n if (existing && isFolder(existing)) continue;\n parent.children.set(name, { ...given, path, type: 'file' });\n }\n }\n\n // Bottom up: a folder's numbers are the sums of its children's.\n const rollUp = (node: Folder): Entry => {\n if (!node.children.size) return node.entry;\n let size = 0;\n let newest: string | number | undefined;\n let newestTime = -Infinity;\n const stats: Record<string, number> = {};\n for (const child of node.children.values()) {\n const e = isFolder(child) ? rollUp(child) : child;\n size += Number(e.size) || 0;\n const t = modifiedTime(e.modified);\n if (t > newestTime) {\n newest = e.modified;\n newestTime = t;\n }\n for (const [k, v] of Object.entries(e.stats ?? {})) {\n if (typeof v === 'number' && Number.isFinite(v)) stats[k] = (stats[k] ?? 0) + v;\n }\n }\n node.entry = { ...node.entry, size, stats, ...(newest === undefined ? {} : { modified: newest }) };\n return node.entry;\n };\n rollUp(root);\n\n return {\n list(path: string): Promise<Entry[]> {\n const node = folders.get(normalizePath(path));\n if (!node) return Promise.reject(new Error(`no folder ${normalizePath(path) || '/'}`));\n return Promise.resolve([...node.children.values()].map((child) => (isFolder(child) ? child.entry : child)));\n },\n ...(options.read ? { read: options.read } : {}),\n capabilities: { read: !!options.read, write: false, rename: false },\n };\n}\n","import { css, html, nothing, svg, type PropertyValues, type TemplateResult } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { cellStyles, renderCell, type Cell } from '../cell';\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\nimport { safeHref, tone, tones, type Tone } from '../parts';\nimport { setVariable } from '../scene';\nimport { staticProvider } from './static';\nimport { dirname, entryName, formatSize, modifiedTime, normalizePath, type Entry, type Provider } from './types';\n\nexport interface FileColumn {\n /** The stat or cell key; `size` and `modified` name the entry's own fields. */\n key: string;\n /** Defaults to the key. */\n label?: string;\n /** Defaults to `size` or `modified` for those keys, else `stat`. */\n kind?: 'size' | 'stat' | 'cell' | 'modified';\n /** Shown before a stat's number (`+`, an emoji). */\n icon?: string;\n /** The colour of a non-zero stat. */\n tone?: Tone;\n /** The header's tooltip. */\n title?: string;\n}\n\n/** What `navigate` and `select` carry. `entry` is undefined for the root. */\nexport interface FilesEventDetail {\n path: string;\n entry?: Entry;\n}\n\ntype Kind = NonNullable<FileColumn['kind']>;\ninterface Sort {\n key: string;\n dir: 1 | -1;\n}\ninterface Row {\n entry: Entry;\n /** The folder it is in, relative to the open one: set only for a filter match deeper down. */\n under?: string;\n up?: boolean;\n}\n\nconst DEFAULT_COLUMNS: FileColumn[] = [{ key: 'size', kind: 'size' }];\n// A filter walks the folders below the open one; this bounds a slow provider.\nconst SEARCH_LIMIT = 20000;\n\nconst kindOf = (col: FileColumn): Kind =>\n col.kind ?? (col.key === 'size' ? 'size' : col.key === 'modified' ? 'modified' : 'stat');\n\nconst byName = (a: Entry, b: Entry) =>\n entryName(a).localeCompare(entryName(b), undefined, { sensitivity: 'base', numeric: true });\n\nfunction cellText(cell: Cell): string {\n if (cell === null || cell === undefined) return '';\n if (Array.isArray(cell)) return cell.map(cellText).join(' ');\n if (typeof cell !== 'object') return String(cell);\n if ('text' in cell) return String(cell.text);\n if ('code' in cell) return String(cell.code);\n return '';\n}\n\nfunction sortValue(entry: Entry, key: string, kind: Kind | 'name'): number | string {\n switch (kind) {\n case 'name':\n return entryName(entry);\n case 'size':\n return Number(entry.size) || 0;\n case 'modified': {\n const t = modifiedTime(entry.modified);\n return Number.isNaN(t) ? -Infinity : t;\n }\n case 'cell':\n return cellText(entry.cells?.[key]);\n default:\n return Number(entry.stats?.[key]) || 0;\n }\n}\n\nconst count = (n: number, one: string, many: string) => `${n} ${n === 1 ? one : many}`;\n\n// Line icons in currentColor, so the theme's tokens colour them (an emoji keeps its own pale colours).\nconst FOLDER = svg`<path d=\"M1.5 3.5h4.5l1.5 1.5h7v8.5h-13z\" />`;\nconst FILE = svg`<path d=\"M3.5 1.5h6l3 3v10h-9z\" /><path d=\"M9.5 1.5v3h3\" />`;\nconst icon = (dir: boolean) =>\n html`<svg class=\"ico\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n ${dir ? FOLDER : FILE}\n </svg>`;\n\nfunction formatModified(value: string | number | undefined): string {\n const t = modifiedTime(value);\n return Number.isNaN(t) ? '' : new Date(t).toISOString().slice(0, 10);\n}\n\n/**\n * A file explorer over a provider (`provider`, or `entries` for a static\n * list): breadcrumbs and `..`, folders first, columns sorted by a header\n * click, a filter box (`filter`), and the keyboard (arrows, Enter, Backspace).\n * Clicking a folder opens it (`navigate`); clicking a file selects it\n * (`select`, cancelable), and with `variable` writes `valuePrefix + path` to that\n * dashboard variable, replacing the URL entry as Grafana's own programmatic\n * writes do. `selected` (`valuePrefix + path`, as the variable holds it) is highlighted and\n * its folder opened. With a `key`, the open folder and the sort survive the\n * panel recreating the element; the folder is stored with the selection it was\n * left with, so a different `selected` (a deep link) opens its own folder instead.\n *\n * `<kd-files variable=\"file\" key=\"repo-files\" filter></kd-files>` + `el.entries = [...]`\n */\nexport class KdFiles extends KdElement {\n static override properties = {\n provider: { attribute: false },\n entries: { attribute: 'entries', converter: json },\n columns: { attribute: 'columns', converter: json },\n selected: {},\n variable: {},\n key: {},\n valuePrefix: { attribute: 'value-prefix' },\n label: {},\n filter: { type: Boolean },\n empty: {},\n };\n static override styles = [\n base,\n tones,\n cellStyles,\n css`\n :host {\n font-size: 13px;\n }\n .bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px 10px;\n padding: 2px 0 8px;\n }\n .crumbs {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n min-width: 0;\n font-size: 14px;\n }\n .sep,\n .dim,\n .tot {\n color: var(--kd-text-dim, inherit);\n }\n .tot {\n margin-left: auto;\n font-size: 12px;\n }\n button.crumb {\n padding: 0;\n border: none;\n background: none;\n color: var(--kd-link, inherit);\n font: inherit;\n font-weight: 500;\n cursor: pointer;\n }\n button.crumb:hover {\n text-decoration: underline;\n }\n button.crumb[aria-current='page'] {\n color: var(--kd-text, inherit);\n cursor: default;\n text-decoration: none;\n }\n input {\n flex: 1 1 160px;\n max-width: 280px;\n padding: 3px 8px;\n border: 1px solid var(--kd-border-strong, currentColor);\n border-radius: var(--kd-radius, 4px);\n background: transparent;\n color: inherit;\n font: inherit;\n }\n .rows {\n outline: none;\n }\n .rows:focus-visible {\n box-shadow: inset 0 0 0 1px var(--kd-primary, currentColor);\n }\n table {\n width: 100%;\n border-collapse: collapse;\n }\n th {\n padding: 4px 6px;\n text-align: left;\n white-space: nowrap;\n }\n th:first-child,\n td:first-child {\n padding-left: 10px;\n }\n button.sort {\n padding: 2px 0;\n border: none;\n background: none;\n color: var(--kd-text-2, inherit);\n font: inherit;\n font-size: 10px;\n font-weight: 500;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n }\n button.sort:hover,\n button.sort:focus-visible {\n color: var(--kd-text, inherit);\n }\n button.sort:focus-visible {\n outline: 1px solid var(--kd-primary, currentColor);\n outline-offset: 1px;\n }\n .glyph {\n font-size: 12px;\n letter-spacing: 0;\n }\n th[aria-sort='ascending'] button.sort::after {\n content: ' ▲';\n }\n th[aria-sort='descending'] button.sort::after {\n content: ' ▼';\n }\n td {\n padding: 4px 6px;\n border-top: 1px solid var(--kd-border, transparent);\n vertical-align: middle;\n }\n .num {\n width: 1%;\n text-align: right;\n white-space: nowrap;\n }\n /* The name takes what the numbers leave, down to the .name min-width, and ellipsises. */\n td.cell-name {\n width: 100%;\n max-width: 0;\n }\n tbody tr {\n cursor: pointer;\n }\n tbody tr:hover td {\n background: color-mix(in srgb, var(--kd-text, currentColor) 5%, transparent);\n }\n tr.cursor td {\n background: color-mix(in srgb, var(--kd-text, currentColor) 8%, transparent);\n }\n tr[aria-selected='true'] td {\n background: color-mix(in srgb, var(--kd-primary, currentColor) 16%, transparent);\n }\n .name {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 6em;\n white-space: nowrap;\n }\n .ico {\n flex: none;\n width: 14px;\n height: 14px;\n color: var(--kd-text-2, inherit);\n }\n .dir .ico {\n color: var(--kd-link, inherit);\n }\n .label,\n .under {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .under {\n flex: 0 1000 auto;\n }\n .partial,\n a.ext {\n flex: none;\n }\n .dir .label {\n color: var(--kd-link, inherit);\n font-weight: 500;\n }\n .partial {\n font-size: 11px;\n font-style: italic;\n }\n a.ext {\n color: var(--kd-text-dim, inherit);\n text-decoration: none;\n }\n a.ext:hover {\n color: var(--kd-link, inherit);\n }\n .stat {\n font-weight: 600;\n }\n .stat.primary,\n .stat.success,\n .stat.warning,\n .stat.error,\n .stat.info {\n color: var(--tone-ink);\n }\n .none {\n padding: 8px 10px;\n color: var(--kd-text-dim, inherit);\n }\n `,\n ];\n\n declare provider: Provider | undefined;\n declare entries: Entry[] | undefined;\n declare columns: FileColumn[] | undefined;\n declare selected: string | undefined;\n declare variable: string | undefined;\n declare key: string | undefined;\n declare valuePrefix: string | undefined;\n declare label: string | undefined;\n declare filter: boolean | undefined;\n declare empty: string | undefined;\n\n #source: Provider | undefined;\n #folder: string | undefined;\n #fromStorage = false;\n // The `selected` value stored with the remembered folder; null when none was.\n #storedSelected: string | null = null;\n #navigated = false;\n #seen: string | undefined;\n #picked: string | undefined;\n #listing: Entry[] = [];\n #listed: string | undefined;\n #error = '';\n #listTicket = 0;\n #query = '';\n #opened: Entry | undefined;\n #matches: Row[] | undefined;\n #searchTicket = 0;\n #sort: Sort = { key: 'name', dir: 1 };\n #cursor = -1;\n #scroll = false;\n\n /** The open folder. */\n get folder(): string {\n return this.#folder ?? '';\n }\n\n /** `selected` as a path, without `valuePrefix`; '' when it carries another prefix. */\n get selectedPath(): string {\n const s = String(this.selected ?? '');\n const p = this.valuePrefix ?? '';\n // A value carrying another prefix (an older commit's) selects nothing here.\n if (p) return s.startsWith(p) ? normalizePath(s.slice(p.length)) : '';\n return normalizePath(s);\n }\n\n get #storage(): Storage | undefined {\n try {\n return this.ownerDocument?.defaultView?.sessionStorage ?? undefined;\n } catch {\n return undefined;\n }\n }\n\n #load(suffix: string): string | null {\n if (!this.key) return null;\n try {\n return this.#storage?.getItem(`kd-files:${this.key}${suffix}`) ?? null;\n } catch {\n return null;\n }\n }\n\n #save(suffix: string, value: string): void {\n if (!this.key) return;\n try {\n this.#storage?.setItem(`kd-files:${this.key}${suffix}`, value);\n } catch {\n // Storage can be blocked; the state simply is not remembered.\n }\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n let relist = false;\n if (changed.has('provider') || changed.has('entries')) {\n const had = this.#source;\n this.#source = this.provider ?? (this.entries ? staticProvider(this.entries) : undefined);\n // A refresh keeps the rows on screen until the new ones arrive; a first source has none to keep.\n if (!had) this.#listed = undefined;\n relist = true;\n }\n if (changed.has('key')) {\n const m = /^(.*):(1|-1)$/.exec(this.#load(':sort') ?? '');\n if (m) this.#sort = { key: m[1], dir: Number(m[2]) as 1 | -1 };\n }\n const sel = this.selectedPath;\n if (this.#folder === undefined) {\n const stored = this.#load('');\n this.#fromStorage = stored !== null;\n this.#storedSelected = this.#load(':selected');\n // A remembered folder is restored for the selection it was left with; a\n // different selection (a deep link, a pick elsewhere) opens its own folder.\n this.#folder = stored !== null && (!sel || this.#sameSelection()) ? normalizePath(stored) : sel ? dirname(sel) : '';\n this.#seen = sel || undefined;\n relist = true;\n } else if (sel && sel !== this.#seen) {\n // The first selection a remembered folder meets moves it only when it is\n // not the one stored with it; any later one, from outside, opens its folder.\n const first = this.#seen === undefined;\n this.#seen = sel;\n const keep = first && this.#fromStorage && this.#sameSelection();\n if (sel !== this.#picked && !keep && dirname(sel) !== this.#folder) {\n this.#folder = dirname(sel);\n this.#navigated = false;\n this.#query = '';\n this.#matches = undefined;\n relist = true;\n }\n }\n if (relist) this.#list();\n }\n\n #sameSelection(): boolean {\n return this.#storedSelected === String(this.selected ?? '');\n }\n\n #remember(folder: string): void {\n this.#save('', folder);\n this.#save(':selected', String(this.selected ?? ''));\n }\n\n #list(): void {\n const source = this.#source;\n const folder = this.#folder ?? '';\n const ticket = ++this.#listTicket;\n if (!source) {\n this.#listing = [];\n this.#listed = folder;\n return;\n }\n let pending: Promise<Entry[]>;\n try {\n pending = Promise.resolve(source.list(folder));\n } catch (e) {\n pending = Promise.reject(e);\n }\n pending.then(\n (entries) => {\n if (ticket !== this.#listTicket) return;\n this.#listing = Array.isArray(entries) ? entries.filter((e) => e && typeof e.path === 'string') : [];\n const fresh = this.#listed !== folder;\n this.#listed = folder;\n this.#error = '';\n if (fresh) this.#cursor = -1;\n if (this.#query.trim()) this.#search();\n this.requestUpdate();\n },\n (error: unknown) => {\n if (ticket !== this.#listTicket) return;\n // A remembered folder that is gone: the selection's folder, else the root.\n // One opened by hand shows its error instead.\n if (folder !== '' && !this.#navigated) {\n const sel = dirname(this.selectedPath);\n this.#folder = sel && sel !== folder ? sel : '';\n this.#list();\n return;\n }\n this.#listing = [];\n this.#listed = folder;\n this.#error = error instanceof Error ? error.message : String(error);\n this.requestUpdate();\n },\n );\n }\n\n // Matches below the open folder: those directly in it first, then deeper ones.\n #search(): void {\n const source = this.#source;\n const query = this.#query.trim().toLowerCase();\n const ticket = ++this.#searchTicket;\n if (!source || !query) {\n this.#matches = undefined;\n return;\n }\n const start = this.#folder ?? '';\n const found: Row[] = [];\n void (async () => {\n let seen = 0;\n const queue: string[] = [start];\n while (queue.length && seen < SEARCH_LIMIT) {\n const folder = queue.shift() as string;\n let entries: Entry[];\n try {\n entries = folder === this.#listed ? this.#listing : await source.list(folder);\n } catch {\n continue;\n }\n if (ticket !== this.#searchTicket) return;\n for (const entry of entries) {\n seen += 1;\n if (entry.type === 'dir' && !entry.partial) queue.push(normalizePath(entry.path));\n if (!entryName(entry).toLowerCase().includes(query)) continue;\n const under = folder === start ? undefined : folder.slice(start ? start.length + 1 : 0);\n found.push({ entry, under });\n }\n }\n if (ticket !== this.#searchTicket) return;\n this.#matches = found;\n this.requestUpdate();\n })();\n }\n\n #go(path: string, entry?: Entry): void {\n const folder = normalizePath(path);\n this.#folder = folder;\n this.#navigated = true;\n this.#opened = entry;\n this.#query = '';\n this.#matches = undefined;\n this.#searchTicket++;\n this.#cursor = -1;\n this.#remember(folder);\n this.dispatchEvent(new CustomEvent<FilesEventDetail>('navigate', { detail: { path: folder, entry }, bubbles: true, composed: true }));\n this.#list();\n this.requestUpdate();\n }\n\n #pick(entry: Entry): void {\n const path = normalizePath(entry.path);\n const event = new CustomEvent<FilesEventDetail>('select', {\n detail: { path, entry },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n if (!this.dispatchEvent(event)) return;\n const value = `${this.valuePrefix ?? ''}${path}`;\n this.#picked = path;\n this.#seen = path;\n this.selected = value;\n // The open folder is remembered with this selection: the pair a re-render restores.\n this.#remember(this.#folder ?? '');\n if (this.variable) setVariable(this, this.variable, value);\n }\n\n #activate(row: Row): void {\n if (row.up) this.#go(dirname(this.#folder ?? ''));\n else if (row.entry.type === 'dir') this.#go(row.entry.path, row.entry);\n else this.#pick(row.entry);\n }\n\n #sortBy(key: string): void {\n const dir: 1 | -1 = this.#sort.key === key ? (this.#sort.dir === 1 ? -1 : 1) : key === 'name' ? 1 : -1;\n this.#sort = { key, dir };\n this.#save(':sort', `${key}:${dir}`);\n this.requestUpdate();\n }\n\n get #columns(): FileColumn[] {\n return Array.isArray(this.columns) ? this.columns.filter((c) => c && typeof c.key === 'string') : DEFAULT_COLUMNS;\n }\n\n #rows(): Row[] {\n const folder = this.#folder ?? '';\n if (this.#listed !== folder) return [];\n const query = this.#query.trim().toLowerCase();\n const rows: Row[] =\n this.#matches ??\n this.#listing.filter((e) => !query || entryName(e).toLowerCase().includes(query)).map((entry) => ({ entry }));\n const { key, dir } = this.#sort;\n const col = this.#columns.find((c) => c.key === key);\n const kind = key === 'name' || !col ? 'name' : kindOf(col);\n const sorted = [...rows].sort((a, b) => {\n const depth = (a.under === undefined ? 0 : 1) - (b.under === undefined ? 0 : 1);\n if (depth) return depth;\n const folders = (a.entry.type === 'dir' ? 0 : 1) - (b.entry.type === 'dir' ? 0 : 1);\n if (folders) return folders;\n const x = sortValue(a.entry, key, kind);\n const y = sortValue(b.entry, key, kind);\n const order =\n typeof x === 'string' || typeof y === 'string'\n ? String(x).localeCompare(String(y), undefined, { sensitivity: 'base', numeric: true })\n : x - y;\n return order * dir || (a.under ?? '').localeCompare(b.under ?? '') || byName(a.entry, b.entry);\n });\n return folder ? [{ entry: { path: dirname(folder), type: 'dir', name: '..' }, up: true }, ...sorted] : sorted;\n }\n\n #keydown(event: KeyboardEvent, rows: Row[]): void {\n // Keys on a sort button or a link inside belong to it.\n if (event.target !== event.currentTarget) return;\n const move = (to: number) => {\n event.preventDefault();\n this.#cursor = Math.max(0, Math.min(rows.length - 1, to));\n this.#scroll = true;\n this.requestUpdate();\n };\n const at = this.#cursor;\n switch (event.key) {\n case 'ArrowDown':\n return move(at + 1);\n case 'ArrowUp':\n return move(at - 1);\n case 'Home':\n return move(0);\n case 'End':\n return move(rows.length - 1);\n case 'Enter':\n case 'ArrowRight':\n if (rows[at] && (event.key === 'Enter' || rows[at].entry.type === 'dir')) {\n event.preventDefault();\n this.#activate(rows[at]);\n }\n return;\n case 'Backspace':\n case 'ArrowLeft':\n if (this.#folder) {\n event.preventDefault();\n this.#go(dirname(this.#folder));\n }\n return;\n }\n }\n\n #filterKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') this.#setQuery('');\n else if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.#cursor = 0;\n (this.renderRoot.querySelector('.rows') as HTMLElement | null)?.focus();\n this.requestUpdate();\n }\n }\n\n #setQuery(query: string): void {\n this.#query = query;\n this.#matches = undefined;\n this.#cursor = -1;\n this.#search();\n this.requestUpdate();\n }\n\n protected override updated(): void {\n if (!this.#scroll) return;\n this.#scroll = false;\n (this.renderRoot.querySelector('tr.cursor') as HTMLElement | null)?.scrollIntoView?.({ block: 'nearest' });\n }\n\n #crumbs(folder: string): TemplateResult {\n const parts = folder ? folder.split('/') : [];\n const crumb = (text: string, path: string, last: boolean) =>\n html`<button\n type=\"button\"\n class=\"crumb\"\n aria-current=${ifDefined(last ? 'page' : undefined)}\n @click=${() => !last && this.#go(path)}\n >\n ${text}\n </button>`;\n return html`<nav class=\"crumbs\" aria-label=\"Folder\">\n ${crumb(this.label || '/', '', !parts.length)}\n ${parts.map(\n // The bare root crumb is itself the first slash.\n (part, i) =>\n html`${i || this.label ? html`<span class=\"sep\">/</span>` : nothing}${crumb(\n part,\n parts.slice(0, i + 1).join('/'),\n i === parts.length - 1,\n )}`,\n )}\n </nav>`;\n }\n\n #cell(entry: Entry, col: FileColumn): unknown {\n switch (kindOf(col)) {\n case 'size':\n return entry.size === undefined && entry.type === 'dir' ? '' : formatSize(entry.size);\n case 'modified':\n return html`<span title=${ifDefined(entry.modified === undefined ? undefined : String(entry.modified))}\n >${formatModified(entry.modified)}</span\n >`;\n case 'cell':\n return renderCell(entry.cells?.[col.key]);\n default: {\n const n = Number(entry.stats?.[col.key]) || 0;\n if (!n) return '';\n const cls = `stat ${col.tone ? tone(col.tone) : ''}`;\n return html`<span class=${cls} title=${`${col.label ?? col.key}: ${n}`}>${col.icon ?? ''}${n.toLocaleString('en')}</span>`;\n }\n }\n }\n\n #row(row: Row, i: number, selected: string, columns: FileColumn[]): TemplateResult {\n const { entry } = row;\n const dir = entry.type === 'dir';\n const href = row.up ? undefined : safeHref(entry.href);\n const isSelected = !dir && !!selected && normalizePath(entry.path) === selected;\n return html`<tr\n class=${[dir ? 'dir' : 'file', i === this.#cursor ? 'cursor' : ''].join(' ')}\n aria-selected=${isSelected ? 'true' : 'false'}\n @click=${() => {\n this.#cursor = i;\n this.#activate(row);\n }}\n >\n <td class=\"cell-name\">\n <span class=\"name\">\n ${icon(dir)}\n ${row.under ? html`<span class=\"under dim\" title=${`${row.under}/`}>${row.under}/</span>` : nothing}\n <span class=\"label\" title=${entryName(entry)}>${entryName(entry)}</span>\n ${entry.partial\n ? html`<span class=\"partial dim\" title=\"The provider could not list this folder\">not listed</span>`\n : nothing}\n ${href\n ? html`<a class=\"ext\" href=${href} target=\"_blank\" rel=\"noopener\" title=\"Open\" @click=${(e: Event) => e.stopPropagation()}\n >↗</a\n >`\n : nothing}\n </span>\n </td>\n ${columns.map(\n (col) => html`<td class=${kindOf(col) === 'cell' ? '' : 'num'}>${row.up ? '' : this.#cell(entry, col)}</td>`,\n )}\n </tr>`;\n }\n\n override render() {\n const folder = this.#folder ?? '';\n const columns = this.#columns;\n const rows = this.#rows();\n const listed = this.#listed === folder;\n const items = rows.filter((r) => !r.up && r.under === undefined);\n const dirs = items.filter((r) => r.entry.type === 'dir').length;\n const total = this.#listing.reduce((sum, e) => sum + (Number(e.size) || 0), 0);\n const selected = this.selectedPath;\n // A column with an icon shows it, its label the tooltip and the accessible name, so six stats fit a narrow panel.\n const header = (key: string, label: string, num: boolean, glyph?: string, title?: string) => {\n const sort = this.#sort.key === key ? (this.#sort.dir === 1 ? 'ascending' : 'descending') : undefined;\n const tip = glyph ? (title ? `${label}: ${title}` : label) : title;\n return html`<th class=${num ? 'num' : ''} aria-sort=${ifDefined(sort)}>\n <button\n type=\"button\"\n class=\"sort\"\n title=${ifDefined(tip)}\n aria-label=${ifDefined(glyph ? label : undefined)}\n @click=${() => this.#sortBy(key)}\n >\n ${glyph ? html`<span class=\"glyph\" aria-hidden=\"true\">${glyph}</span>` : label}\n </button>\n </th>`;\n };\n let body: TemplateResult;\n if (!listed) body = html`<div class=\"none\">Loading…</div>`;\n else if (this.#error) body = html`<div class=\"none\">${this.#error}</div>`;\n else {\n const current = this.#listing.length ? undefined : this.#emptyNote(folder);\n const none = this.#query.trim() && rows.every((r) => r.up);\n body = html`<div class=\"rows\" tabindex=\"0\" @keydown=${(e: KeyboardEvent) => this.#keydown(e, rows)}>\n <table>\n <thead>\n <tr>\n ${header('name', 'Name', false)}\n ${columns.map((c) => header(c.key, c.label ?? c.key, kindOf(c) !== 'cell', c.icon?.trim() || undefined, c.title))}\n </tr>\n </thead>\n <tbody>\n ${rows.map((row, i) => this.#row(row, i, selected, columns))}\n </tbody>\n </table>\n ${current ?? (none ? html`<div class=\"none\">No matches.</div>` : nothing)}\n </div>`;\n }\n return html`<div class=\"bar\">\n ${this.#crumbs(folder)}\n ${this.filter\n ? html`<input\n type=\"search\"\n placeholder=\"Filter\"\n aria-label=\"Filter\"\n .value=${this.#query}\n @input=${(e: Event) => this.#setQuery((e.target as HTMLInputElement).value)}\n @keydown=${(e: KeyboardEvent) => this.#filterKey(e)}\n />`\n : nothing}\n ${listed && !this.#error\n ? html`<span class=\"tot\"\n >${[\n dirs ? count(dirs, 'folder', 'folders') : '',\n items.length - dirs || !dirs ? count(items.length - dirs, 'file', 'files') : '',\n formatSize(total),\n ]\n .filter(Boolean)\n .join(' · ')}</span\n >`\n : nothing}\n </div>\n ${body}`;\n }\n\n #emptyNote(folder: string): TemplateResult {\n const opened = this.#opened;\n if (opened?.partial && normalizePath(opened.path) === folder) {\n const href = safeHref(opened.href);\n return html`<div class=\"none\">\n This folder was not listed.\n ${href ? html`<a class=\"ext\" href=${href} target=\"_blank\" rel=\"noopener\">Open it ↗</a>` : nothing}\n </div>`;\n }\n return html`<div class=\"none\">${this.empty ?? (folder ? 'This folder is empty.' : 'No files.')}</div>`;\n }\n}\n\ndefine('kd-files', KdFiles);\n","import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { define } from '../define';\nimport { KdElement, base, json } from '../element';\nimport { renderIcon, safeHref } from '../parts';\nimport { basename, formatSize, normalizePath, type FileContent, type Provider } from './types';\n\n/** A link in the header: GitHub, code-server and the like. `icon` is an image URL or an emoji. */\nexport interface FileLink {\n text?: string;\n href: string;\n icon?: string;\n title?: string;\n}\n\n/** Bases for a markdown file's relative links and images, as `kd-markdown` takes them. */\nexport interface MarkdownBase {\n links?: string;\n images?: string;\n}\n\n/** How a file is shown. */\nexport type FileKind = 'markdown' | 'code' | 'image' | 'binary';\n\nconst MARKDOWN = new Set(['md', 'markdown', 'mdown', 'mkd', 'mdx']);\nconst IMAGE = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'avif', 'ico', 'bmp', 'apng']);\nconst BINARY = new Set(\n (\n 'zip gz tgz bz2 xz zst 7z rar tar jar war class pdf woff woff2 ttf otf eot exe dll so dylib a o wasm ' +\n 'mp3 mp4 m4a mov avi mkv webm ogg wav flac psd sqlite db bin dat iso dmg pyc'\n ).split(' '),\n);\nconst TEXTUAL = /^application\\/(json|xml|javascript|ecmascript|x-javascript|yaml|x-yaml|toml|x-toml|sql|graphql|x-sh|x-shellscript|x-httpd-php|ld\\+json)$|[+](json|xml|yaml)$/;\n// Enough of a file to tell text from binary.\nconst SNIFF = 8000;\n\nconst extension = (path: string): string => {\n const name = basename(path).toLowerCase();\n const dot = name.lastIndexOf('.');\n return dot > 0 ? name.slice(dot + 1) : '';\n};\n\n/**\n * The kind a type or, failing that, the path's extension names. `type` is a\n * MIME type or a kind (`markdown`, `code`, `text`, `image`, `binary`).\n * Undefined means \"look at the content\".\n */\nexport function fileKind(path: string, type?: string | null): FileKind | undefined {\n const ext = extension(path);\n const t = String(type ?? '')\n .split(';')[0]\n .trim()\n .toLowerCase();\n if (t === 'markdown' || t === 'text/markdown' || t === 'text/x-markdown') return 'markdown';\n if (t === 'image' || t.startsWith('image/')) return 'image';\n if (t === 'binary') return 'binary';\n if (t === 'code' || t === 'text' || t.startsWith('text/') || TEXTUAL.test(t)) {\n return MARKDOWN.has(ext) && (t === 'text' || t === 'text/plain') ? 'markdown' : 'code';\n }\n if (t && t !== 'application/octet-stream') return 'binary';\n if (MARKDOWN.has(ext)) return 'markdown';\n if (IMAGE.has(ext)) return 'image';\n if (BINARY.has(ext)) return 'binary';\n return undefined;\n}\n\n/** Whether text decoded from a file looks binary: a NUL, or more than 10% control or undecodable characters. */\nexport function looksBinary(text: string): boolean {\n const sample = text.slice(0, SNIFF);\n if (!sample) return false;\n if (sample.includes('\\u0000')) return true;\n let odd = 0;\n for (let i = 0; i < sample.length; i += 1) {\n const c = sample.charCodeAt(i);\n if ((c < 32 && c !== 9 && c !== 10 && c !== 12 && c !== 13) || c === 0xfffd) odd += 1;\n }\n return odd / sample.length > 0.1;\n}\n\n/** A blob's text, or null when its bytes look binary. */\nexport async function blobText(blob: Blob): Promise<string | null> {\n const bytes = new Uint8Array(await blob.arrayBuffer());\n if (bytes.subarray(0, SNIFF).includes(0)) return null;\n const text = new TextDecoder('utf-8').decode(bytes);\n return looksBinary(text) ? null : text;\n}\n\n// An image source: a web or relative URL, an object URL, or an inline image.\nconst imageSrc = (src: string | undefined): string | undefined =>\n src && /^(https?:|blob:|data:image\\/|\\/|\\.{0,2}\\/|[^:]*$)/i.test(src.trim()) ? src : undefined;\n\n/**\n * One file: a header (the path as a breadcrumb, the size, `links`), then the\n * file by its kind - markdown in `kd-markdown` (given `base`), text and code in\n * `kd-code`, images inline, anything else as a summary. The kind comes from\n * `type`, else the extension, else the content (a NUL byte or mostly control\n * characters is binary). Give it `text` or `blob` (or an image `src`), or a\n * `provider` and `path` and it reads the file itself.\n *\n * `<kd-file path=\"docs/README.md\"></kd-file>` + `el.text = '# Hello'`\n */\nexport class KdFile extends KdElement {\n static override properties = {\n path: {},\n text: {},\n blob: { attribute: false },\n src: {},\n type: {},\n size: { type: Number },\n links: { attribute: 'links', converter: json },\n provider: { attribute: false },\n base: { attribute: false },\n truncated: { type: Boolean },\n empty: {},\n };\n static override styles = [\n base,\n css`\n :host {\n font-size: 13px;\n }\n .head {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 4px 10px;\n padding: 2px 0 8px;\n border-bottom: 1px solid var(--kd-border, transparent);\n margin-bottom: 8px;\n }\n .path {\n min-width: 0;\n font-family: var(--kd-font-mono, monospace);\n overflow-wrap: anywhere;\n }\n .dirs,\n .meta,\n .none {\n color: var(--kd-text-dim, inherit);\n }\n .name {\n font-weight: 600;\n }\n .meta {\n font-size: 12px;\n }\n .links {\n display: inline-flex;\n gap: 10px;\n margin-left: auto;\n }\n .links a {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--kd-link, inherit);\n text-decoration: none;\n }\n .links a:hover {\n text-decoration: underline;\n }\n .icon {\n width: 16px;\n height: 16px;\n }\n img.image {\n display: block;\n max-width: 100%;\n height: auto;\n }\n .none {\n padding: 8px 0;\n }\n `,\n ];\n\n declare path: string | undefined;\n declare text: string | undefined;\n declare blob: Blob | undefined;\n declare src: string | undefined;\n declare type: string | undefined;\n declare size: number | undefined;\n declare links: FileLink[] | undefined;\n declare provider: Provider | undefined;\n declare base: MarkdownBase | undefined;\n declare truncated: boolean | undefined;\n declare empty: string | undefined;\n\n #read: FileContent | undefined;\n #reading = false;\n #error = '';\n #readTicket = 0;\n // What a blob of unknown kind decoded to: its text, or null for binary.\n #sniffed: { blob: Blob; text: string | null } | undefined;\n #url: { blob: Blob; url: string } | undefined;\n #svgText: { text: string; blob: Blob } | undefined;\n\n get #given(): boolean {\n return this.text !== undefined || this.blob !== undefined || !!this.src;\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (!changed.has('provider') && !changed.has('path') && !changed.has('text') && !changed.has('blob') && !changed.has('src')) {\n return;\n }\n const ticket = ++this.#readTicket;\n this.#read = undefined;\n this.#error = '';\n this.#reading = false;\n const path = normalizePath(this.path);\n const provider = this.provider;\n if (this.#given || !path || typeof provider?.read !== 'function') return;\n this.#reading = true;\n let pending: Promise<FileContent>;\n try {\n pending = Promise.resolve(provider.read(path));\n } catch (e) {\n pending = Promise.reject(e);\n }\n pending.then(\n (content) => {\n if (ticket !== this.#readTicket) return;\n this.#read = content ?? {};\n this.#reading = false;\n this.requestUpdate();\n },\n (error: unknown) => {\n if (ticket !== this.#readTicket) return;\n this.#error = error instanceof Error ? error.message : String(error);\n this.#reading = false;\n this.requestUpdate();\n },\n );\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#revoke();\n }\n\n #revoke(): void {\n if (this.#url) URL.revokeObjectURL(this.#url.url);\n this.#url = undefined;\n }\n\n #objectUrl(blob: Blob): string {\n if (this.#url?.blob !== blob) {\n this.#revoke();\n this.#url = { blob, url: URL.createObjectURL(blob) };\n }\n return this.#url.url;\n }\n\n // An SVG given as text, as one blob per text so its object URL is stable.\n #svg(text: string): Blob {\n if (this.#svgText?.text !== text) this.#svgText = { text, blob: new Blob([text], { type: 'image/svg+xml' }) };\n return this.#svgText.blob;\n }\n\n #sniff(blob: Blob): string | null | undefined {\n if (this.#sniffed?.blob === blob) return this.#sniffed.text;\n blobText(blob).then(\n (text) => {\n this.#sniffed = { blob, text };\n this.requestUpdate();\n },\n () => {\n this.#sniffed = { blob, text: null };\n this.requestUpdate();\n },\n );\n return undefined;\n }\n\n #header(path: string, size: number | undefined, kind: string): TemplateResult {\n const cut = path.lastIndexOf('/');\n const links = (Array.isArray(this.links) ? this.links : []).filter((l) => l && safeHref(l.href));\n return html`<div class=\"head\">\n <span class=\"path\"\n >${cut >= 0 ? html`<span class=\"dirs\">${path.slice(0, cut + 1)}</span>` : nothing}<span class=\"name\"\n >${path.slice(cut + 1)}</span\n ></span\n >\n ${size !== undefined || kind ? html`<span class=\"meta\">${[size === undefined ? '' : formatSize(size), kind].filter(Boolean).join(' · ')}</span>` : nothing}\n ${links.length\n ? html`<span class=\"links\">\n ${links.map(\n (l) => html`<a href=${safeHref(l.href) ?? ''} target=\"_blank\" rel=\"noopener\" title=${ifDefined(l.title ?? l.text)}\n >${renderIcon(l.icon)}${l.text ?? ''}</a\n >`,\n )}\n </span>`\n : nothing}\n </div>`;\n }\n\n override render() {\n const path = normalizePath(this.path);\n const read = this.#read ?? {};\n const text = this.text ?? read.text;\n const blob = this.blob ?? read.blob;\n const type = this.type ?? read.type ?? (blob?.type || undefined);\n const size = this.size ?? read.size ?? blob?.size ?? (text === undefined ? undefined : new TextEncoder().encode(text).length);\n // No path and nothing to show is no file, even when a panel hands over '' for the text.\n if (!path && !text && !blob && !this.src) {\n return html`<div class=\"none\">${this.empty ?? 'No file selected.'}</div>`;\n }\n let kind = fileKind(path, type);\n let body: TemplateResult | typeof nothing = nothing;\n let content = text;\n if (this.#reading) body = html`<div class=\"none\">Loading…</div>`;\n else if (this.#error) body = html`<div class=\"none\">Could not read this file: ${this.#error}</div>`;\n else if (kind === 'image') {\n const image = blob ?? (content !== undefined && /^\\s*</.test(content) ? this.#svg(content) : undefined);\n const src = image ? this.#objectUrl(image) : imageSrc(this.src);\n body = src\n ? html`<img class=\"image\" src=${src} alt=${basename(path)} />`\n : html`<div class=\"none\">An image with nothing to show.</div>`;\n } else if (content === undefined && blob && kind !== 'binary') {\n const sniffed = this.#sniff(blob);\n if (sniffed === undefined) body = html`<div class=\"none\">Loading…</div>`;\n else if (sniffed === null) kind = 'binary';\n else content = sniffed;\n } else if (content !== undefined && kind === undefined && looksBinary(content)) kind = 'binary';\n\n if (body === nothing) {\n if (kind === 'binary' || content === undefined) {\n body = html`<div class=\"none\">\n ${kind === 'binary' ? 'A binary file' : 'A file'} with no text to show${size === undefined ? '' : `, ${formatSize(size)}`}${type\n ? ` (${type})`\n : ''}.\n </div>`;\n } else if (kind === 'markdown') {\n body = html`<kd-markdown .markdown=${content} .base=${this.base}></kd-markdown>`;\n } else {\n body = html`<kd-code .text=${content} .filename=${basename(path)}></kd-code>`;\n }\n }\n const label = kind === 'binary' ? 'binary' : '';\n return html`${path ? this.#header(path, size, label) : nothing}${body}${this.truncated\n ? html`<div class=\"none\">Only the start of this file was loaded.</div>`\n : nothing}`;\n }\n}\n\ndefine('kd-file', KdFile);\n"],"ignoreList":[1,9,10,15],"mappings":"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"}
|