@marimo-team/islands 0.25.2-dev13 → 0.25.2-dev130

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 (400) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CqhQmp74.js → ConnectedDataExplorerComponent-CNSxdKyJ.js} +15 -15
  2. package/dist/{ErrorBoundary-C901K0Pa.js → ErrorBoundary-TNyz711o.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-DbDN7P7-.js → code-visibility-D9wWbBZp.js} +7 -7
  46. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  47. package/dist/{common-BT9gbOCH.js → common-yxD2FJe_.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-CVzcJKyS.js → data-grid-overlay-editor-DZjQDOjA.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-CglJWpZl.js → feedback-button-DZTHS4bw.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-DYVqOapE.js → glide-data-editor-Dwg6aXaX.js} +60 -60
  118. package/dist/{glide-utils-CzzWU59p.js → glide-utils-DJyqh0EM.js} +4 -4
  119. package/dist/{globals-GIct2xJr.js → globals-DDRQd7UN.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 +7060 -6909
  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-D9ZV_sED.js → number-overlay-editor-KgyFjYGb.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-Bl8NIAua.js → reveal-component-BbYNv_VX.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 +6 -5
  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/storage/__tests__/storage-file-viewer.test.tsx +2 -1
  296. package/src/components/ui/__tests__/slider.test.tsx +37 -0
  297. package/src/components/ui/progress-stages.tsx +114 -0
  298. package/src/components/ui/slider.tsx +2 -0
  299. package/src/core/ai/__tests__/state.test.ts +120 -0
  300. package/src/core/ai/state.ts +36 -10
  301. package/src/core/cells/__tests__/document-roundtrip.test.ts +16 -0
  302. package/src/core/codemirror/copilot/__tests__/completion-integration.test.ts +447 -0
  303. package/src/core/codemirror/copilot/__tests__/inline-completion.test.ts +395 -0
  304. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +511 -2
  305. package/src/core/codemirror/copilot/__tests__/rpc-cancellation.test.ts +201 -0
  306. package/src/core/codemirror/copilot/extension.ts +22 -11
  307. package/src/core/codemirror/copilot/language-server.ts +109 -60
  308. package/src/core/codemirror/language/__tests__/sql.test.ts +4 -3
  309. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +138 -26
  310. package/src/core/codemirror/language/embedded/embedded-python.ts +47 -13
  311. package/src/core/codemirror/language/embedded/latex.ts +20 -13
  312. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
  313. package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
  314. package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
  315. package/src/core/codemirror/readonly/extension.ts +2 -2
  316. package/src/core/config/pair.ts +0 -1
  317. package/src/core/datasets/__tests__/data-source-discovery.test.ts +20 -13
  318. package/src/core/edit-app.tsx +5 -1
  319. package/src/core/export/hooks.ts +2 -2
  320. package/src/core/islands/bootstrap.ts +1 -0
  321. package/src/core/islands/bridge.ts +2 -2
  322. package/src/core/kernel/messages.ts +1 -1
  323. package/src/core/kernel/session.ts +9 -0
  324. package/src/core/network/__tests__/api.test.ts +114 -1
  325. package/src/core/network/__tests__/connection.test.ts +3 -3
  326. package/src/core/network/api.ts +3 -2
  327. package/src/core/network/connection-notice.ts +5 -5
  328. package/src/core/network/connection.ts +9 -9
  329. package/src/core/network/requests-lazy.ts +2 -2
  330. package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
  331. package/src/core/packages/useSandboxController.ts +6 -6
  332. package/src/core/runtime/__tests__/adapter.test.ts +6 -6
  333. package/src/core/runtime/adapter.ts +7 -7
  334. package/src/core/runtime/config.ts +2 -2
  335. package/src/core/saving/filename.ts +2 -2
  336. package/src/core/saving/save-component.tsx +5 -5
  337. package/src/core/saving/useAutoSave.ts +2 -2
  338. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  339. package/src/core/wasm/bridge.ts +2 -2
  340. package/src/core/wasm/worker/bootstrap.ts +22 -3
  341. package/src/core/wasm/worker/types.ts +2 -2
  342. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
  343. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
  344. package/src/core/websocket/connection-utils.ts +21 -21
  345. package/src/core/websocket/types.ts +8 -9
  346. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
  347. package/src/css/katex-css.test.ts +166 -0
  348. package/src/css/katex.min.css +175 -169
  349. package/src/hooks/__tests__/useEventListener.test.tsx +45 -1
  350. package/src/hooks/useEventListener.ts +6 -1
  351. package/src/mount.tsx +2 -2
  352. package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
  353. package/src/plugins/core/registerReactComponent.tsx +3 -1
  354. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  355. package/src/plugins/impl/DataTablePlugin.tsx +23 -2
  356. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  357. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  358. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  359. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  360. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  361. package/src/plugins/impl/NumberPlugin.tsx +21 -4
  362. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  363. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  364. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  365. package/src/plugins/impl/SliderPlugin.tsx +5 -1
  366. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  367. package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
  368. package/src/plugins/impl/TextInputPlugin.tsx +10 -2
  369. package/src/plugins/impl/__test__/slider-labels.test.tsx +136 -0
  370. package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
  371. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
  372. package/src/plugins/impl/__tests__/NumberPlugin.test.tsx +159 -1
  373. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  374. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  375. package/src/plugins/impl/common/labeled.tsx +9 -3
  376. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
  377. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
  378. package/src/stories/cell.stories.tsx +2 -2
  379. package/src/stories/dataframe.stories.tsx +7 -0
  380. package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
  381. package/src/stories/progress-stages.stories.tsx +62 -0
  382. package/src/stories/runtime-existing.stories.tsx +44 -0
  383. package/src/stories/runtime-maintenance.stories.tsx +40 -0
  384. package/src/stories/runtime-pixi.stories.tsx +28 -0
  385. package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
  386. package/src/stories/runtime-uv.stories.tsx +56 -0
  387. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  388. package/dist/assets/worker-D7hWi02M.js +0 -109
  389. package/dist/classDiagram-ZZMXUADV-BwYhrSEX.js +0 -30
  390. package/dist/classDiagram-v2-VYDZK3BY-HecM04TM.js +0 -30
  391. package/dist/dropdown-menu-BaqM0t4N.js +0 -4502
  392. package/dist/error-banner-DzAmP0AQ.js +0 -391
  393. package/dist/flowDiagram-HODETNUW-DgcjSdPV.js +0 -16
  394. package/dist/label-MNhNNoN6.js +0 -278
  395. package/dist/mermaid-HWGCJPDP-DYCzSILp.js +0 -2
  396. package/dist/purify.es-DgKyQviY.js +0 -805
  397. package/dist/select-BcObMjGz.js +0 -970
  398. package/dist/stateDiagram-v2-MP3YSRHH-Dk5QgdXF.js +0 -30
  399. package/dist/swimlanesDiagram-VR7AAH4N-CbztusY8.js +0 -30
  400. package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
@@ -8,16 +8,22 @@ import { alertAtom, getPackageAlert } from "@/core/alerts/state";
8
8
  import { notebookAtom } from "@/core/cells/cells";
9
9
  import { CellId } from "@/core/cells/ids";
10
10
  import { AppConfigSchema } from "@/core/config/config-schema";
11
+ import { kernelStartupErrorAtom } from "@/core/errors/state";
11
12
  import { connectionAtom } from "@/core/network/connection";
12
13
  import { sandboxAtom, sandboxSyncAtom } from "@/core/packages/sandbox-state";
13
- import { WebSocketClosedReason, WebSocketState } from "@/core/websocket/types";
14
+ import { WebSocketClosedReason, ConnectionState } from "@/core/websocket/types";
14
15
  import { chromeAtom } from "../../chrome/state";
16
+ import { runtimeDetailsExpandedAtom } from "../../chrome/panels/runtime-details-state";
15
17
  import { ConnectionNotice } from "../connection-notice";
16
18
 
17
19
  beforeEach(() => vi.useFakeTimers());
18
20
  afterEach(() => vi.useRealTimers());
19
21
 
20
- function mount(existingCells = false) {
22
+ function mount({
23
+ existingCells = false,
24
+ onRetry = vi.fn(),
25
+ canOpenPackages = true,
26
+ } = {}) {
21
27
  const store = createStore();
22
28
  store.set(sandboxAtom, {
23
29
  backend: "pixi",
@@ -25,7 +31,7 @@ function mount(existingCells = false) {
25
31
  filename: "notebook.py",
26
32
  });
27
33
  store.set(connectionAtom, {
28
- state: WebSocketState.CONNECTING,
34
+ state: ConnectionState.CONNECTING,
29
35
  phase: "preparing-environment",
30
36
  });
31
37
  if (existingCells) {
@@ -40,7 +46,8 @@ function mount(existingCells = false) {
40
46
  <Provider store={store}>
41
47
  <ConnectionNotice
42
48
  appConfig={AppConfigSchema.parse({})}
43
- onRetry={vi.fn()}
49
+ onRetry={onRetry}
50
+ canOpenPackages={canOpenPackages}
44
51
  />
45
52
  </Provider>,
46
53
  );
@@ -57,13 +64,13 @@ it("shows both stages in an empty notebook, checks them off, then dismisses Read
57
64
  expect(steps.getByText("Start kernel")).toBeInTheDocument();
58
65
  act(() =>
59
66
  store.set(connectionAtom, {
60
- state: WebSocketState.CONNECTING,
67
+ state: ConnectionState.CONNECTING,
61
68
  phase: "starting-kernel",
62
69
  }),
63
70
  );
64
71
  expect(steps.getByText("Environment prepared")).toBeInTheDocument();
65
72
  expect(steps.getByText("Starting kernel")).toBeInTheDocument();
66
- act(() => store.set(connectionAtom, { state: WebSocketState.OPEN }));
73
+ act(() => store.set(connectionAtom, { state: ConnectionState.OPEN }));
67
74
  expect(
68
75
  screen.getByRole("heading", { name: "Your notebook is ready" }),
69
76
  ).toBeInTheDocument();
@@ -78,8 +85,122 @@ it("shows both stages in an empty notebook, checks them off, then dismisses Read
78
85
  ).not.toBeInTheDocument();
79
86
  });
80
87
 
88
+ it("uses the shared kernel stage for an ordinary connection and dismisses it when connected", () => {
89
+ const store = mount();
90
+ act(() => {
91
+ store.set(sandboxAtom, null);
92
+ store.set(connectionAtom, { state: ConnectionState.CONNECTING });
93
+ });
94
+ act(() => vi.advanceTimersByTime(500));
95
+ const stages = within(
96
+ screen.getByRole("list", {
97
+ name: "Notebook startup stages",
98
+ }),
99
+ );
100
+ expect(stages.getAllByRole("listitem")).toHaveLength(1);
101
+ expect(stages.getByText("Starting kernel")).toBeVisible();
102
+ act(() => store.set(connectionAtom, { state: ConnectionState.OPEN }));
103
+ expect(screen.queryByRole("region", { name: "Notebook startup" })).toBeNull();
104
+ });
105
+
106
+ it("shows connection status until a sandbox reports its startup phase", () => {
107
+ const store = mount();
108
+ act(() => store.set(connectionAtom, { state: ConnectionState.CONNECTING }));
109
+ act(() => vi.advanceTimersByTime(500));
110
+ expect(screen.getByRole("heading", { name: "Connecting…" })).toBeVisible();
111
+ expect(screen.queryByRole("list")).not.toBeInTheDocument();
112
+
113
+ act(() =>
114
+ store.set(connectionAtom, {
115
+ state: ConnectionState.CLOSED,
116
+ code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
117
+ reason: "Kernel startup failed",
118
+ }),
119
+ );
120
+ expect(
121
+ screen.getByRole("heading", { name: "Kernel failed to start" }),
122
+ ).toBeVisible();
123
+ expect(screen.queryByRole("list")).not.toBeInTheDocument();
124
+
125
+ act(() =>
126
+ store.set(connectionAtom, {
127
+ state: ConnectionState.CONNECTING,
128
+ phase: "preparing-environment",
129
+ }),
130
+ );
131
+ act(() => vi.advanceTimersByTime(500));
132
+ expect(screen.getByRole("list")).toHaveTextContent("Preparing environment");
133
+ });
134
+
135
+ it("shows kernel startup while sandbox metadata is loading, then adds environment preparation", () => {
136
+ const store = mount();
137
+ const sandbox = store.get(sandboxAtom);
138
+ act(() => store.set(sandboxAtom, null));
139
+ act(() => vi.advanceTimersByTime(500));
140
+ expect(screen.getByText("Starting kernel")).toBeVisible();
141
+ expect(screen.getAllByRole("listitem")).toHaveLength(1);
142
+
143
+ act(() => store.set(sandboxAtom, sandbox));
144
+ const stages = within(screen.getByRole("list"));
145
+ expect(stages.getByText("Preparing environment")).toBeVisible();
146
+ expect(stages.getByText("Start kernel")).toBeVisible();
147
+ });
148
+
149
+ it("shows ordinary environment preparation failures in the kernel stage", () => {
150
+ const store = mount();
151
+ act(() => store.set(sandboxAtom, null));
152
+ act(() => vi.advanceTimersByTime(500));
153
+ expect(screen.getByText("Starting kernel")).toBeVisible();
154
+ expect(screen.getAllByRole("listitem")).toHaveLength(1);
155
+ act(() => {
156
+ store.set(
157
+ kernelStartupErrorAtom,
158
+ "Configured Python environment is missing",
159
+ );
160
+ store.set(connectionAtom, {
161
+ state: ConnectionState.CLOSED,
162
+ phase: "preparing-environment",
163
+ code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
164
+ reason: "Kernel startup failed",
165
+ });
166
+ });
167
+ expect(screen.getByRole("listitem")).toHaveTextContent(
168
+ "Kernel failed to start",
169
+ );
170
+ expect(screen.getByRole("status")).toHaveTextContent(
171
+ "Kernel failed to start",
172
+ );
173
+ expect(screen.getByLabelText("Error details")).toHaveTextContent(
174
+ "Configured Python environment is missing",
175
+ );
176
+ });
177
+
178
+ it("reports the inline disclosure as expanded only when Packages and runtime details are open", () => {
179
+ const store = mount({ existingCells: true });
180
+ act(() => {
181
+ store.set(chromeAtom, (value) => ({
182
+ ...value,
183
+ isSidebarOpen: true,
184
+ selectedPanel: "packages",
185
+ }));
186
+ store.set(runtimeDetailsExpandedAtom, false);
187
+ });
188
+ act(() => vi.advanceTimersByTime(500));
189
+ const toggle = screen.getByRole("button", { name: /Open Packages/ });
190
+ expect(toggle).toHaveAttribute("aria-expanded", "false");
191
+ fireEvent.click(toggle);
192
+ expect(toggle).toHaveAttribute("aria-expanded", "true");
193
+ act(() => store.set(runtimeDetailsExpandedAtom, false));
194
+ expect(toggle).toHaveAttribute("aria-expanded", "false");
195
+ act(() => {
196
+ store.set(runtimeDetailsExpandedAtom, true);
197
+ store.set(chromeAtom, (value) => ({ ...value, isSidebarOpen: false }));
198
+ });
199
+ expect(toggle).toHaveAttribute("aria-expanded", "false");
200
+ });
201
+
81
202
  it("opens Packages from the minimal inline status when cells exist", () => {
82
- const store = mount(true);
203
+ const store = mount({ existingCells: true });
83
204
  act(() => vi.advanceTimersByTime(500));
84
205
  expect(screen.queryByRole("list")).not.toBeInTheDocument();
85
206
  fireEvent.click(screen.getByRole("button", { name: /Open Packages/ }));
@@ -87,14 +208,100 @@ it("opens Packages from the minimal inline status when cells exist", () => {
87
208
  isSidebarOpen: true,
88
209
  selectedPanel: "packages",
89
210
  });
90
- act(() => store.set(connectionAtom, { state: WebSocketState.OPEN }));
211
+ act(() => store.set(connectionAtom, { state: ConnectionState.OPEN }));
91
212
  expect(screen.getByRole("status")).toHaveTextContent(/^Ready$/);
92
213
  });
93
214
 
215
+ it("uses an inline notice for an existing ordinary notebook, opens collapsed details, and offers retry on failure", () => {
216
+ const onRetry = vi.fn();
217
+ const store = mount({ existingCells: true, onRetry });
218
+ act(() => {
219
+ store.set(sandboxAtom, null);
220
+ store.set(connectionAtom, { state: ConnectionState.CONNECTING });
221
+ store.set(runtimeDetailsExpandedAtom, false);
222
+ });
223
+ act(() => vi.advanceTimersByTime(500));
224
+ const statusRow = screen.getByRole("region", {
225
+ name: "Notebook startup",
226
+ }).parentElement;
227
+ fireEvent.click(screen.getByRole("button", { name: /Open Packages/ }));
228
+ expect(store.get(chromeAtom)).toMatchObject({
229
+ isSidebarOpen: true,
230
+ selectedPanel: "packages",
231
+ });
232
+ expect(store.get(runtimeDetailsExpandedAtom)).toBe(true);
233
+ act(() =>
234
+ store.set(connectionAtom, {
235
+ state: ConnectionState.CLOSED,
236
+ code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
237
+ reason: "Kernel startup failed",
238
+ }),
239
+ );
240
+ expect(
241
+ screen.getByRole("button", {
242
+ name: /Kernel failed to start Open Packages/,
243
+ }),
244
+ ).toBeVisible();
245
+ fireEvent.click(screen.getByRole("button", { name: "Try again" }));
246
+ expect(onRetry).toHaveBeenCalledOnce();
247
+ act(() => store.set(connectionAtom, { state: ConnectionState.OPEN }));
248
+ expect(screen.queryByRole("region", { name: "Notebook startup" })).toBeNull();
249
+ expect(statusRow).not.toBeInTheDocument();
250
+ });
251
+
252
+ it.each([
253
+ { existingCells: false, sandbox: false },
254
+ { existingCells: true, sandbox: false },
255
+ { existingCells: false, sandbox: true },
256
+ { existingCells: true, sandbox: true },
257
+ ])(
258
+ "keeps errors in the notebook without chrome (cells=$existingCells, sandbox=$sandbox)",
259
+ ({ existingCells, sandbox }) => {
260
+ const onRetry = vi.fn();
261
+ const store = mount({ existingCells, onRetry, canOpenPackages: false });
262
+ act(() => {
263
+ if (!sandbox) {
264
+ store.set(sandboxAtom, null);
265
+ }
266
+ store.set(connectionAtom, {
267
+ state: ConnectionState.CONNECTING,
268
+ phase: "starting-kernel",
269
+ });
270
+ });
271
+ act(() => vi.advanceTimersByTime(500));
272
+ expect(screen.getByText("Starting kernel")).toBeVisible();
273
+ expect(screen.getByRole("status")).toHaveTextContent("Starting kernel…");
274
+ expect(screen.queryByRole("button")).not.toBeInTheDocument();
275
+
276
+ act(() => {
277
+ store.set(kernelStartupErrorAtom, "Could not import the runtime");
278
+ store.set(connectionAtom, {
279
+ state: ConnectionState.CLOSED,
280
+ phase: "starting-kernel",
281
+ code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
282
+ reason: "Kernel startup failed",
283
+ });
284
+ });
285
+ expect(screen.getByLabelText("Error details")).toHaveTextContent(
286
+ "Could not import the runtime",
287
+ );
288
+ expect(screen.getByRole("status")).toHaveTextContent(
289
+ "Kernel failed to start",
290
+ );
291
+ expect(
292
+ screen.queryByRole("button", { name: /Open Packages/ }),
293
+ ).not.toBeInTheDocument();
294
+ if (!sandbox) {
295
+ fireEvent.click(screen.getByRole("button", { name: "Try again" }));
296
+ }
297
+ expect(onRetry).toHaveBeenCalledTimes(sandbox ? 0 : 1);
298
+ },
299
+ );
300
+
94
301
  it("does not flash Ready for a startup that finished before the notice appeared", () => {
95
- const store = mount(true);
302
+ const store = mount({ existingCells: true });
96
303
  act(() => vi.advanceTimersByTime(200));
97
- act(() => store.set(connectionAtom, { state: WebSocketState.OPEN }));
304
+ act(() => store.set(connectionAtom, { state: ConnectionState.OPEN }));
98
305
  expect(screen.queryByRole("status")).not.toBeInTheDocument();
99
306
  act(() => vi.advanceTimersByTime(2000));
100
307
  expect(screen.queryByRole("status")).not.toBeInTheDocument();
@@ -103,11 +310,11 @@ it("does not flash Ready for a startup that finished before the notice appeared"
103
310
  it("replaces Ready with a new attempt and never dismisses a failure", () => {
104
311
  const store = mount();
105
312
  act(() => vi.advanceTimersByTime(500));
106
- act(() => store.set(connectionAtom, { state: WebSocketState.OPEN }));
313
+ act(() => store.set(connectionAtom, { state: ConnectionState.OPEN }));
107
314
  act(() => vi.advanceTimersByTime(1000));
108
315
  act(() =>
109
316
  store.set(connectionAtom, {
110
- state: WebSocketState.CONNECTING,
317
+ state: ConnectionState.CONNECTING,
111
318
  phase: "starting-kernel",
112
319
  }),
113
320
  );
@@ -115,7 +322,7 @@ it("replaces Ready with a new attempt and never dismisses a failure", () => {
115
322
  expect(screen.getByText("Starting kernel")).toBeInTheDocument();
116
323
  act(() =>
117
324
  store.set(connectionAtom, {
118
- state: WebSocketState.CLOSED,
325
+ state: ConnectionState.CLOSED,
119
326
  code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
120
327
  phase: "starting-kernel",
121
328
  reason: "Kernel startup failed",
@@ -128,9 +335,9 @@ it("replaces Ready with a new attempt and never dismisses a failure", () => {
128
335
  });
129
336
 
130
337
  it("shows a sync as a single operation, without pretending to restart the kernel", () => {
131
- const store = mount(true);
338
+ const store = mount({ existingCells: true });
132
339
  act(() => {
133
- store.set(connectionAtom, { state: WebSocketState.OPEN });
340
+ store.set(connectionAtom, { state: ConnectionState.OPEN });
134
341
  store.set(sandboxSyncAtom, { kind: "running" });
135
342
  });
136
343
  act(() => vi.advanceTimersByTime(500));
@@ -141,7 +348,7 @@ it("shows a sync as a single operation, without pretending to restart the kernel
141
348
  });
142
349
 
143
350
  it("restores syncing in the existing status and stays quiet for a completed snapshot", () => {
144
- const store = mount(true);
351
+ const store = mount({ existingCells: true });
145
352
  const operation: EnvironmentOperation = {
146
353
  operation_id: "sync",
147
354
  action: "sync",
@@ -162,7 +369,7 @@ it("restores syncing in the existing status and stays quiet for a completed snap
162
369
  },
163
370
  }));
164
371
  act(() => {
165
- store.set(connectionAtom, { state: WebSocketState.OPEN });
372
+ store.set(connectionAtom, { state: ConnectionState.OPEN });
166
373
  restore({ kind: "succeeded" });
167
374
  });
168
375
  act(() => vi.advanceTimersByTime(2000));
@@ -0,0 +1,61 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import type { PropsWithChildren } from "react";
3
+ import type { DisplayConnectionNotice } from "@/core/network/useConnectionNotice";
4
+ import { cn } from "@/utils/cn";
5
+ import {
6
+ ConnectionStatusIcon,
7
+ hasStartupStages,
8
+ StartupProgress,
9
+ } from "./startup-progress";
10
+
11
+ export function ConnectionErrorOutput({ error }: { error: string }) {
12
+ return (
13
+ <pre
14
+ tabIndex={0}
15
+ aria-label="Error details"
16
+ 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"
17
+ >
18
+ {error}
19
+ </pre>
20
+ );
21
+ }
22
+
23
+ export function ConnectionDetails({
24
+ notice,
25
+ surface = "sidebar",
26
+ children,
27
+ }: PropsWithChildren<{
28
+ notice: DisplayConnectionNotice;
29
+ surface?: "notebook" | "sidebar";
30
+ }>) {
31
+ const showSteps = hasStartupStages(notice);
32
+ const failed = !notice.pending && !notice.ready;
33
+ return (
34
+ <div className="min-w-0 text-sm">
35
+ {showSteps ? (
36
+ <StartupProgress notice={notice} surface={surface} />
37
+ ) : (
38
+ <div className="flex items-center gap-2" role="status">
39
+ <ConnectionStatusIcon notice={notice} />
40
+ <h2
41
+ className={cn(
42
+ surface === "notebook" && "text-base",
43
+ failed ? "font-medium text-(--red-11)" : "text-foreground",
44
+ )}
45
+ >
46
+ {notice.title}
47
+ </h2>
48
+ </div>
49
+ )}
50
+ {(failed || (!showSteps && surface === "notebook")) && (
51
+ <p className={cn("mt-2", failed && "text-foreground")}>
52
+ {notice.description}
53
+ </p>
54
+ )}
55
+ {notice.error && (surface === "sidebar" || !notice.sandbox) && (
56
+ <ConnectionErrorOutput error={notice.error} />
57
+ )}
58
+ {children}
59
+ </div>
60
+ );
61
+ }
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- import { useAtomValue } from "jotai";
2
+ import { useAtom, useAtomValue } from "jotai";
3
3
  import { ArrowRightIcon, ChevronRightIcon } from "lucide-react";
4
4
  import { useState } from "react";
5
5
  import { Button } from "@/components/ui/button";
@@ -8,25 +8,31 @@ import type { AppConfig } from "@/core/config/config-schema";
8
8
  import { connectionAtom } from "@/core/network/connection";
9
9
  import { useConnectionNotice } from "@/core/network/useConnectionNotice";
10
10
  import { sandboxAtom } from "@/core/packages/sandbox-state";
11
- import { WebSocketState } from "@/core/websocket/types";
11
+ import { ConnectionState } from "@/core/websocket/types";
12
12
  import { useInterval } from "@/hooks/useInterval";
13
13
  import { cn } from "@/utils/cn";
14
- import { SandboxErrorOutput } from "../chrome/panels/sandbox-panel";
14
+ import { runtimeDetailsExpandedAtom } from "../chrome/panels/runtime-details-state";
15
15
  import { chromeAtom, useChromeActions } from "../chrome/state";
16
16
  import { VerticalLayoutWrapper } from "../renderers/vertical-layout/vertical-layout-wrapper";
17
- import { ConnectionStatusIcon, StartupProgress } from "./startup-progress";
17
+ import { ConnectionDetails } from "./connection-details";
18
+ import { ConnectionStatusIcon, hasStartupStages } from "./startup-progress";
18
19
 
19
20
  export const ConnectionNotice = ({
20
21
  appConfig,
21
22
  onRetry,
23
+ canOpenPackages = true,
22
24
  }: {
23
25
  appConfig: AppConfig;
24
26
  onRetry: () => void;
27
+ canOpenPackages?: boolean;
25
28
  }) => {
26
29
  const notice = useConnectionNotice();
27
30
  const connection = useAtomValue(connectionAtom);
28
31
  const hasCells = useAtomValue(hasCellsAtom);
29
32
  const sandbox = useAtomValue(sandboxAtom);
33
+ const [detailsExpanded, setDetailsExpanded] = useAtom(
34
+ runtimeDetailsExpandedAtom,
35
+ );
30
36
  const chrome = useAtomValue(chromeAtom);
31
37
  const packagesOpen =
32
38
  (chrome.isSidebarOpen && chrome.selectedPanel === "packages") ||
@@ -36,48 +42,60 @@ export const ConnectionNotice = ({
36
42
 
37
43
  // Reconnection uses the footer indicator while existing cells stay visible.
38
44
  const reconnecting =
39
- connection.state === WebSocketState.CONNECTING &&
45
+ connection.state === ConnectionState.CONNECTING &&
40
46
  connection.phase === "reconnecting";
41
47
 
42
- if (sandbox?.backend && hasCells) {
48
+ const openDetails = () => {
49
+ setDetailsExpanded(true);
50
+ openApplication("packages");
51
+ };
52
+
53
+ if (!notice && !sandbox?.backend) {
54
+ return null;
55
+ }
56
+
57
+ if (hasCells && canOpenPackages) {
43
58
  const title =
44
59
  notice?.ready && notice.kind === "startup" ? "Ready" : notice?.title;
45
60
  return (
46
61
  <VerticalLayoutWrapper
47
62
  appConfig={appConfig}
48
- // Reserve the status row and gutter so completion never shifts cells.
63
+ // Sandboxes retain this row for subsequent environment syncs.
49
64
  className="shrink-0 h-12 pb-0 sm:pb-0 print:hidden"
50
65
  innerClassName="pb-0 sm:pb-0 pr-4"
51
66
  >
52
67
  {notice && !reconnecting && (
53
- <section aria-label="Notebook startup">
68
+ <section
69
+ aria-label="Notebook startup"
70
+ className="flex items-center gap-4"
71
+ >
54
72
  <button
55
73
  type="button"
56
- onClick={() => openApplication("packages")}
74
+ onClick={openDetails}
57
75
  aria-label={`${title} Open Packages`}
58
- aria-expanded={packagesOpen}
76
+ aria-expanded={packagesOpen && detailsExpanded}
59
77
  className="flex h-6 items-center gap-2 whitespace-nowrap text-xs text-muted-foreground hover:text-foreground rounded focus-visible:outline-2 focus-visible:outline-ring"
60
78
  >
61
79
  <ConnectionStatusIcon notice={notice} />
62
80
  <output>{title}</output>
63
81
  <ChevronRightIcon className="size-3" aria-hidden={true} />
64
82
  </button>
83
+ {!notice.pending && !notice.ready && !notice.sandbox && (
84
+ <Button variant="text" size="xs" onClick={onRetry}>
85
+ Try again
86
+ </Button>
87
+ )}
65
88
  </section>
66
89
  )}
67
90
  </VerticalLayoutWrapper>
68
91
  );
69
92
  }
70
93
 
71
- if (!notice || (hasCells && reconnecting)) {
94
+ if (!notice) {
72
95
  return null;
73
96
  }
74
97
 
75
- const showSteps =
76
- notice.sandbox &&
77
- notice.kind === "startup" &&
78
- (notice.ready ||
79
- notice.phase === "preparing-environment" ||
80
- notice.phase === "starting-kernel");
98
+ const showSteps = hasStartupStages(notice);
81
99
  return (
82
100
  <VerticalLayoutWrapper
83
101
  appConfig={appConfig}
@@ -87,51 +105,26 @@ export const ConnectionNotice = ({
87
105
  <section
88
106
  aria-label="Notebook startup"
89
107
  className={cn(
90
- "text-muted-foreground",
91
- hasCells
92
- ? "mt-4 mb-8 border rounded-lg px-5 py-5"
93
- : "max-w-md mx-auto mt-16 sm:mt-24 px-4",
94
- hasCells && !notice.pending && "border-(--red-7)",
108
+ "text-muted-foreground max-w-md mx-auto px-4",
109
+ hasCells ? "mt-4 mb-8" : "mt-16 sm:mt-24",
95
110
  )}
96
111
  >
97
- {showSteps ? (
98
- <StartupProgress notice={notice} surface="notebook" />
99
- ) : (
100
- <div role="status" className="flex items-center gap-2.5">
101
- <ConnectionStatusIcon notice={notice} />
102
- <h2
103
- className={cn(
104
- "text-base",
105
- notice.pending || notice.ready
106
- ? "font-normal text-foreground"
107
- : "font-medium text-(--red-11)",
108
- )}
109
- >
110
- {notice.title}
111
- </h2>
112
- </div>
112
+ {!canOpenPackages && showSteps && (
113
+ <output className="sr-only">{notice.title}</output>
113
114
  )}
115
+ <ConnectionDetails
116
+ notice={notice}
117
+ surface={canOpenPackages ? "notebook" : "sidebar"}
118
+ />
114
119
  <div className={showSteps ? "mt-8" : "ml-6.5"}>
115
- {!showSteps && (
116
- <p
117
- className={cn(
118
- "mt-3 text-sm leading-7",
119
- !notice.pending && "text-foreground",
120
- )}
121
- >
122
- {notice.description}
123
- </p>
124
- )}
125
- {!notice.sandbox && notice.error && (
126
- <SandboxErrorOutput error={notice.error} />
127
- )}
128
120
  <div
129
121
  className={cn(
130
122
  "flex flex-wrap items-center gap-x-6 gap-y-3",
131
123
  showSteps ? "border-t border-border/60 pt-4" : "mt-5",
132
124
  )}
133
125
  >
134
- {!notice.ready &&
126
+ {canOpenPackages &&
127
+ !notice.ready &&
135
128
  !packagesOpen &&
136
129
  (notice.sandbox || notice.pending) && (
137
130
  <Button
@@ -141,7 +134,7 @@ export const ConnectionNotice = ({
141
134
  "p-0 text-xs gap-1.5",
142
135
  showSteps ? "h-6" : "h-auto",
143
136
  )}
144
- onClick={() => openApplication("packages")}
137
+ onClick={openDetails}
145
138
  >
146
139
  {notice.pending ? "View setup details" : "Open Packages"}
147
140
  <ArrowRightIcon className="size-3" aria-hidden={true} />