@marimo-team/islands 0.25.2-dev12 → 0.25.2-dev121
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/dist/{ConnectedDataExplorerComponent-CqhQmp74.js → ConnectedDataExplorerComponent-CNSxdKyJ.js} +15 -15
- package/dist/{ErrorBoundary-YddQ6YHW.js → ErrorBoundary-Bo3Tg7Jh.js} +12 -12
- package/dist/{ImageComparisonComponent-Cpfz30OZ.js → ImageComparisonComponent-uU8FSKZE.js} +3 -3
- package/dist/{Plot-CTyjbQDT.js → Plot-DdYOe1UK.js} +2 -2
- package/dist/{abnfDiagram-VCTEODGH-aLGD44M7.js → abnfDiagram-VCTEODGH-DQDjNXt3.js} +3 -3
- package/dist/{any-language-editor-dqxlUDlT.js → any-language-editor-B9REGlD9.js} +8 -8
- package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
- package/dist/{architectureDiagram-5GKGNRK7-BGL5P81u.js → architectureDiagram-5GKGNRK7-Nmls7Wxn.js} +5 -5
- package/dist/{asciiarmor-GKQFJXQG.js → asciiarmor-BWNxzkG7.js} +1 -1
- package/dist/{asn1-BsSb7HP5.js → asn1-Bcn2QutK.js} +1 -1
- package/dist/assets/__vite-browser-external-BXYkiFsk.js +1 -0
- package/dist/assets/worker-HPY9fbhz.js +114 -0
- package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
- package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-Cg25UrxT.js} +9 -9
- package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
- package/dist/{button-B0Xgl-Qn.js → button-CvjkwdSk.js} +304 -287
- package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-BxFgrnNV.js} +7 -7
- package/dist/{capabilities-D7Ad8-zw.js → capabilities-CQ5IjhzL.js} +1 -1
- package/dist/{cells-5ppES-Un.js → cells-CuYwqnV8.js} +5950 -4893
- package/dist/{channel-z7HZXHwv.js → channel-CPObtJXj.js} +1 -1
- package/dist/{chat-ui-Dv2V95k6.js → chat-ui-C6oDg4Zu.js} +1595 -1402
- package/dist/{check-DGZ74tV2.js → check-EDwSwP89.js} +1 -1
- package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-D4eFPyFh.js} +5 -5
- package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-D7gxIs2Q.js} +1 -1
- package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BwiyaNpg.js} +2 -2
- package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-ufseIn5y.js} +1 -1
- package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-BhaJx0X3.js} +3 -3
- package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-Cwbt-lF0.js} +2 -2
- package/dist/{chunk-IMKFNOWR-Cm3RgLDj.js → chunk-IMKFNOWR-CoIFEo-1.js} +6 -6
- package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-n-zgIVSy.js} +5 -5
- package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-DXa-Cxbn.js} +6 -6
- package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-B_Zd3-X0.js} +1 -1
- package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-hYOXbYH_.js} +1 -1
- package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-CQw5qATZ.js} +1 -1
- package/dist/{chunk-SHT3W25Y-DedDYSP5.js → chunk-SHT3W25Y-lHiGx3ZC.js} +8 -8
- package/dist/{chunk-SVP7TREG-B2SFkCAL.js → chunk-SVP7TREG-BvsHIrY_.js} +2 -2
- package/dist/{chunk-TICWLB2K-DB6hjNOL.js → chunk-TICWLB2K-BC8YIm_n.js} +6 -6
- package/dist/{chunk-YOKDWASO-DrWbKnxA.js → chunk-YOKDWASO-DPZk8vhS.js} +6 -6
- package/dist/classDiagram-ZZMXUADV-Bt98lkkv.js +30 -0
- package/dist/classDiagram-v2-VYDZK3BY-D9bfbcC3.js +30 -0
- package/dist/{clike-E2lFbGVj.js → clike-CxK9W55Z.js} +1 -1
- package/dist/{clojure-Dn_K4RlK.js → clojure-Dzcvwpxk.js} +1 -1
- package/dist/{cmake-DpN2Top5.js → cmake-DYr-71zp.js} +1 -1
- package/dist/{cobol-Chf22-GM.js → cobol-DC3g37Kq.js} +1 -1
- package/dist/{code-visibility-C0zE3g0U.js → code-visibility-WFM7uHBf.js} +7 -7
- package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
- package/dist/{common-BkjS959w.js → common-BLHW2E-1.js} +9639 -9291
- package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
- package/dist/{compiler-runtime-Cj8ZWiNS.js → compiler-runtime-CldRdSsv.js} +2 -2
- package/dist/{copy-icon-qmRg_VTX.js → copy-icon-Ft7t9bqz.js} +6 -6
- package/dist/{crystal-DCM3yc4r.js → crystal-ih5ax5tQ.js} +1 -1
- package/dist/{css-DkZ9mMyI.js → css-CN_wP7_R.js} +1 -1
- package/dist/{cynefinDiagram-5FMLGOSQ-DzaZEqgD.js → cynefinDiagram-5FMLGOSQ-CgWra7wt.js} +3 -3
- package/dist/{cypher-Drw_8U5I.js → cypher-CqGRcmZo.js} +1 -1
- package/dist/{d-CsVGcKMF.js → d-Cj0sOW2z.js} +1 -1
- package/dist/{dagre-GXQ25YYZ-Cjf5GjU3.js → dagre-GXQ25YYZ-CFZ8-35c.js} +10 -10
- package/dist/{data-grid-overlay-editor-CqoIqvNa.js → data-grid-overlay-editor-Dt75J_Qe.js} +7 -7
- package/dist/{data-grid-types-BucVmDDp.js → data-grid-types-BH_r7g7l.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-IhLt_khx.js → diagram-S7CK7UJ4-lCNQrW7d.js} +4 -4
- package/dist/{diagram-UQ7AKVKN-CQc6KLPB.js → diagram-UQ7AKVKN-CQPQ6pP_.js} +3 -3
- package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-BJWcVVJY.js} +2 -2
- package/dist/{diagram-VX7I27RA-DHmW9N1T.js → diagram-VX7I27RA-Cf3b0llz.js} +5 -5
- package/dist/{diagram-Z3DM3KII-zVKsg-Ty.js → diagram-Z3DM3KII-Bt4QLrpn.js} +3 -3
- package/dist/{dialog-CILKhbsG.js → dialog-CEBFZNyc.js} +29 -29
- package/dist/{diff-CBikYCUF.js → diff-B_hUkiat.js} +1 -1
- package/dist/{dist-Df0wKI0F.js → dist-BK4Oj99o.js} +1 -1
- package/dist/{dist-BVGtK7Ht.js → dist-BLfKmR-l.js} +1 -1
- package/dist/{dist-B8D7McG3.js → dist-BMQf5zIS.js} +46 -46
- package/dist/{dist-C2KzV-vf.js → dist-BorMD-uX.js} +2 -2
- package/dist/{dist-Cs2FijYk.js → dist-BuaRHxOc.js} +2 -2
- package/dist/{dist-DPcEtqmG.js → dist-Bvs24R_E.js} +47 -47
- package/dist/{dist-lA1Cttkb.js → dist-C8fAKSH1.js} +41 -41
- package/dist/{dist-DszxuxS1.js → dist-CLdpGQVr.js} +2 -2
- package/dist/{dist-CO1AwwG_.js → dist-CN8zI-XC.js} +209 -209
- package/dist/{dist-D1PpnuZB.js → dist-CN_BeG2I.js} +1 -1
- package/dist/{dist-CPGxfVGX.js → dist-CSJ0MDRw.js} +1 -1
- package/dist/{dist-Cm3iAFMD.js → dist-CSbh1PNP.js} +3 -3
- package/dist/{dist-9x1ZRe-e.js → dist-Cg7gzw-a.js} +2 -2
- package/dist/{dist-B1vYLK28.js → dist-CkTTIdBe.js} +345 -345
- package/dist/{dist-BRxfaJgs.js → dist-CrSP_H1M.js} +296 -296
- package/dist/{dist-C2wDlYdD.js → dist-D-wwqlzJ.js} +2 -2
- package/dist/{dist-BtKIs9N-.js → dist-D6d86eNJ.js} +1 -1
- package/dist/{dist-DHOTQar0.js → dist-DBtSl3sf.js} +1 -1
- package/dist/{dist-KzZ7WELx.js → dist-DiDibOYr.js} +120 -120
- package/dist/{dist-Kxgjxakw.js → dist-DoE4XJBC.js} +1277 -1222
- package/dist/{dist-CcyKTBTF.js → dist-DpBpA_n1.js} +2 -2
- package/dist/{dist-BHCHt1NI.js → dist-F8Ep36rk.js} +1 -1
- package/dist/{dist-C8xMLVYi.js → dist-OR1OnN-y.js} +44 -44
- package/dist/{dist-1HDa70oE.js → dist-PXYI_yuP.js} +3 -3
- package/dist/{dist-CMh_W4y4.js → dist-diIx5qJW.js} +2 -2
- package/dist/{dockerfile-DJnSntVB.js → dockerfile-D0VKN500.js} +2 -2
- package/dist/dropdown-menu-CP_qCYHC.js +4678 -0
- package/dist/{dtd-BHa4v0Bn.js → dtd-B8FGSWWe.js} +1 -1
- package/dist/{dylan-BypL2Zz8.js → dylan-DbIBYIrw.js} +1 -1
- package/dist/{ebnf-5guncNu-.js → ebnf-D-YbYLdk.js} +1 -1
- package/dist/{ebnfDiagram-PWID7BFC-DDd5hCRC.js → ebnfDiagram-PWID7BFC-D3NAyPFY.js} +3 -3
- package/dist/{ecl-iRcVIKYZ.js → ecl-DBmkdWAd.js} +1 -1
- package/dist/{eiffel-BEqF9aU4.js → eiffel-CcWSDDzK.js} +1 -1
- package/dist/{elm-DYcfNE9c.js → elm-MC-b8a6C.js} +1 -1
- package/dist/{erDiagram-RLTQ6QDP-D10NP0eI.js → erDiagram-RLTQ6QDP-Tlu09_Nm.js} +12 -12
- package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
- package/dist/error-banner-Da600cwz.js +362 -0
- package/dist/{error-entries-B2Ux3Z2X.js → error-entries-zfHL6H60.js} +2 -2
- package/dist/{esm-h8f7-1CJ.js → esm-AMFssoNp.js} +380 -374
- package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
- package/dist/{factor-3nzOwLuN.js → factor-Ys-13HOP.js} +2 -2
- package/dist/{fcl-C90TGnJJ.js → fcl-DnwditDr.js} +1 -1
- package/dist/{feedback-button-BU771zKS.js → feedback-button-pfhtTNjh.js} +13 -13
- package/dist/flowDiagram-HODETNUW-CAYbpJmV.js +16 -0
- package/dist/{formats-Q9gwlLyD.js → formats-DLtvJPnj.js} +6 -6
- package/dist/{forth-DEaRrLUi.js → forth-DiMuIXFe.js} +1 -1
- package/dist/{fortran-Bv6JRUjY.js → fortran-hkrF2eM4.js} +1 -1
- package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-BQT16JSc.js} +2 -2
- package/dist/{gas-JNerWj3-.js → gas-DlhqN9k8.js} +1 -1
- package/dist/{gherkin-CSrl-H70.js → gherkin-0SlhEZ3t.js} +1 -1
- package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-D5nSIzdE.js} +2 -2
- package/dist/{glide-data-editor-D9TpbHEU.js → glide-data-editor-B3x7mDpj.js} +60 -60
- package/dist/{glide-utils-CzzWU59p.js → glide-utils-DJyqh0EM.js} +4 -4
- package/dist/{globals-nXV4QUKg.js → globals-6B7ecxsC.js} +3 -3
- package/dist/{groovy-X7euO_vE.js → groovy-YhcTMyvX.js} +1 -1
- package/dist/{haskell-C48Z70Az.js → haskell-CodLxrtT.js} +1 -1
- package/dist/{haxe-CAUWMmwR.js → haxe-CiRWNFkH.js} +1 -1
- package/dist/{highlighted-body-KPVGNVTW-Ad3MKZ18.js → highlighted-body-KPVGNVTW-zwjq21tf.js} +4 -4
- package/dist/{html-to-image-BZBwkkDG.js → html-to-image-BJJsbNZ1.js} +547 -569
- package/dist/{http-BrSBnhDH.js → http-Bh6HhdNR.js} +1 -1
- package/dist/{idl-BXuPleZv.js → idl-DZgBq75I.js} +1 -1
- package/dist/{infoDiagram-27XIBGKW-DrYu3UZC.js → infoDiagram-27XIBGKW-XrDxhr0x.js} +2 -2
- package/dist/{ishikawaDiagram-5VMMS53U-pmkGQJsA.js → ishikawaDiagram-5VMMS53U-CD1muzov.js} +3 -3
- package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
- package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BaLqn-dZ.js} +2 -2
- package/dist/{jsx-runtime-DgDPJV9S.js → jsx-runtime-3BD1kT0s.js} +1 -1
- package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
- package/dist/{kanban-definition-UXKFOSKX-wWGD9VLW.js → kanban-definition-UXKFOSKX-Dg9W142_.js} +9 -9
- package/dist/{katex-BNCmKUol.js → katex-BIdZGsyO.js} +141 -116
- package/dist/label-BDKF3Afc.js +281 -0
- package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
- package/dist/{loader-C9OUkMrj.js → loader-BQOfjTIJ.js} +1 -1
- package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
- package/dist/main.js +7036 -6893
- package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
- package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
- package/dist/{mermaid-Dfvntf3s.js → mermaid-CiAXjLpA.js} +57 -57
- package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +2 -0
- package/dist/{mhchem-BEc7A1or.js → mhchem-CdWPJK6g.js} +1 -1
- package/dist/{mindmap-definition-YA3MSWOX-C2f1VIBR.js → mindmap-definition-YA3MSWOX-DgCidgYJ.js} +11 -11
- package/dist/{mirc-CqeibO3N.js → mirc-De9aSAZM.js} +1 -1
- package/dist/{mllike-D54QZYTP.js → mllike-BbugeaY_.js} +1 -1
- package/dist/{modelica-DuML2-8V.js → modelica-BjJwWw1F.js} +1 -1
- package/dist/{mscgen-CJmKwp3b.js → mscgen-DwiRH5ma.js} +1 -1
- package/dist/{mumps-DaVgFtkd.js → mumps--plbDM9o.js} +1 -1
- package/dist/{nginx-BXN1rqI0.js → nginx-C4Df7REc.js} +1 -1
- package/dist/{nsis-CMfRqf0V.js → nsis-fiiOqLc3.js} +7 -7
- package/dist/{ntriples-BiOGlMDR.js → ntriples-jV77I4k8.js} +1 -1
- package/dist/{number-overlay-editor-BH4Uo_sZ.js → number-overlay-editor-CyJwIeU1.js} +5 -5
- package/dist/{octave-CgVnzxKk.js → octave-Cztd01tF.js} +1 -1
- package/dist/{oz-B2mky97X.js → oz-Bl8o3BDl.js} +1 -1
- package/dist/{pascal-BoZhBf6s.js → pascal-BO5JqysR.js} +1 -1
- package/dist/{pegDiagram-XKGWAZYB-D6v5dz4M.js → pegDiagram-XKGWAZYB-coOYYKB6.js} +3 -3
- package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
- package/dist/{pieDiagram-E7YTZNPT-BwFAhpYD.js → pieDiagram-E7YTZNPT-BnXTc3bj.js} +3 -3
- package/dist/{pig-B2mB-01d.js → pig-BWGR8wZw.js} +1 -1
- package/dist/{powershell-D0zT88Aj.js → powershell-DT99xlz_.js} +1 -1
- package/dist/{process-output-BSsWzfnY.js → process-output-C1GGFU6Q.js} +4 -4
- package/dist/{properties-3_5qCgOj.js → properties-Q-rkxld0.js} +1 -1
- package/dist/{protobuf-Dgoxfi1H.js → protobuf-DKyWZbs7.js} +1 -1
- package/dist/{pug-CNRdd8oG.js → pug-42ZJUbEC.js} +2 -2
- package/dist/{puppet-DzILxZfz.js → puppet-B4UozHhh.js} +1 -1
- package/dist/purify.es-DMv5zIkJ.js +866 -0
- package/dist/{python-AfVdMn_l.js → python-DREjAV__.js} +1 -1
- package/dist/{q-C6p-CGWh.js → q-Bi63IpBO.js} +1 -1
- package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-Ccw0xMjN.js} +1 -1
- package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
- package/dist/{railroadDiagram-O6MQD6OU-D6eOFr6Z.js → railroadDiagram-O6MQD6OU-B28-u83n.js} +3 -3
- package/dist/{react-dom-BUgJ-ab_.js → react-dom-DUmH0GXv.js} +29 -21
- package/dist/{react-ofJbxM4x.js → react-sHtZdjeP.js} +103 -94
- package/dist/{react-vega-ewj7q_U5.js → react-vega-BED0DjiB.js} +3 -3
- package/dist/{requirementDiagram-BXWQKSXE-CHYsMgDR.js → requirementDiagram-BXWQKSXE-CdYCTMu0.js} +11 -11
- package/dist/{reveal-component-_A40NW1c.js → reveal-component-CPohnNHB.js} +906 -878
- package/dist/{rpm-Bx7FkjTO.js → rpm-DPb1DeKM.js} +1 -1
- package/dist/{ruby-BMzgq2bf.js → ruby-U7fZA4DP.js} +2 -2
- package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-ELvOcnZH.js} +1 -1
- package/dist/{sas-ClGVnK3F.js → sas-CLk1JpTn.js} +1 -1
- package/dist/{scheme-C0MXqXep.js → scheme-CT-2k2Tl.js} +1 -1
- package/dist/select-BButFi-d.js +1344 -0
- package/dist/{sequenceDiagram-WJ2MYXX4-BPAknhBp.js → sequenceDiagram-WJ2MYXX4-CM3aRAe_.js} +4 -4
- package/dist/{shell-CiQZv6oG.js → shell-BLO7fcsk.js} +1 -1
- package/dist/{sieve-BiIMePvV.js → sieve-nG3C7WNH.js} +1 -1
- package/dist/{simple-mode-8ETW2RS6.js → simple-mode-C683Q7or.js} +1 -1
- package/dist/{smalltalk-9-llftyG.js → smalltalk-BROcZybA.js} +1 -1
- package/dist/{solr-CxCKEuwq.js → solr-mVltHNc5.js} +1 -1
- package/dist/{sparql-BRmy7pzx.js → sparql-Cv1Ksr4v.js} +1 -1
- package/dist/{spec-D62vWpMT.js → spec-BwarBpUJ.js} +116 -135
- package/dist/{spreadsheet-UCNUIGsn.js → spreadsheet-BwTnp5K_.js} +1 -1
- package/dist/{sql-D0hSGZ-H.js → sql-CjLt0122.js} +1 -1
- package/dist/{stateDiagram-D77RDMKH-Cq249IQ4.js → stateDiagram-D77RDMKH-DOZUMVj8.js} +13 -13
- package/dist/stateDiagram-v2-MP3YSRHH-CISYxma6.js +30 -0
- package/dist/{stex-UeT_Aofp.js → stex-Btf3omL8.js} +1 -1
- package/dist/style.css +1 -1
- package/dist/{stylus-Fi4waA2H.js → stylus-Dt4VvLXL.js} +1 -1
- package/dist/{swift-NqPyaBye.js → swift-DHsn_CVI.js} +1 -1
- package/dist/{swimlanes-42K2YHIH-Bh_S_HKD.js → swimlanes-42K2YHIH-BkSppxp8.js} +10 -10
- package/dist/swimlanesDiagram-VR7AAH4N-c8G5pGxC.js +30 -0
- package/dist/{swiper-component-DkV7T44B.js → swiper-component-DKntyn8p.js} +5 -5
- package/dist/{tcl-B4f0xfmM.js → tcl-CV0OLBOl.js} +1 -1
- package/dist/{textile-CnNbnPTe.js → textile-D320oKVM.js} +1 -1
- package/dist/{tiddlywiki-CSGSOg38.js → tiddlywiki-BVVNvfy4.js} +1 -1
- package/dist/{tiki-9F02WBA6.js → tiki-BF2aDPlB.js} +1 -1
- package/dist/{timeline-definition-24CTP7MA-ByNMgBE7.js → timeline-definition-24CTP7MA-CaMQayqK.js} +3 -3
- package/dist/{toDate-DWVp6uE1.js → toDate-Dwcg_x_5.js} +5 -6
- package/dist/{toast-DcoJGS3-.js → toast-B9UMEi8u.js} +161 -165
- package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
- package/dist/{tooltip-Bi36DgYh.js → tooltip-BO1REbqs.js} +548 -584
- package/dist/{troff-DlfvveK1.js → troff-DQUFcClZ.js} +1 -1
- package/dist/{ttcn--YVSkGs_.js → ttcn-CQL1duJS.js} +1 -1
- package/dist/{ttcn-cfg-Bb1Knl_J.js → ttcn-cfg-BMmEFJPu.js} +1 -1
- package/dist/{turtle-DC24v1bz.js → turtle-C3esgsRr.js} +1 -1
- package/dist/{use-restore-focus-ZgG5Br63.js → use-restore-focus-BEM7sFWl.js} +2430 -2007
- package/dist/{use-vega-container-remeasure-4DwJbPWu.js → use-vega-container-remeasure-Bz4PZMtt.js} +2 -2
- package/dist/{useAsyncData-BD7NLQ3_.js → useAsyncData-Deh5kszT.js} +3 -3
- package/dist/{useDateFormatter-D8XWr8lL.js → useDateFormatter-D8XruNGG.js} +53 -32
- package/dist/{useDeepCompareMemoize-CawMGSRU.js → useDeepCompareMemoize-DXwzRINI.js} +2 -2
- package/dist/{useIframeCapabilities-BUMBOpsM.js → useIframeCapabilities-DBETvvPl.js} +2 -2
- package/dist/{useLifecycle-3vGhRa1o.js → useLifecycle-j7D9uD1o.js} +6 -6
- package/dist/{useTheme-BOw801nZ.js → useTheme-CRnjkku0.js} +7 -7
- package/dist/{vb-Dpc8vhvF.js → vb-RK1eDXRl.js} +1 -1
- package/dist/{vbscript-B-Y1XnZe.js → vbscript-BCOeM0de.js} +1 -1
- package/dist/{vega-component-9siY74NS.js → vega-component-DLBAQLSf.js} +14 -14
- package/dist/{vega-embed-container-sSR5hAsy.js → vega-embed-container-BNHE18G9.js} +5 -5
- package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
- package/dist/{vennDiagram-4TSXK5OY-DY8CySdO.js → vennDiagram-4TSXK5OY-CF8pfaK3.js} +3 -3
- package/dist/{verilog-DhiEaoUl.js → verilog-DqQTzVn8.js} +1 -1
- package/dist/{vhdl-D4X23YKO.js → vhdl-vQr2bfmi.js} +1 -1
- package/dist/{wardleyDiagram-VM6X3IG4-DYC1AFni.js → wardleyDiagram-VM6X3IG4-dGPu39d-.js} +3 -3
- package/dist/{webidl-SyzNxWpJ.js → webidl-DzX7N40e.js} +1 -1
- package/dist/{xquery-BC2R4Hk6.js → xquery-Cw_Q_hGR.js} +1 -1
- package/dist/{xychartDiagram-S5SC5T6Z-Df8LLnuY.js → xychartDiagram-S5SC5T6Z-CP6-9q56.js} +5 -5
- package/dist/{yacas-DLNXPMmH.js → yacas-DiC4jJBE.js} +1 -1
- package/dist/{z80-CDXWHOO6.js → z80-CUOQDEJO.js} +1 -1
- package/package.json +38 -37
- package/src/__tests__/mount.test.ts +6 -6
- package/src/components/chat/__tests__/chat-history-popover.test.tsx +157 -0
- package/src/components/chat/chat-history-popover.tsx +98 -17
- package/src/components/chat/chat-panel.tsx +29 -0
- package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
- package/src/components/chat/tool-call/tool-result.tsx +3 -3
- package/src/components/data-table/TableTopBar.tsx +4 -0
- package/src/components/data-table/__tests__/export-actions.test.tsx +1111 -14
- package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
- package/src/components/data-table/__tests__/schemas.test.ts +57 -0
- package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
- package/src/components/data-table/charts/__tests__/slider-field.test.tsx +54 -0
- package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
- package/src/components/data-table/charts/components/form-fields.tsx +3 -1
- package/src/components/data-table/charts/constants.ts +11 -10
- package/src/components/data-table/charts/types.ts +1 -0
- package/src/components/data-table/data-table.tsx +3 -0
- package/src/components/data-table/export-actions.tsx +365 -81
- package/src/components/data-table/pagination.tsx +16 -2
- package/src/components/data-table/schemas.ts +90 -14
- package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
- package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
- package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
- package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
- package/src/components/editor/actions/useRestartKernel.tsx +2 -2
- package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +224 -17
- package/src/components/editor/alerts/connection-details.tsx +61 -0
- package/src/components/editor/alerts/connection-notice.tsx +46 -53
- package/src/components/editor/alerts/startup-progress.tsx +73 -129
- package/src/components/editor/app-container.tsx +2 -2
- package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +2 -2
- package/src/components/editor/cell/CreateCellButton.tsx +2 -2
- package/src/components/editor/cell/DeleteButton.tsx +2 -2
- package/src/components/editor/cell/RunButton.tsx +3 -3
- package/src/components/editor/cell/StopButton.tsx +2 -2
- package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +4 -4
- package/src/components/editor/chrome/components/feedback-button.tsx +3 -3
- package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +8 -8
- package/src/components/editor/chrome/panels/__tests__/{sandbox-details.test.tsx → runtime-details.test.tsx} +94 -22
- package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +4 -4
- package/src/components/editor/chrome/panels/packages-panel.tsx +8 -29
- package/src/components/editor/chrome/panels/{sandbox-details-state.ts → runtime-details-state.ts} +1 -1
- package/src/components/editor/chrome/panels/{sandbox-panel.tsx → runtime-panel.tsx} +38 -66
- package/src/components/editor/chrome/panels/runtime-status-toggle.tsx +56 -0
- package/src/components/editor/chrome/panels/sandbox-controller.tsx +2 -2
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +3 -3
- package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +2 -2
- package/src/components/editor/controls/Controls.tsx +3 -3
- package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +2 -2
- package/src/components/editor/header/__tests__/status.test.tsx +4 -4
- package/src/components/editor/header/app-header.tsx +2 -2
- package/src/components/editor/header/status.tsx +3 -3
- package/src/components/editor/navigation/__tests__/navigation.test.ts +8 -8
- package/src/components/editor/output/console/ConsoleOutput.tsx +5 -3
- package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +18 -0
- package/src/components/ui/__tests__/slider.test.tsx +37 -0
- package/src/components/ui/progress-stages.tsx +114 -0
- package/src/components/ui/slider.tsx +2 -0
- package/src/core/ai/__tests__/state.test.ts +120 -0
- package/src/core/ai/state.ts +36 -10
- package/src/core/cells/__tests__/document-roundtrip.test.ts +16 -0
- package/src/core/codemirror/copilot/__tests__/completion-integration.test.ts +447 -0
- package/src/core/codemirror/copilot/__tests__/inline-completion.test.ts +395 -0
- package/src/core/codemirror/copilot/__tests__/language-server.test.ts +511 -2
- package/src/core/codemirror/copilot/__tests__/rpc-cancellation.test.ts +201 -0
- package/src/core/codemirror/copilot/extension.ts +22 -11
- package/src/core/codemirror/copilot/language-server.ts +109 -60
- package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +138 -26
- package/src/core/codemirror/language/embedded/embedded-python.ts +47 -13
- package/src/core/codemirror/language/embedded/latex.ts +20 -13
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
- package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
- package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
- package/src/core/codemirror/readonly/extension.ts +2 -2
- package/src/core/config/pair.ts +0 -1
- package/src/core/datasets/__tests__/data-source-discovery.test.ts +2 -2
- package/src/core/edit-app.tsx +5 -1
- package/src/core/export/hooks.ts +2 -2
- package/src/core/islands/bootstrap.ts +1 -0
- package/src/core/kernel/session.ts +9 -0
- package/src/core/network/__tests__/api.test.ts +114 -1
- package/src/core/network/__tests__/connection.test.ts +3 -3
- package/src/core/network/api.ts +3 -2
- package/src/core/network/connection-notice.ts +5 -5
- package/src/core/network/connection.ts +9 -9
- package/src/core/network/requests-lazy.ts +2 -2
- package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
- package/src/core/packages/useSandboxController.ts +6 -6
- package/src/core/runtime/__tests__/adapter.test.ts +6 -6
- package/src/core/runtime/adapter.ts +7 -7
- package/src/core/runtime/config.ts +2 -2
- package/src/core/saving/filename.ts +2 -2
- package/src/core/saving/save-component.tsx +5 -5
- package/src/core/saving/useAutoSave.ts +2 -2
- package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
- package/src/core/wasm/worker/bootstrap.ts +22 -3
- package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
- package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
- package/src/core/websocket/connection-utils.ts +21 -21
- package/src/core/websocket/types.ts +8 -9
- package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
- package/src/css/katex-css.test.ts +166 -0
- package/src/css/katex.min.css +175 -169
- package/src/hooks/__tests__/useEventListener.test.tsx +45 -1
- package/src/hooks/useEventListener.ts +6 -1
- package/src/mount.tsx +2 -2
- package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
- package/src/plugins/core/registerReactComponent.tsx +3 -1
- package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
- package/src/plugins/impl/DataTablePlugin.tsx +23 -2
- package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
- package/src/plugins/impl/DateRangePlugin.tsx +5 -3
- package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
- package/src/plugins/impl/DropdownPlugin.tsx +1 -1
- package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
- package/src/plugins/impl/NumberPlugin.tsx +1 -1
- package/src/plugins/impl/RadioPlugin.tsx +5 -1
- package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
- package/src/plugins/impl/SearchableSelect.tsx +1 -1
- package/src/plugins/impl/SliderPlugin.tsx +5 -1
- package/src/plugins/impl/SwitchPlugin.tsx +6 -1
- package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
- package/src/plugins/impl/TextInputPlugin.tsx +10 -2
- package/src/plugins/impl/__test__/slider-labels.test.tsx +136 -0
- package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
- package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
- package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
- package/src/plugins/impl/common/labeled.tsx +9 -3
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
- package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
- package/src/stories/cell.stories.tsx +2 -2
- package/src/stories/dataframe.stories.tsx +7 -0
- package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
- package/src/stories/progress-stages.stories.tsx +62 -0
- package/src/stories/runtime-existing.stories.tsx +44 -0
- package/src/stories/runtime-maintenance.stories.tsx +40 -0
- package/src/stories/runtime-pixi.stories.tsx +28 -0
- package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
- package/src/stories/runtime-uv.stories.tsx +56 -0
- package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
- package/dist/assets/worker-D7hWi02M.js +0 -109
- package/dist/classDiagram-ZZMXUADV-BwYhrSEX.js +0 -30
- package/dist/classDiagram-v2-VYDZK3BY-HecM04TM.js +0 -30
- package/dist/dropdown-menu-BaqM0t4N.js +0 -4502
- package/dist/error-banner-DzAmP0AQ.js +0 -391
- package/dist/flowDiagram-HODETNUW-DgcjSdPV.js +0 -16
- package/dist/label-MNhNNoN6.js +0 -278
- package/dist/mermaid-HWGCJPDP-DYCzSILp.js +0 -2
- package/dist/purify.es-DgKyQviY.js +0 -805
- package/dist/select-BcObMjGz.js +0 -970
- package/dist/stateDiagram-v2-MP3YSRHH-Dk5QgdXF.js +0 -30
- package/dist/swimlanesDiagram-VR7AAH4N-CbztusY8.js +0 -30
- package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
|
@@ -52,7 +52,7 @@ import { useRuntimeManager } from "@/core/runtime/config";
|
|
|
52
52
|
import { initialRunCompletedAtom } from "../../kernel/state";
|
|
53
53
|
import { connectionAtom, startupProgressAtom } from "../../network/connection";
|
|
54
54
|
import type { SessionId } from "../../kernel/session";
|
|
55
|
-
import { WebSocketClosedReason,
|
|
55
|
+
import { WebSocketClosedReason, ConnectionState } from "../types";
|
|
56
56
|
import type { IConnectionTransport } from "../transports/transport";
|
|
57
57
|
import { useMarimoKernelConnection } from "../useMarimoKernelConnection";
|
|
58
58
|
import { useConnectionTransport } from "../useWebSocket";
|
|
@@ -118,7 +118,7 @@ describe("useMarimoKernelConnection.reconnect()", () => {
|
|
|
118
118
|
isHealthy = vi.fn<() => Promise<boolean>>().mockResolvedValue(true);
|
|
119
119
|
store = createStore();
|
|
120
120
|
store.set(connectionAtom, {
|
|
121
|
-
state:
|
|
121
|
+
state: ConnectionState.CLOSED,
|
|
122
122
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
123
123
|
reason: "kernel not found",
|
|
124
124
|
});
|
|
@@ -163,7 +163,7 @@ describe("useMarimoKernelConnection.reconnect()", () => {
|
|
|
163
163
|
expect(isHealthy).toHaveBeenCalledOnce();
|
|
164
164
|
expect(transport.reconnect).toHaveBeenCalledOnce();
|
|
165
165
|
expect(store.get(connectionAtom)).toEqual({
|
|
166
|
-
state:
|
|
166
|
+
state: ConnectionState.CONNECTING,
|
|
167
167
|
});
|
|
168
168
|
});
|
|
169
169
|
|
|
@@ -176,7 +176,7 @@ describe("useMarimoKernelConnection.reconnect()", () => {
|
|
|
176
176
|
expect(isHealthy).toHaveBeenCalledOnce();
|
|
177
177
|
expect(transport.reconnect).not.toHaveBeenCalled();
|
|
178
178
|
expect(store.get(connectionAtom)).toEqual({
|
|
179
|
-
state:
|
|
179
|
+
state: ConnectionState.CLOSED,
|
|
180
180
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
181
181
|
reason: "kernel not found",
|
|
182
182
|
});
|
|
@@ -215,7 +215,7 @@ it.each(["kernel-ready", "reconnected"])(
|
|
|
215
215
|
"waits for %s before marking the session connected",
|
|
216
216
|
async (op) => {
|
|
217
217
|
const store = createStore();
|
|
218
|
-
store.set(connectionAtom, { state:
|
|
218
|
+
store.set(connectionAtom, { state: ConnectionState.CONNECTING });
|
|
219
219
|
vi.mocked(useConnectionTransport).mockClear();
|
|
220
220
|
vi.mocked(useConnectionTransport).mockReturnValue(
|
|
221
221
|
makeTransport(WebSocket.OPEN),
|
|
@@ -229,7 +229,7 @@ it.each(["kernel-ready", "reconnected"])(
|
|
|
229
229
|
await act(async () => {
|
|
230
230
|
await options.onOpen(new Event("open"));
|
|
231
231
|
});
|
|
232
|
-
expect(store.get(connectionAtom).state).toBe(
|
|
232
|
+
expect(store.get(connectionAtom).state).toBe(ConnectionState.CONNECTING);
|
|
233
233
|
|
|
234
234
|
act(() => {
|
|
235
235
|
options.onMessage(
|
|
@@ -257,7 +257,7 @@ it.each(["kernel-ready", "reconnected"])(
|
|
|
257
257
|
}),
|
|
258
258
|
);
|
|
259
259
|
});
|
|
260
|
-
expect(store.get(connectionAtom).state).toBe(
|
|
260
|
+
expect(store.get(connectionAtom).state).toBe(ConnectionState.OPEN);
|
|
261
261
|
},
|
|
262
262
|
);
|
|
263
263
|
|
|
@@ -267,7 +267,7 @@ describe("connection notice", () => {
|
|
|
267
267
|
|
|
268
268
|
function renderNotice() {
|
|
269
269
|
const store = createStore();
|
|
270
|
-
store.set(connectionAtom, { state:
|
|
270
|
+
store.set(connectionAtom, { state: ConnectionState.CONNECTING });
|
|
271
271
|
const transport = makeTransport(WebSocket.OPEN);
|
|
272
272
|
vi.mocked(useConnectionTransport).mockReturnValue(transport);
|
|
273
273
|
vi.mocked(useRuntimeManager).mockReturnValue(
|
|
@@ -322,14 +322,6 @@ describe("connection notice", () => {
|
|
|
322
322
|
);
|
|
323
323
|
act(() => vi.advanceTimersByTime(35_000));
|
|
324
324
|
expect(screen.getByText("Elapsed 35s")).toBeInTheDocument();
|
|
325
|
-
act(() =>
|
|
326
|
-
store.set(
|
|
327
|
-
notebookAtom,
|
|
328
|
-
MockNotebook.notebookState({
|
|
329
|
-
cellData: { [cellId("test")]: { code: "answer = 42" } },
|
|
330
|
-
}),
|
|
331
|
-
),
|
|
332
|
-
);
|
|
333
325
|
send({
|
|
334
326
|
op: "startup-progress",
|
|
335
327
|
phase: "starting-kernel",
|
|
@@ -338,6 +330,18 @@ describe("connection notice", () => {
|
|
|
338
330
|
});
|
|
339
331
|
expect(screen.getByRole("status")).toHaveTextContent("Starting kernel");
|
|
340
332
|
expect(screen.getByText("Elapsed 35s")).toBeInTheDocument();
|
|
333
|
+
act(() =>
|
|
334
|
+
store.set(
|
|
335
|
+
notebookAtom,
|
|
336
|
+
MockNotebook.notebookState({
|
|
337
|
+
cellData: { [cellId("test")]: { code: "answer = 42" } },
|
|
338
|
+
}),
|
|
339
|
+
),
|
|
340
|
+
);
|
|
341
|
+
expect(
|
|
342
|
+
screen.getByRole("button", { name: "Starting kernel… Open Packages" }),
|
|
343
|
+
).toBeVisible();
|
|
344
|
+
expect(screen.queryByText(/Elapsed/)).not.toBeInTheDocument();
|
|
341
345
|
send({ op: "reconnected" });
|
|
342
346
|
expect(
|
|
343
347
|
screen.queryByRole("region", { name: "Notebook startup" }),
|
|
@@ -345,7 +349,7 @@ describe("connection notice", () => {
|
|
|
345
349
|
act(() => options.onClose(new CloseEvent("close")));
|
|
346
350
|
act(() => vi.advanceTimersByTime(500));
|
|
347
351
|
expect(store.get(connectionAtom)).toEqual({
|
|
348
|
-
state:
|
|
352
|
+
state: ConnectionState.CONNECTING,
|
|
349
353
|
phase: "reconnecting",
|
|
350
354
|
});
|
|
351
355
|
expect(
|
|
@@ -388,7 +392,7 @@ describe("connection notice", () => {
|
|
|
388
392
|
logs: "Kernel startup output\n",
|
|
389
393
|
log_mode: "replace",
|
|
390
394
|
});
|
|
391
|
-
expect(store.get(connectionAtom)).toEqual({ state:
|
|
395
|
+
expect(store.get(connectionAtom)).toEqual({ state: ConnectionState.OPEN });
|
|
392
396
|
expect(store.get(startupProgressAtom)).toEqual({
|
|
393
397
|
phase: "starting-kernel",
|
|
394
398
|
logs: "Kernel startup output\n",
|
|
@@ -429,12 +433,9 @@ describe("connection notice", () => {
|
|
|
429
433
|
).not.toBeInTheDocument();
|
|
430
434
|
});
|
|
431
435
|
|
|
432
|
-
it.each([
|
|
433
|
-
["preparing-environment", "Sandbox setup failed"],
|
|
434
|
-
["starting-kernel", "Kernel failed to start"],
|
|
435
|
-
] as const)(
|
|
436
|
+
it.each(["preparing-environment", "starting-kernel"] as const)(
|
|
436
437
|
"keeps a %s failure available until the user retries",
|
|
437
|
-
async (phase
|
|
438
|
+
async (phase) => {
|
|
438
439
|
const { store, transport, options, send } = renderNotice();
|
|
439
440
|
send({ op: "startup-progress", phase, logs: "", log_mode: "replace" });
|
|
440
441
|
const error = "A full diagnostic\nwith <stderr> details";
|
|
@@ -445,9 +446,13 @@ describe("connection notice", () => {
|
|
|
445
446
|
new CloseEvent("close", { reason: "MARIMO_KERNEL_STARTUP_ERROR" }),
|
|
446
447
|
),
|
|
447
448
|
);
|
|
448
|
-
expect(screen.getByRole("status")).toHaveTextContent(
|
|
449
|
+
expect(screen.getByRole("status")).toHaveTextContent(
|
|
450
|
+
"Kernel failed to start",
|
|
451
|
+
);
|
|
449
452
|
act(() => vi.advanceTimersByTime(30_000));
|
|
450
|
-
expect(screen.getByRole("status")).toHaveTextContent(
|
|
453
|
+
expect(screen.getByRole("status")).toHaveTextContent(
|
|
454
|
+
"Kernel failed to start",
|
|
455
|
+
);
|
|
451
456
|
expect(screen.getByLabelText("Error details")).toHaveTextContent(error, {
|
|
452
457
|
normalizeWhitespace: false,
|
|
453
458
|
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
4
4
|
import { Logger } from "@/utils/Logger";
|
|
5
|
-
import { WebSocketClosedReason,
|
|
5
|
+
import { WebSocketClosedReason, ConnectionState } from "../types";
|
|
6
6
|
import { classifyCloseEvent } from "../useMarimoKernelConnection";
|
|
7
7
|
|
|
8
8
|
function classify(reason: string | undefined) {
|
|
@@ -14,7 +14,7 @@ describe("classifyCloseEvent", () => {
|
|
|
14
14
|
it("retries on empty/undefined reason", () => {
|
|
15
15
|
const decision = classify(undefined);
|
|
16
16
|
expect(decision.kind).toBe("retry");
|
|
17
|
-
expect(decision.status).toEqual({ state:
|
|
17
|
+
expect(decision.status).toEqual({ state: ConnectionState.CONNECTING });
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
it("treats unknown reason strings as transient and logs a warning", () => {
|
|
@@ -44,7 +44,7 @@ describe("classifyCloseEvent", () => {
|
|
|
44
44
|
const decision = classify(reason);
|
|
45
45
|
expect(decision.kind).toBe("terminal");
|
|
46
46
|
expect(decision.status).toMatchObject({
|
|
47
|
-
state:
|
|
47
|
+
state: ConnectionState.CLOSED,
|
|
48
48
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
49
49
|
});
|
|
50
50
|
expect(decision).toMatchObject({
|
|
@@ -57,7 +57,7 @@ describe("classifyCloseEvent", () => {
|
|
|
57
57
|
const decision = classify("MARIMO_KERNEL_STARTUP_ERROR");
|
|
58
58
|
expect(decision.kind).toBe("terminal");
|
|
59
59
|
expect(decision.status).toMatchObject({
|
|
60
|
-
state:
|
|
60
|
+
state: ConnectionState.CLOSED,
|
|
61
61
|
code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
|
|
62
62
|
});
|
|
63
63
|
expect(decision).toMatchObject({
|
|
@@ -72,7 +72,7 @@ describe("classifyCloseEvent", () => {
|
|
|
72
72
|
const decision = classify("MARIMO_TRANSPORT_EXHAUSTED");
|
|
73
73
|
expect(decision.kind).toBe("gave-up");
|
|
74
74
|
expect(decision.status).toEqual({
|
|
75
|
-
state:
|
|
75
|
+
state: ConnectionState.CLOSED,
|
|
76
76
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
77
77
|
reason: "kernel not found",
|
|
78
78
|
});
|
|
@@ -1,66 +1,66 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
import {
|
|
2
|
+
import { ConnectionState } from "./types";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Check if the app is in a closed/disconnected state
|
|
6
6
|
*/
|
|
7
|
-
export function isAppClosed(state:
|
|
8
|
-
return state ===
|
|
7
|
+
export function isAppClosed(state: ConnectionState): boolean {
|
|
8
|
+
return state === ConnectionState.CLOSED;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Check if the app is in a connecting state
|
|
13
13
|
*/
|
|
14
|
-
export function isAppConnecting(state:
|
|
15
|
-
return state ===
|
|
14
|
+
export function isAppConnecting(state: ConnectionState): boolean {
|
|
15
|
+
return state === ConnectionState.CONNECTING;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Check if the app is in an open/connected state
|
|
20
20
|
*/
|
|
21
|
-
export function isAppConnected(state:
|
|
22
|
-
return state ===
|
|
21
|
+
export function isAppConnected(state: ConnectionState): boolean {
|
|
22
|
+
return state === ConnectionState.OPEN;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* Check if the app is in a closing state
|
|
27
27
|
*/
|
|
28
|
-
export function isAppClosing(state:
|
|
29
|
-
return state ===
|
|
28
|
+
export function isAppClosing(state: ConnectionState): boolean {
|
|
29
|
+
return state === ConnectionState.CLOSING;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
33
|
* Check if the app is in a not started state
|
|
34
34
|
*/
|
|
35
|
-
export function isAppNotStarted(state:
|
|
36
|
-
return state ===
|
|
35
|
+
export function isAppNotStarted(state: ConnectionState): boolean {
|
|
36
|
+
return state === ConnectionState.NOT_STARTED;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
40
|
* Check if the app is in a state where user interactions should be disabled
|
|
41
41
|
*/
|
|
42
|
-
export function isAppInteractionDisabled(state:
|
|
42
|
+
export function isAppInteractionDisabled(state: ConnectionState): boolean {
|
|
43
43
|
return (
|
|
44
|
-
state ===
|
|
45
|
-
state ===
|
|
46
|
-
state ===
|
|
44
|
+
state === ConnectionState.CLOSED ||
|
|
45
|
+
state === ConnectionState.CLOSING ||
|
|
46
|
+
state === ConnectionState.CONNECTING
|
|
47
47
|
);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
51
|
* Get a human-readable tooltip message for the connection state
|
|
52
52
|
*/
|
|
53
|
-
export function getConnectionTooltip(state:
|
|
53
|
+
export function getConnectionTooltip(state: ConnectionState): string {
|
|
54
54
|
switch (state) {
|
|
55
|
-
case
|
|
55
|
+
case ConnectionState.CLOSED:
|
|
56
56
|
return "App disconnected";
|
|
57
|
-
case
|
|
57
|
+
case ConnectionState.CONNECTING:
|
|
58
58
|
return "Connecting to a runtime ...";
|
|
59
|
-
case
|
|
59
|
+
case ConnectionState.CLOSING:
|
|
60
60
|
return "App disconnecting...";
|
|
61
|
-
case
|
|
61
|
+
case ConnectionState.OPEN:
|
|
62
62
|
return "";
|
|
63
|
-
case
|
|
63
|
+
case ConnectionState.NOT_STARTED:
|
|
64
64
|
return "Click to connect to a runtime";
|
|
65
65
|
default:
|
|
66
66
|
return "";
|
|
@@ -6,8 +6,7 @@ export type ConnectionPhase =
|
|
|
6
6
|
| NotificationMessageData<"startup-progress">["phase"]
|
|
7
7
|
| "reconnecting";
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
export const WebSocketState = {
|
|
9
|
+
export const ConnectionState = {
|
|
11
10
|
NOT_STARTED: "NOT_STARTED",
|
|
12
11
|
CONNECTING: "CONNECTING",
|
|
13
12
|
OPEN: "OPEN",
|
|
@@ -15,8 +14,8 @@ export const WebSocketState = {
|
|
|
15
14
|
CLOSED: "CLOSED",
|
|
16
15
|
} as const;
|
|
17
16
|
|
|
18
|
-
export type
|
|
19
|
-
(typeof
|
|
17
|
+
export type ConnectionState =
|
|
18
|
+
(typeof ConnectionState)[keyof typeof ConnectionState];
|
|
20
19
|
|
|
21
20
|
export const WebSocketClosedReason = {
|
|
22
21
|
KERNEL_DISCONNECTED: "KERNEL_DISCONNECTED",
|
|
@@ -28,7 +27,7 @@ export type WebSocketClosedReason =
|
|
|
28
27
|
|
|
29
28
|
export type ConnectionStatus =
|
|
30
29
|
| {
|
|
31
|
-
state: typeof
|
|
30
|
+
state: typeof ConnectionState.CLOSED;
|
|
32
31
|
code: WebSocketClosedReason;
|
|
33
32
|
/**
|
|
34
33
|
* Human-readable reason for closing the connection.
|
|
@@ -37,12 +36,12 @@ export type ConnectionStatus =
|
|
|
37
36
|
phase?: ConnectionPhase;
|
|
38
37
|
}
|
|
39
38
|
| {
|
|
40
|
-
state: typeof
|
|
39
|
+
state: typeof ConnectionState.CONNECTING;
|
|
41
40
|
phase?: ConnectionPhase;
|
|
42
41
|
}
|
|
43
42
|
| {
|
|
44
43
|
state:
|
|
45
|
-
| typeof
|
|
46
|
-
| typeof
|
|
47
|
-
| typeof
|
|
44
|
+
| typeof ConnectionState.OPEN
|
|
45
|
+
| typeof ConnectionState.CLOSING
|
|
46
|
+
| typeof ConnectionState.NOT_STARTED;
|
|
48
47
|
};
|
|
@@ -60,7 +60,11 @@ import {
|
|
|
60
60
|
handleRemoveUIElements,
|
|
61
61
|
} from "../kernel/handlers";
|
|
62
62
|
import { queryParamHandlers } from "../kernel/queryParamHandlers";
|
|
63
|
-
import
|
|
63
|
+
import {
|
|
64
|
+
type SessionId,
|
|
65
|
+
type StableSessionId,
|
|
66
|
+
stableSessionIdAtom,
|
|
67
|
+
} from "../kernel/session";
|
|
64
68
|
import { initialRunCompletedAtom, kernelStateAtom } from "../kernel/state";
|
|
65
69
|
import { type LayoutState, useLayoutActions } from "../layout/state";
|
|
66
70
|
import { kioskModeAtom } from "../mode";
|
|
@@ -80,7 +84,7 @@ import { isWasm } from "../wasm/utils";
|
|
|
80
84
|
import {
|
|
81
85
|
type ConnectionStatus,
|
|
82
86
|
WebSocketClosedReason,
|
|
83
|
-
|
|
87
|
+
ConnectionState,
|
|
84
88
|
} from "./types";
|
|
85
89
|
|
|
86
90
|
const SUPPORTS_LAZY_KERNELS = true;
|
|
@@ -112,7 +116,7 @@ export function classifyCloseEvent(event: { reason?: string }): CloseDecision {
|
|
|
112
116
|
return {
|
|
113
117
|
kind: "gave-up",
|
|
114
118
|
status: {
|
|
115
|
-
state:
|
|
119
|
+
state: ConnectionState.CLOSED,
|
|
116
120
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
117
121
|
reason: "kernel not found",
|
|
118
122
|
},
|
|
@@ -124,7 +128,7 @@ export function classifyCloseEvent(event: { reason?: string }): CloseDecision {
|
|
|
124
128
|
return {
|
|
125
129
|
kind: "terminal",
|
|
126
130
|
status: {
|
|
127
|
-
state:
|
|
131
|
+
state: ConnectionState.CLOSED,
|
|
128
132
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
129
133
|
reason: "kernel not found",
|
|
130
134
|
},
|
|
@@ -134,7 +138,7 @@ export function classifyCloseEvent(event: { reason?: string }): CloseDecision {
|
|
|
134
138
|
return {
|
|
135
139
|
kind: "terminal",
|
|
136
140
|
status: {
|
|
137
|
-
state:
|
|
141
|
+
state: ConnectionState.CLOSED,
|
|
138
142
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
139
143
|
reason: "not authorized",
|
|
140
144
|
},
|
|
@@ -144,7 +148,7 @@ export function classifyCloseEvent(event: { reason?: string }): CloseDecision {
|
|
|
144
148
|
return {
|
|
145
149
|
kind: "terminal",
|
|
146
150
|
status: {
|
|
147
|
-
state:
|
|
151
|
+
state: ConnectionState.CLOSED,
|
|
148
152
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
149
153
|
reason: "kiosk mode is not available for this session",
|
|
150
154
|
},
|
|
@@ -154,7 +158,7 @@ export function classifyCloseEvent(event: { reason?: string }): CloseDecision {
|
|
|
154
158
|
return {
|
|
155
159
|
kind: "terminal",
|
|
156
160
|
status: {
|
|
157
|
-
state:
|
|
161
|
+
state: ConnectionState.CLOSED,
|
|
158
162
|
code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
|
|
159
163
|
reason: "Failed to start kernel sandbox",
|
|
160
164
|
},
|
|
@@ -171,7 +175,7 @@ export function classifyCloseEvent(event: { reason?: string }): CloseDecision {
|
|
|
171
175
|
|
|
172
176
|
return {
|
|
173
177
|
kind: "retry",
|
|
174
|
-
status: { state:
|
|
178
|
+
status: { state: ConnectionState.CONNECTING },
|
|
175
179
|
};
|
|
176
180
|
}
|
|
177
181
|
|
|
@@ -231,6 +235,7 @@ export function useMarimoKernelConnection(opts: {
|
|
|
231
235
|
addStartupLog,
|
|
232
236
|
} = useAlertActions();
|
|
233
237
|
const setKioskMode = useSetAtom(kioskModeAtom);
|
|
238
|
+
const setStableSessionId = useSetAtom(stableSessionIdAtom);
|
|
234
239
|
const setCapabilities = useSetAtom(capabilitiesAtom);
|
|
235
240
|
const runtimeManager = useRuntimeManager();
|
|
236
241
|
const transportType = useAtomValue(connectionTransportTypeAtom);
|
|
@@ -251,17 +256,17 @@ export function useMarimoKernelConnection(opts: {
|
|
|
251
256
|
const { phase } = msg.data;
|
|
252
257
|
updateStartupProgress(msg.data);
|
|
253
258
|
setConnection((previous) =>
|
|
254
|
-
previous.state ===
|
|
255
|
-
(previous.state ===
|
|
259
|
+
previous.state === ConnectionState.OPEN ||
|
|
260
|
+
(previous.state === ConnectionState.CONNECTING &&
|
|
256
261
|
previous.phase === phase)
|
|
257
262
|
? previous
|
|
258
|
-
: { state:
|
|
263
|
+
: { state: ConnectionState.CONNECTING, phase },
|
|
259
264
|
);
|
|
260
265
|
return;
|
|
261
266
|
}
|
|
262
267
|
case "kernel-ready": {
|
|
263
268
|
setKernelStartupError(null);
|
|
264
|
-
setConnection({ state:
|
|
269
|
+
setConnection({ state: ConnectionState.OPEN });
|
|
265
270
|
setInitialRunCompleted(
|
|
266
271
|
Boolean(msg.data.resumed || msg.data.auto_instantiated),
|
|
267
272
|
);
|
|
@@ -284,6 +289,10 @@ export function useMarimoKernelConnection(opts: {
|
|
|
284
289
|
invalidateDataSourceDiscovery();
|
|
285
290
|
}
|
|
286
291
|
setKioskMode(msg.data.kiosk);
|
|
292
|
+
setStableSessionId(
|
|
293
|
+
(msg.data.stable_session_id as StableSessionId | null | undefined) ??
|
|
294
|
+
null,
|
|
295
|
+
);
|
|
287
296
|
// A freshly started kernel has no breakpoints of its own; re-push
|
|
288
297
|
// the client's set so they still apply, and clear the stale
|
|
289
298
|
// highlighted line from the previous kernel instance.
|
|
@@ -295,6 +304,8 @@ export function useMarimoKernelConnection(opts: {
|
|
|
295
304
|
case "completed-run":
|
|
296
305
|
setInitialRunCompleted(true);
|
|
297
306
|
return;
|
|
307
|
+
case "execution":
|
|
308
|
+
return;
|
|
298
309
|
case "interrupted":
|
|
299
310
|
return;
|
|
300
311
|
|
|
@@ -470,7 +481,7 @@ export function useMarimoKernelConnection(opts: {
|
|
|
470
481
|
|
|
471
482
|
case "reconnected":
|
|
472
483
|
setKernelStartupError(null);
|
|
473
|
-
setConnection({ state:
|
|
484
|
+
setConnection({ state: ConnectionState.OPEN });
|
|
474
485
|
return;
|
|
475
486
|
|
|
476
487
|
case "focus-cell":
|
|
@@ -515,12 +526,12 @@ export function useMarimoKernelConnection(opts: {
|
|
|
515
526
|
}
|
|
516
527
|
shouldTryReconnecting.current = true;
|
|
517
528
|
setKernelStartupError(null);
|
|
518
|
-
setConnection({ state:
|
|
529
|
+
setConnection({ state: ConnectionState.CONNECTING });
|
|
519
530
|
const healthy = await runtimeManager.reconcileFromHealth();
|
|
520
531
|
if (!healthy) {
|
|
521
532
|
shouldTryReconnecting.current = false;
|
|
522
533
|
setConnection({
|
|
523
|
-
state:
|
|
534
|
+
state: ConnectionState.CLOSED,
|
|
524
535
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
525
536
|
reason: "kernel not found",
|
|
526
537
|
});
|
|
@@ -596,17 +607,17 @@ export function useMarimoKernelConnection(opts: {
|
|
|
596
607
|
setConnection((previous) => {
|
|
597
608
|
const status = decision.status;
|
|
598
609
|
if (
|
|
599
|
-
status.state ===
|
|
610
|
+
status.state === ConnectionState.CLOSED &&
|
|
600
611
|
status.code === WebSocketClosedReason.KERNEL_STARTUP_ERROR &&
|
|
601
|
-
(previous.state ===
|
|
602
|
-
previous.state ===
|
|
612
|
+
(previous.state === ConnectionState.CONNECTING ||
|
|
613
|
+
previous.state === ConnectionState.CLOSED)
|
|
603
614
|
) {
|
|
604
615
|
return { ...status, phase: previous.phase };
|
|
605
616
|
}
|
|
606
617
|
if (
|
|
607
|
-
status.state ===
|
|
608
|
-
(previous.state ===
|
|
609
|
-
(previous.state ===
|
|
618
|
+
status.state === ConnectionState.CONNECTING &&
|
|
619
|
+
(previous.state === ConnectionState.OPEN ||
|
|
620
|
+
(previous.state === ConnectionState.CONNECTING &&
|
|
610
621
|
previous.phase === "reconnecting"))
|
|
611
622
|
) {
|
|
612
623
|
return { ...status, phase: "reconnecting" };
|
|
@@ -631,7 +642,7 @@ export function useMarimoKernelConnection(opts: {
|
|
|
631
642
|
onError: (e) => {
|
|
632
643
|
Logger.warn("WebSocket error", e);
|
|
633
644
|
setConnection({
|
|
634
|
-
state:
|
|
645
|
+
state: ConnectionState.CLOSED,
|
|
635
646
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
636
647
|
reason: "kernel not found",
|
|
637
648
|
});
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { readFile } from "node:fs/promises";
|
|
4
|
+
import postcss from "postcss";
|
|
5
|
+
import { beforeAll, describe, expect, it } from "vitest";
|
|
6
|
+
import {
|
|
7
|
+
checkKatexCss,
|
|
8
|
+
generateKatexCss,
|
|
9
|
+
readUpstreamCss,
|
|
10
|
+
stylesheetPath,
|
|
11
|
+
} from "../../scripts/katex-css";
|
|
12
|
+
|
|
13
|
+
let upstream: string;
|
|
14
|
+
let generated: string;
|
|
15
|
+
|
|
16
|
+
beforeAll(async () => {
|
|
17
|
+
upstream = await readUpstreamCss();
|
|
18
|
+
generated = await generateKatexCss(upstream);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
describe("copied KaTeX stylesheet", () => {
|
|
22
|
+
it("matches the installed package with only documented marimo overrides", async () => {
|
|
23
|
+
await expect(
|
|
24
|
+
checkKatexCss(upstream, await readFile(stylesheetPath, "utf8")),
|
|
25
|
+
).resolves.toBeUndefined();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it.each(["added", "removed", "changed"])(
|
|
29
|
+
"detects %s upstream rule without a version change",
|
|
30
|
+
async (change) => {
|
|
31
|
+
const root = postcss.parse(upstream);
|
|
32
|
+
if (change === "added") {
|
|
33
|
+
root.append(
|
|
34
|
+
postcss.parse(
|
|
35
|
+
".katex .upstream-drift-probe { display: inline-block; }",
|
|
36
|
+
),
|
|
37
|
+
);
|
|
38
|
+
} else {
|
|
39
|
+
root.walkRules(".katex .mspace", (rule) => {
|
|
40
|
+
if (change === "removed") {
|
|
41
|
+
rule.remove();
|
|
42
|
+
} else {
|
|
43
|
+
rule.append(postcss.decl({ prop: "color", value: "red" }));
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
await expect(checkKatexCss(root.toString(), generated)).rejects.toThrow(
|
|
48
|
+
"pnpm sync-katex-css",
|
|
49
|
+
);
|
|
50
|
+
const regenerated = await generateKatexCss(root.toString());
|
|
51
|
+
await checkKatexCss(root.toString(), regenerated);
|
|
52
|
+
},
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
it.each(["added", "removed", "changed"])(
|
|
56
|
+
"detects %s local rule",
|
|
57
|
+
async (change) => {
|
|
58
|
+
const root = postcss.parse(generated);
|
|
59
|
+
if (change === "added") {
|
|
60
|
+
root.append(postcss.parse(".katex .unexpected { display: none; }"));
|
|
61
|
+
} else {
|
|
62
|
+
root.walkRules(".katex .mspace", (rule) => {
|
|
63
|
+
if (change === "removed") {
|
|
64
|
+
rule.remove();
|
|
65
|
+
} else {
|
|
66
|
+
rule.append(postcss.decl({ prop: "color", value: "red" }));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
await expect(checkKatexCss(upstream, root.toString())).rejects.toThrow(
|
|
71
|
+
"pnpm sync-katex-css",
|
|
72
|
+
);
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
it("preserves math sizing, tag alignment, and equation counters without bundling font faces", () => {
|
|
77
|
+
const root = postcss.parse(generated);
|
|
78
|
+
const declarations = (selector: string) => {
|
|
79
|
+
const values: Record<string, string> = {};
|
|
80
|
+
root.walkRules(selector, (rule) => {
|
|
81
|
+
rule.walkDecls((decl) => {
|
|
82
|
+
values[decl.prop] = decl.value;
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
return values;
|
|
86
|
+
};
|
|
87
|
+
expect(declarations(".katex")).toEqual({
|
|
88
|
+
"font-family": '"KaTeX_Main", "Times New Roman", serif',
|
|
89
|
+
"font-size": "110%",
|
|
90
|
+
"font-style": "normal",
|
|
91
|
+
"line-height": "inherit",
|
|
92
|
+
position: "relative",
|
|
93
|
+
"text-indent": "0",
|
|
94
|
+
"text-rendering": "auto",
|
|
95
|
+
});
|
|
96
|
+
expect(
|
|
97
|
+
declarations(".katex-display > .katex > .katex-html > .katex-tag"),
|
|
98
|
+
).toEqual({ position: "absolute", right: "0", "text-align": "right" });
|
|
99
|
+
expect(declarations("body,\n.katex-display")).toEqual({
|
|
100
|
+
"counter-reset": "katexEqnNo mmlEqnNo",
|
|
101
|
+
});
|
|
102
|
+
expect(declarations(".katex .angl")["border-right"]).toBe("0.049em solid");
|
|
103
|
+
const fontFaces: postcss.AtRule[] = [];
|
|
104
|
+
root.walkAtRules("font-face", (rule) => {
|
|
105
|
+
fontFaces.push(rule);
|
|
106
|
+
});
|
|
107
|
+
expect(fontFaces).toEqual([]);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it.each(["root", "media"])(
|
|
111
|
+
"preserves SVG rule order and %s scope when upstream adds a competing rule",
|
|
112
|
+
async (scope) => {
|
|
113
|
+
const root = postcss.parse(upstream);
|
|
114
|
+
const svgRules: postcss.Rule[] = [];
|
|
115
|
+
root.walkRules(".katex svg", (rule) => {
|
|
116
|
+
svgRules.push(rule);
|
|
117
|
+
});
|
|
118
|
+
const secondSvg = svgRules[1];
|
|
119
|
+
secondSvg.before(postcss.parse(".katex :is(svg) { stroke-width: 3; }"));
|
|
120
|
+
if (scope === "media") {
|
|
121
|
+
const media = postcss.atRule({ name: "media", params: "print" });
|
|
122
|
+
secondSvg.before(media);
|
|
123
|
+
media.append(secondSvg);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const svgCascade = (css: string) => {
|
|
127
|
+
const rules: {
|
|
128
|
+
selector: string;
|
|
129
|
+
scope: string;
|
|
130
|
+
strokeWidth: string | undefined;
|
|
131
|
+
}[] = [];
|
|
132
|
+
postcss.parse(css).walkRules((rule) => {
|
|
133
|
+
if (
|
|
134
|
+
rule.selector !== ".katex svg" &&
|
|
135
|
+
rule.selector !== ".katex :is(svg)"
|
|
136
|
+
) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
let strokeWidth: string | undefined;
|
|
140
|
+
rule.walkDecls("stroke-width", (decl) => {
|
|
141
|
+
strokeWidth = decl.value;
|
|
142
|
+
});
|
|
143
|
+
const parent = rule.parent;
|
|
144
|
+
rules.push({
|
|
145
|
+
selector: rule.selector,
|
|
146
|
+
scope:
|
|
147
|
+
parent?.type === "atrule"
|
|
148
|
+
? `${parent.name} ${parent.params}`
|
|
149
|
+
: "root",
|
|
150
|
+
strokeWidth,
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
return rules;
|
|
154
|
+
};
|
|
155
|
+
const regenerated = await generateKatexCss(root.toString());
|
|
156
|
+
expect(svgCascade(regenerated)).toEqual(svgCascade(root.toString()));
|
|
157
|
+
await checkKatexCss(root.toString(), regenerated);
|
|
158
|
+
},
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
it("requires review when an overridden upstream declaration changes", async () => {
|
|
162
|
+
await expect(
|
|
163
|
+
generateKatexCss(upstream.replace("line-height:1.2", "line-height:1.3")),
|
|
164
|
+
).rejects.toThrow("review overrides");
|
|
165
|
+
});
|
|
166
|
+
});
|