@marimo-team/islands 0.25.2-dev5 → 0.25.2-dev51

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 (269) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CqhQmp74.js → ConnectedDataExplorerComponent-BDizDY3_.js} +11 -11
  2. package/dist/{ErrorBoundary-nmfUc8WW.js → ErrorBoundary-NirupfPN.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-DzqPprAQ.js} +4323 -4313
  18. package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
  19. package/dist/{chat-ui-Dv2V95k6.js → chat-ui-DMu_DFfr.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-DEwQOq-y.js → code-visibility-BeEZujlS.js} +6 -6
  43. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  44. package/dist/{common-GiI6gFi-.js → common-BFYObM05.js} +5435 -5434
  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-jTlmlnzl.js → data-grid-overlay-editor-D6TRPY-U.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-BaqM0t4N.js → dropdown-menu-R7yCbshA.js} +1358 -1388
  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-CdgPvJVz.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-bc8pu-PN.js → feedback-button-CmxK471H.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-B0uO6ALd.js → glide-data-editor-xCj8qP3b.js} +11 -11
  112. package/dist/{glide-utils-CzzWU59p.js → glide-utils-BVJ4fkxX.js} +3 -3
  113. package/dist/{globals-BDtMCl5a.js → globals-CR2rgVY5.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-CFSoonFo.js} +544 -566
  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-DPWAFACU.js} +89 -86
  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 +6647 -6564
  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-BgKLuNYR.js → number-overlay-editor-BIPKclve.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-D8io8maY.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-BIh2bHtb.js → reveal-component-rod7cte8.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-rSPz3O6Q.js} +16 -14
  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-BTtPAD2R.js} +2 -2
  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 +14 -14
  224. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  225. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  226. package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
  227. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  228. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  229. package/src/components/data-table/charts/constants.ts +11 -10
  230. package/src/components/data-table/charts/types.ts +1 -0
  231. package/src/components/data-table/pagination.tsx +16 -2
  232. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
  233. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
  234. package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
  235. package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
  236. package/src/components/ui/__tests__/slider.test.tsx +30 -0
  237. package/src/core/config/pair.ts +0 -1
  238. package/src/core/kernel/session.ts +9 -0
  239. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  240. package/src/core/wasm/worker/bootstrap.ts +22 -3
  241. package/src/core/websocket/useMarimoKernelConnection.tsx +10 -1
  242. package/src/css/katex.min.css +145 -144
  243. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  244. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  245. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  246. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  247. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  248. package/src/plugins/impl/FileBrowserPlugin.tsx +45 -15
  249. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  250. package/src/plugins/impl/NumberPlugin.tsx +1 -1
  251. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  252. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  253. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  254. package/src/plugins/impl/SliderPlugin.tsx +1 -1
  255. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  256. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +85 -2
  257. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  258. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  259. package/src/plugins/impl/common/labeled.tsx +9 -3
  260. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
  261. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  262. package/dist/classDiagram-ZZMXUADV-BwYhrSEX.js +0 -30
  263. package/dist/classDiagram-v2-VYDZK3BY-HecM04TM.js +0 -30
  264. package/dist/error-banner-DzAmP0AQ.js +0 -391
  265. package/dist/flowDiagram-HODETNUW-DgcjSdPV.js +0 -16
  266. package/dist/purify.es-DgKyQviY.js +0 -805
  267. package/dist/select-BcObMjGz.js +0 -970
  268. package/dist/stateDiagram-v2-MP3YSRHH-Dk5QgdXF.js +0 -30
  269. package/dist/swimlanesDiagram-VR7AAH4N-CbztusY8.js +0 -30
