@marimo-team/islands 0.25.2-dev7 → 0.25.2-dev89

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.
Files changed (348) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CqhQmp74.js → ConnectedDataExplorerComponent-BZmqc_F0.js} +11 -11
  2. package/dist/{ErrorBoundary-BBXTdyzo.js → ErrorBoundary-DhBCglR0.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-aLGD44M7.js → abnfDiagram-VCTEODGH-C_Lmaa2j.js} +3 -3
  4. package/dist/{any-language-editor-dqxlUDlT.js → any-language-editor-BFzqhOBR.js} +5 -5
  5. package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
  6. package/dist/{architectureDiagram-5GKGNRK7-BGL5P81u.js → architectureDiagram-5GKGNRK7-BKMataHB.js} +5 -5
  7. package/dist/{asciiarmor-GKQFJXQG.js → asciiarmor-BWNxzkG7.js} +1 -1
  8. package/dist/{asn1-BsSb7HP5.js → asn1-Bcn2QutK.js} +1 -1
  9. package/dist/assets/__vite-browser-external-BqAtzd2P.js +1 -0
  10. package/dist/assets/{worker-D7hWi02M.js → worker-Bf8dt6S-.js} +5 -5
  11. package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
  12. package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-BeHOjyDk.js} +9 -9
  13. package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
  14. package/dist/{button-B0Xgl-Qn.js → button-BtsM2UqM.js} +300 -283
  15. package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
  16. package/dist/{capabilities-D7Ad8-zw.js → capabilities-A5jrzjCJ.js} +1 -1
  17. package/dist/{cells-5ppES-Un.js → cells-DZi0ioak.js} +4330 -4313
  18. package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
  19. package/dist/{chat-ui-Dv2V95k6.js → chat-ui-CwOWzoSO.js} +46 -46
  20. package/dist/{check-DGZ74tV2.js → check-CNP79M3A.js} +1 -1
  21. package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-CH7Gpamd.js} +5 -5
  22. package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-AI7CvgKn.js} +1 -1
  23. package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BSvuTkX4.js} +1 -1
  24. package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-CLshwT9T.js} +1 -1
  25. package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-wnHcn-lH.js} +3 -3
  26. package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-7O2p8hut.js} +2 -2
  27. package/dist/{chunk-IMKFNOWR-Cm3RgLDj.js → chunk-IMKFNOWR-Bu0Vh_Yi.js} +6 -6
  28. package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-B9_Alrxb.js} +5 -5
  29. package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-PeQPH2fD.js} +6 -6
  30. package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-D9twiFuU.js} +1 -1
  31. package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-BUiNs18s.js} +1 -1
  32. package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-D8S9NPCy.js} +1 -1
  33. package/dist/{chunk-SHT3W25Y-DedDYSP5.js → chunk-SHT3W25Y-B2dyNZ31.js} +8 -8
  34. package/dist/{chunk-SVP7TREG-B2SFkCAL.js → chunk-SVP7TREG-D7UPvB10.js} +2 -2
  35. package/dist/{chunk-TICWLB2K-DB6hjNOL.js → chunk-TICWLB2K-BNaGoadd.js} +6 -6
  36. package/dist/classDiagram-ZZMXUADV-Bbo2n384.js +30 -0
  37. package/dist/classDiagram-v2-VYDZK3BY-xR8cGP0r.js +30 -0
  38. package/dist/{clike-E2lFbGVj.js → clike-CxK9W55Z.js} +1 -1
  39. package/dist/{clojure-Dn_K4RlK.js → clojure-Dzcvwpxk.js} +1 -1
  40. package/dist/{cmake-DpN2Top5.js → cmake-DYr-71zp.js} +1 -1
  41. package/dist/{cobol-Chf22-GM.js → cobol-DC3g37Kq.js} +1 -1
  42. package/dist/{code-visibility-XV7kHdNe.js → code-visibility-DVtowxt1.js} +6 -6
  43. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  44. package/dist/{common-9gwzy4VY.js → common-CeQoafB5.js} +11904 -11621
  45. package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
  46. package/dist/{copy-icon-qmRg_VTX.js → copy-icon-BY7jgcaV.js} +3 -3
  47. package/dist/{crystal-DCM3yc4r.js → crystal-ih5ax5tQ.js} +1 -1
  48. package/dist/{css-DkZ9mMyI.js → css-CN_wP7_R.js} +1 -1
  49. package/dist/{cynefinDiagram-5FMLGOSQ-DzaZEqgD.js → cynefinDiagram-5FMLGOSQ-CCDn4Z9e.js} +3 -3
  50. package/dist/{cypher-Drw_8U5I.js → cypher-CqGRcmZo.js} +1 -1
  51. package/dist/{d-CsVGcKMF.js → d-Cj0sOW2z.js} +1 -1
  52. package/dist/{dagre-GXQ25YYZ-Cjf5GjU3.js → dagre-GXQ25YYZ-BJiUO_SV.js} +10 -10
  53. package/dist/{data-grid-overlay-editor-DWmDWNRs.js → data-grid-overlay-editor-Df0vkYi7.js} +1 -1
  54. package/dist/{diagram-S7CK7UJ4-IhLt_khx.js → diagram-S7CK7UJ4-BZfxFNRR.js} +4 -4
  55. package/dist/{diagram-UQ7AKVKN-CQc6KLPB.js → diagram-UQ7AKVKN-1xcsiIMg.js} +3 -3
  56. package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
  57. package/dist/{diagram-VX7I27RA-DHmW9N1T.js → diagram-VX7I27RA-DmRsnHYY.js} +5 -5
  58. package/dist/{diagram-Z3DM3KII-zVKsg-Ty.js → diagram-Z3DM3KII--b49ryKx.js} +3 -3
  59. package/dist/{dialog-CILKhbsG.js → dialog-CmExhUDI.js} +26 -26
  60. package/dist/{diff-CBikYCUF.js → diff-B_hUkiat.js} +1 -1
  61. package/dist/{dist-Df0wKI0F.js → dist-BK4Oj99o.js} +1 -1
  62. package/dist/{dist-BVGtK7Ht.js → dist-BLfKmR-l.js} +1 -1
  63. package/dist/{dist-B8D7McG3.js → dist-BMQf5zIS.js} +46 -46
  64. package/dist/{dist-C2KzV-vf.js → dist-BorMD-uX.js} +2 -2
  65. package/dist/{dist-Cs2FijYk.js → dist-BuaRHxOc.js} +2 -2
  66. package/dist/{dist-DPcEtqmG.js → dist-Bvs24R_E.js} +47 -47
  67. package/dist/{dist-lA1Cttkb.js → dist-C8fAKSH1.js} +41 -41
  68. package/dist/{dist-DszxuxS1.js → dist-CLdpGQVr.js} +2 -2
  69. package/dist/{dist-CO1AwwG_.js → dist-CN8zI-XC.js} +209 -209
  70. package/dist/{dist-D1PpnuZB.js → dist-CN_BeG2I.js} +1 -1
  71. package/dist/{dist-CPGxfVGX.js → dist-CSJ0MDRw.js} +1 -1
  72. package/dist/{dist-Cm3iAFMD.js → dist-CSbh1PNP.js} +3 -3
  73. package/dist/{dist-9x1ZRe-e.js → dist-Cg7gzw-a.js} +2 -2
  74. package/dist/{dist-B1vYLK28.js → dist-CkTTIdBe.js} +345 -345
  75. package/dist/{dist-BRxfaJgs.js → dist-CrSP_H1M.js} +296 -296
  76. package/dist/{dist-C2wDlYdD.js → dist-D-wwqlzJ.js} +2 -2
  77. package/dist/{dist-BtKIs9N-.js → dist-D6d86eNJ.js} +1 -1
  78. package/dist/{dist-DHOTQar0.js → dist-DBtSl3sf.js} +1 -1
  79. package/dist/{dist-KzZ7WELx.js → dist-DiDibOYr.js} +120 -120
  80. package/dist/{dist-Kxgjxakw.js → dist-DoE4XJBC.js} +1277 -1222
  81. package/dist/{dist-BHCHt1NI.js → dist-F8Ep36rk.js} +1 -1
  82. package/dist/{dist-C8xMLVYi.js → dist-OR1OnN-y.js} +44 -44
  83. package/dist/{dist-1HDa70oE.js → dist-PXYI_yuP.js} +3 -3
  84. package/dist/{dist-CMh_W4y4.js → dist-diIx5qJW.js} +2 -2
  85. package/dist/{dockerfile-DJnSntVB.js → dockerfile-D0VKN500.js} +2 -2
  86. package/dist/dropdown-menu-Cz4TdOJh.js +4678 -0
  87. package/dist/{dtd-BHa4v0Bn.js → dtd-B8FGSWWe.js} +1 -1
  88. package/dist/{dylan-BypL2Zz8.js → dylan-DbIBYIrw.js} +1 -1
  89. package/dist/{ebnf-5guncNu-.js → ebnf-D-YbYLdk.js} +1 -1
  90. package/dist/{ebnfDiagram-PWID7BFC-DDd5hCRC.js → ebnfDiagram-PWID7BFC-rSwVyh4y.js} +3 -3
  91. package/dist/{ecl-iRcVIKYZ.js → ecl-DBmkdWAd.js} +1 -1
  92. package/dist/{eiffel-BEqF9aU4.js → eiffel-CcWSDDzK.js} +1 -1
  93. package/dist/{elm-DYcfNE9c.js → elm-MC-b8a6C.js} +1 -1
  94. package/dist/{erDiagram-RLTQ6QDP-D10NP0eI.js → erDiagram-RLTQ6QDP-Bfd3iAoC.js} +12 -12
  95. package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
  96. package/dist/error-banner-D30nA9nE.js +362 -0
  97. package/dist/{error-entries-B2Ux3Z2X.js → error-entries-BovkFYNy.js} +2 -2
  98. package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
  99. package/dist/{esm-h8f7-1CJ.js → esm-DAVrGVKP.js} +378 -372
  100. package/dist/{factor-3nzOwLuN.js → factor-Ys-13HOP.js} +2 -2
  101. package/dist/{fcl-C90TGnJJ.js → fcl-DnwditDr.js} +1 -1
  102. package/dist/{feedback-button-BxwB2lCO.js → feedback-button-mqHtzKAF.js} +10 -10
  103. package/dist/flowDiagram-HODETNUW-D7IBKS12.js +16 -0
  104. package/dist/{formats-Q9gwlLyD.js → formats-DhhbdyAH.js} +3 -3
  105. package/dist/{forth-DEaRrLUi.js → forth-DiMuIXFe.js} +1 -1
  106. package/dist/{fortran-Bv6JRUjY.js → fortran-hkrF2eM4.js} +1 -1
  107. package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-B4m_YsKa.js} +2 -2
  108. package/dist/{gas-JNerWj3-.js → gas-DlhqN9k8.js} +1 -1
  109. package/dist/{gherkin-CSrl-H70.js → gherkin-0SlhEZ3t.js} +1 -1
  110. package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-QRBbvWXh.js} +2 -2
  111. package/dist/{glide-data-editor-CY3_ugi6.js → glide-data-editor-BtaerHsr.js} +11 -11
  112. package/dist/{glide-utils-CzzWU59p.js → glide-utils-BVJ4fkxX.js} +3 -3
  113. package/dist/{globals-N41idH9p.js → globals-rsMlVnSz.js} +3 -3
  114. package/dist/{groovy-X7euO_vE.js → groovy-YhcTMyvX.js} +1 -1
  115. package/dist/{haskell-C48Z70Az.js → haskell-CodLxrtT.js} +1 -1
  116. package/dist/{haxe-CAUWMmwR.js → haxe-CiRWNFkH.js} +1 -1
  117. package/dist/{html-to-image-BZBwkkDG.js → html-to-image-Cn1_16-x.js} +543 -565
  118. package/dist/{http-BrSBnhDH.js → http-Bh6HhdNR.js} +1 -1
  119. package/dist/{idl-BXuPleZv.js → idl-DZgBq75I.js} +1 -1
  120. package/dist/{infoDiagram-27XIBGKW-DrYu3UZC.js → infoDiagram-27XIBGKW-DVQFYvhg.js} +2 -2
  121. package/dist/{ishikawaDiagram-5VMMS53U-pmkGQJsA.js → ishikawaDiagram-5VMMS53U-viPND-nm.js} +3 -3
  122. package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
  123. package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BeeJdJo3.js} +2 -2
  124. package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
  125. package/dist/{kanban-definition-UXKFOSKX-wWGD9VLW.js → kanban-definition-UXKFOSKX-Dcl_ECO9.js} +9 -9
  126. package/dist/{label-MNhNNoN6.js → label-DQO1jFjf.js} +96 -93
  127. package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
  128. package/dist/{loader-C9OUkMrj.js → loader-Cm-ATtou.js} +1 -1
  129. package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
  130. package/dist/main.js +6866 -6746
  131. package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
  132. package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
  133. package/dist/{mermaid-Dfvntf3s.js → mermaid-BfhcnSj-.js} +54 -54
  134. package/dist/{mindmap-definition-YA3MSWOX-C2f1VIBR.js → mindmap-definition-YA3MSWOX-BdxxhF-5.js} +11 -11
  135. package/dist/{mirc-CqeibO3N.js → mirc-De9aSAZM.js} +1 -1
  136. package/dist/{mllike-D54QZYTP.js → mllike-BbugeaY_.js} +1 -1
  137. package/dist/{modelica-DuML2-8V.js → modelica-BjJwWw1F.js} +1 -1
  138. package/dist/{mscgen-CJmKwp3b.js → mscgen-DwiRH5ma.js} +1 -1
  139. package/dist/{mumps-DaVgFtkd.js → mumps--plbDM9o.js} +1 -1
  140. package/dist/{nginx-BXN1rqI0.js → nginx-C4Df7REc.js} +1 -1
  141. package/dist/{nsis-CMfRqf0V.js → nsis-fiiOqLc3.js} +7 -7
  142. package/dist/{ntriples-BiOGlMDR.js → ntriples-jV77I4k8.js} +1 -1
  143. package/dist/{number-overlay-editor-BPWS_Cwq.js → number-overlay-editor-Ci2JathI.js} +1 -1
  144. package/dist/{octave-CgVnzxKk.js → octave-Cztd01tF.js} +1 -1
  145. package/dist/{oz-B2mky97X.js → oz-Bl8o3BDl.js} +1 -1
  146. package/dist/{pascal-BoZhBf6s.js → pascal-BO5JqysR.js} +1 -1
  147. package/dist/{pegDiagram-XKGWAZYB-D6v5dz4M.js → pegDiagram-XKGWAZYB-Du5p2s0w.js} +3 -3
  148. package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
  149. package/dist/{pieDiagram-E7YTZNPT-BwFAhpYD.js → pieDiagram-E7YTZNPT-DJg-SOIq.js} +3 -3
  150. package/dist/{pig-B2mB-01d.js → pig-BWGR8wZw.js} +1 -1
  151. package/dist/{powershell-D0zT88Aj.js → powershell-DT99xlz_.js} +1 -1
  152. package/dist/{process-output-BSsWzfnY.js → process-output-CUG57KRp.js} +4 -4
  153. package/dist/{properties-3_5qCgOj.js → properties-Q-rkxld0.js} +1 -1
  154. package/dist/{protobuf-Dgoxfi1H.js → protobuf-DKyWZbs7.js} +1 -1
  155. package/dist/{pug-CNRdd8oG.js → pug-42ZJUbEC.js} +2 -2
  156. package/dist/{puppet-DzILxZfz.js → puppet-B4UozHhh.js} +1 -1
  157. package/dist/purify.es-DMv5zIkJ.js +866 -0
  158. package/dist/{python-AfVdMn_l.js → python-DREjAV__.js} +1 -1
  159. package/dist/{q-C6p-CGWh.js → q-Bi63IpBO.js} +1 -1
  160. package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-keLfFx9f.js} +1 -1
  161. package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
  162. package/dist/{railroadDiagram-O6MQD6OU-D6eOFr6Z.js → railroadDiagram-O6MQD6OU-C0ojm-6_.js} +3 -3
  163. package/dist/{requirementDiagram-BXWQKSXE-CHYsMgDR.js → requirementDiagram-BXWQKSXE-CNwNBmI3.js} +11 -11
  164. package/dist/{reveal-component-DJQoMaDE.js → reveal-component-BFuZ3Pb9.js} +10 -10
  165. package/dist/{rpm-Bx7FkjTO.js → rpm-DPb1DeKM.js} +1 -1
  166. package/dist/{ruby-BMzgq2bf.js → ruby-U7fZA4DP.js} +2 -2
  167. package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-Bh4EsJox.js} +1 -1
  168. package/dist/{sas-ClGVnK3F.js → sas-CLk1JpTn.js} +1 -1
  169. package/dist/{scheme-C0MXqXep.js → scheme-CT-2k2Tl.js} +1 -1
  170. package/dist/select-Bs-nmvm6.js +1344 -0
  171. package/dist/{sequenceDiagram-WJ2MYXX4-BPAknhBp.js → sequenceDiagram-WJ2MYXX4-DQaW5qBG.js} +4 -4
  172. package/dist/{shell-CiQZv6oG.js → shell-BLO7fcsk.js} +1 -1
  173. package/dist/{sieve-BiIMePvV.js → sieve-nG3C7WNH.js} +1 -1
  174. package/dist/{simple-mode-8ETW2RS6.js → simple-mode-C683Q7or.js} +1 -1
  175. package/dist/{smalltalk-9-llftyG.js → smalltalk-BROcZybA.js} +1 -1
  176. package/dist/{solr-CxCKEuwq.js → solr-mVltHNc5.js} +1 -1
  177. package/dist/{sparql-BRmy7pzx.js → sparql-Cv1Ksr4v.js} +1 -1
  178. package/dist/{spec-D62vWpMT.js → spec-DVsoMvYT.js} +116 -135
  179. package/dist/{spreadsheet-UCNUIGsn.js → spreadsheet-BwTnp5K_.js} +1 -1
  180. package/dist/{sql-D0hSGZ-H.js → sql-CjLt0122.js} +1 -1
  181. package/dist/{stateDiagram-D77RDMKH-Cq249IQ4.js → stateDiagram-D77RDMKH-BDa515QC.js} +13 -13
  182. package/dist/stateDiagram-v2-MP3YSRHH-ChNddepZ.js +30 -0
  183. package/dist/{stex-UeT_Aofp.js → stex-Btf3omL8.js} +1 -1
  184. package/dist/style.css +1 -1
  185. package/dist/{stylus-Fi4waA2H.js → stylus-Dt4VvLXL.js} +1 -1
  186. package/dist/{swift-NqPyaBye.js → swift-DHsn_CVI.js} +1 -1
  187. package/dist/{swimlanes-42K2YHIH-Bh_S_HKD.js → swimlanes-42K2YHIH-M4IdGi8J.js} +10 -10
  188. package/dist/swimlanesDiagram-VR7AAH4N-FUSwmzEp.js +30 -0
  189. package/dist/{swiper-component-DkV7T44B.js → swiper-component-CpN-hewZ.js} +2 -2
  190. package/dist/{tcl-B4f0xfmM.js → tcl-CV0OLBOl.js} +1 -1
  191. package/dist/{textile-CnNbnPTe.js → textile-D320oKVM.js} +1 -1
  192. package/dist/{tiddlywiki-CSGSOg38.js → tiddlywiki-BVVNvfy4.js} +1 -1
  193. package/dist/{tiki-9F02WBA6.js → tiki-BF2aDPlB.js} +1 -1
  194. package/dist/{timeline-definition-24CTP7MA-ByNMgBE7.js → timeline-definition-24CTP7MA-DH-kvakg.js} +3 -3
  195. package/dist/{toDate-DWVp6uE1.js → toDate-vEi5kTfY.js} +4 -5
  196. package/dist/{toast-DcoJGS3-.js → toast-DfEpJedt.js} +157 -161
  197. package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
  198. package/dist/{tooltip-Bi36DgYh.js → tooltip-CuNWg2ay.js} +543 -579
  199. package/dist/{troff-DlfvveK1.js → troff-DQUFcClZ.js} +1 -1
  200. package/dist/{ttcn--YVSkGs_.js → ttcn-CQL1duJS.js} +1 -1
  201. package/dist/{ttcn-cfg-Bb1Knl_J.js → ttcn-cfg-BMmEFJPu.js} +1 -1
  202. package/dist/{turtle-DC24v1bz.js → turtle-C3esgsRr.js} +1 -1
  203. package/dist/{use-restore-focus-ZgG5Br63.js → use-restore-focus-kmgwrL8q.js} +1833 -1625
  204. package/dist/{useAsyncData-BD7NLQ3_.js → useAsyncData-rkAlR_vh.js} +1 -1
  205. package/dist/{useDateFormatter-D8XWr8lL.js → useDateFormatter-C-tz65rD.js} +52 -31
  206. package/dist/{useDeepCompareMemoize-CawMGSRU.js → useDeepCompareMemoize-BlHFBj5_.js} +1 -1
  207. package/dist/{useIframeCapabilities-BUMBOpsM.js → useIframeCapabilities-C1Bt04Iz.js} +1 -1
  208. package/dist/{useLifecycle-3vGhRa1o.js → useLifecycle-B68iY077.js} +3 -3
  209. package/dist/{useTheme-BOw801nZ.js → useTheme-BwSgeAFb.js} +2 -2
  210. package/dist/{vb-Dpc8vhvF.js → vb-RK1eDXRl.js} +1 -1
  211. package/dist/{vbscript-B-Y1XnZe.js → vbscript-BCOeM0de.js} +1 -1
  212. package/dist/{vega-component-9siY74NS.js → vega-component-C-bPttRN.js} +9 -9
  213. package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
  214. package/dist/{vennDiagram-4TSXK5OY-DY8CySdO.js → vennDiagram-4TSXK5OY-d5g7XeiI.js} +3 -3
  215. package/dist/{verilog-DhiEaoUl.js → verilog-DqQTzVn8.js} +1 -1
  216. package/dist/{vhdl-D4X23YKO.js → vhdl-vQr2bfmi.js} +1 -1
  217. package/dist/{wardleyDiagram-VM6X3IG4-DYC1AFni.js → wardleyDiagram-VM6X3IG4-BfX3bSzR.js} +3 -3
  218. package/dist/{webidl-SyzNxWpJ.js → webidl-DzX7N40e.js} +1 -1
  219. package/dist/{xquery-BC2R4Hk6.js → xquery-Cw_Q_hGR.js} +1 -1
  220. package/dist/{xychartDiagram-S5SC5T6Z-Df8LLnuY.js → xychartDiagram-S5SC5T6Z-C1QsLZg7.js} +5 -5
  221. package/dist/{yacas-DLNXPMmH.js → yacas-DiC4jJBE.js} +1 -1
  222. package/dist/{z80-CDXWHOO6.js → z80-CUOQDEJO.js} +1 -1
  223. package/package.json +16 -16
  224. package/src/__tests__/mount.test.ts +6 -6
  225. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  226. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  227. package/src/components/data-table/TableTopBar.tsx +4 -0
  228. package/src/components/data-table/__tests__/export-actions.test.tsx +1111 -14
  229. package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
  230. package/src/components/data-table/__tests__/schemas.test.ts +57 -0
  231. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  232. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  233. package/src/components/data-table/charts/constants.ts +11 -10
  234. package/src/components/data-table/charts/types.ts +1 -0
  235. package/src/components/data-table/data-table.tsx +3 -0
  236. package/src/components/data-table/export-actions.tsx +365 -81
  237. package/src/components/data-table/pagination.tsx +16 -2
  238. package/src/components/data-table/schemas.ts +90 -14
  239. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
  240. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
  241. package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
  242. package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
  243. package/src/components/editor/actions/useRestartKernel.tsx +2 -2
  244. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +224 -17
  245. package/src/components/editor/alerts/connection-details.tsx +61 -0
  246. package/src/components/editor/alerts/connection-notice.tsx +46 -53
  247. package/src/components/editor/alerts/startup-progress.tsx +73 -129
  248. package/src/components/editor/app-container.tsx +2 -2
  249. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +2 -2
  250. package/src/components/editor/cell/CreateCellButton.tsx +2 -2
  251. package/src/components/editor/cell/DeleteButton.tsx +2 -2
  252. package/src/components/editor/cell/RunButton.tsx +3 -3
  253. package/src/components/editor/cell/StopButton.tsx +2 -2
  254. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +4 -4
  255. package/src/components/editor/chrome/components/feedback-button.tsx +3 -3
  256. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +8 -8
  257. package/src/components/editor/chrome/panels/__tests__/{sandbox-details.test.tsx → runtime-details.test.tsx} +94 -22
  258. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +4 -4
  259. package/src/components/editor/chrome/panels/packages-panel.tsx +8 -29
  260. package/src/components/editor/chrome/panels/{sandbox-details-state.ts → runtime-details-state.ts} +1 -1
  261. package/src/components/editor/chrome/panels/{sandbox-panel.tsx → runtime-panel.tsx} +38 -66
  262. package/src/components/editor/chrome/panels/runtime-status-toggle.tsx +56 -0
  263. package/src/components/editor/chrome/panels/sandbox-controller.tsx +2 -2
  264. package/src/components/editor/chrome/wrapper/app-chrome.tsx +3 -3
  265. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +2 -2
  266. package/src/components/editor/controls/Controls.tsx +3 -3
  267. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +2 -2
  268. package/src/components/editor/header/__tests__/status.test.tsx +4 -4
  269. package/src/components/editor/header/app-header.tsx +2 -2
  270. package/src/components/editor/header/status.tsx +3 -3
  271. package/src/components/editor/navigation/__tests__/navigation.test.ts +8 -8
  272. package/src/components/ui/__tests__/slider.test.tsx +30 -0
  273. package/src/components/ui/progress-stages.tsx +114 -0
  274. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
  275. package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
  276. package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
  277. package/src/core/codemirror/readonly/extension.ts +2 -2
  278. package/src/core/config/pair.ts +0 -1
  279. package/src/core/datasets/__tests__/data-source-discovery.test.ts +2 -2
  280. package/src/core/edit-app.tsx +5 -1
  281. package/src/core/export/hooks.ts +2 -2
  282. package/src/core/islands/bootstrap.ts +1 -0
  283. package/src/core/kernel/session.ts +9 -0
  284. package/src/core/network/__tests__/connection.test.ts +3 -3
  285. package/src/core/network/connection-notice.ts +5 -5
  286. package/src/core/network/connection.ts +9 -9
  287. package/src/core/network/requests-lazy.ts +2 -2
  288. package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
  289. package/src/core/packages/useSandboxController.ts +6 -6
  290. package/src/core/runtime/__tests__/adapter.test.ts +6 -6
  291. package/src/core/runtime/adapter.ts +7 -7
  292. package/src/core/runtime/config.ts +2 -2
  293. package/src/core/saving/filename.ts +2 -2
  294. package/src/core/saving/save-component.tsx +5 -5
  295. package/src/core/saving/useAutoSave.ts +2 -2
  296. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  297. package/src/core/wasm/worker/bootstrap.ts +22 -3
  298. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
  299. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
  300. package/src/core/websocket/connection-utils.ts +21 -21
  301. package/src/core/websocket/types.ts +8 -9
  302. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
  303. package/src/css/katex.min.css +145 -144
  304. package/src/mount.tsx +2 -2
  305. package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
  306. package/src/plugins/core/registerReactComponent.tsx +3 -1
  307. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  308. package/src/plugins/impl/DataTablePlugin.tsx +23 -2
  309. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  310. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  311. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  312. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  313. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  314. package/src/plugins/impl/NumberPlugin.tsx +1 -1
  315. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  316. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  317. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  318. package/src/plugins/impl/SliderPlugin.tsx +1 -1
  319. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  320. package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
  321. package/src/plugins/impl/TextInputPlugin.tsx +10 -2
  322. package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
  323. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
  324. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  325. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  326. package/src/plugins/impl/common/labeled.tsx +9 -3
  327. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
  328. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
  329. package/src/stories/cell.stories.tsx +2 -2
  330. package/src/stories/dataframe.stories.tsx +7 -0
  331. package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
  332. package/src/stories/progress-stages.stories.tsx +62 -0
  333. package/src/stories/runtime-existing.stories.tsx +44 -0
  334. package/src/stories/runtime-maintenance.stories.tsx +40 -0
  335. package/src/stories/runtime-pixi.stories.tsx +28 -0
  336. package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
  337. package/src/stories/runtime-uv.stories.tsx +56 -0
  338. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  339. package/dist/classDiagram-ZZMXUADV-BwYhrSEX.js +0 -30
  340. package/dist/classDiagram-v2-VYDZK3BY-HecM04TM.js +0 -30
  341. package/dist/dropdown-menu-BaqM0t4N.js +0 -4502
  342. package/dist/error-banner-DzAmP0AQ.js +0 -391
  343. package/dist/flowDiagram-HODETNUW-DgcjSdPV.js +0 -16
  344. package/dist/purify.es-DgKyQviY.js +0 -805
  345. package/dist/select-BcObMjGz.js +0 -970
  346. package/dist/stateDiagram-v2-MP3YSRHH-Dk5QgdXF.js +0 -30
  347. package/dist/swimlanesDiagram-VR7AAH4N-CbztusY8.js +0 -30
  348. 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
