@marimo-team/islands 0.25.2-dev9 → 0.25.2-dev90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CqhQmp74.js → ConnectedDataExplorerComponent-BZmqc_F0.js} +11 -11
  2. package/dist/{ErrorBoundary-BK6f6roX.js → ErrorBoundary-Cmnsp7X-.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-aLGD44M7.js → abnfDiagram-VCTEODGH-C_Lmaa2j.js} +3 -3
  4. package/dist/{any-language-editor-dqxlUDlT.js → any-language-editor-BFzqhOBR.js} +5 -5
  5. package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
  6. package/dist/{architectureDiagram-5GKGNRK7-BGL5P81u.js → architectureDiagram-5GKGNRK7-BKMataHB.js} +5 -5
  7. package/dist/{asciiarmor-GKQFJXQG.js → asciiarmor-BWNxzkG7.js} +1 -1
  8. package/dist/{asn1-BsSb7HP5.js → asn1-Bcn2QutK.js} +1 -1
  9. package/dist/assets/__vite-browser-external-BqAtzd2P.js +1 -0
  10. package/dist/assets/{worker-D7hWi02M.js → worker-Bf8dt6S-.js} +5 -5
  11. package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
  12. package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-BeHOjyDk.js} +9 -9
  13. package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
  14. package/dist/{button-B0Xgl-Qn.js → button-BtsM2UqM.js} +300 -283
  15. package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
  16. package/dist/{capabilities-D7Ad8-zw.js → capabilities-A5jrzjCJ.js} +1 -1
  17. package/dist/{cells-5ppES-Un.js → cells-DZi0ioak.js} +4330 -4313
  18. package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
  19. package/dist/{chat-ui-Dv2V95k6.js → chat-ui-CwOWzoSO.js} +46 -46
  20. package/dist/{check-DGZ74tV2.js → check-CNP79M3A.js} +1 -1
  21. package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-CH7Gpamd.js} +5 -5
  22. package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-AI7CvgKn.js} +1 -1
  23. package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BSvuTkX4.js} +1 -1
  24. package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-CLshwT9T.js} +1 -1
  25. package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-wnHcn-lH.js} +3 -3
  26. package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-7O2p8hut.js} +2 -2
  27. package/dist/{chunk-IMKFNOWR-Cm3RgLDj.js → chunk-IMKFNOWR-Bu0Vh_Yi.js} +6 -6
  28. package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-B9_Alrxb.js} +5 -5
  29. package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-PeQPH2fD.js} +6 -6
  30. package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-D9twiFuU.js} +1 -1
  31. package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-BUiNs18s.js} +1 -1
  32. package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-D8S9NPCy.js} +1 -1
  33. package/dist/{chunk-SHT3W25Y-DedDYSP5.js → chunk-SHT3W25Y-B2dyNZ31.js} +8 -8
  34. package/dist/{chunk-SVP7TREG-B2SFkCAL.js → chunk-SVP7TREG-D7UPvB10.js} +2 -2
  35. package/dist/{chunk-TICWLB2K-DB6hjNOL.js → chunk-TICWLB2K-BNaGoadd.js} +6 -6
  36. package/dist/classDiagram-ZZMXUADV-Bbo2n384.js +30 -0
  37. package/dist/classDiagram-v2-VYDZK3BY-xR8cGP0r.js +30 -0
  38. package/dist/{clike-E2lFbGVj.js → clike-CxK9W55Z.js} +1 -1
  39. package/dist/{clojure-Dn_K4RlK.js → clojure-Dzcvwpxk.js} +1 -1
  40. package/dist/{cmake-DpN2Top5.js → cmake-DYr-71zp.js} +1 -1
  41. package/dist/{cobol-Chf22-GM.js → cobol-DC3g37Kq.js} +1 -1
  42. package/dist/{code-visibility-Ba_h3MSI.js → code-visibility-B5ZN4pNx.js} +6 -6
  43. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  44. package/dist/{common-0rJUT4CU.js → common-C0fEcRVO.js} +11904 -11621
  45. package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
  46. package/dist/{copy-icon-qmRg_VTX.js → copy-icon-BY7jgcaV.js} +3 -3
  47. package/dist/{crystal-DCM3yc4r.js → crystal-ih5ax5tQ.js} +1 -1
  48. package/dist/{css-DkZ9mMyI.js → css-CN_wP7_R.js} +1 -1
  49. package/dist/{cynefinDiagram-5FMLGOSQ-DzaZEqgD.js → cynefinDiagram-5FMLGOSQ-CCDn4Z9e.js} +3 -3
  50. package/dist/{cypher-Drw_8U5I.js → cypher-CqGRcmZo.js} +1 -1
  51. package/dist/{d-CsVGcKMF.js → d-Cj0sOW2z.js} +1 -1
  52. package/dist/{dagre-GXQ25YYZ-Cjf5GjU3.js → dagre-GXQ25YYZ-BJiUO_SV.js} +10 -10
  53. package/dist/{data-grid-overlay-editor-DvZ8ZYHw.js → data-grid-overlay-editor-Cq0iaJqU.js} +1 -1
  54. package/dist/{diagram-S7CK7UJ4-IhLt_khx.js → diagram-S7CK7UJ4-BZfxFNRR.js} +4 -4
  55. package/dist/{diagram-UQ7AKVKN-CQc6KLPB.js → diagram-UQ7AKVKN-1xcsiIMg.js} +3 -3
  56. package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
  57. package/dist/{diagram-VX7I27RA-DHmW9N1T.js → diagram-VX7I27RA-DmRsnHYY.js} +5 -5
  58. package/dist/{diagram-Z3DM3KII-zVKsg-Ty.js → diagram-Z3DM3KII--b49ryKx.js} +3 -3
  59. package/dist/{dialog-CILKhbsG.js → dialog-CmExhUDI.js} +26 -26
  60. package/dist/{diff-CBikYCUF.js → diff-B_hUkiat.js} +1 -1
  61. package/dist/{dist-Df0wKI0F.js → dist-BK4Oj99o.js} +1 -1
  62. package/dist/{dist-BVGtK7Ht.js → dist-BLfKmR-l.js} +1 -1
  63. package/dist/{dist-B8D7McG3.js → dist-BMQf5zIS.js} +46 -46
  64. package/dist/{dist-C2KzV-vf.js → dist-BorMD-uX.js} +2 -2
  65. package/dist/{dist-Cs2FijYk.js → dist-BuaRHxOc.js} +2 -2
  66. package/dist/{dist-DPcEtqmG.js → dist-Bvs24R_E.js} +47 -47
  67. package/dist/{dist-lA1Cttkb.js → dist-C8fAKSH1.js} +41 -41
  68. package/dist/{dist-DszxuxS1.js → dist-CLdpGQVr.js} +2 -2
  69. package/dist/{dist-CO1AwwG_.js → dist-CN8zI-XC.js} +209 -209
  70. package/dist/{dist-D1PpnuZB.js → dist-CN_BeG2I.js} +1 -1
  71. package/dist/{dist-CPGxfVGX.js → dist-CSJ0MDRw.js} +1 -1
  72. package/dist/{dist-Cm3iAFMD.js → dist-CSbh1PNP.js} +3 -3
  73. package/dist/{dist-9x1ZRe-e.js → dist-Cg7gzw-a.js} +2 -2
  74. package/dist/{dist-B1vYLK28.js → dist-CkTTIdBe.js} +345 -345
  75. package/dist/{dist-BRxfaJgs.js → dist-CrSP_H1M.js} +296 -296
  76. package/dist/{dist-C2wDlYdD.js → dist-D-wwqlzJ.js} +2 -2
  77. package/dist/{dist-BtKIs9N-.js → dist-D6d86eNJ.js} +1 -1
  78. package/dist/{dist-DHOTQar0.js → dist-DBtSl3sf.js} +1 -1
  79. package/dist/{dist-KzZ7WELx.js → dist-DiDibOYr.js} +120 -120
  80. package/dist/{dist-Kxgjxakw.js → dist-DoE4XJBC.js} +1277 -1222
  81. package/dist/{dist-BHCHt1NI.js → dist-F8Ep36rk.js} +1 -1
  82. package/dist/{dist-C8xMLVYi.js → dist-OR1OnN-y.js} +44 -44
  83. package/dist/{dist-1HDa70oE.js → dist-PXYI_yuP.js} +3 -3
  84. package/dist/{dist-CMh_W4y4.js → dist-diIx5qJW.js} +2 -2
  85. package/dist/{dockerfile-DJnSntVB.js → dockerfile-D0VKN500.js} +2 -2
  86. package/dist/dropdown-menu-Cz4TdOJh.js +4678 -0
  87. package/dist/{dtd-BHa4v0Bn.js → dtd-B8FGSWWe.js} +1 -1
  88. package/dist/{dylan-BypL2Zz8.js → dylan-DbIBYIrw.js} +1 -1
  89. package/dist/{ebnf-5guncNu-.js → ebnf-D-YbYLdk.js} +1 -1
  90. package/dist/{ebnfDiagram-PWID7BFC-DDd5hCRC.js → ebnfDiagram-PWID7BFC-rSwVyh4y.js} +3 -3
  91. package/dist/{ecl-iRcVIKYZ.js → ecl-DBmkdWAd.js} +1 -1
  92. package/dist/{eiffel-BEqF9aU4.js → eiffel-CcWSDDzK.js} +1 -1
  93. package/dist/{elm-DYcfNE9c.js → elm-MC-b8a6C.js} +1 -1
  94. package/dist/{erDiagram-RLTQ6QDP-D10NP0eI.js → erDiagram-RLTQ6QDP-Bfd3iAoC.js} +12 -12
  95. package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
  96. package/dist/error-banner-D30nA9nE.js +362 -0
  97. package/dist/{error-entries-B2Ux3Z2X.js → error-entries-BovkFYNy.js} +2 -2
  98. package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
  99. package/dist/{esm-h8f7-1CJ.js → esm-DAVrGVKP.js} +378 -372
  100. package/dist/{factor-3nzOwLuN.js → factor-Ys-13HOP.js} +2 -2
  101. package/dist/{fcl-C90TGnJJ.js → fcl-DnwditDr.js} +1 -1
  102. package/dist/{feedback-button-Bd-kdxIT.js → feedback-button-DpYfzMWP.js} +10 -10
  103. package/dist/flowDiagram-HODETNUW-D7IBKS12.js +16 -0
  104. package/dist/{formats-Q9gwlLyD.js → formats-DhhbdyAH.js} +3 -3
  105. package/dist/{forth-DEaRrLUi.js → forth-DiMuIXFe.js} +1 -1
  106. package/dist/{fortran-Bv6JRUjY.js → fortran-hkrF2eM4.js} +1 -1
  107. package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-B4m_YsKa.js} +2 -2
  108. package/dist/{gas-JNerWj3-.js → gas-DlhqN9k8.js} +1 -1
  109. package/dist/{gherkin-CSrl-H70.js → gherkin-0SlhEZ3t.js} +1 -1
  110. package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-QRBbvWXh.js} +2 -2
  111. package/dist/{glide-data-editor-DrEBdhP5.js → glide-data-editor-DFtk9eMf.js} +11 -11
  112. package/dist/{glide-utils-CzzWU59p.js → glide-utils-BVJ4fkxX.js} +3 -3
  113. package/dist/{globals-BVhJcU-3.js → globals-XdDkDS89.js} +3 -3
  114. package/dist/{groovy-X7euO_vE.js → groovy-YhcTMyvX.js} +1 -1
  115. package/dist/{haskell-C48Z70Az.js → haskell-CodLxrtT.js} +1 -1
  116. package/dist/{haxe-CAUWMmwR.js → haxe-CiRWNFkH.js} +1 -1
  117. package/dist/{html-to-image-BZBwkkDG.js → html-to-image-Cn1_16-x.js} +543 -565
  118. package/dist/{http-BrSBnhDH.js → http-Bh6HhdNR.js} +1 -1
  119. package/dist/{idl-BXuPleZv.js → idl-DZgBq75I.js} +1 -1
  120. package/dist/{infoDiagram-27XIBGKW-DrYu3UZC.js → infoDiagram-27XIBGKW-DVQFYvhg.js} +2 -2
  121. package/dist/{ishikawaDiagram-5VMMS53U-pmkGQJsA.js → ishikawaDiagram-5VMMS53U-viPND-nm.js} +3 -3
  122. package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
  123. package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BeeJdJo3.js} +2 -2
  124. package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
  125. package/dist/{kanban-definition-UXKFOSKX-wWGD9VLW.js → kanban-definition-UXKFOSKX-Dcl_ECO9.js} +9 -9
  126. package/dist/{label-MNhNNoN6.js → label-DQO1jFjf.js} +96 -93
  127. package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
  128. package/dist/{loader-C9OUkMrj.js → loader-Cm-ATtou.js} +1 -1
  129. package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
  130. package/dist/main.js +6866 -6746
  131. package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
  132. package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
  133. package/dist/{mermaid-Dfvntf3s.js → mermaid-BfhcnSj-.js} +54 -54
  134. package/dist/{mindmap-definition-YA3MSWOX-C2f1VIBR.js → mindmap-definition-YA3MSWOX-BdxxhF-5.js} +11 -11
  135. package/dist/{mirc-CqeibO3N.js → mirc-De9aSAZM.js} +1 -1
  136. package/dist/{mllike-D54QZYTP.js → mllike-BbugeaY_.js} +1 -1
  137. package/dist/{modelica-DuML2-8V.js → modelica-BjJwWw1F.js} +1 -1
  138. package/dist/{mscgen-CJmKwp3b.js → mscgen-DwiRH5ma.js} +1 -1
  139. package/dist/{mumps-DaVgFtkd.js → mumps--plbDM9o.js} +1 -1
  140. package/dist/{nginx-BXN1rqI0.js → nginx-C4Df7REc.js} +1 -1
  141. package/dist/{nsis-CMfRqf0V.js → nsis-fiiOqLc3.js} +7 -7
  142. package/dist/{ntriples-BiOGlMDR.js → ntriples-jV77I4k8.js} +1 -1
  143. package/dist/{number-overlay-editor-DthBBC83.js → number-overlay-editor-xPAwGgFC.js} +1 -1
  144. package/dist/{octave-CgVnzxKk.js → octave-Cztd01tF.js} +1 -1
  145. package/dist/{oz-B2mky97X.js → oz-Bl8o3BDl.js} +1 -1
  146. package/dist/{pascal-BoZhBf6s.js → pascal-BO5JqysR.js} +1 -1
  147. package/dist/{pegDiagram-XKGWAZYB-D6v5dz4M.js → pegDiagram-XKGWAZYB-Du5p2s0w.js} +3 -3
  148. package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
  149. package/dist/{pieDiagram-E7YTZNPT-BwFAhpYD.js → pieDiagram-E7YTZNPT-DJg-SOIq.js} +3 -3
  150. package/dist/{pig-B2mB-01d.js → pig-BWGR8wZw.js} +1 -1
  151. package/dist/{powershell-D0zT88Aj.js → powershell-DT99xlz_.js} +1 -1
  152. package/dist/{process-output-BSsWzfnY.js → process-output-CUG57KRp.js} +4 -4
  153. package/dist/{properties-3_5qCgOj.js → properties-Q-rkxld0.js} +1 -1
  154. package/dist/{protobuf-Dgoxfi1H.js → protobuf-DKyWZbs7.js} +1 -1
  155. package/dist/{pug-CNRdd8oG.js → pug-42ZJUbEC.js} +2 -2
  156. package/dist/{puppet-DzILxZfz.js → puppet-B4UozHhh.js} +1 -1
  157. package/dist/purify.es-DMv5zIkJ.js +866 -0
  158. package/dist/{python-AfVdMn_l.js → python-DREjAV__.js} +1 -1
  159. package/dist/{q-C6p-CGWh.js → q-Bi63IpBO.js} +1 -1
  160. package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-keLfFx9f.js} +1 -1
  161. package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
  162. package/dist/{railroadDiagram-O6MQD6OU-D6eOFr6Z.js → railroadDiagram-O6MQD6OU-C0ojm-6_.js} +3 -3
  163. package/dist/{requirementDiagram-BXWQKSXE-CHYsMgDR.js → requirementDiagram-BXWQKSXE-CNwNBmI3.js} +11 -11
  164. package/dist/{reveal-component-CX4Yqwsa.js → reveal-component-B_bLilty.js} +10 -10
  165. package/dist/{rpm-Bx7FkjTO.js → rpm-DPb1DeKM.js} +1 -1
  166. package/dist/{ruby-BMzgq2bf.js → ruby-U7fZA4DP.js} +2 -2
  167. package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-Bh4EsJox.js} +1 -1
  168. package/dist/{sas-ClGVnK3F.js → sas-CLk1JpTn.js} +1 -1
  169. package/dist/{scheme-C0MXqXep.js → scheme-CT-2k2Tl.js} +1 -1
  170. package/dist/select-Bs-nmvm6.js +1344 -0
  171. package/dist/{sequenceDiagram-WJ2MYXX4-BPAknhBp.js → sequenceDiagram-WJ2MYXX4-DQaW5qBG.js} +4 -4
  172. package/dist/{shell-CiQZv6oG.js → shell-BLO7fcsk.js} +1 -1
  173. package/dist/{sieve-BiIMePvV.js → sieve-nG3C7WNH.js} +1 -1
  174. package/dist/{simple-mode-8ETW2RS6.js → simple-mode-C683Q7or.js} +1 -1
  175. package/dist/{smalltalk-9-llftyG.js → smalltalk-BROcZybA.js} +1 -1
  176. package/dist/{solr-CxCKEuwq.js → solr-mVltHNc5.js} +1 -1
  177. package/dist/{sparql-BRmy7pzx.js → sparql-Cv1Ksr4v.js} +1 -1
  178. package/dist/{spec-D62vWpMT.js → spec-DVsoMvYT.js} +116 -135
  179. package/dist/{spreadsheet-UCNUIGsn.js → spreadsheet-BwTnp5K_.js} +1 -1
  180. package/dist/{sql-D0hSGZ-H.js → sql-CjLt0122.js} +1 -1
  181. package/dist/{stateDiagram-D77RDMKH-Cq249IQ4.js → stateDiagram-D77RDMKH-BDa515QC.js} +13 -13
  182. package/dist/stateDiagram-v2-MP3YSRHH-ChNddepZ.js +30 -0
  183. package/dist/{stex-UeT_Aofp.js → stex-Btf3omL8.js} +1 -1
  184. package/dist/style.css +1 -1
  185. package/dist/{stylus-Fi4waA2H.js → stylus-Dt4VvLXL.js} +1 -1
  186. package/dist/{swift-NqPyaBye.js → swift-DHsn_CVI.js} +1 -1
  187. package/dist/{swimlanes-42K2YHIH-Bh_S_HKD.js → swimlanes-42K2YHIH-M4IdGi8J.js} +10 -10
  188. package/dist/swimlanesDiagram-VR7AAH4N-FUSwmzEp.js +30 -0
  189. package/dist/{swiper-component-DkV7T44B.js → swiper-component-CpN-hewZ.js} +2 -2
  190. package/dist/{tcl-B4f0xfmM.js → tcl-CV0OLBOl.js} +1 -1
  191. package/dist/{textile-CnNbnPTe.js → textile-D320oKVM.js} +1 -1
  192. package/dist/{tiddlywiki-CSGSOg38.js → tiddlywiki-BVVNvfy4.js} +1 -1
  193. package/dist/{tiki-9F02WBA6.js → tiki-BF2aDPlB.js} +1 -1
  194. package/dist/{timeline-definition-24CTP7MA-ByNMgBE7.js → timeline-definition-24CTP7MA-DH-kvakg.js} +3 -3
  195. package/dist/{toDate-DWVp6uE1.js → toDate-vEi5kTfY.js} +4 -5
  196. package/dist/{toast-DcoJGS3-.js → toast-DfEpJedt.js} +157 -161
  197. package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
  198. package/dist/{tooltip-Bi36DgYh.js → tooltip-CuNWg2ay.js} +543 -579
  199. package/dist/{troff-DlfvveK1.js → troff-DQUFcClZ.js} +1 -1
  200. package/dist/{ttcn--YVSkGs_.js → ttcn-CQL1duJS.js} +1 -1
  201. package/dist/{ttcn-cfg-Bb1Knl_J.js → ttcn-cfg-BMmEFJPu.js} +1 -1
  202. package/dist/{turtle-DC24v1bz.js → turtle-C3esgsRr.js} +1 -1
  203. package/dist/{use-restore-focus-ZgG5Br63.js → use-restore-focus-kmgwrL8q.js} +1833 -1625
  204. package/dist/{useAsyncData-BD7NLQ3_.js → useAsyncData-rkAlR_vh.js} +1 -1
  205. package/dist/{useDateFormatter-D8XWr8lL.js → useDateFormatter-C-tz65rD.js} +52 -31
  206. package/dist/{useDeepCompareMemoize-CawMGSRU.js → useDeepCompareMemoize-BlHFBj5_.js} +1 -1
  207. package/dist/{useIframeCapabilities-BUMBOpsM.js → useIframeCapabilities-C1Bt04Iz.js} +1 -1
  208. package/dist/{useLifecycle-3vGhRa1o.js → useLifecycle-B68iY077.js} +3 -3
  209. package/dist/{useTheme-BOw801nZ.js → useTheme-BwSgeAFb.js} +2 -2
  210. package/dist/{vb-Dpc8vhvF.js → vb-RK1eDXRl.js} +1 -1
  211. package/dist/{vbscript-B-Y1XnZe.js → vbscript-BCOeM0de.js} +1 -1
  212. package/dist/{vega-component-9siY74NS.js → vega-component-C-bPttRN.js} +9 -9
  213. package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
  214. package/dist/{vennDiagram-4TSXK5OY-DY8CySdO.js → vennDiagram-4TSXK5OY-d5g7XeiI.js} +3 -3
  215. package/dist/{verilog-DhiEaoUl.js → verilog-DqQTzVn8.js} +1 -1
  216. package/dist/{vhdl-D4X23YKO.js → vhdl-vQr2bfmi.js} +1 -1
  217. package/dist/{wardleyDiagram-VM6X3IG4-DYC1AFni.js → wardleyDiagram-VM6X3IG4-BfX3bSzR.js} +3 -3
  218. package/dist/{webidl-SyzNxWpJ.js → webidl-DzX7N40e.js} +1 -1
  219. package/dist/{xquery-BC2R4Hk6.js → xquery-Cw_Q_hGR.js} +1 -1
  220. package/dist/{xychartDiagram-S5SC5T6Z-Df8LLnuY.js → xychartDiagram-S5SC5T6Z-C1QsLZg7.js} +5 -5
  221. package/dist/{yacas-DLNXPMmH.js → yacas-DiC4jJBE.js} +1 -1
  222. package/dist/{z80-CDXWHOO6.js → z80-CUOQDEJO.js} +1 -1
  223. package/package.json +16 -16
  224. package/src/__tests__/mount.test.ts +6 -6
  225. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  226. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  227. package/src/components/data-table/TableTopBar.tsx +4 -0
  228. package/src/components/data-table/__tests__/export-actions.test.tsx +1111 -14
  229. package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
  230. package/src/components/data-table/__tests__/schemas.test.ts +57 -0
  231. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  232. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  233. package/src/components/data-table/charts/constants.ts +11 -10
  234. package/src/components/data-table/charts/types.ts +1 -0
  235. package/src/components/data-table/data-table.tsx +3 -0
  236. package/src/components/data-table/export-actions.tsx +365 -81
  237. package/src/components/data-table/pagination.tsx +16 -2
  238. package/src/components/data-table/schemas.ts +90 -14
  239. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
  240. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
  241. package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
  242. package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
  243. package/src/components/editor/actions/useRestartKernel.tsx +2 -2
  244. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +224 -17
  245. package/src/components/editor/alerts/connection-details.tsx +61 -0
  246. package/src/components/editor/alerts/connection-notice.tsx +46 -53
  247. package/src/components/editor/alerts/startup-progress.tsx +73 -129
  248. package/src/components/editor/app-container.tsx +2 -2
  249. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +2 -2
  250. package/src/components/editor/cell/CreateCellButton.tsx +2 -2
  251. package/src/components/editor/cell/DeleteButton.tsx +2 -2
  252. package/src/components/editor/cell/RunButton.tsx +3 -3
  253. package/src/components/editor/cell/StopButton.tsx +2 -2
  254. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +4 -4
  255. package/src/components/editor/chrome/components/feedback-button.tsx +3 -3
  256. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +8 -8
  257. package/src/components/editor/chrome/panels/__tests__/{sandbox-details.test.tsx → runtime-details.test.tsx} +94 -22
  258. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +4 -4
  259. package/src/components/editor/chrome/panels/packages-panel.tsx +8 -29
  260. package/src/components/editor/chrome/panels/{sandbox-details-state.ts → runtime-details-state.ts} +1 -1
  261. package/src/components/editor/chrome/panels/{sandbox-panel.tsx → runtime-panel.tsx} +38 -66
  262. package/src/components/editor/chrome/panels/runtime-status-toggle.tsx +56 -0
  263. package/src/components/editor/chrome/panels/sandbox-controller.tsx +2 -2
  264. package/src/components/editor/chrome/wrapper/app-chrome.tsx +3 -3
  265. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +2 -2
  266. package/src/components/editor/controls/Controls.tsx +3 -3
  267. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +2 -2
  268. package/src/components/editor/header/__tests__/status.test.tsx +4 -4
  269. package/src/components/editor/header/app-header.tsx +2 -2
  270. package/src/components/editor/header/status.tsx +3 -3
  271. package/src/components/editor/navigation/__tests__/navigation.test.ts +8 -8
  272. package/src/components/ui/__tests__/slider.test.tsx +30 -0
  273. package/src/components/ui/progress-stages.tsx +114 -0
  274. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
  275. package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
  276. package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
  277. package/src/core/codemirror/readonly/extension.ts +2 -2
  278. package/src/core/config/pair.ts +0 -1
  279. package/src/core/datasets/__tests__/data-source-discovery.test.ts +2 -2
  280. package/src/core/edit-app.tsx +5 -1
  281. package/src/core/export/hooks.ts +2 -2
  282. package/src/core/islands/bootstrap.ts +1 -0
  283. package/src/core/kernel/session.ts +9 -0
  284. package/src/core/network/__tests__/connection.test.ts +3 -3
  285. package/src/core/network/connection-notice.ts +5 -5
  286. package/src/core/network/connection.ts +9 -9
  287. package/src/core/network/requests-lazy.ts +2 -2
  288. package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
  289. package/src/core/packages/useSandboxController.ts +6 -6
  290. package/src/core/runtime/__tests__/adapter.test.ts +6 -6
  291. package/src/core/runtime/adapter.ts +7 -7
  292. package/src/core/runtime/config.ts +2 -2
  293. package/src/core/saving/filename.ts +2 -2
  294. package/src/core/saving/save-component.tsx +5 -5
  295. package/src/core/saving/useAutoSave.ts +2 -2
  296. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  297. package/src/core/wasm/worker/bootstrap.ts +22 -3
  298. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
  299. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
  300. package/src/core/websocket/connection-utils.ts +21 -21
  301. package/src/core/websocket/types.ts +8 -9
  302. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
  303. package/src/css/katex.min.css +145 -144
  304. package/src/mount.tsx +2 -2
  305. package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
  306. package/src/plugins/core/registerReactComponent.tsx +3 -1
  307. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  308. package/src/plugins/impl/DataTablePlugin.tsx +23 -2
  309. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  310. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  311. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  312. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  313. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  314. package/src/plugins/impl/NumberPlugin.tsx +1 -1
  315. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  316. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  317. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  318. package/src/plugins/impl/SliderPlugin.tsx +1 -1
  319. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  320. package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
  321. package/src/plugins/impl/TextInputPlugin.tsx +10 -2
  322. package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
  323. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
  324. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  325. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  326. package/src/plugins/impl/common/labeled.tsx +9 -3
  327. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
  328. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
  329. package/src/stories/cell.stories.tsx +2 -2
  330. package/src/stories/dataframe.stories.tsx +7 -0
  331. package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
  332. package/src/stories/progress-stages.stories.tsx +62 -0
  333. package/src/stories/runtime-existing.stories.tsx +44 -0
  334. package/src/stories/runtime-maintenance.stories.tsx +40 -0
  335. package/src/stories/runtime-pixi.stories.tsx +28 -0
  336. package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
  337. package/src/stories/runtime-uv.stories.tsx +56 -0
  338. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  339. package/dist/classDiagram-ZZMXUADV-BwYhrSEX.js +0 -30
  340. package/dist/classDiagram-v2-VYDZK3BY-HecM04TM.js +0 -30
  341. package/dist/dropdown-menu-BaqM0t4N.js +0 -4502
  342. package/dist/error-banner-DzAmP0AQ.js +0 -391
  343. package/dist/flowDiagram-HODETNUW-DgcjSdPV.js +0 -16
  344. package/dist/purify.es-DgKyQviY.js +0 -805
  345. package/dist/select-BcObMjGz.js +0 -970
  346. package/dist/stateDiagram-v2-MP3YSRHH-Dk5QgdXF.js +0 -30
  347. package/dist/swimlanesDiagram-VR7AAH4N-CbztusY8.js +0 -30
  348. package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
