@marimo-team/islands 0.25.2-dev0 → 0.25.2-dev100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/dist/{ConnectedDataExplorerComponent-C2d9ysUI.js → ConnectedDataExplorerComponent-BZmqc_F0.js} +11 -11
  2. package/dist/{ErrorBoundary-2usl042r.js → ErrorBoundary-Dcb6Zg4M.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-AFhOQTt8.js → abnfDiagram-VCTEODGH-C_Lmaa2j.js} +3 -3
  4. package/dist/{any-language-editor-CycIVIeP.js → any-language-editor-BFzqhOBR.js} +5 -5
  5. package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
  6. package/dist/{architectureDiagram-5GKGNRK7-BngksAAQ.js → architectureDiagram-5GKGNRK7-BKMataHB.js} +5 -5
  7. package/dist/{asciiarmor-GKQFJXQG.js → asciiarmor-BWNxzkG7.js} +1 -1
  8. package/dist/{asn1-BsSb7HP5.js → asn1-Bcn2QutK.js} +1 -1
  9. package/dist/assets/__vite-browser-external-BqAtzd2P.js +1 -0
  10. package/dist/assets/{worker-D7hWi02M.js → worker-Bf8dt6S-.js} +5 -5
  11. package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
  12. package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-BeHOjyDk.js} +9 -9
  13. package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
  14. package/dist/{button-DdXAm8iz.js → button-BtsM2UqM.js} +312 -283
  15. package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
  16. package/dist/{capabilities-B3ce_GNu.js → capabilities-A5jrzjCJ.js} +1 -1
  17. package/dist/{cells-Cv93oav_.js → cells-DZi0ioak.js} +4330 -4313
  18. package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
  19. package/dist/{chat-ui-fVyVOhYN.js → chat-ui-CwOWzoSO.js} +46 -46
  20. package/dist/{check-B7cIK6gb.js → check-CNP79M3A.js} +1 -1
  21. package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-CH7Gpamd.js} +5 -5
  22. package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-AI7CvgKn.js} +1 -1
  23. package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BSvuTkX4.js} +1 -1
  24. package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-CLshwT9T.js} +1 -1
  25. package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-wnHcn-lH.js} +3 -3
  26. package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-7O2p8hut.js} +2 -2
  27. package/dist/{chunk-IMKFNOWR-UOVZuZVn.js → chunk-IMKFNOWR-Bu0Vh_Yi.js} +6 -6
  28. package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-B9_Alrxb.js} +5 -5
  29. package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-PeQPH2fD.js} +6 -6
  30. package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-D9twiFuU.js} +1 -1
  31. package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-BUiNs18s.js} +1 -1
  32. package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-D8S9NPCy.js} +1 -1
  33. package/dist/{chunk-SHT3W25Y-CrEPyWy1.js → chunk-SHT3W25Y-B2dyNZ31.js} +8 -8
  34. package/dist/{chunk-SVP7TREG-uIyyySp6.js → chunk-SVP7TREG-D7UPvB10.js} +2 -2
  35. package/dist/{chunk-TICWLB2K-DdXM3eg6.js → chunk-TICWLB2K-BNaGoadd.js} +6 -6
  36. package/dist/classDiagram-ZZMXUADV-Bbo2n384.js +30 -0
  37. package/dist/classDiagram-v2-VYDZK3BY-xR8cGP0r.js +30 -0
  38. package/dist/{clike-E2lFbGVj.js → clike-CxK9W55Z.js} +1 -1
  39. package/dist/{clojure-Dn_K4RlK.js → clojure-Dzcvwpxk.js} +1 -1
  40. package/dist/{cmake-DpN2Top5.js → cmake-DYr-71zp.js} +1 -1
  41. package/dist/{cobol-Chf22-GM.js → cobol-DC3g37Kq.js} +1 -1
  42. package/dist/{code-visibility-rUDTB2Ce.js → code-visibility-DTB0i3UU.js} +6 -6
  43. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  44. package/dist/{common-BVErJKjc.js → common-CaVEr6tY.js} +11801 -11503
  45. package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
  46. package/dist/{copy-icon-CLdENY__.js → copy-icon-BY7jgcaV.js} +3 -3
  47. package/dist/{crystal-DCM3yc4r.js → crystal-ih5ax5tQ.js} +1 -1
  48. package/dist/{css-DkZ9mMyI.js → css-CN_wP7_R.js} +1 -1
  49. package/dist/{cynefinDiagram-5FMLGOSQ-zknaAsGy.js → cynefinDiagram-5FMLGOSQ-CCDn4Z9e.js} +3 -3
  50. package/dist/{cypher-Drw_8U5I.js → cypher-CqGRcmZo.js} +1 -1
  51. package/dist/{d-CsVGcKMF.js → d-Cj0sOW2z.js} +1 -1
  52. package/dist/{dagre-GXQ25YYZ-BhMOoMGJ.js → dagre-GXQ25YYZ-BJiUO_SV.js} +10 -10
  53. package/dist/{data-grid-overlay-editor-7ANmo9c-.js → data-grid-overlay-editor-BzTuqI2T.js} +1 -1
  54. package/dist/{diagram-S7CK7UJ4-V5-Z-EDY.js → diagram-S7CK7UJ4-BZfxFNRR.js} +4 -4
  55. package/dist/{diagram-UQ7AKVKN-qw8AjDal.js → diagram-UQ7AKVKN-1xcsiIMg.js} +3 -3
  56. package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
  57. package/dist/{diagram-VX7I27RA-DfuqFb1E.js → diagram-VX7I27RA-DmRsnHYY.js} +5 -5
  58. package/dist/{diagram-Z3DM3KII-DpWwlYZB.js → diagram-Z3DM3KII--b49ryKx.js} +3 -3
  59. package/dist/{dialog-CgNq6y9-.js → dialog-CmExhUDI.js} +26 -26
  60. package/dist/{diff-CBikYCUF.js → diff-B_hUkiat.js} +1 -1
  61. package/dist/{dist-Df0wKI0F.js → dist-BK4Oj99o.js} +1 -1
  62. package/dist/{dist-BVGtK7Ht.js → dist-BLfKmR-l.js} +1 -1
  63. package/dist/{dist-B8D7McG3.js → dist-BMQf5zIS.js} +46 -46
  64. package/dist/{dist-C2KzV-vf.js → dist-BorMD-uX.js} +2 -2
  65. package/dist/{dist-Cs2FijYk.js → dist-BuaRHxOc.js} +2 -2
  66. package/dist/{dist-DPcEtqmG.js → dist-Bvs24R_E.js} +47 -47
  67. package/dist/{dist-lA1Cttkb.js → dist-C8fAKSH1.js} +41 -41
  68. package/dist/{dist-DszxuxS1.js → dist-CLdpGQVr.js} +2 -2
  69. package/dist/{dist-CO1AwwG_.js → dist-CN8zI-XC.js} +209 -209
  70. package/dist/{dist-D1PpnuZB.js → dist-CN_BeG2I.js} +1 -1
  71. package/dist/{dist-CPGxfVGX.js → dist-CSJ0MDRw.js} +1 -1
  72. package/dist/{dist-Cm3iAFMD.js → dist-CSbh1PNP.js} +3 -3
  73. package/dist/{dist-9x1ZRe-e.js → dist-Cg7gzw-a.js} +2 -2
  74. package/dist/{dist-B1vYLK28.js → dist-CkTTIdBe.js} +345 -345
  75. package/dist/{dist-BRxfaJgs.js → dist-CrSP_H1M.js} +296 -296
  76. package/dist/{dist-C2wDlYdD.js → dist-D-wwqlzJ.js} +2 -2
  77. package/dist/{dist-BtKIs9N-.js → dist-D6d86eNJ.js} +1 -1
  78. package/dist/{dist-DHOTQar0.js → dist-DBtSl3sf.js} +1 -1
  79. package/dist/{dist-KzZ7WELx.js → dist-DiDibOYr.js} +120 -120
  80. package/dist/{dist-Kxgjxakw.js → dist-DoE4XJBC.js} +1277 -1222
  81. package/dist/{dist-BHCHt1NI.js → dist-F8Ep36rk.js} +1 -1
  82. package/dist/{dist-C8xMLVYi.js → dist-OR1OnN-y.js} +44 -44
  83. package/dist/{dist-1HDa70oE.js → dist-PXYI_yuP.js} +3 -3
  84. package/dist/{dist-CMh_W4y4.js → dist-diIx5qJW.js} +2 -2
  85. package/dist/{dockerfile-DJnSntVB.js → dockerfile-D0VKN500.js} +2 -2
  86. package/dist/dropdown-menu-Cz4TdOJh.js +4678 -0
  87. package/dist/{dtd-BHa4v0Bn.js → dtd-B8FGSWWe.js} +1 -1
  88. package/dist/{dylan-BypL2Zz8.js → dylan-DbIBYIrw.js} +1 -1
  89. package/dist/{ebnf-5guncNu-.js → ebnf-D-YbYLdk.js} +1 -1
  90. package/dist/{ebnfDiagram-PWID7BFC-C20OnNMZ.js → ebnfDiagram-PWID7BFC-rSwVyh4y.js} +3 -3
  91. package/dist/{ecl-iRcVIKYZ.js → ecl-DBmkdWAd.js} +1 -1
  92. package/dist/{eiffel-BEqF9aU4.js → eiffel-CcWSDDzK.js} +1 -1
  93. package/dist/{elm-DYcfNE9c.js → elm-MC-b8a6C.js} +1 -1
  94. package/dist/{erDiagram-RLTQ6QDP-DBXLWO9v.js → erDiagram-RLTQ6QDP-Bfd3iAoC.js} +12 -12
  95. package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
  96. package/dist/error-banner-D30nA9nE.js +362 -0
  97. package/dist/{error-entries-DLl0XqoW.js → error-entries-BovkFYNy.js} +2 -2
  98. package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
  99. package/dist/{esm-h8f7-1CJ.js → esm-DAVrGVKP.js} +378 -372
  100. package/dist/{factor-3nzOwLuN.js → factor-Ys-13HOP.js} +2 -2
  101. package/dist/{fcl-C90TGnJJ.js → fcl-DnwditDr.js} +1 -1
  102. package/dist/{feedback-button-K1inEVfd.js → feedback-button-CHGz2EXX.js} +10 -10
  103. package/dist/flowDiagram-HODETNUW-D7IBKS12.js +16 -0
  104. package/dist/{formats-Cl_67ghI.js → formats-DhhbdyAH.js} +3 -3
  105. package/dist/{forth-DEaRrLUi.js → forth-DiMuIXFe.js} +1 -1
  106. package/dist/{fortran-Bv6JRUjY.js → fortran-hkrF2eM4.js} +1 -1
  107. package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-B4m_YsKa.js} +2 -2
  108. package/dist/{gas-JNerWj3-.js → gas-DlhqN9k8.js} +1 -1
  109. package/dist/{gherkin-CSrl-H70.js → gherkin-0SlhEZ3t.js} +1 -1
  110. package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-QRBbvWXh.js} +2 -2
  111. package/dist/{glide-data-editor-D2fDO5aG.js → glide-data-editor-WxMsJlmb.js} +11 -11
  112. package/dist/{glide-utils-B3rUT5PI.js → glide-utils-BVJ4fkxX.js} +3 -3
  113. package/dist/{globals-NylFP0CX.js → globals-BROokniw.js} +3 -3
  114. package/dist/{groovy-X7euO_vE.js → groovy-YhcTMyvX.js} +1 -1
  115. package/dist/{haskell-C48Z70Az.js → haskell-CodLxrtT.js} +1 -1
  116. package/dist/{haxe-CAUWMmwR.js → haxe-CiRWNFkH.js} +1 -1
  117. package/dist/{html-to-image-CmkwfNkf.js → html-to-image-Cn1_16-x.js} +543 -565
  118. package/dist/{http-BrSBnhDH.js → http-Bh6HhdNR.js} +1 -1
  119. package/dist/{idl-BXuPleZv.js → idl-DZgBq75I.js} +1 -1
  120. package/dist/{infoDiagram-27XIBGKW-ntpxMfrq.js → infoDiagram-27XIBGKW-DVQFYvhg.js} +2 -2
  121. package/dist/{ishikawaDiagram-5VMMS53U-BllIlHE5.js → ishikawaDiagram-5VMMS53U-viPND-nm.js} +3 -3
  122. package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
  123. package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BeeJdJo3.js} +2 -2
  124. package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
  125. package/dist/{kanban-definition-UXKFOSKX-GYtNMjtS.js → kanban-definition-UXKFOSKX-Dcl_ECO9.js} +9 -9
  126. package/dist/{label-BslhXqL6.js → label-DQO1jFjf.js} +96 -93
  127. package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
  128. package/dist/{loader-DEZSzvma.js → loader-Cm-ATtou.js} +1 -1
  129. package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
  130. package/dist/main.js +6966 -6827
  131. package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
  132. package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
  133. package/dist/{mermaid-Dnzoxjt1.js → mermaid-BfhcnSj-.js} +54 -54
  134. package/dist/{mindmap-definition-YA3MSWOX-Cth76xgH.js → mindmap-definition-YA3MSWOX-BdxxhF-5.js} +11 -11
  135. package/dist/{mirc-CqeibO3N.js → mirc-De9aSAZM.js} +1 -1
  136. package/dist/{mllike-D54QZYTP.js → mllike-BbugeaY_.js} +1 -1
  137. package/dist/{modelica-DuML2-8V.js → modelica-BjJwWw1F.js} +1 -1
  138. package/dist/{mscgen-CJmKwp3b.js → mscgen-DwiRH5ma.js} +1 -1
  139. package/dist/{mumps-DaVgFtkd.js → mumps--plbDM9o.js} +1 -1
  140. package/dist/{nginx-BXN1rqI0.js → nginx-C4Df7REc.js} +1 -1
  141. package/dist/{nsis-CMfRqf0V.js → nsis-fiiOqLc3.js} +7 -7
  142. package/dist/{ntriples-BiOGlMDR.js → ntriples-jV77I4k8.js} +1 -1
  143. package/dist/{number-overlay-editor-B4XyCoMu.js → number-overlay-editor-DCj0MZgn.js} +1 -1
  144. package/dist/{octave-CgVnzxKk.js → octave-Cztd01tF.js} +1 -1
  145. package/dist/{oz-B2mky97X.js → oz-Bl8o3BDl.js} +1 -1
  146. package/dist/{pascal-BoZhBf6s.js → pascal-BO5JqysR.js} +1 -1
  147. package/dist/{pegDiagram-XKGWAZYB-Cu4uOXii.js → pegDiagram-XKGWAZYB-Du5p2s0w.js} +3 -3
  148. package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
  149. package/dist/{pieDiagram-E7YTZNPT-Bh3eDa9s.js → pieDiagram-E7YTZNPT-DJg-SOIq.js} +3 -3
  150. package/dist/{pig-B2mB-01d.js → pig-BWGR8wZw.js} +1 -1
  151. package/dist/{powershell-D0zT88Aj.js → powershell-DT99xlz_.js} +1 -1
  152. package/dist/{process-output-CYN5E-iO.js → process-output-CUG57KRp.js} +4 -4
  153. package/dist/{properties-3_5qCgOj.js → properties-Q-rkxld0.js} +1 -1
  154. package/dist/{protobuf-Dgoxfi1H.js → protobuf-DKyWZbs7.js} +1 -1
  155. package/dist/{pug-CNRdd8oG.js → pug-42ZJUbEC.js} +2 -2
  156. package/dist/{puppet-DzILxZfz.js → puppet-B4UozHhh.js} +1 -1
  157. package/dist/purify.es-DMv5zIkJ.js +866 -0
  158. package/dist/{python-AfVdMn_l.js → python-DREjAV__.js} +1 -1
  159. package/dist/{q-C6p-CGWh.js → q-Bi63IpBO.js} +1 -1
  160. package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-keLfFx9f.js} +1 -1
  161. package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
  162. package/dist/{railroadDiagram-O6MQD6OU-DG-M6Rnc.js → railroadDiagram-O6MQD6OU-C0ojm-6_.js} +3 -3
  163. package/dist/{requirementDiagram-BXWQKSXE-DCwsThh0.js → requirementDiagram-BXWQKSXE-CNwNBmI3.js} +11 -11
  164. package/dist/{reveal-component-Dtm5GH3p.js → reveal-component-CSY54dq4.js} +10 -10
  165. package/dist/{rpm-Bx7FkjTO.js → rpm-DPb1DeKM.js} +1 -1
  166. package/dist/{ruby-BMzgq2bf.js → ruby-U7fZA4DP.js} +2 -2
  167. package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-Bh4EsJox.js} +1 -1
  168. package/dist/{sas-ClGVnK3F.js → sas-CLk1JpTn.js} +1 -1
  169. package/dist/{scheme-C0MXqXep.js → scheme-CT-2k2Tl.js} +1 -1
  170. package/dist/select-Bs-nmvm6.js +1344 -0
  171. package/dist/{sequenceDiagram-WJ2MYXX4-CbXB1_PU.js → sequenceDiagram-WJ2MYXX4-DQaW5qBG.js} +4 -4
  172. package/dist/{shell-CiQZv6oG.js → shell-BLO7fcsk.js} +1 -1
  173. package/dist/{sieve-BiIMePvV.js → sieve-nG3C7WNH.js} +1 -1
  174. package/dist/{simple-mode-8ETW2RS6.js → simple-mode-C683Q7or.js} +1 -1
  175. package/dist/{smalltalk-9-llftyG.js → smalltalk-BROcZybA.js} +1 -1
  176. package/dist/{solr-CxCKEuwq.js → solr-mVltHNc5.js} +1 -1
  177. package/dist/{sparql-BRmy7pzx.js → sparql-Cv1Ksr4v.js} +1 -1
  178. package/dist/{spec-DQBRQSba.js → spec-DVsoMvYT.js} +116 -135
  179. package/dist/{spreadsheet-UCNUIGsn.js → spreadsheet-BwTnp5K_.js} +1 -1
  180. package/dist/{sql-D0hSGZ-H.js → sql-CjLt0122.js} +1 -1
  181. package/dist/{stateDiagram-D77RDMKH-A-Zf3Sb2.js → stateDiagram-D77RDMKH-BDa515QC.js} +13 -13
  182. package/dist/stateDiagram-v2-MP3YSRHH-ChNddepZ.js +30 -0
  183. package/dist/{stex-UeT_Aofp.js → stex-Btf3omL8.js} +1 -1
  184. package/dist/style.css +1 -1
  185. package/dist/{stylus-Fi4waA2H.js → stylus-Dt4VvLXL.js} +1 -1
  186. package/dist/{swift-NqPyaBye.js → swift-DHsn_CVI.js} +1 -1
  187. package/dist/{swimlanes-42K2YHIH-B_pMf0J4.js → swimlanes-42K2YHIH-M4IdGi8J.js} +10 -10
  188. package/dist/swimlanesDiagram-VR7AAH4N-FUSwmzEp.js +30 -0
  189. package/dist/{swiper-component-IOUowglM.js → swiper-component-CpN-hewZ.js} +2 -2
  190. package/dist/{tcl-B4f0xfmM.js → tcl-CV0OLBOl.js} +1 -1
  191. package/dist/{textile-CnNbnPTe.js → textile-D320oKVM.js} +1 -1
  192. package/dist/{tiddlywiki-CSGSOg38.js → tiddlywiki-BVVNvfy4.js} +1 -1
  193. package/dist/{tiki-9F02WBA6.js → tiki-BF2aDPlB.js} +1 -1
  194. package/dist/{timeline-definition-24CTP7MA-DTXFjTTM.js → timeline-definition-24CTP7MA-DH-kvakg.js} +3 -3
  195. package/dist/{toDate-C67bxMWn.js → toDate-vEi5kTfY.js} +4 -5
  196. package/dist/{toast-DvY70eFX.js → toast-DfEpJedt.js} +157 -161
  197. package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
  198. package/dist/{tooltip-qB8NlSqV.js → tooltip-CuNWg2ay.js} +543 -579
  199. package/dist/{troff-DlfvveK1.js → troff-DQUFcClZ.js} +1 -1
  200. package/dist/{ttcn--YVSkGs_.js → ttcn-CQL1duJS.js} +1 -1
  201. package/dist/{ttcn-cfg-Bb1Knl_J.js → ttcn-cfg-BMmEFJPu.js} +1 -1
  202. package/dist/{turtle-DC24v1bz.js → turtle-C3esgsRr.js} +1 -1
  203. package/dist/{use-restore-focus-D5D9xEjZ.js → use-restore-focus-kmgwrL8q.js} +1833 -1625
  204. package/dist/{useAsyncData-BD6AStMt.js → useAsyncData-rkAlR_vh.js} +1 -1
  205. package/dist/{useDateFormatter-BXQGu86d.js → useDateFormatter-C-tz65rD.js} +52 -31
  206. package/dist/{useDeepCompareMemoize-D_HNdyvI.js → useDeepCompareMemoize-BlHFBj5_.js} +1 -1
  207. package/dist/{useIframeCapabilities-CVtNkI3Y.js → useIframeCapabilities-C1Bt04Iz.js} +1 -1
  208. package/dist/{useLifecycle-DPgiiwwU.js → useLifecycle-B68iY077.js} +3 -3
  209. package/dist/{useTheme-DzXmYZ5V.js → useTheme-BwSgeAFb.js} +2 -2
  210. package/dist/{vb-Dpc8vhvF.js → vb-RK1eDXRl.js} +1 -1
  211. package/dist/{vbscript-B-Y1XnZe.js → vbscript-BCOeM0de.js} +1 -1
  212. package/dist/{vega-component-tFOzgarw.js → vega-component-C-bPttRN.js} +9 -9
  213. package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
  214. package/dist/{vennDiagram-4TSXK5OY-BPHjZo0R.js → vennDiagram-4TSXK5OY-d5g7XeiI.js} +3 -3
  215. package/dist/{verilog-DhiEaoUl.js → verilog-DqQTzVn8.js} +1 -1
  216. package/dist/{vhdl-D4X23YKO.js → vhdl-vQr2bfmi.js} +1 -1
  217. package/dist/{wardleyDiagram-VM6X3IG4-6fTLYBuD.js → wardleyDiagram-VM6X3IG4-BfX3bSzR.js} +3 -3
  218. package/dist/{webidl-SyzNxWpJ.js → webidl-DzX7N40e.js} +1 -1
  219. package/dist/{xquery-BC2R4Hk6.js → xquery-Cw_Q_hGR.js} +1 -1
  220. package/dist/{xychartDiagram-S5SC5T6Z-BYjwjrzE.js → xychartDiagram-S5SC5T6Z-C1QsLZg7.js} +5 -5
  221. package/dist/{yacas-DLNXPMmH.js → yacas-DiC4jJBE.js} +1 -1
  222. package/dist/{z80-CDXWHOO6.js → z80-CUOQDEJO.js} +1 -1
  223. package/package.json +24 -23
  224. package/src/__tests__/mount.test.ts +6 -6
  225. package/src/components/chat/__tests__/chat-history-popover.test.tsx +157 -0
  226. package/src/components/chat/chat-history-popover.tsx +98 -17
  227. package/src/components/chat/chat-panel.tsx +29 -0
  228. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  229. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  230. package/src/components/data-table/TableTopBar.tsx +4 -0
  231. package/src/components/data-table/__tests__/export-actions.test.tsx +1111 -14
  232. package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
  233. package/src/components/data-table/__tests__/schemas.test.ts +57 -0
  234. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  235. package/src/components/data-table/charts/__tests__/slider-field.test.tsx +54 -0
  236. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  237. package/src/components/data-table/charts/components/form-fields.tsx +3 -1
  238. package/src/components/data-table/charts/constants.ts +11 -10
  239. package/src/components/data-table/charts/types.ts +1 -0
  240. package/src/components/data-table/data-table.tsx +3 -0
  241. package/src/components/data-table/export-actions.tsx +365 -81
  242. package/src/components/data-table/pagination.tsx +16 -2
  243. package/src/components/data-table/range-focus/__tests__/atoms.test.ts +11 -11
  244. package/src/components/data-table/schemas.ts +90 -14
  245. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
  246. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
  247. package/src/components/editor/actions/__tests__/useSetOutputsExpanded.test.ts +42 -0
  248. package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
  249. package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
  250. package/src/components/editor/actions/useNotebookActions.tsx +20 -0
  251. package/src/components/editor/actions/useRestartKernel.tsx +2 -2
  252. package/src/components/editor/actions/useSetOutputsExpanded.ts +67 -0
  253. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +224 -17
  254. package/src/components/editor/alerts/connection-details.tsx +61 -0
  255. package/src/components/editor/alerts/connection-notice.tsx +46 -53
  256. package/src/components/editor/alerts/startup-progress.tsx +73 -129
  257. package/src/components/editor/app-container.tsx +2 -2
  258. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +2 -2
  259. package/src/components/editor/cell/CreateCellButton.tsx +2 -2
  260. package/src/components/editor/cell/DeleteButton.tsx +2 -2
  261. package/src/components/editor/cell/RunButton.tsx +3 -3
  262. package/src/components/editor/cell/StopButton.tsx +2 -2
  263. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +4 -4
  264. package/src/components/editor/chrome/components/feedback-button.tsx +3 -3
  265. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +8 -8
  266. package/src/components/editor/chrome/panels/__tests__/{sandbox-details.test.tsx → runtime-details.test.tsx} +94 -22
  267. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +4 -4
  268. package/src/components/editor/chrome/panels/packages-panel.tsx +8 -29
  269. package/src/components/editor/chrome/panels/{sandbox-details-state.ts → runtime-details-state.ts} +1 -1
  270. package/src/components/editor/chrome/panels/{sandbox-panel.tsx → runtime-panel.tsx} +38 -66
  271. package/src/components/editor/chrome/panels/runtime-status-toggle.tsx +56 -0
  272. package/src/components/editor/chrome/panels/sandbox-controller.tsx +2 -2
  273. package/src/components/editor/chrome/wrapper/app-chrome.tsx +3 -3
  274. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +2 -2
  275. package/src/components/editor/controls/Controls.tsx +3 -3
  276. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +2 -2
  277. package/src/components/editor/header/__tests__/status.test.tsx +4 -4
  278. package/src/components/editor/header/app-header.tsx +2 -2
  279. package/src/components/editor/header/status.tsx +3 -3
  280. package/src/components/editor/navigation/__tests__/navigation.test.ts +8 -8
  281. package/src/components/tracing/tracing.test.tsx +30 -30
  282. package/src/components/ui/__tests__/slider.test.tsx +37 -0
  283. package/src/components/ui/progress-stages.tsx +114 -0
  284. package/src/components/ui/slider.tsx +2 -0
  285. package/src/core/ai/__tests__/state.test.ts +120 -0
  286. package/src/core/ai/state.ts +36 -10
  287. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
  288. package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
  289. package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
  290. package/src/core/codemirror/readonly/extension.ts +2 -2
  291. package/src/core/config/pair.ts +0 -1
  292. package/src/core/datasets/__tests__/data-source-discovery.test.ts +2 -2
  293. package/src/core/edit-app.tsx +21 -1
  294. package/src/core/export/hooks.ts +2 -2
  295. package/src/core/hotkeys/hotkeys.ts +12 -0
  296. package/src/core/islands/bootstrap.ts +1 -0
  297. package/src/core/kernel/session.ts +9 -0
  298. package/src/core/network/__tests__/connection.test.ts +3 -3
  299. package/src/core/network/connection-notice.ts +5 -5
  300. package/src/core/network/connection.ts +9 -9
  301. package/src/core/network/requests-lazy.ts +2 -2
  302. package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
  303. package/src/core/packages/useSandboxController.ts +6 -6
  304. package/src/core/runtime/__tests__/adapter.test.ts +6 -6
  305. package/src/core/runtime/adapter.ts +7 -7
  306. package/src/core/runtime/config.ts +2 -2
  307. package/src/core/saving/filename.ts +2 -2
  308. package/src/core/saving/save-component.tsx +5 -5
  309. package/src/core/saving/useAutoSave.ts +2 -2
  310. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  311. package/src/core/wasm/worker/bootstrap.ts +22 -3
  312. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
  313. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
  314. package/src/core/websocket/connection-utils.ts +21 -21
  315. package/src/core/websocket/types.ts +8 -9
  316. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
  317. package/src/css/katex-css.test.ts +166 -0
  318. package/src/css/katex.min.css +169 -168
  319. package/src/mount.tsx +2 -2
  320. package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
  321. package/src/plugins/core/registerReactComponent.tsx +3 -1
  322. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  323. package/src/plugins/impl/DataTablePlugin.tsx +23 -2
  324. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  325. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  326. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  327. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  328. package/src/plugins/impl/FileBrowserPlugin.tsx +45 -15
  329. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  330. package/src/plugins/impl/NumberPlugin.tsx +1 -1
  331. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  332. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  333. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  334. package/src/plugins/impl/SliderPlugin.tsx +5 -1
  335. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  336. package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
  337. package/src/plugins/impl/TextInputPlugin.tsx +10 -2
  338. package/src/plugins/impl/__test__/slider-labels.test.tsx +136 -0
  339. package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
  340. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
  341. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +85 -2
  342. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  343. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  344. package/src/plugins/impl/common/labeled.tsx +9 -3
  345. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
  346. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
  347. package/src/stories/cell.stories.tsx +2 -2
  348. package/src/stories/dataframe.stories.tsx +7 -0
  349. package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
  350. package/src/stories/progress-stages.stories.tsx +62 -0
  351. package/src/stories/runtime-existing.stories.tsx +44 -0
  352. package/src/stories/runtime-maintenance.stories.tsx +40 -0
  353. package/src/stories/runtime-pixi.stories.tsx +28 -0
  354. package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
  355. package/src/stories/runtime-uv.stories.tsx +56 -0
  356. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  357. package/dist/classDiagram-ZZMXUADV-BiATbBE4.js +0 -30
  358. package/dist/classDiagram-v2-VYDZK3BY-JnH97GYw.js +0 -30
  359. package/dist/dropdown-menu-CZy06LAq.js +0 -4502
  360. package/dist/error-banner-B94dcDmP.js +0 -391
  361. package/dist/flowDiagram-HODETNUW-DL52nMkt.js +0 -16
  362. package/dist/purify.es-DgKyQviY.js +0 -805
  363. package/dist/select-C6plhmZr.js +0 -970
  364. package/dist/stateDiagram-v2-MP3YSRHH-D9YMnUGx.js +0 -30
  365. package/dist/swimlanesDiagram-VR7AAH4N-Ctgy-yGP.js +0 -30
  366. package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
