@marimo-team/islands 0.25.2-dev9 → 0.25.2-dev90
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-BZmqc_F0.js} +11 -11
- package/dist/{ErrorBoundary-BK6f6roX.js → ErrorBoundary-Cmnsp7X-.js} +8 -8
- package/dist/{abnfDiagram-VCTEODGH-aLGD44M7.js → abnfDiagram-VCTEODGH-C_Lmaa2j.js} +3 -3
- package/dist/{any-language-editor-dqxlUDlT.js → any-language-editor-BFzqhOBR.js} +5 -5
- package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
- package/dist/{architectureDiagram-5GKGNRK7-BGL5P81u.js → architectureDiagram-5GKGNRK7-BKMataHB.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-BqAtzd2P.js +1 -0
- package/dist/assets/{worker-D7hWi02M.js → worker-Bf8dt6S-.js} +5 -5
- package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
- package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-BeHOjyDk.js} +9 -9
- package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
- package/dist/{button-B0Xgl-Qn.js → button-BtsM2UqM.js} +300 -283
- package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
- package/dist/{capabilities-D7Ad8-zw.js → capabilities-A5jrzjCJ.js} +1 -1
- package/dist/{cells-5ppES-Un.js → cells-DZi0ioak.js} +4330 -4313
- package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
- package/dist/{chat-ui-Dv2V95k6.js → chat-ui-CwOWzoSO.js} +46 -46
- package/dist/{check-DGZ74tV2.js → check-CNP79M3A.js} +1 -1
- package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-CH7Gpamd.js} +5 -5
- package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-AI7CvgKn.js} +1 -1
- package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BSvuTkX4.js} +1 -1
- package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-CLshwT9T.js} +1 -1
- package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-wnHcn-lH.js} +3 -3
- package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-7O2p8hut.js} +2 -2
- package/dist/{chunk-IMKFNOWR-Cm3RgLDj.js → chunk-IMKFNOWR-Bu0Vh_Yi.js} +6 -6
- package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-B9_Alrxb.js} +5 -5
- package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-PeQPH2fD.js} +6 -6
- package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-D9twiFuU.js} +1 -1
- package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-BUiNs18s.js} +1 -1
- package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-D8S9NPCy.js} +1 -1
- package/dist/{chunk-SHT3W25Y-DedDYSP5.js → chunk-SHT3W25Y-B2dyNZ31.js} +8 -8
- package/dist/{chunk-SVP7TREG-B2SFkCAL.js → chunk-SVP7TREG-D7UPvB10.js} +2 -2
- package/dist/{chunk-TICWLB2K-DB6hjNOL.js → chunk-TICWLB2K-BNaGoadd.js} +6 -6
- package/dist/classDiagram-ZZMXUADV-Bbo2n384.js +30 -0
- package/dist/classDiagram-v2-VYDZK3BY-xR8cGP0r.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-Ba_h3MSI.js → code-visibility-B5ZN4pNx.js} +6 -6
- package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
- package/dist/{common-0rJUT4CU.js → common-C0fEcRVO.js} +11904 -11621
- package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
- package/dist/{copy-icon-qmRg_VTX.js → copy-icon-BY7jgcaV.js} +3 -3
- 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-CCDn4Z9e.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-BJiUO_SV.js} +10 -10
- package/dist/{data-grid-overlay-editor-DvZ8ZYHw.js → data-grid-overlay-editor-Cq0iaJqU.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-IhLt_khx.js → diagram-S7CK7UJ4-BZfxFNRR.js} +4 -4
- package/dist/{diagram-UQ7AKVKN-CQc6KLPB.js → diagram-UQ7AKVKN-1xcsiIMg.js} +3 -3
- package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
- package/dist/{diagram-VX7I27RA-DHmW9N1T.js → diagram-VX7I27RA-DmRsnHYY.js} +5 -5
- package/dist/{diagram-Z3DM3KII-zVKsg-Ty.js → diagram-Z3DM3KII--b49ryKx.js} +3 -3
- package/dist/{dialog-CILKhbsG.js → dialog-CmExhUDI.js} +26 -26
- 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-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-Cz4TdOJh.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-rSwVyh4y.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-Bfd3iAoC.js} +12 -12
- package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
- package/dist/error-banner-D30nA9nE.js +362 -0
- package/dist/{error-entries-B2Ux3Z2X.js → error-entries-BovkFYNy.js} +2 -2
- package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
- package/dist/{esm-h8f7-1CJ.js → esm-DAVrGVKP.js} +378 -372
- 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-Bd-kdxIT.js → feedback-button-DpYfzMWP.js} +10 -10
- package/dist/flowDiagram-HODETNUW-D7IBKS12.js +16 -0
- package/dist/{formats-Q9gwlLyD.js → formats-DhhbdyAH.js} +3 -3
- 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-B4m_YsKa.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-QRBbvWXh.js} +2 -2
- package/dist/{glide-data-editor-DrEBdhP5.js → glide-data-editor-DFtk9eMf.js} +11 -11
- package/dist/{glide-utils-CzzWU59p.js → glide-utils-BVJ4fkxX.js} +3 -3
- package/dist/{globals-BVhJcU-3.js → globals-XdDkDS89.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/{html-to-image-BZBwkkDG.js → html-to-image-Cn1_16-x.js} +543 -565
- 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-DVQFYvhg.js} +2 -2
- package/dist/{ishikawaDiagram-5VMMS53U-pmkGQJsA.js → ishikawaDiagram-5VMMS53U-viPND-nm.js} +3 -3
- package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
- package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BeeJdJo3.js} +2 -2
- package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
- package/dist/{kanban-definition-UXKFOSKX-wWGD9VLW.js → kanban-definition-UXKFOSKX-Dcl_ECO9.js} +9 -9
- package/dist/{label-MNhNNoN6.js → label-DQO1jFjf.js} +96 -93
- package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
- package/dist/{loader-C9OUkMrj.js → loader-Cm-ATtou.js} +1 -1
- package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
- package/dist/main.js +6866 -6746
- 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-BfhcnSj-.js} +54 -54
- package/dist/{mindmap-definition-YA3MSWOX-C2f1VIBR.js → mindmap-definition-YA3MSWOX-BdxxhF-5.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-DthBBC83.js → number-overlay-editor-xPAwGgFC.js} +1 -1
- 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-Du5p2s0w.js} +3 -3
- package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
- package/dist/{pieDiagram-E7YTZNPT-BwFAhpYD.js → pieDiagram-E7YTZNPT-DJg-SOIq.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-CUG57KRp.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-keLfFx9f.js} +1 -1
- package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
- package/dist/{railroadDiagram-O6MQD6OU-D6eOFr6Z.js → railroadDiagram-O6MQD6OU-C0ojm-6_.js} +3 -3
- package/dist/{requirementDiagram-BXWQKSXE-CHYsMgDR.js → requirementDiagram-BXWQKSXE-CNwNBmI3.js} +11 -11
- package/dist/{reveal-component-CX4Yqwsa.js → reveal-component-B_bLilty.js} +10 -10
- 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-Bh4EsJox.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-Bs-nmvm6.js +1344 -0
- package/dist/{sequenceDiagram-WJ2MYXX4-BPAknhBp.js → sequenceDiagram-WJ2MYXX4-DQaW5qBG.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-DVsoMvYT.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-BDa515QC.js} +13 -13
- package/dist/stateDiagram-v2-MP3YSRHH-ChNddepZ.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-M4IdGi8J.js} +10 -10
- package/dist/swimlanesDiagram-VR7AAH4N-FUSwmzEp.js +30 -0
- package/dist/{swiper-component-DkV7T44B.js → swiper-component-CpN-hewZ.js} +2 -2
- 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-DH-kvakg.js} +3 -3
- package/dist/{toDate-DWVp6uE1.js → toDate-vEi5kTfY.js} +4 -5
- package/dist/{toast-DcoJGS3-.js → toast-DfEpJedt.js} +157 -161
- package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
- package/dist/{tooltip-Bi36DgYh.js → tooltip-CuNWg2ay.js} +543 -579
- 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-kmgwrL8q.js} +1833 -1625
- package/dist/{useAsyncData-BD7NLQ3_.js → useAsyncData-rkAlR_vh.js} +1 -1
- package/dist/{useDateFormatter-D8XWr8lL.js → useDateFormatter-C-tz65rD.js} +52 -31
- package/dist/{useDeepCompareMemoize-CawMGSRU.js → useDeepCompareMemoize-BlHFBj5_.js} +1 -1
- package/dist/{useIframeCapabilities-BUMBOpsM.js → useIframeCapabilities-C1Bt04Iz.js} +1 -1
- package/dist/{useLifecycle-3vGhRa1o.js → useLifecycle-B68iY077.js} +3 -3
- package/dist/{useTheme-BOw801nZ.js → useTheme-BwSgeAFb.js} +2 -2
- 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-C-bPttRN.js} +9 -9
- package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
- package/dist/{vennDiagram-4TSXK5OY-DY8CySdO.js → vennDiagram-4TSXK5OY-d5g7XeiI.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-BfX3bSzR.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-C1QsLZg7.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 +16 -16
- package/src/__tests__/mount.test.ts +6 -6
- 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__/spec.test.ts +26 -23
- 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/ui/__tests__/slider.test.tsx +30 -0
- package/src/components/ui/progress-stages.tsx +114 -0
- 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__/connection.test.ts +3 -3
- 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.min.css +145 -144
- 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 +1 -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__/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/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/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
|
@@ -10,7 +10,7 @@ import { viewStateAtom } from "@/core/mode";
|
|
|
10
10
|
import {
|
|
11
11
|
type ConnectionStatus,
|
|
12
12
|
WebSocketClosedReason,
|
|
13
|
-
|
|
13
|
+
ConnectionState,
|
|
14
14
|
} from "@/core/websocket/types";
|
|
15
15
|
import { StatusOverlay } from "../status";
|
|
16
16
|
|
|
@@ -40,7 +40,7 @@ describe("StatusOverlay disconnect indicator", () => {
|
|
|
40
40
|
const onReconnect = vi.fn();
|
|
41
41
|
const { getByTestId } = renderOverlay(
|
|
42
42
|
{
|
|
43
|
-
state:
|
|
43
|
+
state: ConnectionState.CLOSED,
|
|
44
44
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
45
45
|
reason: "kernel not found",
|
|
46
46
|
},
|
|
@@ -57,7 +57,7 @@ describe("StatusOverlay disconnect indicator", () => {
|
|
|
57
57
|
|
|
58
58
|
it("renders a disabled button when no onReconnect is provided", () => {
|
|
59
59
|
const { getByTestId } = renderOverlay({
|
|
60
|
-
state:
|
|
60
|
+
state: ConnectionState.CLOSED,
|
|
61
61
|
code: WebSocketClosedReason.KERNEL_DISCONNECTED,
|
|
62
62
|
reason: "kernel not found",
|
|
63
63
|
});
|
|
@@ -68,7 +68,7 @@ describe("StatusOverlay disconnect indicator", () => {
|
|
|
68
68
|
|
|
69
69
|
it("leaves editor startup failures to the inline notice", () => {
|
|
70
70
|
const { queryByTestId } = renderOverlay({
|
|
71
|
-
state:
|
|
71
|
+
state: ConnectionState.CLOSED,
|
|
72
72
|
code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
|
|
73
73
|
reason: "Failed to start kernel sandbox",
|
|
74
74
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import React, { type PropsWithChildren } from "react";
|
|
4
|
-
import { type ConnectionStatus,
|
|
4
|
+
import { type ConnectionStatus, ConnectionState } from "@/core/websocket/types";
|
|
5
5
|
import { Disconnected } from "../Disconnected";
|
|
6
6
|
|
|
7
7
|
interface Props {
|
|
@@ -17,7 +17,7 @@ export const AppHeader: React.FC<PropsWithChildren<Props>> = ({
|
|
|
17
17
|
return (
|
|
18
18
|
<div className={className}>
|
|
19
19
|
{children}
|
|
20
|
-
{connection.state ===
|
|
20
|
+
{connection.state === ConnectionState.CLOSED && (
|
|
21
21
|
<Disconnected reason={connection.reason} />
|
|
22
22
|
)}
|
|
23
23
|
</div>
|
|
@@ -10,7 +10,7 @@ import { viewStateAtom } from "@/core/mode";
|
|
|
10
10
|
import {
|
|
11
11
|
type ConnectionStatus,
|
|
12
12
|
WebSocketClosedReason,
|
|
13
|
-
|
|
13
|
+
ConnectionState,
|
|
14
14
|
} from "@/core/websocket/types";
|
|
15
15
|
import { cn } from "@/utils/cn";
|
|
16
16
|
|
|
@@ -21,10 +21,10 @@ export const StatusOverlay: React.FC<{
|
|
|
21
21
|
}> = ({ connection, isRunning, onReconnect }) => {
|
|
22
22
|
const { mode } = useAtomValue(viewStateAtom);
|
|
23
23
|
const isClosed =
|
|
24
|
-
connection.state ===
|
|
24
|
+
connection.state === ConnectionState.CLOSED &&
|
|
25
25
|
(mode === "read" ||
|
|
26
26
|
connection.code !== WebSocketClosedReason.KERNEL_STARTUP_ERROR);
|
|
27
|
-
const isOpen = connection.state ===
|
|
27
|
+
const isOpen = connection.state === ConnectionState.OPEN;
|
|
28
28
|
// Editor startup failures have their own recovery UI.
|
|
29
29
|
const canReconnect =
|
|
30
30
|
isClosed && connection.code === WebSocketClosedReason.KERNEL_DISCONNECTED;
|
|
@@ -703,7 +703,7 @@ describe("useCellNavigationProps", () => {
|
|
|
703
703
|
});
|
|
704
704
|
|
|
705
705
|
expect(mockCopyCell).not.toHaveBeenCalled();
|
|
706
|
-
expect(mockEvent.
|
|
706
|
+
expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
|
|
707
707
|
});
|
|
708
708
|
});
|
|
709
709
|
|
|
@@ -714,7 +714,7 @@ describe("useCellNavigationProps", () => {
|
|
|
714
714
|
);
|
|
715
715
|
|
|
716
716
|
const mockEvent = Mocks.keyboardEvent({
|
|
717
|
-
key: "
|
|
717
|
+
key: "F24",
|
|
718
718
|
target: document.createElement("div"),
|
|
719
719
|
});
|
|
720
720
|
|
|
@@ -722,7 +722,7 @@ describe("useCellNavigationProps", () => {
|
|
|
722
722
|
result.current.onKeyDown?.(mockEvent);
|
|
723
723
|
});
|
|
724
724
|
|
|
725
|
-
expect(mockEvent.
|
|
725
|
+
expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
|
|
726
726
|
});
|
|
727
727
|
});
|
|
728
728
|
|
|
@@ -1749,7 +1749,7 @@ describe("useCellEditorNavigationProps", () => {
|
|
|
1749
1749
|
});
|
|
1750
1750
|
|
|
1751
1751
|
expect(focusCell).toHaveBeenCalledWith(mockCellId);
|
|
1752
|
-
expect(mockEvent.
|
|
1752
|
+
expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
|
|
1753
1753
|
});
|
|
1754
1754
|
|
|
1755
1755
|
it("should clear text selection when Escape is pressed with selection", () => {
|
|
@@ -1901,7 +1901,7 @@ describe("useCellEditorNavigationProps", () => {
|
|
|
1901
1901
|
});
|
|
1902
1902
|
|
|
1903
1903
|
expect(focusCell).not.toHaveBeenCalled();
|
|
1904
|
-
expect(mockEvent.
|
|
1904
|
+
expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
|
|
1905
1905
|
});
|
|
1906
1906
|
});
|
|
1907
1907
|
|
|
@@ -1932,7 +1932,7 @@ describe("useCellEditorNavigationProps", () => {
|
|
|
1932
1932
|
});
|
|
1933
1933
|
|
|
1934
1934
|
expect(focusCell).toHaveBeenCalledWith(mockCellId);
|
|
1935
|
-
expect(mockEvent.
|
|
1935
|
+
expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
|
|
1936
1936
|
});
|
|
1937
1937
|
});
|
|
1938
1938
|
|
|
@@ -1954,7 +1954,7 @@ describe("useCellEditorNavigationProps", () => {
|
|
|
1954
1954
|
});
|
|
1955
1955
|
|
|
1956
1956
|
expect(focusCell).toHaveBeenCalledWith(mockCellId);
|
|
1957
|
-
expect(mockEvent.
|
|
1957
|
+
expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
|
|
1958
1958
|
});
|
|
1959
1959
|
});
|
|
1960
1960
|
|
|
@@ -1979,7 +1979,7 @@ describe("useCellEditorNavigationProps", () => {
|
|
|
1979
1979
|
});
|
|
1980
1980
|
|
|
1981
1981
|
expect(focusCell).toHaveBeenCalledWith(mockCellId);
|
|
1982
|
-
expect(mockEvent.
|
|
1982
|
+
expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
|
|
1983
1983
|
});
|
|
1984
1984
|
});
|
|
1985
1985
|
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { fireEvent, render } from "@testing-library/react";
|
|
3
|
+
import { describe, expect, it, vi } from "vitest";
|
|
4
|
+
import { SetupMocks } from "@/__mocks__/common";
|
|
5
|
+
import { Slider } from "../slider";
|
|
6
|
+
|
|
7
|
+
SetupMocks.resizeObserver();
|
|
8
|
+
|
|
9
|
+
describe("Slider", () => {
|
|
10
|
+
// Regression for #2593: steps below 1e-6 stringify in exponent notation
|
|
11
|
+
// ("1e-7"), which older radix versions counted as 0 decimal places, so
|
|
12
|
+
// every value was rounded to an integer and the slider never moved.
|
|
13
|
+
it.each([1e-6, 1e-7, 1e-9])("moves by a tiny step of %s", (step) => {
|
|
14
|
+
const onValueChange = vi.fn();
|
|
15
|
+
const { getByRole } = render(
|
|
16
|
+
<Slider
|
|
17
|
+
value={[step]}
|
|
18
|
+
min={step}
|
|
19
|
+
max={100 * step}
|
|
20
|
+
step={step}
|
|
21
|
+
onValueChange={onValueChange}
|
|
22
|
+
valueMap={(v) => v}
|
|
23
|
+
/>,
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
fireEvent.keyDown(getByRole("slider"), { key: "ArrowRight" });
|
|
27
|
+
|
|
28
|
+
expect(onValueChange).toHaveBeenCalledWith([2 * step]);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { AlertCircleIcon, CheckIcon, CircleIcon } from "lucide-react";
|
|
3
|
+
import type { ReactNode } from "react";
|
|
4
|
+
import { Spinner } from "@/components/icons/spinner";
|
|
5
|
+
import { cn } from "@/utils/cn";
|
|
6
|
+
|
|
7
|
+
export type ProgressState = "waiting" | "running" | "succeeded" | "failed";
|
|
8
|
+
|
|
9
|
+
export interface ProgressStage {
|
|
10
|
+
id: string;
|
|
11
|
+
state: ProgressState;
|
|
12
|
+
title: string;
|
|
13
|
+
description: string;
|
|
14
|
+
details?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function ProgressStatusIcon({
|
|
18
|
+
state,
|
|
19
|
+
variant = "icon",
|
|
20
|
+
}: {
|
|
21
|
+
state: ProgressState;
|
|
22
|
+
variant?: "icon" | "dot";
|
|
23
|
+
}) {
|
|
24
|
+
if (variant === "dot") {
|
|
25
|
+
return (
|
|
26
|
+
<span
|
|
27
|
+
aria-hidden={true}
|
|
28
|
+
className={cn(
|
|
29
|
+
"size-1.5 shrink-0 rounded-full",
|
|
30
|
+
{
|
|
31
|
+
waiting: "bg-muted-foreground",
|
|
32
|
+
running: "bg-muted-foreground motion-safe:animate-pulse",
|
|
33
|
+
succeeded: "bg-(--grass-9)",
|
|
34
|
+
failed: "bg-(--red-9)",
|
|
35
|
+
}[state],
|
|
36
|
+
)}
|
|
37
|
+
/>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
const Icon = {
|
|
41
|
+
waiting: CircleIcon,
|
|
42
|
+
running: Spinner,
|
|
43
|
+
succeeded: CheckIcon,
|
|
44
|
+
failed: AlertCircleIcon,
|
|
45
|
+
}[state];
|
|
46
|
+
return (
|
|
47
|
+
<Icon
|
|
48
|
+
aria-hidden={true}
|
|
49
|
+
className={cn(
|
|
50
|
+
"size-4 shrink-0",
|
|
51
|
+
{
|
|
52
|
+
waiting: "text-muted-foreground/50",
|
|
53
|
+
running: "motion-reduce:animate-none",
|
|
54
|
+
succeeded: "text-(--grass-11)",
|
|
55
|
+
failed: "text-(--red-11)",
|
|
56
|
+
}[state],
|
|
57
|
+
)}
|
|
58
|
+
/>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function ProgressStages({
|
|
63
|
+
stages,
|
|
64
|
+
label,
|
|
65
|
+
className,
|
|
66
|
+
}: {
|
|
67
|
+
stages: readonly ProgressStage[];
|
|
68
|
+
label: string;
|
|
69
|
+
className?: string;
|
|
70
|
+
}) {
|
|
71
|
+
return (
|
|
72
|
+
<ol aria-label={label} className={cn("space-y-6", className)}>
|
|
73
|
+
{stages.map((stage, index) => (
|
|
74
|
+
<li
|
|
75
|
+
key={stage.id}
|
|
76
|
+
aria-current={
|
|
77
|
+
stage.state === "running" || stage.state === "failed"
|
|
78
|
+
? "step"
|
|
79
|
+
: undefined
|
|
80
|
+
}
|
|
81
|
+
className="relative flex items-start gap-3"
|
|
82
|
+
>
|
|
83
|
+
{index < stages.length - 1 && (
|
|
84
|
+
<span
|
|
85
|
+
aria-hidden={true}
|
|
86
|
+
className="absolute left-2 top-4.5 -bottom-6.5 border-l border-border"
|
|
87
|
+
/>
|
|
88
|
+
)}
|
|
89
|
+
<span className="mt-0.5 text-muted-foreground">
|
|
90
|
+
<ProgressStatusIcon state={stage.state} />
|
|
91
|
+
</span>
|
|
92
|
+
<div className="min-w-0 flex-1">
|
|
93
|
+
<div
|
|
94
|
+
className={cn(
|
|
95
|
+
"text-sm",
|
|
96
|
+
stage.state === "failed"
|
|
97
|
+
? "text-(--red-11)"
|
|
98
|
+
: stage.state === "waiting"
|
|
99
|
+
? "text-muted-foreground"
|
|
100
|
+
: "text-foreground",
|
|
101
|
+
)}
|
|
102
|
+
>
|
|
103
|
+
{stage.title}
|
|
104
|
+
</div>
|
|
105
|
+
<p className="mt-1 text-xs text-muted-foreground">
|
|
106
|
+
{stage.description}
|
|
107
|
+
</p>
|
|
108
|
+
{stage.details}
|
|
109
|
+
</div>
|
|
110
|
+
</li>
|
|
111
|
+
))}
|
|
112
|
+
</ol>
|
|
113
|
+
);
|
|
114
|
+
}
|
|
@@ -359,11 +359,111 @@ describe("NotebookLanguageServerClient", () => {
|
|
|
359
359
|
return undefined;
|
|
360
360
|
});
|
|
361
361
|
|
|
362
|
-
notebookClient = new NotebookLanguageServerClient(
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
362
|
+
notebookClient = new NotebookLanguageServerClient(
|
|
363
|
+
mockClient,
|
|
364
|
+
{},
|
|
365
|
+
() => ({}),
|
|
366
|
+
);
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
describe("live editor snapshots", () => {
|
|
370
|
+
function createEditor(code: string) {
|
|
371
|
+
return new EditorView({
|
|
372
|
+
doc: code,
|
|
373
|
+
extensions: [
|
|
374
|
+
languageAdapterState.init(() => new PythonLanguageAdapter()),
|
|
375
|
+
languageMetadataField.init(() => ({})),
|
|
376
|
+
],
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
it("sends edits and their removal without invalidating the notebook atom", async () => {
|
|
381
|
+
const cachedCodes = store.get(topologicalCodesAtom);
|
|
382
|
+
const editor = createEditor("print(math.sqrt(4))");
|
|
383
|
+
replaceNotebookEditors(notebookClient, () => ({ [Cells.cell3]: editor }));
|
|
384
|
+
const uri = CellDocumentUri.of(Cells.cell3);
|
|
385
|
+
try {
|
|
386
|
+
await notebookClient.textDocumentDidOpen({
|
|
387
|
+
textDocument: {
|
|
388
|
+
uri,
|
|
389
|
+
languageId: "python",
|
|
390
|
+
version: 1,
|
|
391
|
+
text: editor.state.doc.toString(),
|
|
392
|
+
},
|
|
393
|
+
});
|
|
394
|
+
for (const [index, code] of [
|
|
395
|
+
"math.missing()",
|
|
396
|
+
"print(math.sqrt(4))",
|
|
397
|
+
].entries()) {
|
|
398
|
+
editor.dispatch({
|
|
399
|
+
changes: { from: 0, to: editor.state.doc.length, insert: code },
|
|
400
|
+
});
|
|
401
|
+
await notebookClient.textDocumentDidChange({
|
|
402
|
+
textDocument: { uri, version: index + 2 },
|
|
403
|
+
contentChanges: [{ text: code }],
|
|
404
|
+
});
|
|
405
|
+
expect(store.get(topologicalCodesAtom)).toEqual(cachedCodes);
|
|
406
|
+
expect(mockClient.textDocumentDidChange).toHaveBeenNthCalledWith(
|
|
407
|
+
index + 1,
|
|
408
|
+
{
|
|
409
|
+
textDocument: {
|
|
410
|
+
uri: notebookClient.documentUri,
|
|
411
|
+
version: index + 2,
|
|
412
|
+
},
|
|
413
|
+
contentChanges: [
|
|
414
|
+
{
|
|
415
|
+
text: `# this is a comment\nimport math\nimport numpy\n${code}`,
|
|
416
|
+
},
|
|
417
|
+
],
|
|
418
|
+
},
|
|
419
|
+
);
|
|
420
|
+
}
|
|
421
|
+
} finally {
|
|
422
|
+
editor.destroy();
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
it("syncs pending edits before completion and uses their updated line offsets", async () => {
|
|
427
|
+
const editor = createEditor("import math\nimport numpy");
|
|
428
|
+
replaceNotebookEditors(notebookClient, () => ({ [Cells.cell2]: editor }));
|
|
429
|
+
try {
|
|
430
|
+
await notebookClient.textDocumentDidOpen({
|
|
431
|
+
textDocument: {
|
|
432
|
+
uri: CellDocumentUri.of(Cells.cell2),
|
|
433
|
+
languageId: "python",
|
|
434
|
+
version: 1,
|
|
435
|
+
text: editor.state.doc.toString(),
|
|
436
|
+
},
|
|
437
|
+
});
|
|
438
|
+
editor.dispatch({
|
|
439
|
+
changes: { from: editor.state.doc.length, insert: "\nextra = 1" },
|
|
440
|
+
});
|
|
441
|
+
mockClient.textDocumentCompletion.mockImplementation(async () => {
|
|
442
|
+
expect(mockClient.textDocumentDidChange).toHaveBeenCalledWith({
|
|
443
|
+
textDocument: { uri: notebookClient.documentUri, version: 2 },
|
|
444
|
+
contentChanges: [
|
|
445
|
+
{
|
|
446
|
+
text: "# this is a comment\nimport math\nimport numpy\nextra = 1\nprint(math.sqrt(4))",
|
|
447
|
+
},
|
|
448
|
+
],
|
|
449
|
+
});
|
|
450
|
+
return null;
|
|
451
|
+
});
|
|
452
|
+
const params: LSP.CompletionParams = {
|
|
453
|
+
textDocument: { uri: CellDocumentUri.of(Cells.cell3) },
|
|
454
|
+
position: { line: 0, character: 11 },
|
|
455
|
+
};
|
|
456
|
+
await notebookClient.textDocumentCompletion(params);
|
|
457
|
+
expect(mockClient.textDocumentCompletion).toHaveBeenCalledWith({
|
|
458
|
+
textDocument: { uri: notebookClient.documentUri },
|
|
459
|
+
position: { line: 4, character: 11 },
|
|
460
|
+
});
|
|
461
|
+
await notebookClient.textDocumentCompletion(params);
|
|
462
|
+
expect(mockClient.textDocumentDidChange).toHaveBeenCalledTimes(1);
|
|
463
|
+
} finally {
|
|
464
|
+
editor.destroy();
|
|
465
|
+
}
|
|
466
|
+
});
|
|
367
467
|
});
|
|
368
468
|
|
|
369
469
|
describe("document lifecycle", () => {
|
|
@@ -1893,6 +1993,7 @@ describe("NotebookLanguageServerClient", () => {
|
|
|
1893
1993
|
const isolatedNotebookClient = new NotebookLanguageServerClient(
|
|
1894
1994
|
isolatedClient,
|
|
1895
1995
|
{},
|
|
1996
|
+
() => ({}),
|
|
1896
1997
|
);
|
|
1897
1998
|
await isolatedNotebookClient.sync();
|
|
1898
1999
|
isolatedNotebookClient.patchProcessNotification();
|
|
@@ -343,7 +343,21 @@ export class NotebookLanguageServerClient implements ILanguageServerClient {
|
|
|
343
343
|
}
|
|
344
344
|
|
|
345
345
|
private getNotebookCode() {
|
|
346
|
-
|
|
346
|
+
const { cellIds, codes } = store.get(topologicalCodesAtom);
|
|
347
|
+
const editors = this.getNotebookEditors();
|
|
348
|
+
// EditorView edits do not invalidate the cached notebook atom.
|
|
349
|
+
return {
|
|
350
|
+
cellIds,
|
|
351
|
+
codes: Objects.fromEntries(
|
|
352
|
+
cellIds.map((id) => {
|
|
353
|
+
const editor = editors[id];
|
|
354
|
+
return [
|
|
355
|
+
id,
|
|
356
|
+
editor ? getEditorCodeAsPython(editor) : (codes[id] ?? ""),
|
|
357
|
+
];
|
|
358
|
+
}),
|
|
359
|
+
),
|
|
360
|
+
};
|
|
347
361
|
}
|
|
348
362
|
|
|
349
363
|
private assertCellDocumentUri(
|
|
@@ -870,7 +884,7 @@ export class NotebookLanguageServerClient implements ILanguageServerClient {
|
|
|
870
884
|
}
|
|
871
885
|
|
|
872
886
|
public async textDocumentCompletion(params: LSP.CompletionParams) {
|
|
873
|
-
const { lens } = this.
|
|
887
|
+
const { lens } = await this.sync();
|
|
874
888
|
|
|
875
889
|
// Check if URI is valid
|
|
876
890
|
if (!CellDocumentUri.is(params.textDocument.uri)) {
|
|
@@ -4,12 +4,12 @@ import { EditorState } from "@codemirror/state";
|
|
|
4
4
|
import { EditorView } from "@codemirror/view";
|
|
5
5
|
import { createStore } from "jotai";
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import {
|
|
7
|
+
import { ConnectionState } from "@/core/websocket/types";
|
|
8
8
|
import { connectionAtom } from "../../../network/connection";
|
|
9
9
|
import { dynamicReadonly, isEditorReadonly } from "../extension";
|
|
10
10
|
|
|
11
11
|
function makeStoreWithConnection(
|
|
12
|
-
state: typeof
|
|
12
|
+
state: typeof ConnectionState.CONNECTING | typeof ConnectionState.OPEN,
|
|
13
13
|
) {
|
|
14
14
|
const store = createStore();
|
|
15
15
|
store.set(connectionAtom, { state });
|
|
@@ -18,7 +18,7 @@ function makeStoreWithConnection(
|
|
|
18
18
|
|
|
19
19
|
describe("dynamicReadonly", () => {
|
|
20
20
|
it("should be readonly when connection is not OPEN", () => {
|
|
21
|
-
const store = makeStoreWithConnection(
|
|
21
|
+
const store = makeStoreWithConnection(ConnectionState.CONNECTING);
|
|
22
22
|
const state = EditorState.create({
|
|
23
23
|
doc: "test",
|
|
24
24
|
extensions: [dynamicReadonly(store)],
|
|
@@ -27,7 +27,7 @@ describe("dynamicReadonly", () => {
|
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
it("should be editable when connection is OPEN", async () => {
|
|
30
|
-
const store = makeStoreWithConnection(
|
|
30
|
+
const store = makeStoreWithConnection(ConnectionState.OPEN);
|
|
31
31
|
const state = EditorState.create({
|
|
32
32
|
doc: "test",
|
|
33
33
|
extensions: [dynamicReadonly(store)],
|
|
@@ -37,7 +37,7 @@ describe("dynamicReadonly", () => {
|
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
it("should toggle readonly when connection state changes", () => {
|
|
40
|
-
const store = makeStoreWithConnection(
|
|
40
|
+
const store = makeStoreWithConnection(ConnectionState.CONNECTING);
|
|
41
41
|
const state = EditorState.create({
|
|
42
42
|
doc: "test",
|
|
43
43
|
extensions: [dynamicReadonly(store)],
|
|
@@ -45,7 +45,7 @@ describe("dynamicReadonly", () => {
|
|
|
45
45
|
const view = new EditorView({ state });
|
|
46
46
|
expect(isEditorReadonly(state)).toBe(true);
|
|
47
47
|
// Simulate connection opening
|
|
48
|
-
store.set(connectionAtom, { state:
|
|
48
|
+
store.set(connectionAtom, { state: ConnectionState.OPEN });
|
|
49
49
|
// The extension uses a plugin to update the state, so we need to create a view to trigger it
|
|
50
50
|
view.requestMeasure();
|
|
51
51
|
// The state should now be editable
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
isAppConnecting,
|
|
8
8
|
} from "@/core/websocket/connection-utils";
|
|
9
9
|
import { connectionAtom } from "../../network/connection";
|
|
10
|
-
import {
|
|
10
|
+
import { ConnectionState } from "../../websocket/types";
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* State effect for updating readonly status based on connection
|
|
@@ -111,7 +111,7 @@ export function dynamicReadonly(store: ReturnType<typeof createStore>) {
|
|
|
111
111
|
// Subscribe to connectionAtom and manage listeners
|
|
112
112
|
const unsubscribe = store.sub(connectionAtom, () => {
|
|
113
113
|
const connection = store.get(connectionAtom);
|
|
114
|
-
if (connection.state ===
|
|
114
|
+
if (connection.state === ConnectionState.CONNECTING) {
|
|
115
115
|
attachListeners();
|
|
116
116
|
} else {
|
|
117
117
|
detachListeners();
|
package/src/core/config/pair.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
3
|
import { connectionAtom } from "@/core/network/connection";
|
|
4
4
|
import { store } from "@/core/state/jotai";
|
|
5
|
-
import {
|
|
5
|
+
import { ConnectionState } from "@/core/websocket/types";
|
|
6
6
|
import {
|
|
7
7
|
fetchDataSourceDiscovery,
|
|
8
8
|
invalidateDataSourceDiscovery,
|
|
@@ -30,7 +30,7 @@ describe("fetchDataSourceDiscovery", () => {
|
|
|
30
30
|
beforeEach(() => {
|
|
31
31
|
// Discovery waits for the session's websocket connection to be open
|
|
32
32
|
// before requesting, so it doesn't race a still-connecting session.
|
|
33
|
-
store.set(connectionAtom, { state:
|
|
33
|
+
store.set(connectionAtom, { state: ConnectionState.OPEN });
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
afterEach(() => {
|
package/src/core/edit-app.tsx
CHANGED
|
@@ -197,7 +197,11 @@ export const EditApp: React.FC<AppProps> = ({
|
|
|
197
197
|
)}
|
|
198
198
|
</div>
|
|
199
199
|
|
|
200
|
-
<ConnectionNotice
|
|
200
|
+
<ConnectionNotice
|
|
201
|
+
appConfig={appConfig}
|
|
202
|
+
onRetry={reconnect}
|
|
203
|
+
canOpenPackages={!hideControls}
|
|
204
|
+
/>
|
|
201
205
|
|
|
202
206
|
{/* Don't render until we have a single cell. NotStartedConnectionAlert
|
|
203
207
|
still covers the "no remote runtime started" prompt. */}
|
package/src/core/export/hooks.ts
CHANGED
|
@@ -16,7 +16,7 @@ import { connectionAtom } from "../network/connection";
|
|
|
16
16
|
import { useRequestClient } from "../network/requests";
|
|
17
17
|
import type { UpdateCellOutputsRequest } from "../network/types";
|
|
18
18
|
import { VirtualFileTracker } from "../static/virtual-file-tracker";
|
|
19
|
-
import {
|
|
19
|
+
import { ConnectionState } from "../websocket/types";
|
|
20
20
|
|
|
21
21
|
const DELAY = 5000; // 5 seconds;
|
|
22
22
|
|
|
@@ -28,7 +28,7 @@ export function useAutoExport() {
|
|
|
28
28
|
const htmlEnabled = appConfig.auto_download.includes("html");
|
|
29
29
|
const ipynbEnabled = appConfig.auto_download.includes("ipynb");
|
|
30
30
|
|
|
31
|
-
const isConnected = state ===
|
|
31
|
+
const isConnected = state === ConnectionState.OPEN;
|
|
32
32
|
const markdownDisabled = !markdownEnabled || !isConnected;
|
|
33
33
|
const htmlDisabled = !htmlEnabled || !isConnected;
|
|
34
34
|
const ipynbDisabled = !ipynbEnabled || !isConnected;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
import { init } from "@paralleldrive/cuid2";
|
|
3
|
+
import { atom } from "jotai";
|
|
3
4
|
import { Logger } from "@/utils/Logger";
|
|
4
5
|
import type { TypedString } from "@/utils/typed";
|
|
5
6
|
import { updateQueryParams } from "@/utils/urls";
|
|
@@ -9,6 +10,14 @@ import { store } from "../state/jotai";
|
|
|
9
10
|
|
|
10
11
|
export type SessionId = TypedString<"SessionId">;
|
|
11
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Server-owned identity of the notebook Session. It survives browser reloads
|
|
15
|
+
* and reconnects and ends with the Session.
|
|
16
|
+
*/
|
|
17
|
+
export type StableSessionId = TypedString<"StableSessionId">;
|
|
18
|
+
|
|
19
|
+
export const stableSessionIdAtom = atom<StableSessionId | null>(null);
|
|
20
|
+
|
|
12
21
|
const createId = init({ length: 6 });
|
|
13
22
|
|
|
14
23
|
export function generateSessionId(): SessionId {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { afterEach, describe, expect, it } from "vitest";
|
|
4
4
|
import { initialModeAtom } from "@/core/mode";
|
|
5
5
|
import { store } from "@/core/state/jotai";
|
|
6
|
-
import {
|
|
6
|
+
import { ConnectionState } from "../../websocket/types";
|
|
7
7
|
import { connectionAtom, waitForConnectionOpenIfNotebook } from "../connection";
|
|
8
8
|
|
|
9
9
|
const NEVER = Symbol("never");
|
|
@@ -20,7 +20,7 @@ function settledOrNever(promise: Promise<unknown>) {
|
|
|
20
20
|
|
|
21
21
|
describe("waitForConnectionOpenIfNotebook", () => {
|
|
22
22
|
afterEach(() => {
|
|
23
|
-
store.set(connectionAtom, { state:
|
|
23
|
+
store.set(connectionAtom, { state: ConnectionState.NOT_STARTED });
|
|
24
24
|
store.set(initialModeAtom, undefined);
|
|
25
25
|
});
|
|
26
26
|
|
|
@@ -39,7 +39,7 @@ describe("waitForConnectionOpenIfNotebook", () => {
|
|
|
39
39
|
const promise = waitForConnectionOpenIfNotebook();
|
|
40
40
|
await expect(settledOrNever(promise)).resolves.toBe(NEVER);
|
|
41
41
|
|
|
42
|
-
store.set(connectionAtom, { state:
|
|
42
|
+
store.set(connectionAtom, { state: ConnectionState.OPEN });
|
|
43
43
|
await expect(settledOrNever(promise)).resolves.not.toBe(NEVER);
|
|
44
44
|
});
|
|
45
45
|
});
|