- WebSocketState,
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: WebSocketState.CLOSED,
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: WebSocketState.CLOSED,
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: WebSocketState.CLOSED,
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, WebSocketState } from "@/core/websocket/types";
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 === WebSocketState.CLOSED && (
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
- WebSocketState,
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 === WebSocketState.CLOSED &&
24
+ connection.state === ConnectionState.CLOSED &&
25
25
  (mode === "read" ||
26
26
  connection.code !== WebSocketClosedReason.KERNEL_STARTUP_ERROR);
27
- const isOpen = connection.state === WebSocketState.OPEN;
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.continuePropagation).not.toHaveBeenCalled();
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: "x",
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.continuePropagation).not.toHaveBeenCalled();
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.continuePropagation).not.toHaveBeenCalled();
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.continuePropagation).not.toHaveBeenCalled();
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.continuePropagation).not.toHaveBeenCalled();
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.continuePropagation).not.toHaveBeenCalled();
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.continuePropagation).not.toHaveBeenCalled();
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(mockClient, {}, () => ({
363
- [Cells.cell1]: new EditorView({ doc: "# this is a comment" }),
364
- [Cells.cell2]: new EditorView({ doc: "import math\nimport numpy" }),
365
- [Cells.cell3]: new EditorView({ doc: "print(math.sqrt(4))" }),
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
- return store.get(topologicalCodesAtom);
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.snapshotter.getLatestSnapshot();
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 { WebSocketState } from "@/core/websocket/types";
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 WebSocketState.CONNECTING | typeof WebSocketState.OPEN,
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(WebSocketState.CONNECTING);
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(WebSocketState.OPEN);
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(WebSocketState.CONNECTING);
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: WebSocketState.OPEN });
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 { WebSocketState } from "../../websocket/types";
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 === WebSocketState.CONNECTING) {
114
+ if (connection.state === ConnectionState.CONNECTING) {
115
115
  attachListeners();
116
116
  } else {
117
117
  detachListeners();
@@ -7,7 +7,6 @@ export const pairPreviewSchema = z.object({
7
7
  command: z.string(),
8
8
  templates: z.object({
9
9
  prompt: z.string(),
10
- file: z.string(),
11
10
  session: z.string(),
12
11
  token_file: z.string(),
13
12
  token: z.string(),
@@ -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 { WebSocketState } from "@/core/websocket/types";
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: WebSocketState.OPEN });
33
+ store.set(connectionAtom, { state: ConnectionState.OPEN });
34
34
  });
35
35
 
36
36
  afterEach(() => {
@@ -197,7 +197,11 @@ export const EditApp: React.FC<AppProps> = ({
197
197
  )}
198
198
  </div>
199
199
 
200
- <ConnectionNotice appConfig={appConfig} onRetry={reconnect} />
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. */}
@@ -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 { WebSocketState } from "../websocket/types";
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 === WebSocketState.OPEN;
31
+ const isConnected = state === ConnectionState.OPEN;
32
32
  const markdownDisabled = !markdownEnabled || !isConnected;
33
33
  const htmlDisabled = !htmlEnabled || !isConnected;
34
34
  const ipynbDisabled = !ipynbEnabled || !isConnected;
@@ -283,6 +283,7 @@ function handleMessage(
283
283
  return;
284
284
 
285
285
  case "consumer-capabilities":
286
+ case "execution":
286
287
  return;
287
288
  default:
288
289
  logNever(msg);
@@ -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 { WebSocketState } from "../../websocket/types";
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: WebSocketState.NOT_STARTED });
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: WebSocketState.OPEN });
42
+ store.set(connectionAtom, { state: ConnectionState.OPEN });
43
43
  await expect(settledOrNever(promise)).resolves.not.toBe(NEVER);
44
44
  });
45
45
  });