@@ -10,7 +10,7 @@ import { viewStateAtom } from "@/core/mode";
10
10
  import {
11
11
  type ConnectionStatus,
12
12
  WebSocketClosedReason,
13
- WebSocketState,
13
+ ConnectionState,
14
14
  } from "@/core/websocket/types";
15
15
  import { StatusOverlay } from "../status";
16
16
 
@@ -40,7 +40,7 @@ describe("StatusOverlay disconnect indicator", () => {
40
40
  const onReconnect = vi.fn();
41
41
  const { getByTestId } = renderOverlay(
42
42
  {
43
- state: WebSocketState.CLOSED,
43
+ state: ConnectionState.CLOSED,
44
44
  code: WebSocketClosedReason.KERNEL_DISCONNECTED,
45
45
  reason: "kernel not found",
46
46
  },
@@ -57,7 +57,7 @@ describe("StatusOverlay disconnect indicator", () => {
57
57
 
58
58
  it("renders a disabled button when no onReconnect is provided", () => {
59
59
  const { getByTestId } = renderOverlay({
60
- state: WebSocketState.CLOSED,
60
+ state: ConnectionState.CLOSED,
61
61
  code: WebSocketClosedReason.KERNEL_DISCONNECTED,
62
62
  reason: "kernel not found",
63
63
  });
@@ -68,7 +68,7 @@ describe("StatusOverlay disconnect indicator", () => {
68
68
 
69
69
  it("leaves editor startup failures to the inline notice", () => {
70
70
  const { queryByTestId } = renderOverlay({
71
- state: WebSocketState.CLOSED,
71
+ state: ConnectionState.CLOSED,
72
72
  code: WebSocketClosedReason.KERNEL_STARTUP_ERROR,
73
73
  reason: "Failed to start kernel sandbox",
74
74
  });
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import React, { type PropsWithChildren } from "react";
4
- import { type ConnectionStatus, WebSocketState } from "@/core/websocket/types";
4
+ import { type ConnectionStatus, ConnectionState } from "@/core/websocket/types";
5
5
  import { Disconnected } from "../Disconnected";
6
6
 
7
7
  interface Props {
@@ -17,7 +17,7 @@ export const AppHeader: React.FC<PropsWithChildren<Props>> = ({
17
17
  return (
18
18
  <div className={className}>
19
19
  {children}
20
- {connection.state === WebSocketState.CLOSED && (
20
+ {connection.state === ConnectionState.CLOSED && (
21
21
  <Disconnected reason={connection.reason} />
22
22
  )}
23
23
  </div>
@@ -10,7 +10,7 @@ import { viewStateAtom } from "@/core/mode";
10
10
  import {
11
11
  type ConnectionStatus,
12
12
  WebSocketClosedReason,
13
- WebSocketState,
13
+ ConnectionState,
14
14
  } from "@/core/websocket/types";
15
15
  import { cn } from "@/utils/cn";
16
16
 
@@ -21,10 +21,10 @@ export const StatusOverlay: React.FC<{
21
21
  }> = ({ connection, isRunning, onReconnect }) => {
22
22
  const { mode } = useAtomValue(viewStateAtom);
23
23
  const isClosed =
24
- connection.state === WebSocketState.CLOSED &&
24
+ connection.state === ConnectionState.CLOSED &&
25
25
  (mode === "read" ||
26
26
  connection.code !== WebSocketClosedReason.KERNEL_STARTUP_ERROR);
27
- const isOpen = connection.state === WebSocketState.OPEN;
27
+ const isOpen = connection.state === ConnectionState.OPEN;
28
28
  // Editor startup failures have their own recovery UI.
29
29
  const canReconnect =
30
30
  isClosed && connection.code === WebSocketClosedReason.KERNEL_DISCONNECTED;
@@ -703,7 +703,7 @@ describe("useCellNavigationProps", () => {
703
703
  });
704
704
 
705
705
  expect(mockCopyCell).not.toHaveBeenCalled();
706
- expect(mockEvent.continuePropagation).not.toHaveBeenCalled();
706
+ expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
707
707
  });
708
708
  });
709
709
 
@@ -714,7 +714,7 @@ describe("useCellNavigationProps", () => {
714
714
  );
715
715
 
716
716
  const mockEvent = Mocks.keyboardEvent({
717
- key: "x",
717
+ key: "F24",
718
718
  target: document.createElement("div"),
719
719
  });
720
720
 
@@ -722,7 +722,7 @@ describe("useCellNavigationProps", () => {
722
722
  result.current.onKeyDown?.(mockEvent);
723
723
  });
724
724
 
725
- expect(mockEvent.continuePropagation).not.toHaveBeenCalled();
725
+ expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
726
726
  });
727
727
  });
728
728
 
@@ -1749,7 +1749,7 @@ describe("useCellEditorNavigationProps", () => {
1749
1749
  });
1750
1750
 
1751
1751
  expect(focusCell).toHaveBeenCalledWith(mockCellId);
1752
- expect(mockEvent.continuePropagation).not.toHaveBeenCalled();
1752
+ expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
1753
1753
  });
1754
1754
 
1755
1755
  it("should clear text selection when Escape is pressed with selection", () => {
@@ -1901,7 +1901,7 @@ describe("useCellEditorNavigationProps", () => {
1901
1901
  });
1902
1902
 
1903
1903
  expect(focusCell).not.toHaveBeenCalled();
1904
- expect(mockEvent.continuePropagation).not.toHaveBeenCalled();
1904
+ expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
1905
1905
  });
1906
1906
  });
1907
1907
 
@@ -1932,7 +1932,7 @@ describe("useCellEditorNavigationProps", () => {
1932
1932
  });
1933
1933
 
1934
1934
  expect(focusCell).toHaveBeenCalledWith(mockCellId);
1935
- expect(mockEvent.continuePropagation).not.toHaveBeenCalled();
1935
+ expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
1936
1936
  });
1937
1937
  });
1938
1938
 
@@ -1954,7 +1954,7 @@ describe("useCellEditorNavigationProps", () => {
1954
1954
  });
1955
1955
 
1956
1956
  expect(focusCell).toHaveBeenCalledWith(mockCellId);
1957
- expect(mockEvent.continuePropagation).not.toHaveBeenCalled();
1957
+ expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
1958
1958
  });
1959
1959
  });