package/src/mount.tsx CHANGED
@@ -62,7 +62,7 @@ import {
62
62
  import { maybeRegisterVSCodeBindings } from "./core/vscode/vscode-bindings";
63
63
  import type { FileStore } from "./core/wasm/store";
64
64
  import { notebookFileStore } from "./core/wasm/store";
65
- import { WebSocketState } from "./core/websocket/types";
65
+ import { ConnectionState } from "./core/websocket/types";
66
66
  import {
67
67
  handleWidgetMessage,
68
68
  WIDGET_REGISTRY,
@@ -359,7 +359,7 @@ function initStore(options: unknown) {
359
359
  });
360
360
  // If the remote runtime is not lazy, start it in CONNECTING
361
361
  if (!firstRuntimeConfig.lazy && !isStaticNotebook()) {
362
- store.set(connectionAtom, { state: WebSocketState.CONNECTING });
362
+ store.set(connectionAtom, { state: ConnectionState.CONNECTING });
363
363
  }
364
364
  } else {
365
365
  store.set(runtimeConfigAtom, {
@@ -32,6 +32,61 @@ function makePlugin(tagName: string) {
32
32
  };
33
33
  }
34
34
 
35
+ describe("stylesheet copying", () => {
36
+ afterEach(() => {
37
+ delete (Document.prototype as Partial<Document>).adoptedStyleSheets;
38
+ vi.restoreAllMocks();
39
+ vi.unstubAllGlobals();
40
+ });
41
+
42
+ test.each([
43
+ {
44
+ name: "linked stylesheet",
45
+ href: "http://localhost/assets/index.css",
46
+ title: "marimo-linked-test",
47
+ expectedBaseURL: "http://localhost/assets/index.css",
48
+ },
49
+ {
50
+ name: "inline stylesheet",
51
+ href: null,
52
+ title: "marimo-inline-test",
53
+ expectedBaseURL: document.baseURI,
54
+ },
55
+ ])(
56
+ "preserves the base URL of a $name",
57
+ ({ href, title, expectedBaseURL }) => {
58
+ const constructedStyleSheet = {
59
+ replaceSync: vi.fn(),
60
+ } as unknown as CSSStyleSheet;
61
+ const constructor = vi.fn(function () {
62
+ return constructedStyleSheet;
63
+ });
64
+ constructor.prototype.replace = vi.fn();
65
+ vi.stubGlobal("CSSStyleSheet", constructor);
66
+ Object.defineProperty(Document.prototype, "adoptedStyleSheets", {
67
+ configurable: true,
68
+ value: [],
69
+ });
70
+
71
+ const source = {
72
+ cssRules: [],
73
+ href,
74
+ ownerNode: null,
75
+ title,
76
+ } as unknown as CSSStyleSheet;
77
+ vi.spyOn(document, "styleSheets", "get").mockReturnValue([
78
+ source,
79
+ ] as unknown as StyleSheetList);
80
+
81
+ const tag = uniqueTag("stylesheet-base-url");
82
+ registerReactComponent(makePlugin(tag));
83
+ document.createElement(tag);
84
+
85
+ expect(constructor).toHaveBeenCalledWith({ baseURL: expectedBaseURL });
86
+ },
87
+ );
88
+ });
89
+
35
90
  describe("isCustomMarimoElement", () => {
36
91
  test("returns false for null", () => {
37
92
  expect(isCustomMarimoElement(null)).toBe(false);
@@ -519,7 +519,9 @@ export function registerReactComponent<T>(plugin: IPlugin<T, unknown>): void {
519
519
  if (!styleSheetCache.has(sheetUniqueKey)) {
520
520
  // We need to create a new stylesheet because we can't use the same
521
521
  // stylesheet otherwise the browser will throw an error.
522
- const newSheet = new CSSStyleSheet();
522
+ const newSheet = new CSSStyleSheet({
523
+ baseURL: sheet.href ?? document.baseURI,
524
+ });
523
525
  try {
524
526
  newSheet.replaceSync(
525
527
  Array.from(sheet.cssRules)
@@ -46,7 +46,7 @@ const CheckboxComponent = ({
46
46
  const id = useId();
47
47
 
48
48
  return (
49
- <Labeled label={data.label} align="right" id={id}>
49
+ <Labeled label={data.label} align="right" controlId={id}>
50
50
  <Checkbox
51
51
  data-testid="marimo-plugin-checkbox"
52
52
  checked={value}
@@ -36,7 +36,12 @@ import { usePanelOwnership } from "@/components/data-table/hooks/use-panel-owner
36
36
  import { LoadingTable } from "@/components/data-table/loading-table";
37
37
  import {
38
38
  type DownloadAsArgs,
39
+ type DownloadAsFunction,
39
40
  DownloadAsSchema,
41
+ type DownloadGeoJSON,
42
+ DownloadGeoJSONSchema,
43
+ type GetExportMetadata,
44
+ GetExportMetadataSchema,
40
45
  } from "@/components/data-table/schemas";
41
46
  import { TableExplorerPanel } from "@/components/data-table/table-explorer-panel/table-explorer-panel";
42
47
  import {
@@ -209,7 +214,9 @@ interface Data<T> {
209
214
 
210
215
  // oxlint-disable-next-line typescript/consistent-type-definitions
211
216
  type DataTableFunctions = {
212
- download_as: DownloadAsArgs;
217
+ download_as: DownloadAsFunction;
218
+ download_geojson: DownloadGeoJSON;
219
+ get_export_metadata: GetExportMetadata;
213
220
  get_column_summaries: <T>(opts: {}) => Promise<ColumnSummaries<T>>;
214
221
  search: <T>(req: {
215
222
  sort?: {
@@ -302,6 +309,8 @@ export const DataTablePlugin = createPlugin<S>("marimo-table")
302
309
  )
303
310
  .withFunctions<DataTableFunctions>({
304
311
  download_as: DownloadAsSchema,
312
+ download_geojson: DownloadGeoJSONSchema,
313
+ get_export_metadata: GetExportMetadataSchema,
305
314
  get_column_summaries: rpc.input(z.looseObject({})).output(
306
315
  z.object({
307
316
  data: z.union([z.string(), z.array(z.looseObject({}))]).nullable(),
@@ -839,7 +848,9 @@ const DataTableComponent = ({
839
848
  fieldTypes,
840
849
  paginationState,
841
850
  setPaginationState,
842
- download_as: downloadAs,
851
+ download_as,
852
+ download_geojson,
853
+ get_export_metadata: getExportMetadata,
843
854
  columnSummaries,
844
855
  className,
845
856
  setValue,
@@ -880,6 +891,15 @@ const DataTableComponent = ({
880
891
  sizeBytesIsLoading?: boolean;
881
892
  }): JSX.Element => {
882
893
  const id = useId();
894
+ const downloadAs = useCallback<DownloadAsArgs>(
895
+ (request) => {
896
+ const { format, ...options } = request;
897
+ return format === "geojson"
898
+ ? download_geojson({ format, ...options })
899
+ : download_as({ format, ...options });
900
+ },
901
+ [download_as, download_geojson],
902
+ );
883
903
  const { locale } = useLocale();
884
904
  const [viewedRowIdx, setViewedRowIdx] = useState(0);
885
905
  const { isPanelOpen, isAnyPanelOpen, togglePanel, panelType, setPanelType } =
@@ -1168,6 +1188,7 @@ const DataTableComponent = ({
1168
1188
  hoverTemplate={hoverTemplate}
1169
1189
  cellHoverTexts={cellHoverTexts}
1170
1190
  downloadAs={showDownload ? downloadAs : undefined}
1191
+ getExportMetadata={showDownload ? getExportMetadata : undefined}
1171
1192
  showSearch={showSearch}
1172
1193
  searchQuery={searchQuery}
1173
1194
  onSearchQueryChange={setSearchQuery}
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { type CalendarDate, parseDate } from "@internationalized/date";
4
- import type { JSX } from "react";
4
+ import { type JSX, useId } from "react";
5
5
  import { z } from "zod";
6
6
  import { DatePicker } from "@/components/ui/date-picker";
7
7
  import type { IPlugin, IPluginProps, Setter } from "../types";
@@ -49,6 +49,7 @@ interface DatePickerProps extends Data {
49
49
  }
50
50
 
51
51
  const DatePickerComponent = (props: DatePickerProps): JSX.Element => {
52
+ const labelId = useId();
52
53
  const handleInput = (valueAsDate: CalendarDate | null) => {
53
54
  if (!valueAsDate) {
54
55
  return;
@@ -59,12 +60,13 @@ const DatePickerComponent = (props: DatePickerProps): JSX.Element => {
59
60
  };
60
61
 
61
62
  return (
62
- <Labeled label={props.label} fullWidth={props.fullWidth}>
63
+ <Labeled labelId={labelId} label={props.label} fullWidth={props.fullWidth}>
63
64
  <DatePicker
64
65
  granularity="day"
65
66
  value={parseDate(props.value)}
66
67
  onChange={handleInput}
67
- aria-label={props.label ?? "date picker"}
68
+ aria-labelledby={props.label ? labelId : undefined}
69
+ aria-label={props.label ? undefined : "date picker"}
68
70
  minValue={parseDate(props.start)}
69
71
  maxValue={parseDate(props.stop)}
70
72
  isDisabled={props.disabled}
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { type CalendarDate, parseDate } from "@internationalized/date";
4
- import type { JSX } from "react";
4
+ import { type JSX, useId } from "react";
5
5
  import { z } from "zod";
6
6
  import { DateRangePicker } from "@/components/ui/date-picker";
7
7
  import type { IPlugin, IPluginProps, Setter } from "../types";
@@ -48,6 +48,7 @@ interface DateRangePickerProps extends Data {
48
48
  }
49
49
 
50
50
  const DateRangePickerComponent = (props: DateRangePickerProps): JSX.Element => {
51
+ const labelId = useId();
51
52
  const handleInput = (
52
53
  valueAsDateRange: {
53
54
  start: CalendarDate;
@@ -64,7 +65,7 @@ const DateRangePickerComponent = (props: DateRangePickerProps): JSX.Element => {
64
65
  };
65
66
 
66
67
  return (
67
- <Labeled label={props.label} fullWidth={props.fullWidth}>
68
+ <Labeled labelId={labelId} label={props.label} fullWidth={props.fullWidth}>
68
69
  <DateRangePicker
69
70
  granularity="day"
70
71
  value={{
@@ -72,7 +73,8 @@ const DateRangePickerComponent = (props: DateRangePickerProps): JSX.Element => {
72
73
  end: parseDate(props.value[1]),
73
74
  }}
74
75
  onChange={handleInput}
75
- aria-label={props.label ?? "date range picker"}
76
+ aria-labelledby={props.label ? labelId : undefined}
77
+ aria-label={props.label ? undefined : "date range picker"}
76
78
  minValue={parseDate(props.start)}
77
79
  maxValue={parseDate(props.stop)}
78
80
  isDisabled={props.disabled}
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { type CalendarDateTime, parseDateTime } from "@internationalized/date";
4
- import type { JSX } from "react";
4
+ import { type JSX, useId } from "react";
5
5
  import { z } from "zod";
6
6
  import { DatePicker } from "@/components/ui/date-picker";
7
7
  import type { IPlugin, IPluginProps, Setter } from "../types";
@@ -50,6 +50,7 @@ interface DateTimePickerProps extends Data {
50
50
  }
51
51
 
52
52
  const DateTimePickerComponent = (props: DateTimePickerProps): JSX.Element => {
53
+ const labelId = useId();
53
54
  const handleInput = (valueAsDateTime: CalendarDateTime | null) => {
54
55
  if (!valueAsDateTime) {
55
56
  return;
@@ -63,12 +64,13 @@ const DateTimePickerComponent = (props: DateTimePickerProps): JSX.Element => {
63
64
  const parsedValue = props.value ? parseDateTime(props.value) : undefined;
64
65
 
65
66
  return (
66
- <Labeled label={props.label} fullWidth={props.fullWidth}>
67
+ <Labeled labelId={labelId} label={props.label} fullWidth={props.fullWidth}>
67
68
  <DatePicker
68
69
  granularity={props.precision}
69
70
  value={parsedValue}
70
71
  onChange={handleInput}
71
- aria-label={props.label ?? "date time picker"}
72
+ aria-labelledby={props.label ? labelId : undefined}
73
+ aria-label={props.label ? undefined : "date time picker"}
72
74
  minValue={parseDateTime(props.start)}
73
75
  maxValue={parseDateTime(props.stop)}
74
76
  isDisabled={props.disabled}
@@ -79,7 +79,7 @@ const Dropdown = (props: DropdownProps): JSX.Element => {
79
79
  const singleValue = value.length === 0 ? defaultValue : value[0];
80
80
 
81
81
  return (
82
- <Labeled label={label} id={id} fullWidth={fullWidth}>
82
+ <Labeled label={label} controlId={id} fullWidth={fullWidth}>
83
83
  <NativeSelect
84
84
  data-testid="marimo-plugin-dropdown"
85
85
  onChange={(e) => {
@@ -68,7 +68,7 @@ export const Multiselect = ({
68
68
  );
69
69
 
70
70
  return (
71
- <Labeled label={label} id={id} fullWidth={fullWidth}>
71
+ <Labeled label={label} controlId={id} fullWidth={fullWidth}>
72
72
  <SelectList<string>
73
73
  id={id}
74
74
  options={items}
@@ -70,7 +70,7 @@ const NumberComponent = (props: NumberComponentProps): JSX.Element => {
70
70
  };
71
71
 
72
72
  return (
73
- <Labeled label={props.label} id={id} fullWidth={props.fullWidth}>
73
+ <Labeled label={props.label} controlId={id} fullWidth={props.fullWidth}>
74
74
  <NumberField
75
75
  data-testid="marimo-plugin-number-input"
76
76
  className={cn("min-w-[3em]", props.fullWidth && "w-full")}
@@ -51,7 +51,11 @@ export const Radio = (props: RadioProps): JSX.Element => {
51
51
  const id = useId();
52
52
 
53
53
  return (
54
- <Labeled label={props.label} id={id} align={props.inline ? "left" : "top"}>
54
+ <Labeled
55
+ label={props.label}
56
+ controlId={id}
57
+ align={props.inline ? "left" : "top"}
58
+ >
55
59
  <RadioGroup
56
60
  data-testid="marimo-plugin-radio"
57
61
  value={props.value ?? ""}
@@ -98,7 +98,7 @@ const RangeSliderComponent = ({
98
98
  const sliderElement = (
99
99
  <Labeled
100
100
  label={label}
101
- id={id}
101
+ controlId={id}
102
102
  align={orientation === "horizontal" ? "left" : "top"}
103
103
  className={cn(fullWidth && "my-1 w-full")}
104
104
  fullWidth={fullWidth}
@@ -33,7 +33,7 @@ export const SearchableSelect = (props: SearchableSelectProps): JSX.Element => {
33
33
  );
34
34
 
35
35
  return (
36
- <Labeled label={label} id={id} fullWidth={fullWidth}>
36
+ <Labeled label={label} controlId={id} fullWidth={fullWidth}>
37
37
  <SelectList<string>
38
38
  id={id}
39
39
  options={items}
@@ -224,7 +224,7 @@ const SliderComponent = ({
224
224
  const sliderElement = (
225
225
  <Labeled
226
226
  label={label}
227
- id={id}
227
+ controlId={id}
228
228
  align={orientation === "horizontal" ? "left" : "top"}
229
229
  fullWidth={fullWidth}
230
230
  className={cn(fullWidth && "my-1 w-full")}
@@ -34,7 +34,12 @@ const SwitchComponent = ({
34
34
  const id = useId();
35
35
 
36
36
  return (
37
- <Labeled label={data.label} align="right" id={id} labelClassName="ml-1">
37
+ <Labeled
38
+ label={data.label}
39
+ align="right"
40
+ controlId={id}
41
+ labelClassName="ml-1"
42
+ >
38
43
  <Switch
39
44
  data-testid="marimo-plugin-switch"
40
45
  checked={value}
@@ -1,6 +1,6 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import type { JSX } from "react";
3
+ import { type JSX, useId } from "react";
4
4
  import { z } from "zod";
5
5
  import { cn } from "@/utils/cn";
6
6
  import {
@@ -56,6 +56,7 @@ interface TextAreaComponentProps extends Data {
56
56
  }
57
57
 
58
58
  const TextAreaComponent = (props: TextAreaComponentProps) => {
59
+ const textareaId = useId();
59
60
  const bottomAdornment = props.maxLength ? (
60
61
  <span className="text-muted-foreground text-xs font-medium">
61
62
  {props.value.length}/{props.maxLength}
@@ -64,8 +65,14 @@ const TextAreaComponent = (props: TextAreaComponentProps) => {
64
65
 
65
66
  if (props.debounce === true) {
66
67
  return (
67
- <Labeled label={props.label} align="top" fullWidth={props.fullWidth}>
68
+ <Labeled
69
+ controlId={textareaId}
70
+ label={props.label}
71
+ align="top"
72
+ fullWidth={props.fullWidth}
73
+ >
68
74
  <OnBlurredTextarea
75
+ id={textareaId}
69
76
  className={cn("font-code", {
70
77
  "w-full": props.fullWidth,
71
78
  })}
@@ -86,8 +93,14 @@ const TextAreaComponent = (props: TextAreaComponentProps) => {
86
93
 
87
94
  if (typeof props.debounce === "number") {
88
95
  return (
89
- <Labeled label={props.label} align="top" fullWidth={props.fullWidth}>
96
+ <Labeled
97
+ controlId={textareaId}
98
+ label={props.label}
99
+ align="top"
100
+ fullWidth={props.fullWidth}
101
+ >
90
102
  <DebouncedTextarea
103
+ id={textareaId}
91
104
  className={cn("font-code", {
92
105
  "w-full": props.fullWidth,
93
106
  })}
@@ -108,8 +121,14 @@ const TextAreaComponent = (props: TextAreaComponentProps) => {
108
121
  }
109
122
 
110
123
  return (
111
- <Labeled label={props.label} align="top" fullWidth={props.fullWidth}>
124
+ <Labeled
125
+ controlId={textareaId}
126
+ label={props.label}
127
+ align="top"
128
+ fullWidth={props.fullWidth}
129
+ >
112
130
  <Textarea
131
+ id={textareaId}
113
132
  className={cn("font-code", {
114
133
  "w-full": props.fullWidth,
115
134
  })}
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { AtSignIcon, GlobeIcon, LockIcon } from "lucide-react";
4
- import { type JSX, useRef, useState } from "react";
4
+ import { type JSX, useId, useRef, useState } from "react";
5
5
  import { z } from "zod";
6
6
  import {
7
7
  DebouncedInput,
@@ -73,6 +73,7 @@ interface TextComponentProps extends Data {
73
73
  }
74
74
 
75
75
  const TextComponent = (props: TextComponentProps) => {
76
+ const inputId = useId();
76
77
  // Before first real keystroke: show masked placeholder, suppress setValue.
77
78
  // After first keystroke: normal password field.
78
79
  const initiallyMasked =
@@ -125,6 +126,7 @@ const TextComponent = (props: TextComponentProps) => {
125
126
  if (props.debounce === true) {
126
127
  input = (
127
128
  <OnBlurredInput
129
+ id={inputId}
128
130
  data-testid="marimo-plugin-text-input"
129
131
  type={props.kind}
130
132
  icon={icon[props.kind]}
@@ -143,6 +145,7 @@ const TextComponent = (props: TextComponentProps) => {
143
145
  } else if (typeof props.debounce === "number") {
144
146
  input = (
145
147
  <DebouncedInput
148
+ id={inputId}
146
149
  data-testid="marimo-plugin-text-input"
147
150
  type={props.kind}
148
151
  icon={icon[props.kind]}
@@ -163,6 +166,7 @@ const TextComponent = (props: TextComponentProps) => {
163
166
  } else {
164
167
  input = (
165
168
  <Input
169
+ id={inputId}
166
170
  data-testid="marimo-plugin-text-input"
167
171
  type={props.kind}
168
172
  icon={icon[props.kind]}
@@ -182,7 +186,11 @@ const TextComponent = (props: TextComponentProps) => {
182
186
  }
183
187
 
184
188
  return (
185
- <Labeled label={props.label} fullWidth={props.fullWidth}>
189
+ <Labeled
190
+ controlId={inputId}
191
+ label={props.label}
192
+ fullWidth={props.fullWidth}
193
+ >
186
194
  {input}
187
195
  </Labeled>
188
196
  );
@@ -0,0 +1,141 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import { act, fireEvent, render, screen } from "@testing-library/react";
3
+ import { expect, test, vi } from "vitest";
4
+ import type { IPlugin } from "../../types";
5
+ import { TextInputPlugin } from "../TextInputPlugin";
6
+ import { TextAreaPlugin } from "../TextAreaPlugin";
7
+
8
+ function testLabelBehavior<D extends { label: string | null }>(
9
+ plugin: IPlugin<string, D>,
10
+ ) {
11
+ for (const debounce of [false, true, 200]) {
12
+ test(`${plugin.tagName} associates formatted label with debounce=${debounce}`, () => {
13
+ const setValue = vi.fn();
14
+ const props = {
15
+ host: document.createElement("div"),
16
+ value: "",
17
+ setValue,
18
+ functions: {},
19
+ data: plugin.validator.parse({
20
+ initialValue: "",
21
+ placeholder: "",
22
+ label: "<strong>Notes &amp; details</strong>",
23
+ debounce,
24
+ }),
25
+ };
26
+ const { rerender } = render(plugin.render(props));
27
+ const control = screen.getByLabelText("Notes & details");
28
+ expect(control).toHaveAccessibleName("Notes & details");
29
+ const id = control.id;
30
+ rerender(
31
+ plugin.render({
32
+ ...props,
33
+ data: { ...props.data, label: "Updated notes" },
34
+ }),
35
+ );
36
+ expect(screen.getByLabelText("Updated notes").id).toBe(id);
37
+ rerender(
38
+ plugin.render({ ...props, data: { ...props.data, label: null } }),
39
+ );
40
+ expect(control).toHaveAccessibleName("");
41
+ });
42
+ test(`${plugin.tagName} preserves commit timing with debounce=${debounce}`, () => {
43
+ vi.useFakeTimers();
44
+ try {
45
+ const setValue = vi.fn();
46
+ const props = {
47
+ host: document.createElement("div"),
48
+ value: "",
49
+ setValue,
50
+ functions: {},
51
+ data: plugin.validator.parse({
52
+ initialValue: "",
53
+ placeholder: "",
54
+ label: "Notes",
55
+ debounce,
56
+ }),
57
+ };
58
+ render(plugin.render(props));
59
+ const control = screen.getByLabelText("Notes");
60
+ if (debounce === false) {
61
+ fireEvent.input(control, { target: { value: "hello" } });
62
+ } else {
63
+ fireEvent.change(control, { target: { value: "hello" } });
64
+ }
65
+ const immediateCalls = debounce === false ? 1 : 0;
66
+ expect(setValue).toHaveBeenCalledTimes(immediateCalls);
67
+ act(() => vi.advanceTimersByTime(199));
68
+ expect(setValue).toHaveBeenCalledTimes(immediateCalls);
69
+ if (debounce === true) {
70
+ fireEvent.blur(control);
71
+ } else if (typeof debounce === "number") {
72
+ act(() => vi.advanceTimersByTime(1));
73
+ }
74
+ expect(setValue).toHaveBeenCalledWith("hello");
75
+ } finally {
76
+ vi.useRealTimers();
77
+ }
78
+ });
79
+ }
80
+ }
81
+
82
+ for (const kind of ["text", "password", "email", "url"] as const) {
83
+ test(`native association preserves ${kind} input attributes`, () => {
84
+ const plugin = new TextInputPlugin();
85
+ render(
86
+ plugin.render({
87
+ host: document.createElement("div"),
88
+ value: "",
89
+ setValue: vi.fn(),
90
+ functions: {},
91
+ data: plugin.validator.parse({
92
+ initialValue: "",
93
+ placeholder: "",
94
+ label: "Account",
95
+ kind,
96
+ disabled: true,
97
+ minLength: 2,
98
+ maxLength: 30,
99
+ }),
100
+ }),
101
+ );
102
+ const control = screen.getByLabelText("Account");
103
+ expect(control).toHaveAttribute("type", kind);
104
+ expect(control).toBeDisabled();
105
+ expect(control).toBeRequired();
106
+ expect(control).toHaveAttribute("minlength", "2");
107
+ expect(control).toHaveAttribute("maxlength", "30");
108
+ });
109
+ }
110
+
111
+ function testMultipleInstances<D>(plugin: IPlugin<string, D>) {
112
+ test(`${plugin.tagName} keeps repeated labels independently associated`, () => {
113
+ const props = {
114
+ host: document.createElement("div"),
115
+ value: "",
116
+ setValue: vi.fn(),
117
+ functions: {},
118
+ data: plugin.validator.parse({
119
+ initialValue: "",
120
+ placeholder: "",
121
+ label: "Notes",
122
+ }),
123
+ };
124
+ render(
125
+ <>
126
+ {plugin.render(props)}
127
+ {plugin.render(props)}
128
+ </>,
129
+ );
130
+ const controls = screen.getAllByLabelText("Notes");
131
+ expect(controls).toHaveLength(2);
132
+ expect(controls[0].id).not.toBe(controls[1].id);
133
+ expect(controls[0]).toHaveAccessibleName("Notes");
134
+ expect(controls[1]).toHaveAccessibleName("Notes");
135
+ });
136
+ }
137
+
138
+ testLabelBehavior(new TextInputPlugin());
139
+ testLabelBehavior(new TextAreaPlugin());
140
+ testMultipleInstances(new TextInputPlugin());
141
+ testMultipleInstances(new TextAreaPlugin());