@@ -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}
@@ -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) => {
@@ -1,6 +1,6 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { type LucideIcon, CornerLeftUp } from "lucide-react";
3
+ import { type LucideIcon, ChevronRightIcon, CornerLeftUp } from "lucide-react";
4
4
  import { type JSX, useEffect, useLayoutEffect, useRef, useState } from "react";
5
5
  import { z } from "zod";
6
6
  import {
@@ -12,7 +12,6 @@ import { Spinner } from "@/components/icons/spinner";
12
12
  import { Button } from "@/components/ui/button";
13
13
  import { Checkbox } from "@/components/ui/checkbox";
14
14
  import { Label } from "@/components/ui/label";
15
- import { NativeSelect } from "@/components/ui/native-select";
16
15
  import { Table, TableBody, TableCell, TableRow } from "@/components/ui/table";
17
16
  import { toast } from "@/components/ui/use-toast";
18
17
  import { RANDOM_ID_ATTR } from "@/core/dom/ui-element-constants";
@@ -472,12 +471,19 @@ export const FileBrowser = ({
472
471
  //
473
472
  // Assumes that path contains at least one delimiter, which is true
474
473
  // only if this is an absolute path.
475
- const { parentDirectories } = getProtocolAndParentDirectories({
474
+ const { protocol, parentDirectories } = getProtocolAndParentDirectories({
476
475
  path,
477
476
  delimiter,
478
477
  initialPath,
479
478
  restrictNavigation,
480
479
  });
480
+ const breadcrumbs = parentDirectories.toReversed().map((dir) => ({
481
+ path: dir,
482
+ name:
483
+ dir === protocol
484
+ ? protocol
485
+ : (dir.split(delimiter).findLast(Boolean) ?? dir),
486
+ }));
481
487
 
482
488
  const selectionKindLabel =
483
489
  selectionMode === "all"
@@ -515,18 +521,42 @@ export const FileBrowser = ({
515
521
  <div>
516
522
  {error && <Banner kind="danger">{error.message}</Banner>}
517
523
  {renderHeader()}
518
- <NativeSelect
519
- className="mt-2 w-full"
520
- placeholder={path}
521
- value={path}
522
- onChange={(e) => setNewPath(e.target.value)}
523
- >
524
- {parentDirectories.map((dir) => (
525
- <option value={dir} key={dir}>
526
- {dir}
527
- </option>
528
- ))}
529
- </NativeSelect>
524
+ <nav aria-label="Current directory" className="mt-2">
525
+ <ol className="flex flex-wrap items-center gap-0.5 text-sm">
526
+ {breadcrumbs.map((crumb, index) => {
527
+ const isCurrent = index === breadcrumbs.length - 1;
528
+ return (
529
+ <li key={crumb.path} className="flex items-center gap-0.5">
530
+ {index > 0 && (
531
+ <ChevronRightIcon
532
+ size={14}
533
+ className="text-muted-foreground shrink-0"
534
+ aria-hidden={true}
535
+ />
536
+ )}
537
+ <button
538
+ type="button"
539
+ title={crumb.path}
540
+ aria-current={isCurrent ? "page" : undefined}
541
+ onClick={() => {
542
+ if (!isCurrent) {
543
+ setNewPath(crumb.path);
544
+ }
545
+ }}
546
+ className={cn(
547
+ "rounded px-1 focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring",
548
+ isCurrent
549
+ ? "font-medium cursor-default"
550
+ : "text-muted-foreground hover:bg-accent hover:text-foreground",
551
+ )}
552
+ >
553
+ {crumb.name}
554
+ </button>
555
+ </li>
556
+ );
557
+ })}
558
+ </ol>
559
+ </nav>
530
560
 
531
561
  {data && typeof data.total_count === "number" && (
532
562
  <div className="text-xs text-muted-foreground mt-1 px-1">
@@ -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,12 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { fireEvent, render, screen, waitFor } from "@testing-library/react";
3
+ import {
4
+ fireEvent,
5
+ render,
6
+ screen,
7
+ waitFor,
8
+ within,
9
+ } from "@testing-library/react";
4
10
  import { beforeAll, describe, expect, it, vi } from "vitest";
5
11
  import { SetupMocks } from "@/__mocks__/common";
6
12
  import { initialModeAtom } from "@/core/mode";
@@ -187,7 +193,7 @@ describe("FileBrowserPlugin keyboard accessibility", () => {
187
193
  const docsRow = docs.closest('[role="row"]')!;
188
194
  fireEvent.keyDown(docsRow, { key: "ArrowDown" }); // move active off the parent
189
195
  fireEvent.click(docs); // navigate into "docs"
190
- await screen.findByText("docs"); // listing reloads (mock returns same files)
196
+ await within(screen.getByRole("grid")).findByText("docs"); // listing reloads (mock returns same files)
191
197
  const rows = screen.getAllByRole("row");
192
198
  expect(rows[0]).toHaveAttribute("tabindex", "0");
193
199
  // the focused row must match the only tabbable row
@@ -361,3 +367,80 @@ describe("FileBrowserPlugin keyboard accessibility", () => {
361
367
  function rowFor(name: string): HTMLElement {
362
368
  return screen.getByText(name).closest('[role="row"]') as HTMLElement;
363
369
  }
370
+
371
+ describe("FileBrowserPlugin breadcrumbs", () => {
372
+ function breadcrumbs() {
373
+ return within(
374
+ screen.getByRole("navigation", { name: "Current directory" }),
375
+ );
376
+ }
377
+
378
+ it("renders a crumb per ancestor with the current directory last", async () => {
379
+ renderBrowser();
380
+ await screen.findByText("docs");
381
+ const items = breadcrumbs().getAllByRole("listitem");
382
+ expect(items.map((li) => li.textContent)).toEqual(["/", "home", "user"]);
383
+ expect(breadcrumbs().getByRole("button", { name: "user" })).toHaveAttribute(
384
+ "aria-current",
385
+ "page",
386
+ );
387
+ expect(
388
+ breadcrumbs().getByRole("button", { name: "home" }),
389
+ ).not.toHaveAttribute("aria-current");
390
+ });
391
+
392
+ it("keeps focus on a crumb after navigating to it", async () => {
393
+ const { listDirectory } = renderBrowser();
394
+ await screen.findByText("docs");
395
+ const home = breadcrumbs().getByRole("button", { name: "home" });
396
+ home.focus();
397
+ fireEvent.click(home);
398
+ await waitFor(() =>
399
+ expect(listDirectory).toHaveBeenLastCalledWith({ path: "/home" }),
400
+ );
401
+ const current = breadcrumbs().getByRole("button", { name: "home" });
402
+ expect(current).toHaveAttribute("aria-current", "page");
403
+ expect(current).toBe(home);
404
+ expect(current).toHaveFocus();
405
+ });
406
+
407
+ it("does not reload when the current crumb is clicked", async () => {
408
+ const { listDirectory } = renderBrowser();
409
+ await screen.findByText("docs");
410
+ fireEvent.click(breadcrumbs().getByRole("button", { name: "user" }));
411
+ expect(listDirectory).toHaveBeenCalledTimes(1);
412
+ });
413
+
414
+ it("navigates to an ancestor when a crumb is clicked", async () => {
415
+ const { listDirectory } = renderBrowser();
416
+ await screen.findByText("docs");
417
+ fireEvent.click(breadcrumbs().getByRole("button", { name: "home" }));
418
+ await waitFor(() =>
419
+ expect(listDirectory).toHaveBeenLastCalledWith({ path: "/home" }),
420
+ );
421
+ fireEvent.click(breadcrumbs().getByRole("button", { name: "/" }));
422
+ await waitFor(() =>
423
+ expect(listDirectory).toHaveBeenLastCalledWith({ path: "/" }),
424
+ );
425
+ });
426
+
427
+ it("hides ancestors outside the initial path when navigation is restricted", async () => {
428
+ render(
429
+ <FileBrowser
430
+ initialPath="/home/user"
431
+ filetypes={[]}
432
+ selectionMode="all"
433
+ multiple={true}
434
+ label={null}
435
+ restrictNavigation={true}
436
+ value={[]}
437
+ setValue={vi.fn()}
438
+ host={document.createElement("div")}
439
+ list_directory={mockListDirectory(FILES)}
440
+ />,
441
+ );
442
+ await screen.findByText("docs");
443
+ const items = breadcrumbs().getAllByRole("listitem");
444
+ expect(items.map((li) => li.textContent)).toEqual(["user"]);
445
+ });
446
+ });
@@ -0,0 +1,122 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { render } from "@testing-library/react";
4
+ import { beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { initialModeAtom } from "@/core/mode";
6
+ import { store } from "@/core/state/jotai";
7
+ import { DatePickerPlugin } from "../DatePickerPlugin";
8
+ import { DateRangePickerPlugin } from "../DateRangePlugin";
9
+ import { DateTimePickerPlugin } from "../DateTimePickerPlugin";
10
+
11
+ const sharedProps = () => ({
12
+ host: document.createElement("div"),
13
+ setValue: vi.fn(),
14
+ functions: {},
15
+ });
16
+
17
+ const widgets = [
18
+ {
19
+ name: "date",
20
+ role: "group",
21
+ fallback: "date picker",
22
+ render: (label: string | null, disabled = false) =>
23
+ new DatePickerPlugin().render({
24
+ ...sharedProps(),
25
+ value: "2026-10-02",
26
+ data: {
27
+ label,
28
+ disabled,
29
+ start: "2026-01-01",
30
+ stop: "2026-12-31",
31
+ fullWidth: false,
32
+ },
33
+ }),
34
+ },
35
+ {
36
+ name: "datetime",
37
+ role: "group",
38
+ fallback: "date time picker",
39
+ render: (label: string | null, disabled = false) =>
40
+ new DateTimePickerPlugin().render({
41
+ ...sharedProps(),
42
+ value: "2026-10-02T12:00:00",
43
+ data: {
44
+ label,
45
+ disabled,
46
+ start: "2026-01-01T00:00:00",
47
+ stop: "2026-12-31T23:59:59",
48
+ precision: "minute",
49
+ fullWidth: false,
50
+ },
51
+ }),
52
+ },
53
+ {
54
+ name: "date range",
55
+ role: "group",
56
+ fallback: "date range picker",
57
+ render: (label: string | null, disabled = false) =>
58
+ new DateRangePickerPlugin().render({
59
+ ...sharedProps(),
60
+ value: ["2026-10-02", "2026-10-03"],
61
+ data: {
62
+ label,
63
+ disabled,
64
+ start: "2026-01-01",
65
+ stop: "2026-12-31",
66
+ fullWidth: false,
67
+ },
68
+ }),
69
+ },
70
+ ];
71
+
72
+ beforeEach(() => store.set(initialModeAtom, "edit"));
73
+
74
+ describe.each(widgets)("$name accessible labels", (widget) => {
75
+ it("uses rendered formatting and decoded entities, and follows label updates", () => {
76
+ const { getByRole, rerender } = render(
77
+ widget.render("<span>Visit <strong>date</strong> &amp; time</span>"),
78
+ );
79
+ expect(getByRole(widget.role, { name: "Visit date & time" })).toBeTruthy();
80
+ rerender(widget.render("<span>Updated <em>label</em></span>"));
81
+ expect(getByRole(widget.role, { name: "Updated label" })).toBeTruthy();
82
+ rerender(widget.render(null));
83
+ expect(getByRole(widget.role, { name: widget.fallback })).toBeTruthy();
84
+ });
85
+
86
+ it.each([null, ""])("uses the fallback when label is %s", (label) => {
87
+ const { getByRole } = render(widget.render(label));
88
+ expect(getByRole(widget.role, { name: widget.fallback })).toBeTruthy();
89
+ });
90
+
91
+ it("names the calendar button and every editable segment", () => {
92
+ const { getByRole, getAllByRole } = render(
93
+ widget.render("<strong>Visit</strong> &amp; time"),
94
+ );
95
+ expect(getByRole("button", { name: "Calendar Visit & time" })).toBeTruthy();
96
+ for (const segment of getAllByRole("spinbutton")) {
97
+ expect(segment).toHaveAccessibleName(/Visit & time/);
98
+ }
99
+ });
100
+
101
+ it("preserves disabled controls with a formatted label", () => {
102
+ const { getByRole, getAllByRole } = render(
103
+ widget.render("<strong>Visit</strong>", true),
104
+ );
105
+ expect(getByRole("button", { name: "Calendar Visit" })).toBeDisabled();
106
+ for (const segment of getAllByRole("spinbutton")) {
107
+ expect(segment).toHaveAttribute("aria-disabled", "true");
108
+ }
109
+ });
110
+
111
+ it("keeps labels distinct for multiple widgets", () => {
112
+ const { getByRole } = render(
113
+ <>
114
+ {widget.render("First")}
115
+ {widget.render("Second")}
116
+ </>,
117
+ );
118
+ expect(getByRole(widget.role, { name: "First" })).not.toBe(
119
+ getByRole(widget.role, { name: "Second" }),
120
+ );
121
+ });
122
+ });
@@ -27,7 +27,7 @@ const messageSchema = z.array(
27
27
  role: z.enum(["system", "user", "assistant"]),
28
28
  content: z.string().nullable(),
29
29
  parts: z.array(z.any()),
30
- metadata: z.any().nullable(),
30
+ metadata: z.any().optional(),
31
31
  }),
32
32
  );
33
33
 
@@ -9,7 +9,8 @@ interface Props {
9
9
  label: string | null | undefined;
10
10
  className?: string;
11
11
  labelClassName?: string;
12
- id?: string;
12
+ labelId?: string;
13
+ controlId?: string;
13
14
  fullWidth?: boolean;
14
15
  /**
15
16
  * Align the label to the top, left, or right of the component.
@@ -27,8 +28,9 @@ export const Labeled: React.FC<PropsWithChildren<Props>> = ({
27
28
  align = "left",
28
29
  className,
29
30
  labelClassName,
31
+ labelId,
30
32
  fullWidth,
31
- id,
33
+ controlId,
32
34
  }) => {
33
35
  // If fullWidth is true, force align to be "top"
34
36
  if (fullWidth) {
@@ -45,7 +47,11 @@ export const Labeled: React.FC<PropsWithChildren<Props>> = ({
45
47
 
46
48
  const labelElement = (
47
49
  <div part="label" className="inline-flex items-center m-0 p-0">
48
- <Label htmlFor={id} className={cn("font-prose", labelClassName)}>
50
+ <Label
51
+ id={labelId}
52
+ htmlFor={controlId}
53
+ className={cn("font-prose", labelClassName)}
54
+ >
49
55
  {renderHTML({ html: label })}
50
56
  </Label>
51
57
  </div>