1960
1960
 
@@ -1979,7 +1979,7 @@ describe("useCellEditorNavigationProps", () => {
1979
1979
  });
1980
1980
 
1981
1981
  expect(focusCell).toHaveBeenCalledWith(mockCellId);
1982
- expect(mockEvent.continuePropagation).not.toHaveBeenCalled();
1982
+ expect(mockEvent.stopPropagation).not.toHaveBeenCalled();
1983
1983
  });
1984
1984
  });
1985
1985
  });
@@ -5,36 +5,36 @@ import { formatChartTime } from "./utils";
5
5
  describe("formatChartTime", () => {
6
6
  beforeAll(() => {
7
7
  // Mock Date to always use UTC
8
- vi.spyOn(global.Date.prototype, "getFullYear").mockImplementation(
9
- function (this: Date) {
10
- return this.getUTCFullYear();
11
- },
12
- );
13
- vi.spyOn(global.Date.prototype, "getMonth").mockImplementation(
14
- function (this: Date) {
15
- return this.getUTCMonth();
16
- },
17
- );
18
- vi.spyOn(global.Date.prototype, "getDate").mockImplementation(
19
- function (this: Date) {
20
- return this.getUTCDate();
21
- },
22
- );
23
- vi.spyOn(global.Date.prototype, "getHours").mockImplementation(
24
- function (this: Date) {
25
- return this.getUTCHours();
26
- },
27
- );
28
- vi.spyOn(global.Date.prototype, "getMinutes").mockImplementation(
29
- function (this: Date) {
30
- return this.getUTCMinutes();
31
- },
32
- );
33
- vi.spyOn(global.Date.prototype, "getSeconds").mockImplementation(
34
- function (this: Date) {
35
- return this.getUTCSeconds();
36
- },
37
- );
8
+ vi.spyOn(global.Date.prototype, "getFullYear").mockImplementation(function (
9
+ this: Date,
10
+ ) {
11
+ return this.getUTCFullYear();
12
+ });
13
+ vi.spyOn(global.Date.prototype, "getMonth").mockImplementation(function (
14
+ this: Date,
15
+ ) {
16
+ return this.getUTCMonth();
17
+ });
18
+ vi.spyOn(global.Date.prototype, "getDate").mockImplementation(function (
19
+ this: Date,
20
+ ) {
21
+ return this.getUTCDate();
22
+ });
23
+ vi.spyOn(global.Date.prototype, "getHours").mockImplementation(function (
24
+ this: Date,
25
+ ) {
26
+ return this.getUTCHours();
27
+ });
28
+ vi.spyOn(global.Date.prototype, "getMinutes").mockImplementation(function (
29
+ this: Date,
30
+ ) {
31
+ return this.getUTCMinutes();
32
+ });
33
+ vi.spyOn(global.Date.prototype, "getSeconds").mockImplementation(function (
34
+ this: Date,
35
+ ) {
36
+ return this.getUTCSeconds();
37
+ });
38
38
  vi.spyOn(global.Date.prototype, "getMilliseconds").mockImplementation(
39
39
  function (this: Date) {
40
40
  return this.getUTCMilliseconds();
@@ -0,0 +1,37 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import { fireEvent, render } from "@testing-library/react";
3
+ import { describe, expect, it, vi } from "vitest";
4
+ import { SetupMocks } from "@/__mocks__/common";
5
+ import { Slider } from "../slider";
6
+
7
+ SetupMocks.resizeObserver();
8
+
9
+ describe("Slider", () => {
10
+ // Regression for #2593: steps below 1e-6 stringify in exponent notation
11
+ // ("1e-7"), which older radix versions counted as 0 decimal places, so
12
+ // every value was rounded to an integer and the slider never moved.
13
+ it.each([1e-6, 1e-7, 1e-9])("moves by a tiny step of %s", (step) => {
14
+ const onValueChange = vi.fn();
15
+ const { getByRole } = render(
16
+ <Slider
17
+ value={[step]}
18
+ min={step}
19
+ max={100 * step}
20
+ step={step}
21
+ onValueChange={onValueChange}
22
+ valueMap={(v) => v}
23
+ />,
24
+ );
25
+
26
+ fireEvent.keyDown(getByRole("slider"), { key: "ArrowRight" });
27
+
28
+ expect(onValueChange).toHaveBeenCalledWith([2 * step]);
29
+ });
30
+
31
+ it("forwards a direct accessible name to the thumb", () => {
32
+ const { getByRole } = render(
33
+ <Slider aria-label="Opacity" value={[50]} valueMap={(v) => v} />,
34
+ );
35
+ expect(getByRole("slider")).toHaveAccessibleName("Opacity");
36
+ });
37
+ });
@@ -0,0 +1,114 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import { AlertCircleIcon, CheckIcon, CircleIcon } from "lucide-react";
3
+ import type { ReactNode } from "react";
4
+ import { Spinner } from "@/components/icons/spinner";
5
+ import { cn } from "@/utils/cn";
6
+
7
+ export type ProgressState = "waiting" | "running" | "succeeded" | "failed";
8
+
9
+ export interface ProgressStage {
10
+ id: string;
11
+ state: ProgressState;
12
+ title: string;
13
+ description: string;
14
+ details?: ReactNode;
15
+ }
16
+
17
+ export function ProgressStatusIcon({
18
+ state,
19
+ variant = "icon",
20
+ }: {
21
+ state: ProgressState;
22
+ variant?: "icon" | "dot";
23
+ }) {
24
+ if (variant === "dot") {
25
+ return (
26
+ <span
27
+ aria-hidden={true}
28
+ className={cn(
29
+ "size-1.5 shrink-0 rounded-full",
30
+ {
31
+ waiting: "bg-muted-foreground",
32
+ running: "bg-muted-foreground motion-safe:animate-pulse",
33
+ succeeded: "bg-(--grass-9)",
34
+ failed: "bg-(--red-9)",
35
+ }[state],
36
+ )}
37
+ />
38
+ );
39
+ }
40
+ const Icon = {
41
+ waiting: CircleIcon,
42
+ running: Spinner,
43
+ succeeded: CheckIcon,
44
+ failed: AlertCircleIcon,
45
+ }[state];
46
+ return (
47
+ <Icon
48
+ aria-hidden={true}
49
+ className={cn(
50
+ "size-4 shrink-0",
51
+ {
52
+ waiting: "text-muted-foreground/50",
53
+ running: "motion-reduce:animate-none",
54
+ succeeded: "text-(--grass-11)",
55
+ failed: "text-(--red-11)",
56
+ }[state],
57
+ )}
58
+ />
59
+ );
60
+ }
61
+
62
+ export function ProgressStages({
63
+ stages,
64
+ label,
65
+ className,
66
+ }: {
67
+ stages: readonly ProgressStage[];
68
+ label: string;
69
+ className?: string;
70
+ }) {
71
+ return (
72
+ <ol aria-label={label} className={cn("space-y-6", className)}>
73
+ {stages.map((stage, index) => (
74
+ <li
75
+ key={stage.id}
76
+ aria-current={
77
+ stage.state === "running" || stage.state === "failed"
78
+ ? "step"
79
+ : undefined
80
+ }
81
+ className="relative flex items-start gap-3"
82
+ >
83
+ {index < stages.length - 1 && (
84
+ <span
85
+ aria-hidden={true}
86
+ className="absolute left-2 top-4.5 -bottom-6.5 border-l border-border"
87
+ />
88
+ )}
89
+ <span className="mt-0.5 text-muted-foreground">
90
+ <ProgressStatusIcon state={stage.state} />
91
+ </span>
92
+ <div className="min-w-0 flex-1">
93
+ <div
94
+ className={cn(
95
+ "text-sm",
96
+ stage.state === "failed"
97
+ ? "text-(--red-11)"
98
+ : stage.state === "waiting"
99
+ ? "text-muted-foreground"
100
+ : "text-foreground",
101
+ )}
102
+ >
103
+ {stage.title}
104
+ </div>
105
+ <p className="mt-1 text-xs text-muted-foreground">
106
+ {stage.description}
107
+ </p>
108
+ {stage.details}
109
+ </div>
110
+ </li>
111
+ ))}
112
+ </ol>
113
+ );
114
+ }
@@ -57,6 +57,8 @@ const Slider = React.forwardRef<
57
57
  <TooltipRoot delayDuration={0} open={open}>
58
58
  <TooltipTrigger asChild={true}>
59
59
  <SliderPrimitive.Thumb
60
+ aria-label={props["aria-label"]}
61
+ aria-labelledby={props["aria-labelledby"]}
60
62
  data-testid="thumb"
61
63
  className="block h-4 w-4 rounded-full shadow-xs-solid border border-blue-500 dark:border-primary dark:bg-accent bg-white hover:bg-blue-300 focus:bg-blue-300 transition-colors focus-visible:outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50"
62
64
  onFocus={openActions.setTrue}
@@ -0,0 +1,120 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { createStore } from "jotai";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { toast } from "@/components/ui/use-toast";
6
+ import { type Chat, type ChatId, chatStateAtom } from "../state";
7
+
8
+ vi.mock("@/components/ui/use-toast", () => ({ toast: vi.fn() }));
9
+
10
+ const KEY = "marimo:ai:chatState:v5";
11
+ const chatId = "saved-chat" as ChatId;
12
+ const chat: Chat = {
13
+ id: chatId,
14
+ title: "Saved conversation",
15
+ messages: [
16
+ { id: "message", role: "user", parts: [{ type: "text", text: "Hello" }] },
17
+ ],
18
+ createdAt: 1,
19
+ updatedAt: 1,
20
+ };
21
+
22
+ const unsubscribers: (() => void)[] = [];
23
+
24
+ function loadStore() {
25
+ const store = createStore();
26
+ unsubscribers.push(store.sub(chatStateAtom, vi.fn()));
27
+ return store;
28
+ }
29
+
30
+ function fillStorage() {
31
+ vi.spyOn(Storage.prototype, "setItem").mockImplementation(() => {
32
+ throw new DOMException("Storage is full", "QuotaExceededError");
33
+ });
34
+ }
35
+
36
+ describe("chat history storage", () => {
37
+ beforeEach(() => {
38
+ window.localStorage.clear();
39
+ window.localStorage.setItem(
40
+ KEY,
41
+ JSON.stringify({
42
+ chats: [[chatId, chat]],
43
+ activeChatId: chatId,
44
+ }),
45
+ );
46
+ });
47
+
48
+ afterEach(() => {
49
+ for (const unsubscribe of unsubscribers.splice(0)) {
50
+ unsubscribe();
51
+ }
52
+ vi.restoreAllMocks();
53
+ });
54
+
55
+ it("loads saved history when storage is full", () => {
56
+ fillStorage();
57
+ expect(loadStore().get(chatStateAtom)).toEqual({
58
+ chats: new Map([[chatId, chat]]),
59
+ activeChatId: chatId,
60
+ });
61
+ });
62
+
63
+ it("warns on save failure without interrupting in-memory updates", () => {
64
+ const store = loadStore();
65
+ const savedHistory = window.localStorage.getItem(KEY);
66
+ fillStorage();
67
+ const updatedChat = { ...chat, title: "Unsaved conversation" };
68
+ expect(() =>
69
+ store.set(chatStateAtom, {
70
+ chats: new Map([[chatId, updatedChat]]),
71
+ activeChatId: chatId,
72
+ }),
73
+ ).not.toThrow();
74
+
75
+ expect(store.get(chatStateAtom).chats.get(chatId)).toEqual(updatedChat);
76
+ expect(window.localStorage.getItem(KEY)).toBe(savedHistory);
77
+ expect(toast).toHaveBeenCalledWith(
78
+ expect.objectContaining({
79
+ id: "chat-storage-error",
80
+ once: true,
81
+ title: "Chat history couldn't be saved",
82
+ }),
83
+ );
84
+ });
85
+
86
+ it("frees storage when history is cleared even if further writes fail", () => {
87
+ window.localStorage.setItem("unrelated-setting", "keep");
88
+ const store = loadStore();
89
+ fillStorage();
90
+ store.set(chatStateAtom, { chats: new Map(), activeChatId: null });
91
+
92
+ expect(window.localStorage.getItem(KEY)).toBeNull();
93
+ expect(window.localStorage.getItem("unrelated-setting")).toBe("keep");
94
+ expect(loadStore().get(chatStateAtom)).toEqual({
95
+ chats: new Map(),
96
+ activeChatId: null,
97
+ });
98
+ expect(toast).not.toHaveBeenCalled();
99
+ });
100
+
101
+ it("removes saved history when only an empty chat remains and writes fail", () => {
102
+ const store = loadStore();
103
+ const emptyChat = { ...chat, messages: [] };
104
+ const state = {
105
+ chats: new Map([[chatId, emptyChat]]),
106
+ activeChatId: chatId,
107
+ };
108
+ fillStorage();
109
+
110
+ store.set(chatStateAtom, state);
111
+
112
+ expect(window.localStorage.getItem(KEY)).toBeNull();
113
+ expect(store.get(chatStateAtom)).toEqual(state);
114
+ expect(loadStore().get(chatStateAtom)).toEqual({
115
+ chats: new Map(),
116
+ activeChatId: null,
117
+ });
118
+ expect(toast).not.toHaveBeenCalled();
119
+ });
120
+ });
@@ -4,7 +4,9 @@ import type { UIMessage } from "@ai-sdk/react";
4
4
  import type { FileUIPart } from "ai";
5
5
  import { atom } from "jotai";
6
6
  import { atomWithStorage } from "jotai/utils";
7
+ import { toast } from "@/components/ui/use-toast";
7
8
  import { uniqueBy } from "@/utils/arrays";
9
+ import { Logger } from "@/utils/Logger";
8
10
  import { adaptForLocalStorage, jotaiJsonStorage } from "@/utils/storage/jotai";
9
11
  import type { TypedString } from "@/utils/typed";
10
12
  import type { CellId } from "../cells/ids";
@@ -85,22 +87,46 @@ function removeEmptyChats(chatState: Map<ChatId, Chat>): Map<ChatId, Chat> {
85
87
  return result;
86
88
  }
87
89
 
90
+ const chatStorage = adaptForLocalStorage({
91
+ toSerializable: (value: ChatState) => ({
92
+ chats: [...removeEmptyChats(value.chats).entries()],
93
+ activeChatId: value.activeChatId,
94
+ }),
95
+ fromSerializable: (value) => ({
96
+ chats: new Map(value.chats),
97
+ activeChatId: value.activeChatId,
98
+ }),
99
+ });
100
+
88
101
  export const chatStateAtom = atomWithStorage<ChatState>(
89
102
  KEY,
90
103
  {
91
104
  chats: new Map(),
92
105
  activeChatId: null,
93
106
  },
94
- adaptForLocalStorage({
95
- toSerializable: (value: ChatState) => ({
96
- chats: [...removeEmptyChats(value.chats).entries()],
97
- activeChatId: value.activeChatId,
98
- }),
99
- fromSerializable: (value) => ({
100
- chats: new Map(value.chats),
101
- activeChatId: value.activeChatId,
102
- }),
103
- }),
107
+ {
108
+ ...chatStorage,
109
+ setItem: (key, value) => {
110
+ try {
111
+ // Removing the key frees space even when no further writes can fit.
112
+ if (removeEmptyChats(value.chats).size === 0) {
113
+ chatStorage.removeItem(key);
114
+ } else {
115
+ chatStorage.setItem(key, value);
116
+ }
117
+ } catch (error) {
118
+ Logger.warn("Could not save chat history", error);
119
+ toast({
120
+ id: "chat-storage-error",
121
+ once: true,
122
+ title: "Chat history couldn't be saved",
123
+ description:
124
+ "Try deleting old chats. New messages may be lost when you reload.",
125
+ variant: "danger",
126
+ });
127
+ }
128
+ },
129
+ },
104
130
  );
105
131
 
106
132
  export const activeChatAtom = atom(