@marimo-team/islands 0.25.2-dev12 → 0.25.2-dev121

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CqhQmp74.js → ConnectedDataExplorerComponent-CNSxdKyJ.js} +15 -15
  2. package/dist/{ErrorBoundary-YddQ6YHW.js → ErrorBoundary-Bo3Tg7Jh.js} +12 -12
  3. package/dist/{ImageComparisonComponent-Cpfz30OZ.js → ImageComparisonComponent-uU8FSKZE.js} +3 -3
  4. package/dist/{Plot-CTyjbQDT.js → Plot-DdYOe1UK.js} +2 -2
  5. package/dist/{abnfDiagram-VCTEODGH-aLGD44M7.js → abnfDiagram-VCTEODGH-DQDjNXt3.js} +3 -3
  6. package/dist/{any-language-editor-dqxlUDlT.js → any-language-editor-B9REGlD9.js} +8 -8
  7. package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
  8. package/dist/{architectureDiagram-5GKGNRK7-BGL5P81u.js → architectureDiagram-5GKGNRK7-Nmls7Wxn.js} +5 -5
  9. package/dist/{asciiarmor-GKQFJXQG.js → asciiarmor-BWNxzkG7.js} +1 -1
  10. package/dist/{asn1-BsSb7HP5.js → asn1-Bcn2QutK.js} +1 -1
  11. package/dist/assets/__vite-browser-external-BXYkiFsk.js +1 -0
  12. package/dist/assets/worker-HPY9fbhz.js +114 -0
  13. package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
  14. package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-Cg25UrxT.js} +9 -9
  15. package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
  16. package/dist/{button-B0Xgl-Qn.js → button-CvjkwdSk.js} +304 -287
  17. package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-BxFgrnNV.js} +7 -7
  18. package/dist/{capabilities-D7Ad8-zw.js → capabilities-CQ5IjhzL.js} +1 -1
  19. package/dist/{cells-5ppES-Un.js → cells-CuYwqnV8.js} +5950 -4893
  20. package/dist/{channel-z7HZXHwv.js → channel-CPObtJXj.js} +1 -1
  21. package/dist/{chat-ui-Dv2V95k6.js → chat-ui-C6oDg4Zu.js} +1595 -1402
  22. package/dist/{check-DGZ74tV2.js → check-EDwSwP89.js} +1 -1
  23. package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-D4eFPyFh.js} +5 -5
  24. package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-D7gxIs2Q.js} +1 -1
  25. package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BwiyaNpg.js} +2 -2
  26. package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-ufseIn5y.js} +1 -1
  27. package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-BhaJx0X3.js} +3 -3
  28. package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-Cwbt-lF0.js} +2 -2
  29. package/dist/{chunk-IMKFNOWR-Cm3RgLDj.js → chunk-IMKFNOWR-CoIFEo-1.js} +6 -6
  30. package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-n-zgIVSy.js} +5 -5
  31. package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-DXa-Cxbn.js} +6 -6
  32. package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-B_Zd3-X0.js} +1 -1
  33. package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-hYOXbYH_.js} +1 -1
  34. package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-CQw5qATZ.js} +1 -1
  35. package/dist/{chunk-SHT3W25Y-DedDYSP5.js → chunk-SHT3W25Y-lHiGx3ZC.js} +8 -8
  36. package/dist/{chunk-SVP7TREG-B2SFkCAL.js → chunk-SVP7TREG-BvsHIrY_.js} +2 -2
  37. package/dist/{chunk-TICWLB2K-DB6hjNOL.js → chunk-TICWLB2K-BC8YIm_n.js} +6 -6
  38. package/dist/{chunk-YOKDWASO-DrWbKnxA.js → chunk-YOKDWASO-DPZk8vhS.js} +6 -6
  39. package/dist/classDiagram-ZZMXUADV-Bt98lkkv.js +30 -0
  40. package/dist/classDiagram-v2-VYDZK3BY-D9bfbcC3.js +30 -0
  41. package/dist/{clike-E2lFbGVj.js → clike-CxK9W55Z.js} +1 -1
  42. package/dist/{clojure-Dn_K4RlK.js → clojure-Dzcvwpxk.js} +1 -1
  43. package/dist/{cmake-DpN2Top5.js → cmake-DYr-71zp.js} +1 -1
  44. package/dist/{cobol-Chf22-GM.js → cobol-DC3g37Kq.js} +1 -1
  45. package/dist/{code-visibility-C0zE3g0U.js → code-visibility-WFM7uHBf.js} +7 -7
  46. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  47. package/dist/{common-BkjS959w.js → common-BLHW2E-1.js} +9639 -9291
  48. package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
  49. package/dist/{compiler-runtime-Cj8ZWiNS.js → compiler-runtime-CldRdSsv.js} +2 -2
  50. package/dist/{copy-icon-qmRg_VTX.js → copy-icon-Ft7t9bqz.js} +6 -6
  51. package/dist/{crystal-DCM3yc4r.js → crystal-ih5ax5tQ.js} +1 -1
  52. package/dist/{css-DkZ9mMyI.js → css-CN_wP7_R.js} +1 -1
  53. package/dist/{cynefinDiagram-5FMLGOSQ-DzaZEqgD.js → cynefinDiagram-5FMLGOSQ-CgWra7wt.js} +3 -3
  54. package/dist/{cypher-Drw_8U5I.js → cypher-CqGRcmZo.js} +1 -1
  55. package/dist/{d-CsVGcKMF.js → d-Cj0sOW2z.js} +1 -1
  56. package/dist/{dagre-GXQ25YYZ-Cjf5GjU3.js → dagre-GXQ25YYZ-CFZ8-35c.js} +10 -10
  57. package/dist/{data-grid-overlay-editor-CqoIqvNa.js → data-grid-overlay-editor-Dt75J_Qe.js} +7 -7
  58. package/dist/{data-grid-types-BucVmDDp.js → data-grid-types-BH_r7g7l.js} +1 -1
  59. package/dist/{diagram-S7CK7UJ4-IhLt_khx.js → diagram-S7CK7UJ4-lCNQrW7d.js} +4 -4
  60. package/dist/{diagram-UQ7AKVKN-CQc6KLPB.js → diagram-UQ7AKVKN-CQPQ6pP_.js} +3 -3
  61. package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-BJWcVVJY.js} +2 -2
  62. package/dist/{diagram-VX7I27RA-DHmW9N1T.js → diagram-VX7I27RA-Cf3b0llz.js} +5 -5
  63. package/dist/{diagram-Z3DM3KII-zVKsg-Ty.js → diagram-Z3DM3KII-Bt4QLrpn.js} +3 -3
  64. package/dist/{dialog-CILKhbsG.js → dialog-CEBFZNyc.js} +29 -29
  65. package/dist/{diff-CBikYCUF.js → diff-B_hUkiat.js} +1 -1
  66. package/dist/{dist-Df0wKI0F.js → dist-BK4Oj99o.js} +1 -1
  67. package/dist/{dist-BVGtK7Ht.js → dist-BLfKmR-l.js} +1 -1
  68. package/dist/{dist-B8D7McG3.js → dist-BMQf5zIS.js} +46 -46
  69. package/dist/{dist-C2KzV-vf.js → dist-BorMD-uX.js} +2 -2
  70. package/dist/{dist-Cs2FijYk.js → dist-BuaRHxOc.js} +2 -2
  71. package/dist/{dist-DPcEtqmG.js → dist-Bvs24R_E.js} +47 -47
  72. package/dist/{dist-lA1Cttkb.js → dist-C8fAKSH1.js} +41 -41
  73. package/dist/{dist-DszxuxS1.js → dist-CLdpGQVr.js} +2 -2
  74. package/dist/{dist-CO1AwwG_.js → dist-CN8zI-XC.js} +209 -209
  75. package/dist/{dist-D1PpnuZB.js → dist-CN_BeG2I.js} +1 -1
  76. package/dist/{dist-CPGxfVGX.js → dist-CSJ0MDRw.js} +1 -1
  77. package/dist/{dist-Cm3iAFMD.js → dist-CSbh1PNP.js} +3 -3
  78. package/dist/{dist-9x1ZRe-e.js → dist-Cg7gzw-a.js} +2 -2
  79. package/dist/{dist-B1vYLK28.js → dist-CkTTIdBe.js} +345 -345
  80. package/dist/{dist-BRxfaJgs.js → dist-CrSP_H1M.js} +296 -296
  81. package/dist/{dist-C2wDlYdD.js → dist-D-wwqlzJ.js} +2 -2
  82. package/dist/{dist-BtKIs9N-.js → dist-D6d86eNJ.js} +1 -1
  83. package/dist/{dist-DHOTQar0.js → dist-DBtSl3sf.js} +1 -1
  84. package/dist/{dist-KzZ7WELx.js → dist-DiDibOYr.js} +120 -120
  85. package/dist/{dist-Kxgjxakw.js → dist-DoE4XJBC.js} +1277 -1222
  86. package/dist/{dist-CcyKTBTF.js → dist-DpBpA_n1.js} +2 -2
  87. package/dist/{dist-BHCHt1NI.js → dist-F8Ep36rk.js} +1 -1
  88. package/dist/{dist-C8xMLVYi.js → dist-OR1OnN-y.js} +44 -44
  89. package/dist/{dist-1HDa70oE.js → dist-PXYI_yuP.js} +3 -3
  90. package/dist/{dist-CMh_W4y4.js → dist-diIx5qJW.js} +2 -2
  91. package/dist/{dockerfile-DJnSntVB.js → dockerfile-D0VKN500.js} +2 -2
  92. package/dist/dropdown-menu-CP_qCYHC.js +4678 -0
  93. package/dist/{dtd-BHa4v0Bn.js → dtd-B8FGSWWe.js} +1 -1
  94. package/dist/{dylan-BypL2Zz8.js → dylan-DbIBYIrw.js} +1 -1
  95. package/dist/{ebnf-5guncNu-.js → ebnf-D-YbYLdk.js} +1 -1
  96. package/dist/{ebnfDiagram-PWID7BFC-DDd5hCRC.js → ebnfDiagram-PWID7BFC-D3NAyPFY.js} +3 -3
  97. package/dist/{ecl-iRcVIKYZ.js → ecl-DBmkdWAd.js} +1 -1
  98. package/dist/{eiffel-BEqF9aU4.js → eiffel-CcWSDDzK.js} +1 -1
  99. package/dist/{elm-DYcfNE9c.js → elm-MC-b8a6C.js} +1 -1
  100. package/dist/{erDiagram-RLTQ6QDP-D10NP0eI.js → erDiagram-RLTQ6QDP-Tlu09_Nm.js} +12 -12
  101. package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
  102. package/dist/error-banner-Da600cwz.js +362 -0
  103. package/dist/{error-entries-B2Ux3Z2X.js → error-entries-zfHL6H60.js} +2 -2
  104. package/dist/{esm-h8f7-1CJ.js → esm-AMFssoNp.js} +380 -374
  105. package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
  106. package/dist/{factor-3nzOwLuN.js → factor-Ys-13HOP.js} +2 -2
  107. package/dist/{fcl-C90TGnJJ.js → fcl-DnwditDr.js} +1 -1
  108. package/dist/{feedback-button-BU771zKS.js → feedback-button-pfhtTNjh.js} +13 -13
  109. package/dist/flowDiagram-HODETNUW-CAYbpJmV.js +16 -0
  110. package/dist/{formats-Q9gwlLyD.js → formats-DLtvJPnj.js} +6 -6
  111. package/dist/{forth-DEaRrLUi.js → forth-DiMuIXFe.js} +1 -1
  112. package/dist/{fortran-Bv6JRUjY.js → fortran-hkrF2eM4.js} +1 -1
  113. package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-BQT16JSc.js} +2 -2
  114. package/dist/{gas-JNerWj3-.js → gas-DlhqN9k8.js} +1 -1
  115. package/dist/{gherkin-CSrl-H70.js → gherkin-0SlhEZ3t.js} +1 -1
  116. package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-D5nSIzdE.js} +2 -2
  117. package/dist/{glide-data-editor-D9TpbHEU.js → glide-data-editor-B3x7mDpj.js} +60 -60
  118. package/dist/{glide-utils-CzzWU59p.js → glide-utils-DJyqh0EM.js} +4 -4
  119. package/dist/{globals-nXV4QUKg.js → globals-6B7ecxsC.js} +3 -3
  120. package/dist/{groovy-X7euO_vE.js → groovy-YhcTMyvX.js} +1 -1
  121. package/dist/{haskell-C48Z70Az.js → haskell-CodLxrtT.js} +1 -1
  122. package/dist/{haxe-CAUWMmwR.js → haxe-CiRWNFkH.js} +1 -1
  123. package/dist/{highlighted-body-KPVGNVTW-Ad3MKZ18.js → highlighted-body-KPVGNVTW-zwjq21tf.js} +4 -4
  124. package/dist/{html-to-image-BZBwkkDG.js → html-to-image-BJJsbNZ1.js} +547 -569
  125. package/dist/{http-BrSBnhDH.js → http-Bh6HhdNR.js} +1 -1
  126. package/dist/{idl-BXuPleZv.js → idl-DZgBq75I.js} +1 -1
  127. package/dist/{infoDiagram-27XIBGKW-DrYu3UZC.js → infoDiagram-27XIBGKW-XrDxhr0x.js} +2 -2
  128. package/dist/{ishikawaDiagram-5VMMS53U-pmkGQJsA.js → ishikawaDiagram-5VMMS53U-CD1muzov.js} +3 -3
  129. package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
  130. package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BaLqn-dZ.js} +2 -2
  131. package/dist/{jsx-runtime-DgDPJV9S.js → jsx-runtime-3BD1kT0s.js} +1 -1
  132. package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
  133. package/dist/{kanban-definition-UXKFOSKX-wWGD9VLW.js → kanban-definition-UXKFOSKX-Dg9W142_.js} +9 -9
  134. package/dist/{katex-BNCmKUol.js → katex-BIdZGsyO.js} +141 -116
  135. package/dist/label-BDKF3Afc.js +281 -0
  136. package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
  137. package/dist/{loader-C9OUkMrj.js → loader-BQOfjTIJ.js} +1 -1
  138. package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
  139. package/dist/main.js +7036 -6893
  140. package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
  141. package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
  142. package/dist/{mermaid-Dfvntf3s.js → mermaid-CiAXjLpA.js} +57 -57
  143. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +2 -0
  144. package/dist/{mhchem-BEc7A1or.js → mhchem-CdWPJK6g.js} +1 -1
  145. package/dist/{mindmap-definition-YA3MSWOX-C2f1VIBR.js → mindmap-definition-YA3MSWOX-DgCidgYJ.js} +11 -11
  146. package/dist/{mirc-CqeibO3N.js → mirc-De9aSAZM.js} +1 -1
  147. package/dist/{mllike-D54QZYTP.js → mllike-BbugeaY_.js} +1 -1
  148. package/dist/{modelica-DuML2-8V.js → modelica-BjJwWw1F.js} +1 -1
  149. package/dist/{mscgen-CJmKwp3b.js → mscgen-DwiRH5ma.js} +1 -1
  150. package/dist/{mumps-DaVgFtkd.js → mumps--plbDM9o.js} +1 -1
  151. package/dist/{nginx-BXN1rqI0.js → nginx-C4Df7REc.js} +1 -1
  152. package/dist/{nsis-CMfRqf0V.js → nsis-fiiOqLc3.js} +7 -7
  153. package/dist/{ntriples-BiOGlMDR.js → ntriples-jV77I4k8.js} +1 -1
  154. package/dist/{number-overlay-editor-BH4Uo_sZ.js → number-overlay-editor-CyJwIeU1.js} +5 -5
  155. package/dist/{octave-CgVnzxKk.js → octave-Cztd01tF.js} +1 -1
  156. package/dist/{oz-B2mky97X.js → oz-Bl8o3BDl.js} +1 -1
  157. package/dist/{pascal-BoZhBf6s.js → pascal-BO5JqysR.js} +1 -1
  158. package/dist/{pegDiagram-XKGWAZYB-D6v5dz4M.js → pegDiagram-XKGWAZYB-coOYYKB6.js} +3 -3
  159. package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
  160. package/dist/{pieDiagram-E7YTZNPT-BwFAhpYD.js → pieDiagram-E7YTZNPT-BnXTc3bj.js} +3 -3
  161. package/dist/{pig-B2mB-01d.js → pig-BWGR8wZw.js} +1 -1
  162. package/dist/{powershell-D0zT88Aj.js → powershell-DT99xlz_.js} +1 -1
  163. package/dist/{process-output-BSsWzfnY.js → process-output-C1GGFU6Q.js} +4 -4
  164. package/dist/{properties-3_5qCgOj.js → properties-Q-rkxld0.js} +1 -1
  165. package/dist/{protobuf-Dgoxfi1H.js → protobuf-DKyWZbs7.js} +1 -1
  166. package/dist/{pug-CNRdd8oG.js → pug-42ZJUbEC.js} +2 -2
  167. package/dist/{puppet-DzILxZfz.js → puppet-B4UozHhh.js} +1 -1
  168. package/dist/purify.es-DMv5zIkJ.js +866 -0
  169. package/dist/{python-AfVdMn_l.js → python-DREjAV__.js} +1 -1
  170. package/dist/{q-C6p-CGWh.js → q-Bi63IpBO.js} +1 -1
  171. package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-Ccw0xMjN.js} +1 -1
  172. package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
  173. package/dist/{railroadDiagram-O6MQD6OU-D6eOFr6Z.js → railroadDiagram-O6MQD6OU-B28-u83n.js} +3 -3
  174. package/dist/{react-dom-BUgJ-ab_.js → react-dom-DUmH0GXv.js} +29 -21
  175. package/dist/{react-ofJbxM4x.js → react-sHtZdjeP.js} +103 -94
  176. package/dist/{react-vega-ewj7q_U5.js → react-vega-BED0DjiB.js} +3 -3
  177. package/dist/{requirementDiagram-BXWQKSXE-CHYsMgDR.js → requirementDiagram-BXWQKSXE-CdYCTMu0.js} +11 -11
  178. package/dist/{reveal-component-_A40NW1c.js → reveal-component-CPohnNHB.js} +906 -878
  179. package/dist/{rpm-Bx7FkjTO.js → rpm-DPb1DeKM.js} +1 -1
  180. package/dist/{ruby-BMzgq2bf.js → ruby-U7fZA4DP.js} +2 -2
  181. package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-ELvOcnZH.js} +1 -1
  182. package/dist/{sas-ClGVnK3F.js → sas-CLk1JpTn.js} +1 -1
  183. package/dist/{scheme-C0MXqXep.js → scheme-CT-2k2Tl.js} +1 -1
  184. package/dist/select-BButFi-d.js +1344 -0
  185. package/dist/{sequenceDiagram-WJ2MYXX4-BPAknhBp.js → sequenceDiagram-WJ2MYXX4-CM3aRAe_.js} +4 -4
  186. package/dist/{shell-CiQZv6oG.js → shell-BLO7fcsk.js} +1 -1
  187. package/dist/{sieve-BiIMePvV.js → sieve-nG3C7WNH.js} +1 -1
  188. package/dist/{simple-mode-8ETW2RS6.js → simple-mode-C683Q7or.js} +1 -1
  189. package/dist/{smalltalk-9-llftyG.js → smalltalk-BROcZybA.js} +1 -1
  190. package/dist/{solr-CxCKEuwq.js → solr-mVltHNc5.js} +1 -1
  191. package/dist/{sparql-BRmy7pzx.js → sparql-Cv1Ksr4v.js} +1 -1
  192. package/dist/{spec-D62vWpMT.js → spec-BwarBpUJ.js} +116 -135
  193. package/dist/{spreadsheet-UCNUIGsn.js → spreadsheet-BwTnp5K_.js} +1 -1
  194. package/dist/{sql-D0hSGZ-H.js → sql-CjLt0122.js} +1 -1
  195. package/dist/{stateDiagram-D77RDMKH-Cq249IQ4.js → stateDiagram-D77RDMKH-DOZUMVj8.js} +13 -13
  196. package/dist/stateDiagram-v2-MP3YSRHH-CISYxma6.js +30 -0
  197. package/dist/{stex-UeT_Aofp.js → stex-Btf3omL8.js} +1 -1
  198. package/dist/style.css +1 -1
  199. package/dist/{stylus-Fi4waA2H.js → stylus-Dt4VvLXL.js} +1 -1
  200. package/dist/{swift-NqPyaBye.js → swift-DHsn_CVI.js} +1 -1
  201. package/dist/{swimlanes-42K2YHIH-Bh_S_HKD.js → swimlanes-42K2YHIH-BkSppxp8.js} +10 -10
  202. package/dist/swimlanesDiagram-VR7AAH4N-c8G5pGxC.js +30 -0
  203. package/dist/{swiper-component-DkV7T44B.js → swiper-component-DKntyn8p.js} +5 -5
  204. package/dist/{tcl-B4f0xfmM.js → tcl-CV0OLBOl.js} +1 -1
  205. package/dist/{textile-CnNbnPTe.js → textile-D320oKVM.js} +1 -1
  206. package/dist/{tiddlywiki-CSGSOg38.js → tiddlywiki-BVVNvfy4.js} +1 -1
  207. package/dist/{tiki-9F02WBA6.js → tiki-BF2aDPlB.js} +1 -1
  208. package/dist/{timeline-definition-24CTP7MA-ByNMgBE7.js → timeline-definition-24CTP7MA-CaMQayqK.js} +3 -3
  209. package/dist/{toDate-DWVp6uE1.js → toDate-Dwcg_x_5.js} +5 -6
  210. package/dist/{toast-DcoJGS3-.js → toast-B9UMEi8u.js} +161 -165
  211. package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
  212. package/dist/{tooltip-Bi36DgYh.js → tooltip-BO1REbqs.js} +548 -584
  213. package/dist/{troff-DlfvveK1.js → troff-DQUFcClZ.js} +1 -1
  214. package/dist/{ttcn--YVSkGs_.js → ttcn-CQL1duJS.js} +1 -1
  215. package/dist/{ttcn-cfg-Bb1Knl_J.js → ttcn-cfg-BMmEFJPu.js} +1 -1
  216. package/dist/{turtle-DC24v1bz.js → turtle-C3esgsRr.js} +1 -1
  217. package/dist/{use-restore-focus-ZgG5Br63.js → use-restore-focus-BEM7sFWl.js} +2430 -2007
  218. package/dist/{use-vega-container-remeasure-4DwJbPWu.js → use-vega-container-remeasure-Bz4PZMtt.js} +2 -2
  219. package/dist/{useAsyncData-BD7NLQ3_.js → useAsyncData-Deh5kszT.js} +3 -3
  220. package/dist/{useDateFormatter-D8XWr8lL.js → useDateFormatter-D8XruNGG.js} +53 -32
  221. package/dist/{useDeepCompareMemoize-CawMGSRU.js → useDeepCompareMemoize-DXwzRINI.js} +2 -2
  222. package/dist/{useIframeCapabilities-BUMBOpsM.js → useIframeCapabilities-DBETvvPl.js} +2 -2
  223. package/dist/{useLifecycle-3vGhRa1o.js → useLifecycle-j7D9uD1o.js} +6 -6
  224. package/dist/{useTheme-BOw801nZ.js → useTheme-CRnjkku0.js} +7 -7
  225. package/dist/{vb-Dpc8vhvF.js → vb-RK1eDXRl.js} +1 -1
  226. package/dist/{vbscript-B-Y1XnZe.js → vbscript-BCOeM0de.js} +1 -1
  227. package/dist/{vega-component-9siY74NS.js → vega-component-DLBAQLSf.js} +14 -14
  228. package/dist/{vega-embed-container-sSR5hAsy.js → vega-embed-container-BNHE18G9.js} +5 -5
  229. package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
  230. package/dist/{vennDiagram-4TSXK5OY-DY8CySdO.js → vennDiagram-4TSXK5OY-CF8pfaK3.js} +3 -3
  231. package/dist/{verilog-DhiEaoUl.js → verilog-DqQTzVn8.js} +1 -1
  232. package/dist/{vhdl-D4X23YKO.js → vhdl-vQr2bfmi.js} +1 -1
  233. package/dist/{wardleyDiagram-VM6X3IG4-DYC1AFni.js → wardleyDiagram-VM6X3IG4-dGPu39d-.js} +3 -3
  234. package/dist/{webidl-SyzNxWpJ.js → webidl-DzX7N40e.js} +1 -1
  235. package/dist/{xquery-BC2R4Hk6.js → xquery-Cw_Q_hGR.js} +1 -1
  236. package/dist/{xychartDiagram-S5SC5T6Z-Df8LLnuY.js → xychartDiagram-S5SC5T6Z-CP6-9q56.js} +5 -5
  237. package/dist/{yacas-DLNXPMmH.js → yacas-DiC4jJBE.js} +1 -1
  238. package/dist/{z80-CDXWHOO6.js → z80-CUOQDEJO.js} +1 -1
  239. package/package.json +38 -37
  240. package/src/__tests__/mount.test.ts +6 -6
  241. package/src/components/chat/__tests__/chat-history-popover.test.tsx +157 -0
  242. package/src/components/chat/chat-history-popover.tsx +98 -17
  243. package/src/components/chat/chat-panel.tsx +29 -0
  244. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  245. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  246. package/src/components/data-table/TableTopBar.tsx +4 -0
  247. package/src/components/data-table/__tests__/export-actions.test.tsx +1111 -14
  248. package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
  249. package/src/components/data-table/__tests__/schemas.test.ts +57 -0
  250. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  251. package/src/components/data-table/charts/__tests__/slider-field.test.tsx +54 -0
  252. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  253. package/src/components/data-table/charts/components/form-fields.tsx +3 -1
  254. package/src/components/data-table/charts/constants.ts +11 -10
  255. package/src/components/data-table/charts/types.ts +1 -0
  256. package/src/components/data-table/data-table.tsx +3 -0
  257. package/src/components/data-table/export-actions.tsx +365 -81
  258. package/src/components/data-table/pagination.tsx +16 -2
  259. package/src/components/data-table/schemas.ts +90 -14
  260. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
  261. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
  262. package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
  263. package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
  264. package/src/components/editor/actions/useRestartKernel.tsx +2 -2
  265. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +224 -17
  266. package/src/components/editor/alerts/connection-details.tsx +61 -0
  267. package/src/components/editor/alerts/connection-notice.tsx +46 -53
  268. package/src/components/editor/alerts/startup-progress.tsx +73 -129
  269. package/src/components/editor/app-container.tsx +2 -2
  270. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +2 -2
  271. package/src/components/editor/cell/CreateCellButton.tsx +2 -2
  272. package/src/components/editor/cell/DeleteButton.tsx +2 -2
  273. package/src/components/editor/cell/RunButton.tsx +3 -3
  274. package/src/components/editor/cell/StopButton.tsx +2 -2
  275. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +4 -4
  276. package/src/components/editor/chrome/components/feedback-button.tsx +3 -3
  277. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +8 -8
  278. package/src/components/editor/chrome/panels/__tests__/{sandbox-details.test.tsx → runtime-details.test.tsx} +94 -22
  279. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +4 -4
  280. package/src/components/editor/chrome/panels/packages-panel.tsx +8 -29
  281. package/src/components/editor/chrome/panels/{sandbox-details-state.ts → runtime-details-state.ts} +1 -1
  282. package/src/components/editor/chrome/panels/{sandbox-panel.tsx → runtime-panel.tsx} +38 -66
  283. package/src/components/editor/chrome/panels/runtime-status-toggle.tsx +56 -0
  284. package/src/components/editor/chrome/panels/sandbox-controller.tsx +2 -2
  285. package/src/components/editor/chrome/wrapper/app-chrome.tsx +3 -3
  286. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +2 -2
  287. package/src/components/editor/controls/Controls.tsx +3 -3
  288. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +2 -2
  289. package/src/components/editor/header/__tests__/status.test.tsx +4 -4
  290. package/src/components/editor/header/app-header.tsx +2 -2
  291. package/src/components/editor/header/status.tsx +3 -3
  292. package/src/components/editor/navigation/__tests__/navigation.test.ts +8 -8
  293. package/src/components/editor/output/console/ConsoleOutput.tsx +5 -3
  294. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +18 -0
  295. package/src/components/ui/__tests__/slider.test.tsx +37 -0
  296. package/src/components/ui/progress-stages.tsx +114 -0
  297. package/src/components/ui/slider.tsx +2 -0
  298. package/src/core/ai/__tests__/state.test.ts +120 -0
  299. package/src/core/ai/state.ts +36 -10
  300. package/src/core/cells/__tests__/document-roundtrip.test.ts +16 -0
  301. package/src/core/codemirror/copilot/__tests__/completion-integration.test.ts +447 -0
  302. package/src/core/codemirror/copilot/__tests__/inline-completion.test.ts +395 -0
  303. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +511 -2
  304. package/src/core/codemirror/copilot/__tests__/rpc-cancellation.test.ts +201 -0
  305. package/src/core/codemirror/copilot/extension.ts +22 -11
  306. package/src/core/codemirror/copilot/language-server.ts +109 -60
  307. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +138 -26
  308. package/src/core/codemirror/language/embedded/embedded-python.ts +47 -13
  309. package/src/core/codemirror/language/embedded/latex.ts +20 -13
  310. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
  311. package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
  312. package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
  313. package/src/core/codemirror/readonly/extension.ts +2 -2
  314. package/src/core/config/pair.ts +0 -1
  315. package/src/core/datasets/__tests__/data-source-discovery.test.ts +2 -2
  316. package/src/core/edit-app.tsx +5 -1
  317. package/src/core/export/hooks.ts +2 -2
  318. package/src/core/islands/bootstrap.ts +1 -0
  319. package/src/core/kernel/session.ts +9 -0
  320. package/src/core/network/__tests__/api.test.ts +114 -1
  321. package/src/core/network/__tests__/connection.test.ts +3 -3
  322. package/src/core/network/api.ts +3 -2
  323. package/src/core/network/connection-notice.ts +5 -5
  324. package/src/core/network/connection.ts +9 -9
  325. package/src/core/network/requests-lazy.ts +2 -2
  326. package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
  327. package/src/core/packages/useSandboxController.ts +6 -6
  328. package/src/core/runtime/__tests__/adapter.test.ts +6 -6
  329. package/src/core/runtime/adapter.ts +7 -7
  330. package/src/core/runtime/config.ts +2 -2
  331. package/src/core/saving/filename.ts +2 -2
  332. package/src/core/saving/save-component.tsx +5 -5
  333. package/src/core/saving/useAutoSave.ts +2 -2
  334. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  335. package/src/core/wasm/worker/bootstrap.ts +22 -3
  336. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
  337. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
  338. package/src/core/websocket/connection-utils.ts +21 -21
  339. package/src/core/websocket/types.ts +8 -9
  340. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
  341. package/src/css/katex-css.test.ts +166 -0
  342. package/src/css/katex.min.css +175 -169
  343. package/src/hooks/__tests__/useEventListener.test.tsx +45 -1
  344. package/src/hooks/useEventListener.ts +6 -1
  345. package/src/mount.tsx +2 -2
  346. package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
  347. package/src/plugins/core/registerReactComponent.tsx +3 -1
  348. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  349. package/src/plugins/impl/DataTablePlugin.tsx +23 -2
  350. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  351. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  352. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  353. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  354. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  355. package/src/plugins/impl/NumberPlugin.tsx +1 -1
  356. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  357. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  358. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  359. package/src/plugins/impl/SliderPlugin.tsx +5 -1
  360. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  361. package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
  362. package/src/plugins/impl/TextInputPlugin.tsx +10 -2
  363. package/src/plugins/impl/__test__/slider-labels.test.tsx +136 -0
  364. package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
  365. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
  366. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  367. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  368. package/src/plugins/impl/common/labeled.tsx +9 -3
  369. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
  370. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
  371. package/src/stories/cell.stories.tsx +2 -2
  372. package/src/stories/dataframe.stories.tsx +7 -0
  373. package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
  374. package/src/stories/progress-stages.stories.tsx +62 -0
  375. package/src/stories/runtime-existing.stories.tsx +44 -0
  376. package/src/stories/runtime-maintenance.stories.tsx +40 -0
  377. package/src/stories/runtime-pixi.stories.tsx +28 -0
  378. package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
  379. package/src/stories/runtime-uv.stories.tsx +56 -0
  380. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  381. package/dist/assets/worker-D7hWi02M.js +0 -109
  382. package/dist/classDiagram-ZZMXUADV-BwYhrSEX.js +0 -30
  383. package/dist/classDiagram-v2-VYDZK3BY-HecM04TM.js +0 -30
  384. package/dist/dropdown-menu-BaqM0t4N.js +0 -4502
  385. package/dist/error-banner-DzAmP0AQ.js +0 -391
  386. package/dist/flowDiagram-HODETNUW-DgcjSdPV.js +0 -16
  387. package/dist/label-MNhNNoN6.js +0 -278
  388. package/dist/mermaid-HWGCJPDP-DYCzSILp.js +0 -2
  389. package/dist/purify.es-DgKyQviY.js +0 -805
  390. package/dist/select-BcObMjGz.js +0 -970
  391. package/dist/stateDiagram-v2-MP3YSRHH-Dk5QgdXF.js +0 -30
  392. package/dist/swimlanesDiagram-VR7AAH4N-CbztusY8.js +0 -30
  393. package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
