@marimo-team/islands 0.25.2-dev0 → 0.25.2-dev100
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-C2d9ysUI.js → ConnectedDataExplorerComponent-BZmqc_F0.js} +11 -11
- package/dist/{ErrorBoundary-2usl042r.js → ErrorBoundary-Dcb6Zg4M.js} +8 -8
- package/dist/{abnfDiagram-VCTEODGH-AFhOQTt8.js → abnfDiagram-VCTEODGH-C_Lmaa2j.js} +3 -3
- package/dist/{any-language-editor-CycIVIeP.js → any-language-editor-BFzqhOBR.js} +5 -5
- package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
- package/dist/{architectureDiagram-5GKGNRK7-BngksAAQ.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-DdXAm8iz.js → button-BtsM2UqM.js} +312 -283
- package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
- package/dist/{capabilities-B3ce_GNu.js → capabilities-A5jrzjCJ.js} +1 -1
- package/dist/{cells-Cv93oav_.js → cells-DZi0ioak.js} +4330 -4313
- package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
- package/dist/{chat-ui-fVyVOhYN.js → chat-ui-CwOWzoSO.js} +46 -46
- package/dist/{check-B7cIK6gb.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-UOVZuZVn.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-CrEPyWy1.js → chunk-SHT3W25Y-B2dyNZ31.js} +8 -8
- package/dist/{chunk-SVP7TREG-uIyyySp6.js → chunk-SVP7TREG-D7UPvB10.js} +2 -2
- package/dist/{chunk-TICWLB2K-DdXM3eg6.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-rUDTB2Ce.js → code-visibility-DTB0i3UU.js} +6 -6
- package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
- package/dist/{common-BVErJKjc.js → common-CaVEr6tY.js} +11801 -11503
- package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
- package/dist/{copy-icon-CLdENY__.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-zknaAsGy.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-BhMOoMGJ.js → dagre-GXQ25YYZ-BJiUO_SV.js} +10 -10
- package/dist/{data-grid-overlay-editor-7ANmo9c-.js → data-grid-overlay-editor-BzTuqI2T.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-V5-Z-EDY.js → diagram-S7CK7UJ4-BZfxFNRR.js} +4 -4
- package/dist/{diagram-UQ7AKVKN-qw8AjDal.js → diagram-UQ7AKVKN-1xcsiIMg.js} +3 -3
- package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
- package/dist/{diagram-VX7I27RA-DfuqFb1E.js → diagram-VX7I27RA-DmRsnHYY.js} +5 -5
- package/dist/{diagram-Z3DM3KII-DpWwlYZB.js → diagram-Z3DM3KII--b49ryKx.js} +3 -3
- package/dist/{dialog-CgNq6y9-.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-C20OnNMZ.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-DBXLWO9v.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-DLl0XqoW.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-K1inEVfd.js → feedback-button-CHGz2EXX.js} +10 -10
- package/dist/flowDiagram-HODETNUW-D7IBKS12.js +16 -0
- package/dist/{formats-Cl_67ghI.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-D2fDO5aG.js → glide-data-editor-WxMsJlmb.js} +11 -11
- package/dist/{glide-utils-B3rUT5PI.js → glide-utils-BVJ4fkxX.js} +3 -3
- package/dist/{globals-NylFP0CX.js → globals-BROokniw.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-CmkwfNkf.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-ntpxMfrq.js → infoDiagram-27XIBGKW-DVQFYvhg.js} +2 -2
- package/dist/{ishikawaDiagram-5VMMS53U-BllIlHE5.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-GYtNMjtS.js → kanban-definition-UXKFOSKX-Dcl_ECO9.js} +9 -9
- package/dist/{label-BslhXqL6.js → label-DQO1jFjf.js} +96 -93
- package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
- package/dist/{loader-DEZSzvma.js → loader-Cm-ATtou.js} +1 -1
- package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
- package/dist/main.js +6966 -6827
- package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
- package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
- package/dist/{mermaid-Dnzoxjt1.js → mermaid-BfhcnSj-.js} +54 -54
- package/dist/{mindmap-definition-YA3MSWOX-Cth76xgH.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-B4XyCoMu.js → number-overlay-editor-DCj0MZgn.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-Cu4uOXii.js → pegDiagram-XKGWAZYB-Du5p2s0w.js} +3 -3
- package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
- package/dist/{pieDiagram-E7YTZNPT-Bh3eDa9s.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-CYN5E-iO.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-DG-M6Rnc.js → railroadDiagram-O6MQD6OU-C0ojm-6_.js} +3 -3
- package/dist/{requirementDiagram-BXWQKSXE-DCwsThh0.js → requirementDiagram-BXWQKSXE-CNwNBmI3.js} +11 -11
- package/dist/{reveal-component-Dtm5GH3p.js → reveal-component-CSY54dq4.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-CbXB1_PU.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-DQBRQSba.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-A-Zf3Sb2.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-B_pMf0J4.js → swimlanes-42K2YHIH-M4IdGi8J.js} +10 -10
- package/dist/swimlanesDiagram-VR7AAH4N-FUSwmzEp.js +30 -0
- package/dist/{swiper-component-IOUowglM.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-DTXFjTTM.js → timeline-definition-24CTP7MA-DH-kvakg.js} +3 -3
- package/dist/{toDate-C67bxMWn.js → toDate-vEi5kTfY.js} +4 -5
- package/dist/{toast-DvY70eFX.js → toast-DfEpJedt.js} +157 -161
- package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
- package/dist/{tooltip-qB8NlSqV.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-D5D9xEjZ.js → use-restore-focus-kmgwrL8q.js} +1833 -1625
- package/dist/{useAsyncData-BD6AStMt.js → useAsyncData-rkAlR_vh.js} +1 -1
- package/dist/{useDateFormatter-BXQGu86d.js → useDateFormatter-C-tz65rD.js} +52 -31
- package/dist/{useDeepCompareMemoize-D_HNdyvI.js → useDeepCompareMemoize-BlHFBj5_.js} +1 -1
- package/dist/{useIframeCapabilities-CVtNkI3Y.js → useIframeCapabilities-C1Bt04Iz.js} +1 -1
- package/dist/{useLifecycle-DPgiiwwU.js → useLifecycle-B68iY077.js} +3 -3
- package/dist/{useTheme-DzXmYZ5V.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-tFOzgarw.js → vega-component-C-bPttRN.js} +9 -9
- package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
- package/dist/{vennDiagram-4TSXK5OY-BPHjZo0R.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-6fTLYBuD.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-BYjwjrzE.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 +24 -23
- 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/range-focus/__tests__/atoms.test.ts +11 -11
- 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/__tests__/useSetOutputsExpanded.test.ts +42 -0
- 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/useNotebookActions.tsx +20 -0
- package/src/components/editor/actions/useRestartKernel.tsx +2 -2
- package/src/components/editor/actions/useSetOutputsExpanded.ts +67 -0
- 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/tracing/tracing.test.tsx +30 -30
- 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/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 +21 -1
- package/src/core/export/hooks.ts +2 -2
- package/src/core/hotkeys/hotkeys.ts +12 -0
- 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-css.test.ts +166 -0
- package/src/css/katex.min.css +169 -168
- 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/FileBrowserPlugin.tsx +45 -15
- 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__/FileBrowserPlugin.test.tsx +85 -2
- 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-BiATbBE4.js +0 -30
- package/dist/classDiagram-v2-VYDZK3BY-JnH97GYw.js +0 -30
- package/dist/dropdown-menu-CZy06LAq.js +0 -4502
- package/dist/error-banner-B94dcDmP.js +0 -391
- package/dist/flowDiagram-HODETNUW-DL52nMkt.js +0 -16
- package/dist/purify.es-DgKyQviY.js +0 -805
- package/dist/select-C6plhmZr.js +0 -970
- package/dist/stateDiagram-v2-MP3YSRHH-D9YMnUGx.js +0 -30
- package/dist/swimlanesDiagram-VR7AAH4N-Ctgy-yGP.js +0 -30
- package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
|
@@ -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
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
useRunStaleCells,
|
|
24
24
|
} from "../components/editor/cell/useRunCells";
|
|
25
25
|
import { useSetCodeVisibility } from "../components/editor/actions/useSetCodeVisibility";
|
|
26
|
+
import { useSetOutputsExpanded } from "../components/editor/actions/useSetOutputsExpanded";
|
|
26
27
|
import { CellArray } from "../components/editor/renderers/cell-array";
|
|
27
28
|
import { CellsRenderer } from "../components/editor/renderers/cells-renderer";
|
|
28
29
|
import { useHotkey } from "../hooks/useHotkey";
|
|
@@ -115,6 +116,7 @@ export const EditApp: React.FC<AppProps> = ({
|
|
|
115
116
|
const runAllCells = useRunAllCells();
|
|
116
117
|
const togglePresenting = useTogglePresenting();
|
|
117
118
|
const setCodeVisibility = useSetCodeVisibility();
|
|
119
|
+
const setOutputsExpanded = useSetOutputsExpanded();
|
|
118
120
|
|
|
119
121
|
// HOTKEYS
|
|
120
122
|
useHotkey("global.runStale", () => {
|
|
@@ -141,6 +143,20 @@ export const EditApp: React.FC<AppProps> = ({
|
|
|
141
143
|
useHotkey("global.hideAllMarkdownCode", () => {
|
|
142
144
|
setCodeVisibility(true, "markdown");
|
|
143
145
|
});
|
|
146
|
+
useHotkey(
|
|
147
|
+
"global.expandAllOutputs",
|
|
148
|
+
() => {
|
|
149
|
+
setOutputsExpanded(true);
|
|
150
|
+
},
|
|
151
|
+
{ disabled: !isEditing },
|
|
152
|
+
);
|
|
153
|
+
useHotkey(
|
|
154
|
+
"global.clampAllOutputs",
|
|
155
|
+
() => {
|
|
156
|
+
setOutputsExpanded(false);
|
|
157
|
+
},
|
|
158
|
+
{ disabled: !isEditing },
|
|
159
|
+
);
|
|
144
160
|
useHotkey("global.collapseAllSections", () => {
|
|
145
161
|
collapseAllCells();
|
|
146
162
|
});
|
|
@@ -181,7 +197,11 @@ export const EditApp: React.FC<AppProps> = ({
|
|
|
181
197
|
)}
|
|
182
198
|
</div>
|
|
183
199
|
|
|
184
|
-
<ConnectionNotice
|
|
200
|
+
<ConnectionNotice
|
|
201
|
+
appConfig={appConfig}
|
|
202
|
+
onRetry={reconnect}
|
|
203
|
+
canOpenPackages={!hideControls}
|
|
204
|
+
/>
|
|
185
205
|
|
|
186
206
|
{/* Don't render until we have a single cell. NotStartedConnectionAlert
|
|
187
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;
|
|
@@ -389,6 +389,18 @@ const DEFAULT_HOT_KEY = {
|
|
|
389
389
|
group: "Editing",
|
|
390
390
|
key: NOT_SET,
|
|
391
391
|
},
|
|
392
|
+
"global.expandAllOutputs": {
|
|
393
|
+
name: "Expand all outputs",
|
|
394
|
+
group: "Editing",
|
|
395
|
+
key: NOT_SET,
|
|
396
|
+
additionalKeywords: ["show full output", "unclamp"],
|
|
397
|
+
},
|
|
398
|
+
"global.clampAllOutputs": {
|
|
399
|
+
name: "Clamp all outputs",
|
|
400
|
+
group: "Editing",
|
|
401
|
+
key: NOT_SET,
|
|
402
|
+
additionalKeywords: ["collapse outputs", "shrink outputs"],
|
|
403
|
+
},
|
|
392
404
|
"global.collapseAllSections": {
|
|
393
405
|
name: "Collapse all sections",
|
|
394
406
|
group: "Editing",
|
|
@@ -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
|
});
|
|
@@ -5,7 +5,7 @@ import { sandboxAtom, sandboxSyncAtom } from "@/core/packages/sandbox-state";
|
|
|
5
5
|
import {
|
|
6
6
|
type ConnectionPhase,
|
|
7
7
|
WebSocketClosedReason,
|
|
8
|
-
|
|
8
|
+
ConnectionState,
|
|
9
9
|
} from "@/core/websocket/types";
|
|
10
10
|
import { connectionAtom } from "./connection";
|
|
11
11
|
|
|
@@ -37,7 +37,7 @@ export const connectionNoticeAtom = atom<ConnectionNotice | null>((get) => {
|
|
|
37
37
|
if (
|
|
38
38
|
sandbox &&
|
|
39
39
|
(syncing || syncError !== null) &&
|
|
40
|
-
connection.state ===
|
|
40
|
+
connection.state === ConnectionState.OPEN
|
|
41
41
|
) {
|
|
42
42
|
return {
|
|
43
43
|
kind: "sync",
|
|
@@ -56,7 +56,7 @@ export const connectionNoticeAtom = atom<ConnectionNotice | null>((get) => {
|
|
|
56
56
|
error: syncError,
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
|
-
if (connection.state ===
|
|
59
|
+
if (connection.state === ConnectionState.CONNECTING) {
|
|
60
60
|
const messages = {
|
|
61
61
|
"preparing-environment": {
|
|
62
62
|
title: "Preparing environment…",
|
|
@@ -88,11 +88,11 @@ export const connectionNoticeAtom = atom<ConnectionNotice | null>((get) => {
|
|
|
88
88
|
error: null,
|
|
89
89
|
};
|
|
90
90
|
}
|
|
91
|
-
if (connection.state ===
|
|
91
|
+
if (connection.state === ConnectionState.CLOSED) {
|
|
92
92
|
const startupFailed =
|
|
93
93
|
connection.code === WebSocketClosedReason.KERNEL_STARTUP_ERROR;
|
|
94
94
|
const environmentFailed =
|
|
95
|
-
startupFailed && connection.phase === "preparing-environment";
|
|
95
|
+
sandbox && startupFailed && connection.phase === "preparing-environment";
|
|
96
96
|
return {
|
|
97
97
|
kind: startupFailed ? "startup" : "connection",
|
|
98
98
|
phase: connection.phase,
|
|
@@ -4,14 +4,14 @@ import { atomWithReducer } from "jotai/utils";
|
|
|
4
4
|
import type { NotificationMessageData } from "../kernel/messages";
|
|
5
5
|
import { isNotebookPage } from "../mode";
|
|
6
6
|
import { waitFor } from "../state/jotai";
|
|
7
|
-
import { type ConnectionStatus,
|
|
7
|
+
import { type ConnectionStatus, ConnectionState } from "../websocket/types";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Atom for storing the connection status.
|
|
11
11
|
* Initialized to NOT_STARTED.
|
|
12
12
|
*/
|
|
13
13
|
export const connectionAtom = atom<ConnectionStatus>({
|
|
14
|
-
state:
|
|
14
|
+
state: ConnectionState.NOT_STARTED,
|
|
15
15
|
});
|
|
16
16
|
|
|
17
17
|
type StartupProgress = NotificationMessageData<"startup-progress">;
|
|
@@ -33,7 +33,7 @@ export const startupProgressAtom = atomWithReducer<
|
|
|
33
33
|
|
|
34
34
|
export function waitForConnectionOpen() {
|
|
35
35
|
return waitFor(connectionAtom, (value) => {
|
|
36
|
-
return value.state ===
|
|
36
|
+
return value.state === ConnectionState.OPEN;
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
39
|
|
|
@@ -53,28 +53,28 @@ export function waitForConnectionOpenIfNotebook() {
|
|
|
53
53
|
|
|
54
54
|
export const isConnectingAtom = atom((get) => {
|
|
55
55
|
const connection = get(connectionAtom);
|
|
56
|
-
return connection.state ===
|
|
56
|
+
return connection.state === ConnectionState.CONNECTING;
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
export const isConnectedAtom = atom((get) => {
|
|
60
60
|
const connection = get(connectionAtom);
|
|
61
|
-
return connection.state ===
|
|
61
|
+
return connection.state === ConnectionState.OPEN;
|
|
62
62
|
});
|
|
63
63
|
|
|
64
64
|
export const canInteractWithAppAtom = atom((get) => {
|
|
65
65
|
const connection = get(connectionAtom);
|
|
66
66
|
return (
|
|
67
|
-
connection.state ===
|
|
68
|
-
connection.state ===
|
|
67
|
+
connection.state === ConnectionState.OPEN ||
|
|
68
|
+
connection.state === ConnectionState.NOT_STARTED
|
|
69
69
|
);
|
|
70
70
|
});
|
|
71
71
|
|
|
72
72
|
export const isClosedAtom = atom((get) => {
|
|
73
73
|
const connection = get(connectionAtom);
|
|
74
|
-
return connection.state ===
|
|
74
|
+
return connection.state === ConnectionState.CLOSED;
|
|
75
75
|
});
|
|
76
76
|
|
|
77
77
|
export const isNotStartedAtom = atom((get) => {
|
|
78
78
|
const connection = get(connectionAtom);
|
|
79
|
-
return connection.state ===
|
|
79
|
+
return connection.state === ConnectionState.NOT_STARTED;
|
|
80
80
|
});
|
|
@@ -7,7 +7,7 @@ import { memoizeLastValue } from "@/utils/once";
|
|
|
7
7
|
import { waitForKernelToBeInstantiated } from "../kernel/state";
|
|
8
8
|
import type { RuntimeManager } from "../runtime/runtime";
|
|
9
9
|
import { store } from "../state/jotai";
|
|
10
|
-
import {
|
|
10
|
+
import { ConnectionState } from "../websocket/types";
|
|
11
11
|
import { connectionAtom, waitForConnectionOpen } from "./connection";
|
|
12
12
|
import type { EditRequests, RunRequests } from "./types";
|
|
13
13
|
|
|
@@ -159,7 +159,7 @@ export function createLazyRequests(
|
|
|
159
159
|
): AllRequests {
|
|
160
160
|
// Memoize the init call, just once per runtime manager
|
|
161
161
|
const initOnce = memoizeLastValue(async (runtimeManager: RuntimeManager) => {
|
|
162
|
-
store.set(connectionAtom, { state:
|
|
162
|
+
store.set(connectionAtom, { state: ConnectionState.CONNECTING });
|
|
163
163
|
await runtimeManager.init();
|
|
164
164
|
});
|
|
165
165
|
|
|
@@ -17,7 +17,7 @@ import type {
|
|
|
17
17
|
} from "@/core/network/types";
|
|
18
18
|
import { filenameAtom } from "@/core/saving/file-state";
|
|
19
19
|
import { store } from "@/core/state/jotai";
|
|
20
|
-
import {
|
|
20
|
+
import { ConnectionState } from "@/core/websocket/types";
|
|
21
21
|
import { HTTPError } from "@/utils/errors";
|
|
22
22
|
import { packageDataVersionAtom } from "../package-data";
|
|
23
23
|
import {
|
|
@@ -52,7 +52,7 @@ beforeEach(() => {
|
|
|
52
52
|
store.set(sandboxAtom, null);
|
|
53
53
|
store.set(sandboxSyncAtom, { kind: "succeeded" });
|
|
54
54
|
store.set(sandboxActionsAtom, null);
|
|
55
|
-
store.set(connectionAtom, { state:
|
|
55
|
+
store.set(connectionAtom, { state: ConnectionState.OPEN });
|
|
56
56
|
store.set(kernelStartupErrorAtom, null);
|
|
57
57
|
store.set(filenameAtom, "notebook.py");
|
|
58
58
|
store.set(packageDataVersionAtom, 0);
|
|
@@ -8,7 +8,7 @@ import { useRequestClient } from "@/core/network/requests";
|
|
|
8
8
|
import { useFilename } from "@/core/saving/filename";
|
|
9
9
|
import { waitFor } from "@/core/state/jotai";
|
|
10
10
|
import { isWasm } from "@/core/wasm/utils";
|
|
11
|
-
import {
|
|
11
|
+
import { ConnectionState } from "@/core/websocket/types";
|
|
12
12
|
import { HTTPError, prettyError } from "@/utils/errors";
|
|
13
13
|
import { invalidatePackageData } from "./package-data";
|
|
14
14
|
import {
|
|
@@ -67,7 +67,7 @@ export function useSandboxController(onReconnect: () => Promise<void>) {
|
|
|
67
67
|
if (
|
|
68
68
|
inFlight.current ||
|
|
69
69
|
operation.kind === "running" ||
|
|
70
|
-
connection.state ===
|
|
70
|
+
connection.state === ConnectionState.CONNECTING
|
|
71
71
|
) {
|
|
72
72
|
return false;
|
|
73
73
|
}
|
|
@@ -91,10 +91,10 @@ export function useSandboxController(onReconnect: () => Promise<void>) {
|
|
|
91
91
|
const status = await waitFor(
|
|
92
92
|
connectionAtom,
|
|
93
93
|
(value) =>
|
|
94
|
-
value.state ===
|
|
95
|
-
value.state ===
|
|
94
|
+
value.state === ConnectionState.OPEN ||
|
|
95
|
+
value.state === ConnectionState.CLOSED,
|
|
96
96
|
);
|
|
97
|
-
if (status.state ===
|
|
97
|
+
if (status.state === ConnectionState.CLOSED) {
|
|
98
98
|
setOperation({ kind: "idle" });
|
|
99
99
|
return false;
|
|
100
100
|
}
|
|
@@ -177,7 +177,7 @@ export function useSandboxController(onReconnect: () => Promise<void>) {
|
|
|
177
177
|
saving ||
|
|
178
178
|
loading ||
|
|
179
179
|
operation.kind === "running" ||
|
|
180
|
-
connection.state ===
|
|
180
|
+
connection.state === ConnectionState.CONNECTING;
|
|
181
181
|
const diagnostic =
|
|
182
182
|
error ??
|
|
183
183
|
(operation.kind === "failed"
|
|
@@ -6,7 +6,7 @@ import { islandsInitializedAtom } from "../../islands/state";
|
|
|
6
6
|
import { kernelStateAtom } from "../../kernel/state";
|
|
7
7
|
import { connectionAtom } from "../../network/connection";
|
|
8
8
|
import { wasmInitStateAtom } from "../../wasm/state";
|
|
9
|
-
import {
|
|
9
|
+
import { ConnectionState } from "../../websocket/types";
|
|
10
10
|
import {
|
|
11
11
|
canRunCellsAtom,
|
|
12
12
|
islandsAdapter,
|
|
@@ -50,13 +50,13 @@ describe("wasmAdapter", () => {
|
|
|
50
50
|
|
|
51
51
|
describe("remoteAdapter", () => {
|
|
52
52
|
it.each([
|
|
53
|
-
[{ state:
|
|
53
|
+
[{ state: ConnectionState.OPEN }, { kind: "ready" }],
|
|
54
54
|
[
|
|
55
|
-
{ state:
|
|
55
|
+
{ state: ConnectionState.CONNECTING },
|
|
56
56
|
{ kind: "connecting", progress: { label: "Connecting…" } },
|
|
57
57
|
],
|
|
58
58
|
[
|
|
59
|
-
{ state:
|
|
59
|
+
{ state: ConnectionState.NOT_STARTED },
|
|
60
60
|
{ kind: "connecting", progress: { label: "Not connected" } },
|
|
61
61
|
],
|
|
62
62
|
] as const)("maps %j to %j", (conn, expected) => {
|
|
@@ -68,7 +68,7 @@ describe("remoteAdapter", () => {
|
|
|
68
68
|
it("surfaces the close reason when closed", () => {
|
|
69
69
|
const store = createStore();
|
|
70
70
|
store.set(connectionAtom, {
|
|
71
|
-
state:
|
|
71
|
+
state: ConnectionState.CLOSED,
|
|
72
72
|
code: "KERNEL_DISCONNECTED",
|
|
73
73
|
reason: "Kernel went away",
|
|
74
74
|
});
|
|
@@ -125,7 +125,7 @@ describe("canRunCellsAtom", () => {
|
|
|
125
125
|
it("is false on a remote adapter until kernel acks", () => {
|
|
126
126
|
const store = createStore();
|
|
127
127
|
// Default adapter in test env is remote.
|
|
128
|
-
store.set(connectionAtom, { state:
|
|
128
|
+
store.set(connectionAtom, { state: ConnectionState.OPEN });
|
|
129
129
|
expect(store.get(canRunCellsAtom)).toBe(false);
|
|
130
130
|
|
|
131
131
|
store.set(kernelStateAtom, { isInstantiated: true, error: null });
|
|
@@ -8,7 +8,7 @@ import { connectionAtom } from "../network/connection";
|
|
|
8
8
|
import { isStaticNotebook } from "../static/static-state";
|
|
9
9
|
import { wasmInitStateAtom } from "../wasm/state";
|
|
10
10
|
import { isWasm } from "../wasm/utils";
|
|
11
|
-
import {
|
|
11
|
+
import { ConnectionState } from "../websocket/types";
|
|
12
12
|
|
|
13
13
|
export type RuntimeKind = "wasm" | "remote" | "static" | "islands";
|
|
14
14
|
|
|
@@ -76,19 +76,19 @@ export const wasmAdapter: RuntimeAdapter = {
|
|
|
76
76
|
const remoteStateAtom = atom<AdapterState>((get) => {
|
|
77
77
|
const conn = get(connectionAtom);
|
|
78
78
|
switch (conn.state) {
|
|
79
|
-
case
|
|
79
|
+
case ConnectionState.OPEN:
|
|
80
80
|
return { kind: "ready" };
|
|
81
|
-
case
|
|
81
|
+
case ConnectionState.CONNECTING:
|
|
82
82
|
return { kind: "connecting", progress: { label: "Connecting…" } };
|
|
83
|
-
case
|
|
83
|
+
case ConnectionState.NOT_STARTED:
|
|
84
84
|
return { kind: "connecting", progress: { label: "Not connected" } };
|
|
85
|
-
case
|
|
86
|
-
case
|
|
85
|
+
case ConnectionState.CLOSING:
|
|
86
|
+
case ConnectionState.CLOSED:
|
|
87
87
|
return {
|
|
88
88
|
kind: "failed",
|
|
89
89
|
error: {
|
|
90
90
|
message:
|
|
91
|
-
conn.state ===
|
|
91
|
+
conn.state === ConnectionState.CLOSED
|
|
92
92
|
? conn.reason
|
|
93
93
|
: "Disconnecting",
|
|
94
94
|
errorKind: "runtime",
|