@@ -11,10 +11,10 @@ import { kernelStartupErrorAtom } from "@/core/errors/state";
11
11
  import { connectionAtom, startupProgressAtom } from "@/core/network/connection";
12
12
  import { requestClientAtom } from "@/core/network/requests";
13
13
  import { sandboxAtom } from "@/core/packages/sandbox-state";
14
- import { WebSocketClosedReason, WebSocketState } from "@/core/websocket/types";
14
+ import { WebSocketClosedReason, ConnectionState } from "@/core/websocket/types";
15
15
  import PackagesPanel from "../packages-panel";
16
16
  import { PanelSectionProvider } from "../panel-context";
17
- import { SandboxToggle } from "../sandbox-toggle";
17
+ import { RuntimeStatusToggle } from "../runtime-status-toggle";
18
18
 
19
19
  vi.mock("@/utils/reload-safe", () => ({ reloadSafe: vi.fn() }));
20
20
 
@@ -43,8 +43,8 @@ function mount({
43
43
  store.set(
44
44
  connectionAtom,
45
45
  preparing
46
- ? { state: WebSocketState.CONNECTING, phase: "preparing-environment" }
47
- : { state: WebSocketState.OPEN },
46
+ ? { state: ConnectionState.CONNECTING, phase: "preparing-environment" }
47
+ : { state: ConnectionState.OPEN },
48
48
  );
49
49
  store.set(alertAtom, (state) => ({
50
50
  ...state,
@@ -89,7 +89,7 @@ function mount({
89
89
  <Provider store={store}>
90
90
  <TooltipProvider>
91
91
  <ModalProvider>
92
- <SandboxToggle section="sidebar" />
92
+ <RuntimeStatusToggle section="sidebar" />
93
93
  <PanelSectionProvider value="sidebar">
94
94
  <PackagesPanel />
95
95
  </PanelSectionProvider>
@@ -103,7 +103,7 @@ function mount({
103
103
  it("opens restored preparation and kernel logs without reopening completed startup on refresh", async () => {
104
104
  mount();
105
105
  await screen.findByText("numpy");
106
- const toggle = screen.getByRole("button", { name: "uv sandbox" });
106
+ const toggle = screen.getByRole("button", { name: /^uv sandbox, / });
107
107
  expect(toggle).toHaveAttribute("aria-expanded", "false");
108
108
  expect(
109
109
  screen.queryByRole("region", { name: "Sandbox details" }),
@@ -164,7 +164,9 @@ it("restores a restart-required sync with the kernel restart action", async () =
164
164
  })),
165
165
  );
166
166
  await screen.findByText("numpy");
167
- expect(screen.getByText("Sandbox restart required")).toBeVisible();
167
+ expect(
168
+ screen.getByRole("heading", { name: "Sandbox restart required" }),
169
+ ).toBeVisible();
168
170
  expect(
169
171
  screen.queryByRole("button", { name: "Retry sync" }),
170
172
  ).not.toBeInTheDocument();
@@ -194,7 +196,9 @@ it("restores a restart-required sync with the kernel restart action", async () =
194
196
  },
195
197
  })),
196
198
  );
197
- expect(screen.getByText("Sandbox restart required")).toBeVisible();
199
+ expect(
200
+ screen.getByRole("heading", { name: "Sandbox restart required" }),
201
+ ).toBeVisible();
198
202
  fireEvent.click(screen.getByRole("button", { name: "Restart Kernel" }));
199
203
  expect(screen.getByRole("alertdialog")).toHaveTextContent("Restart Kernel");
200
204
  expect(client.sendRestart).not.toHaveBeenCalled();
@@ -251,7 +255,7 @@ it("keeps sync output open through completion and restores it quietly after refr
251
255
  unmount();
252
256
  const refreshed = mount();
253
257
  act(() => refreshed.store.set(alertAtom, snapshot));
254
- const toggle = screen.getByRole("button", { name: "uv sandbox" });
258
+ const toggle = screen.getByRole("button", { name: /^uv sandbox, / });
255
259
  expect(toggle).toHaveAttribute("aria-expanded", "false");
256
260
  fireEvent.click(toggle);
257
261
  fireEvent.click(
@@ -266,7 +270,7 @@ it.each([false, true])(
266
270
  "retains the progression after completion with inspecting=%s",
267
271
  async (inspecting) => {
268
272
  const { store, client } = mount({ preparing: true });
269
- const toggle = screen.getByRole("button", { name: "uv sandbox" });
273
+ const toggle = screen.getByRole("button", { name: /^uv sandbox, / });
270
274
  expect(toggle).toHaveAttribute("aria-expanded", "true");
271
275
  expect(client.getDependencyTree).not.toHaveBeenCalled();
272
276
  if (inspecting) {
@@ -283,11 +287,11 @@ it.each([false, true])(
283
287
  log_mode: "replace",
284
288
  });
285
289
  store.set(connectionAtom, {
286
- state: WebSocketState.CONNECTING,
290
+ state: ConnectionState.CONNECTING,
287
291
  phase: "starting-kernel",
288
292
  });
289
293
  });
290
- act(() => store.set(connectionAtom, { state: WebSocketState.OPEN }));
294
+ act(() => store.set(connectionAtom, { state: ConnectionState.OPEN }));
291
295
  await screen.findByText("numpy");
292
296
  expect(toggle).toHaveAttribute("aria-expanded", String(inspecting));
293
297
  if (!inspecting) {
@@ -308,7 +312,7 @@ it.each([false, true])(
308
312
 
309
313
  it("opens a startup error even after collapsing preparation and keeps both step outputs available", () => {
310
314
  const { store } = mount({ preparing: true, backend: "pixi" });
311
- const toggle = screen.getByRole("button", { name: "pixi sandbox" });
315
+ const toggle = screen.getByRole("button", { name: /^pixi sandbox, / });
312
316
  fireEvent.click(toggle);
313
317
  act(() => {
314
318
  store.set(startupProgressAtom, {
@@ -318,13 +322,14 @@ it("opens a startup error even after collapsing preparation and keeps both step
318
322
  });
319
323
  store.set(kernelStartupErrorAtom, "Could not import the runtime");
320
324
  store.set(connectionAtom, {
321
- state: WebSocketState.CLOSED,
325
+ state: ConnectionState.CLOSED,
322
326
  phase: "starting-kernel",
323
327
  code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
324
328
  reason: "Kernel startup failed",
325
329
  });
326
330
  });
327
331
  expect(toggle).toHaveAttribute("aria-expanded", "true");
332
+ expect(toggle).toHaveTextContent("pixi sandbox");
328
333
  expect(within(toggle).getByRole("status")).toHaveAccessibleName(
329
334
  "Kernel failed to start",
330
335
  );
@@ -346,13 +351,80 @@ it("opens a startup error even after collapsing preparation and keeps both step
346
351
  expect(screen.getByLabelText("Error details")).toBeVisible();
347
352
  });
348
353
 
349
- it("does not add a toggle or startup details to an existing environment", async () => {
350
- mount({ backend: null });
354
+ it.each(["uv", "pixi"] as const)(
355
+ "shows connection status and errors before the %s startup phase arrives",
356
+ (backend) => {
357
+ const { store } = mount({ backend, preparing: true });
358
+ act(() => store.set(connectionAtom, { state: ConnectionState.CONNECTING }));
359
+ const details = within(
360
+ screen.getByRole("region", { name: "Sandbox details" }),
361
+ );
362
+ expect(details.getByRole("status")).toHaveTextContent("Connecting…");
363
+ expect(details.queryByRole("list")).not.toBeInTheDocument();
364
+
365
+ act(() => {
366
+ store.set(kernelStartupErrorAtom, "Kernel process exited unexpectedly");
367
+ store.set(connectionAtom, {
368
+ state: ConnectionState.CLOSED,
369
+ code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
370
+ reason: "Kernel startup failed",
371
+ });
372
+ });
373
+ expect(details.getByRole("status")).toHaveTextContent(
374
+ "Kernel failed to start",
375
+ );
376
+ expect(details.getByLabelText("Error details")).toHaveTextContent(
377
+ "Kernel process exited unexpectedly",
378
+ );
379
+ expect(details.queryByRole("list")).not.toBeInTheDocument();
380
+ },
381
+ );
382
+
383
+ it("uses the same disclosure for an existing environment and updates it through connection changes", async () => {
384
+ const { store } = mount({ backend: null });
351
385
  await screen.findByText("numpy");
352
- expect(
353
- screen.queryByRole("button", { name: /sandbox/ }),
354
- ).not.toBeInTheDocument();
355
- expect(
356
- screen.queryByRole("region", { name: "Sandbox details" }),
357
- ).not.toBeInTheDocument();
386
+ const toggle = screen.getByRole("button", { name: /^Runtime details, / });
387
+ expect(toggle).toHaveTextContent(/^Runtime$/);
388
+ expect(toggle).toHaveAccessibleName("Runtime details, Kernel ready");
389
+ expect(within(toggle).getByRole("status")).toHaveAccessibleName(
390
+ "Kernel ready",
391
+ );
392
+ expect(toggle).toHaveAttribute("aria-expanded", "false");
393
+ fireEvent.click(toggle);
394
+ const details = screen.getByRole("region", { name: "Runtime details" });
395
+ expect(toggle).toHaveAttribute("aria-controls", details.id);
396
+ expect(within(details).getByText("Kernel started")).toBeVisible();
397
+ expect(within(details).getAllByRole("listitem")).toHaveLength(1);
398
+ expect(within(details).queryByRole("button", { name: "Sync" })).toBeNull();
399
+
400
+ act(() => store.set(connectionAtom, { state: ConnectionState.CONNECTING }));
401
+ expect(toggle).toHaveTextContent(/^Runtime$/);
402
+ expect(within(toggle).getByRole("status")).toHaveAccessibleName(
403
+ "Connecting…",
404
+ );
405
+ expect(within(details).getByText("Starting kernel")).toBeVisible();
406
+ fireEvent.click(toggle);
407
+ expect(details).not.toBeVisible();
408
+ act(() =>
409
+ store.set(connectionAtom, {
410
+ state: ConnectionState.CLOSED,
411
+ code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
412
+ reason: "Kernel startup failed",
413
+ }),
414
+ );
415
+ expect(toggle).toHaveAttribute("aria-expanded", "true");
416
+ expect(toggle).toHaveTextContent(/^Runtime$/);
417
+ expect(within(toggle).getByRole("status")).toHaveAccessibleName(
418
+ "Kernel failed to start",
419
+ );
420
+ expect(details).toBeVisible();
421
+ expect(toggle).toHaveAccessibleName(
422
+ "Runtime details, Kernel failed to start",
423
+ );
424
+
425
+ act(() => store.set(connectionAtom, { state: ConnectionState.NOT_STARTED }));
426
+ expect(toggle).toHaveTextContent(/^Runtime$/);
427
+ expect(within(toggle).getByRole("status")).toHaveAccessibleName(
428
+ "Kernel not connected",
429
+ );
358
430
  });
@@ -24,7 +24,7 @@ import {
24
24
  } from "@/core/packages/sandbox-state";
25
25
  import { filenameAtom } from "@/core/saving/file-state";
26
26
  import { store } from "@/core/state/jotai";
27
- import { WebSocketClosedReason, WebSocketState } from "@/core/websocket/types";
27
+ import { WebSocketClosedReason, ConnectionState } from "@/core/websocket/types";
28
28
  import { chromeAtom } from "../../state";
29
29
  import PackagesPanel from "../packages-panel";
30
30
  import { PanelSectionProvider } from "../panel-context";
@@ -52,7 +52,7 @@ vi.mock("@/plugins/impl/code/LazyAnyLanguageCodeMirror", () => ({
52
52
  const manifest =
53
53
  'dependencies = ["numpy==0.0.0"]\n\n[tool.custom]\nlabel = "experiment"\n';
54
54
  const failed = {
55
- state: WebSocketState.CLOSED,
55
+ state: ConnectionState.CLOSED,
56
56
  code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
57
57
  phase: "preparing-environment",
58
58
  reason: "Kernel startup failed",
@@ -117,7 +117,7 @@ it("keeps a whole-manifest repair open through failure and closes only after syn
117
117
  const reconnect = vi.fn(async () => {
118
118
  store.set(kernelStartupErrorAtom, null);
119
119
  store.set(connectionAtom, {
120
- state: WebSocketState.CONNECTING,
120
+ state: ConnectionState.CONNECTING,
121
121
  phase: "preparing-environment",
122
122
  });
123
123
  });
@@ -161,7 +161,7 @@ it("keeps a whole-manifest repair open through failure and closes only after syn
161
161
  );
162
162
  fireEvent.click(dialog.getByRole("button", { name: "Sync" }));
163
163
  await waitFor(() => expect(reconnect).toHaveBeenCalledTimes(2));
164
- act(() => store.set(connectionAtom, { state: WebSocketState.OPEN }));
164
+ act(() => store.set(connectionAtom, { state: ConnectionState.OPEN }));
165
165
  await waitFor(() =>
166
166
  expect(screen.queryByRole("dialog")).not.toBeInTheDocument(),
167
167
  );
@@ -7,7 +7,6 @@ import {
7
7
  HelpCircleIcon,
8
8
  } from "lucide-react";
9
9
  import React from "react";
10
- import { useConnectionNotice } from "@/core/network/useConnectionNotice";
11
10
  import { useOpenSettingsToTab } from "@/components/app-config/state";
12
11
  import { Spinner } from "@/components/icons/spinner";
13
12
  import { SearchInput } from "@/components/ui/input";
@@ -26,7 +25,7 @@ import type {
26
25
  DependencyTreeNode,
27
26
  DependencyTreeResponse,
28
27
  } from "@/core/network/types";
29
- import { sandboxAtom, sandboxSyncAtom } from "@/core/packages/sandbox-state";
28
+ import { sandboxSyncAtom } from "@/core/packages/sandbox-state";
30
29
  import { stripPackageManagerPrefix } from "@/core/packages/package-input-utils";
31
30
  import { usePackageAction } from "@/core/packages/usePackageAction";
32
31
  import { usePackageDependencies } from "@/core/packages/usePackageDependencies";
@@ -36,7 +35,7 @@ import { ErrorBanner } from "@/plugins/impl/common/error-banner";
36
35
  import { cn } from "@/utils/cn";
37
36
  import { copyToClipboard } from "@/utils/copy";
38
37
  import { Events } from "@/utils/events";
39
- import { SandboxDetails } from "./sandbox-panel";
38
+ import { RuntimeDetails } from "./runtime-panel";
40
39
  import { PanelEmptyState } from "./empty-state";
41
40
  import { PACKAGES_INPUT_ID, packagesToInstallAtom } from "./packages-utils";
42
41
 
@@ -69,33 +68,13 @@ const PackageActionButton: React.FC<{
69
68
  };
70
69
 
71
70
  const PackagesPanel: React.FC = () => {
72
- const sandbox = useAtomValue(sandboxAtom);
73
71
  const connected = useAtomValue(isConnectedAtom);
74
- const notice = useConnectionNotice(0);
75
- if (sandbox?.backend) {
76
- return (
77
- <div className="flex flex-col flex-1 min-h-0 overflow-hidden">
78
- <SandboxDetails />
79
- {connected && <PackageContents />}
80
- </div>
81
- );
82
- }
83
- if (notice) {
84
- return (
85
- <div className="p-4 text-sm text-muted-foreground">
86
- <div className="flex items-center gap-2">
87
- {notice.pending && <Spinner className="size-3" />}
88
- {notice.title}
89
- </div>
90
- {notice.error && (
91
- <pre className="mt-3 text-xs whitespace-pre-wrap break-words max-h-52 overflow-auto">
92
- {notice.error}
93
- </pre>
94
- )}
95
- </div>
96
- );
97
- }
98
- return <PackageContents />;
72
+ return (
73
+ <div className="flex flex-col flex-1 min-h-0 overflow-hidden">
74
+ <RuntimeDetails />
75
+ {connected && <PackageContents />}
76
+ </div>
77
+ );
99
78
  };
100
79
 
101
80
  const PackageContents: React.FC = () => {
@@ -17,7 +17,7 @@ const disclosureContextAtom = atom((get) => {
17
17
  };
18
18
  });
19
19
 
20
- export const sandboxDetailsExpandedAtom = atom(
20
+ export const runtimeDetailsExpandedAtom = atom(
21
21
  (get) => {
22
22
  const context = get(disclosureContextAtom);
23
23
  const preference = get(preferenceAtom);
@@ -1,13 +1,13 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import { useAtom, useAtomValue } from "jotai";
3
3
  import { RefreshCwIcon } from "lucide-react";
4
- import { connectionNoticeAtom } from "@/core/network/connection-notice";
5
4
  import { Button } from "@/components/ui/button";
6
5
  import { useRestartKernel } from "@/components/editor/actions/useRestartKernel";
7
6
  import {
8
7
  isConnectedAtom,
9
8
  startupProgressAtom,
10
9
  } from "@/core/network/connection";
10
+ import { connectionNoticeAtom } from "@/core/network/connection-notice";
11
11
  import type { DisplayConnectionNotice } from "@/core/network/useConnectionNotice";
12
12
  import {
13
13
  preparationAtom,
@@ -17,25 +17,10 @@ import {
17
17
  sandboxSyncOperationAtom,
18
18
  } from "@/core/packages/sandbox-state";
19
19
  import { cn } from "@/utils/cn";
20
- import { usePanelSection } from "./panel-context";
21
- import { sandboxDetailsExpandedAtom } from "./sandbox-details-state";
22
20
  import { StartupOutput } from "../../alerts/startup-output";
23
- import {
24
- ConnectionStatusIcon,
25
- StartupProgress,
26
- } from "../../alerts/startup-progress";
27
-
28
- export function SandboxErrorOutput({ error }: { error: string }) {
29
- return (
30
- <pre
31
- tabIndex={0}
32
- aria-label="Error details"
33
- className="mt-3 p-3 rounded border bg-muted/30 text-xs text-muted-foreground whitespace-pre min-w-0 max-w-full max-h-52 overflow-auto"
34
- >
35
- {error}
36
- </pre>
37
- );
38
- }
21
+ import { ConnectionDetails } from "../../alerts/connection-details";
22
+ import { usePanelSection } from "./panel-context";
23
+ import { runtimeDetailsExpandedAtom } from "./runtime-details-state";
39
24
 
40
25
  function SandboxRecovery({ notice }: { notice: DisplayConnectionNotice }) {
41
26
  const sandbox = useAtomValue(sandboxAtom);
@@ -46,8 +31,6 @@ function SandboxRecovery({ notice }: { notice: DisplayConnectionNotice }) {
46
31
  }
47
32
  return (
48
33
  <>
49
- <p className="mt-2 text-foreground">{notice.description}</p>
50
- {notice.error && <SandboxErrorOutput error={notice.error} />}
51
34
  <div className="flex items-center gap-2 mt-3">
52
35
  <Button
53
36
  variant="outline"
@@ -88,36 +71,11 @@ function SandboxRestart() {
88
71
  );
89
72
  }
90
73
 
91
- function SandboxStartupPanel({ notice }: { notice: DisplayConnectionNotice }) {
92
- const showSteps =
93
- notice.kind === "startup" &&
94
- (notice.ready ||
95
- notice.phase === "preparing-environment" ||
96
- notice.phase === "starting-kernel");
97
- return (
98
- <div className="min-w-0 text-sm">
99
- {showSteps ? (
100
- <StartupProgress notice={notice} surface="sidebar" />
101
- ) : (
102
- <div className="flex items-center gap-2" role="status">
103
- <ConnectionStatusIcon notice={notice} />
104
- <h2>{notice.title}</h2>
105
- </div>
106
- )}
107
- <SandboxRecovery notice={notice} />
108
- </div>
109
- );
110
- }
111
-
112
- function SandboxSyncStatus({ notice }: { notice: DisplayConnectionNotice }) {
74
+ function RuntimeNoticeDetails({ notice }: { notice: DisplayConnectionNotice }) {
113
75
  return (
114
- <div className="mb-5 text-sm">
115
- <output className="flex items-center gap-2 text-xs">
116
- <ConnectionStatusIcon notice={notice} />
117
- <span>{notice.title}</span>
118
- </output>
119
- <SandboxRecovery notice={notice} />
120
- </div>
76
+ <ConnectionDetails notice={notice}>
77
+ {notice.sandbox && <SandboxRecovery notice={notice} />}
78
+ </ConnectionDetails>
121
79
  );
122
80
  }
123
81
 
@@ -133,7 +91,9 @@ function SandboxSyncDetails({
133
91
  return (
134
92
  <div className="mt-5 min-w-0">
135
93
  {notice ? (
136
- <SandboxSyncStatus notice={notice} />
94
+ <div className="mb-5">
95
+ <RuntimeNoticeDetails notice={notice} />
96
+ </div>
137
97
  ) : (
138
98
  <p className="text-sm">Environment synced</p>
139
99
  )}
@@ -153,20 +113,25 @@ function SandboxSyncDetails({
153
113
  );
154
114
  }
155
115
 
156
- export function SandboxDetails() {
116
+ export function RuntimeDetails() {
157
117
  const section = usePanelSection();
118
+ const sandbox = Boolean(useAtomValue(sandboxAtom)?.backend);
158
119
  const connected = useAtomValue(isConnectedAtom);
159
- const notice = useAtomValue(connectionNoticeAtom);
120
+ const connectionNotice = useAtomValue(connectionNoticeAtom);
121
+ const notice: DisplayConnectionNotice | null = connectionNotice && {
122
+ ...connectionNotice,
123
+ ready: false,
124
+ };
160
125
  const preparation = useAtomValue(preparationAtom);
161
126
  const progress = useAtomValue(startupProgressAtom);
162
- const [expanded, setExpanded] = useAtom(sandboxDetailsExpandedAtom);
127
+ const [expanded, setExpanded] = useAtom(runtimeDetailsExpandedAtom);
163
128
  const startup: DisplayConnectionNotice | null =
164
129
  notice?.kind === "startup"
165
- ? { ...notice, ready: false }
166
- : preparation || progress
130
+ ? notice
131
+ : preparation || progress || (connected && !sandbox)
167
132
  ? {
168
133
  kind: "startup",
169
- sandbox: true,
134
+ sandbox,
170
135
  title: "Notebook started",
171
136
  description: "The notebook is ready to run.",
172
137
  pending: false,
@@ -176,8 +141,8 @@ export function SandboxDetails() {
176
141
  : null;
177
142
  return (
178
143
  <section
179
- id={`sandbox-details-${section}`}
180
- aria-label="Sandbox details"
144
+ id={`runtime-details-${section}`}
145
+ aria-label={sandbox ? "Sandbox details" : "Runtime details"}
181
146
  hidden={!expanded}
182
147
  className={cn(
183
148
  "min-w-0 overflow-auto p-4",
@@ -187,15 +152,22 @@ export function SandboxDetails() {
187
152
  onFocusCapture={() => setExpanded(true)}
188
153
  >
189
154
  {notice?.kind === "connection" && (
190
- <SandboxSyncStatus notice={{ ...notice, ready: false }} />
155
+ <div className="mb-5">
156
+ <RuntimeNoticeDetails notice={notice} />
157
+ </div>
191
158
  )}
192
- {startup && <SandboxStartupPanel notice={startup} />}
193
- {connected && (
194
- <SandboxSyncDetails
195
- notice={notice?.kind === "sync" ? { ...notice, ready: false } : null}
196
- />
159
+ {startup && <RuntimeNoticeDetails notice={startup} />}
160
+ {sandbox && connected && (
161
+ <SandboxSyncDetails notice={notice?.kind === "sync" ? notice : null} />
162
+ )}
163
+ {sandbox && connected && (!notice || notice.pending) && (
164
+ <SandboxActions />
165
+ )}
166
+ {!notice && !startup && !sandbox && (
167
+ <p className="text-sm text-muted-foreground">
168
+ Not connected to a runtime.
169
+ </p>
197
170
  )}
198
- {connected && (!notice || notice.pending) && <SandboxActions />}
199
171
  </section>
200
172
  );
201
173
  }
@@ -0,0 +1,56 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import { useAtom, useAtomValue } from "jotai";
3
+ import { ChevronDownIcon } from "lucide-react";
4
+ import {
5
+ ProgressStatusIcon,
6
+ type ProgressState,
7
+ } from "@/components/ui/progress-stages";
8
+ import { isConnectedAtom } from "@/core/network/connection";
9
+ import { connectionNoticeAtom } from "@/core/network/connection-notice";
10
+ import { sandboxAtom } from "@/core/packages/sandbox-state";
11
+ import { cn } from "@/utils/cn";
12
+ import type { PanelSection } from "./panel-context";
13
+ import { runtimeDetailsExpandedAtom } from "./runtime-details-state";
14
+
15
+ export function RuntimeStatusToggle({ section }: { section: PanelSection }) {
16
+ const sandbox = useAtomValue(sandboxAtom);
17
+ const notice = useAtomValue(connectionNoticeAtom);
18
+ const [expanded, setExpanded] = useAtom(runtimeDetailsExpandedAtom);
19
+ const connected = useAtomValue(isConnectedAtom);
20
+ const label = sandbox?.backend ? `${sandbox.backend} sandbox` : "Runtime";
21
+ const statusLabel =
22
+ notice?.title ?? (connected ? "Kernel ready" : "Kernel not connected");
23
+ const status: ProgressState = notice
24
+ ? notice.pending
25
+ ? "running"
26
+ : "failed"
27
+ : connected
28
+ ? "succeeded"
29
+ : "waiting";
30
+ return (
31
+ <button
32
+ type="button"
33
+ aria-label={`${sandbox?.backend ? label : "Runtime details"}, ${statusLabel}`}
34
+ aria-expanded={expanded}
35
+ aria-controls={`runtime-details-${section}`}
36
+ title={statusLabel}
37
+ className={cn(
38
+ "flex min-w-0 items-center gap-1.5 rounded px-1.5 py-1 text-xs whitespace-nowrap hover:bg-accent focus-visible:outline-2 focus-visible:outline-ring",
39
+ status === "failed" ? "text-(--red-11)" : "text-foreground",
40
+ )}
41
+ onClick={() => setExpanded(!expanded)}
42
+ >
43
+ <ProgressStatusIcon state={status} variant="dot" />
44
+ <output aria-label={statusLabel} className="truncate">
45
+ {label}
46
+ </output>
47
+ <ChevronDownIcon
48
+ aria-hidden={true}
49
+ className={cn(
50
+ "size-3 shrink-0 text-muted-foreground",
51
+ expanded && "rotate-180",
52
+ )}
53
+ />
54
+ </button>
55
+ );
56
+ }
@@ -14,7 +14,7 @@ import { useSandboxController } from "@/core/packages/useSandboxController";
14
14
  import { LazyAnyLanguageCodeMirror } from "@/plugins/impl/code/LazyAnyLanguageCodeMirror";
15
15
  import { useTheme } from "@/theme/useTheme";
16
16
  import { Paths } from "@/utils/paths";
17
- import { SandboxErrorOutput } from "./sandbox-panel";
17
+ import { ConnectionErrorOutput } from "../../alerts/connection-details";
18
18
 
19
19
  export function SandboxController({
20
20
  onReconnect,
@@ -64,7 +64,7 @@ export function SandboxController({
64
64
  ) : (
65
65
  !error && <Spinner />
66
66
  )}
67
- {diagnostic && <SandboxErrorOutput error={diagnostic} />}
67
+ {diagnostic && <ConnectionErrorOutput error={diagnostic} />}
68
68
  {conflict && (
69
69
  <Button variant="text" size="sm" onClick={loadManifest}>
70
70
  Discard draft and reload manifest
@@ -34,7 +34,7 @@ import { ErrorBoundary } from "../../boundary/ErrorBoundary";
34
34
  import { raf2 } from "../../navigation/focus-utils";
35
35
  import { ContextAwarePanel } from "../panels/context-aware-panel/context-aware-panel";
36
36
  import { PanelSectionProvider } from "../panels/panel-context";
37
- import { SandboxToggle } from "../panels/sandbox-toggle";
37
+ import { RuntimeStatusToggle } from "../panels/runtime-status-toggle";
38
38
  import { useTheme } from "@/theme/useTheme";
39
39
  import {
40
40
  LazyAgentPanel,
@@ -391,7 +391,7 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
391
391
  </span>
392
392
  )}
393
393
  {selectedPanel === "packages" && (
394
- <SandboxToggle section="sidebar" />
394
+ <RuntimeStatusToggle section="sidebar" />
395
395
  )}
396
396
  <Button
397
397
  data-testid="close-helper-pane"
@@ -549,7 +549,7 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
549
549
  <LspStatus />
550
550
  <div className="flex-1" />
551
551
  {selectedDeveloperPanelTab === "packages" && (
552
- <SandboxToggle section="developer-panel" />
552
+ <RuntimeStatusToggle section="developer-panel" />
553
553
  )}
554
554
  <Button
555
555
  size="xs"
@@ -10,7 +10,7 @@ import { connectionAtom } from "@/core/network/connection";
10
10
  import { useRequestClient } from "@/core/network/requests";
11
11
  import type { UsageResponse } from "@/core/network/types";
12
12
  import { isWasm } from "@/core/wasm/utils";
13
- import { WebSocketState } from "@/core/websocket/types";
13
+ import { ConnectionState } from "@/core/websocket/types";
14
14
  import { useAsyncData } from "@/hooks/useAsyncData";
15
15
  import { useInterval } from "@/hooks/useInterval";
16
16
  import { cn } from "@/utils/cn";
@@ -29,7 +29,7 @@ export const MachineStats: React.FC = () => {
29
29
  if (isWasm()) {
30
30
  return null;
31
31
  }
32
- if (connection.state !== WebSocketState.OPEN) {
32
+ if (connection.state !== ConnectionState.OPEN) {
33
33
  return null;
34
34
  }
35
35
  return getUsageStats();
@@ -21,7 +21,7 @@ import {
21
21
  getConnectionTooltip,
22
22
  isAppInteractionDisabled,
23
23
  } from "@/core/websocket/connection-utils";
24
- import { WebSocketState } from "@/core/websocket/types";
24
+ import { ConnectionState } from "@/core/websocket/types";
25
25
  import { cn } from "@/utils/cn";
26
26
  import { Functions } from "@/utils/functions";
27
27
  import {
@@ -43,7 +43,7 @@ interface ControlsProps {
43
43
  onTogglePresenting: () => void;
44
44
  onInterrupt: () => void;
45
45
  onRun: () => void;
46
- connectionState: WebSocketState;
46
+ connectionState: ConnectionState;
47
47
  running: boolean;
48
48
  appConfig: AppConfig;
49
49
  }
@@ -60,7 +60,7 @@ export const Controls = ({
60
60
  const undoLabel = useAtomValue(undoLabelAtom);
61
61
  const needsRun = useAtomValue(needsRunAtom);
62
62
  const { undoDeleteCell } = useCellActions();
63
- const closed = connectionState === WebSocketState.CLOSED;
63
+ const closed = connectionState === ConnectionState.CLOSED;
64
64
 
65
65
  let undoControl: JSX.Element | null = null;
66
66
  if (!closed && undoAvailable) {
@@ -25,7 +25,7 @@ import { requestClientAtom } from "@/core/network/requests";
25
25
  import { filenameAtom } from "@/core/saving/file-state";
26
26
  import { store } from "@/core/state/jotai";
27
27
  import { isWasm } from "@/core/wasm/utils";
28
- import { WebSocketState } from "@/core/websocket/types";
28
+ import { ConnectionState } from "@/core/websocket/types";
29
29
  import {
30
30
  DEFAULT_EXPORT_OPTIONS,
31
31
  exportOptionsAtom,
@@ -111,7 +111,7 @@ describe("NotebookMenuDropdown", () => {
111
111
  store.set(requestClientAtom, MockRequestClient.create());
112
112
  store.set(filenameAtom, "/project/notebook.py");
113
113
  store.set(viewStateAtom, { mode: "edit", cellAnchor: null });
114
- store.set(connectionAtom, { state: WebSocketState.OPEN });
114
+ store.set(connectionAtom, { state: ConnectionState.OPEN });
115
115
  store.set(kioskModeAtom, false);
116
116
  store.set(layoutStateAtom, {
117
117
  selectedLayout: "vertical",