@marimo-team/islands 0.25.2-dev14 → 0.25.2-dev140

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 (404) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CqhQmp74.js → ConnectedDataExplorerComponent-CNSxdKyJ.js} +15 -15
  2. package/dist/{ErrorBoundary-M1CN91UQ.js → ErrorBoundary-BkQSYCZo.js} +12 -12
  3. package/dist/{ImageComparisonComponent-Cpfz30OZ.js → ImageComparisonComponent-uU8FSKZE.js} +3 -3
  4. package/dist/{Plot-CTyjbQDT.js → Plot-DdYOe1UK.js} +2 -2
  5. package/dist/{abnfDiagram-VCTEODGH-aLGD44M7.js → abnfDiagram-VCTEODGH-DQDjNXt3.js} +3 -3
  6. package/dist/{any-language-editor-dqxlUDlT.js → any-language-editor-B9REGlD9.js} +8 -8
  7. package/dist/{apl-BYaaig9_.js → apl-GEW9-ZP1.js} +1 -1
  8. package/dist/{architectureDiagram-5GKGNRK7-BGL5P81u.js → architectureDiagram-5GKGNRK7-Nmls7Wxn.js} +5 -5
  9. package/dist/{asciiarmor-GKQFJXQG.js → asciiarmor-BWNxzkG7.js} +1 -1
  10. package/dist/{asn1-BsSb7HP5.js → asn1-Bcn2QutK.js} +1 -1
  11. package/dist/assets/__vite-browser-external-BXYkiFsk.js +1 -0
  12. package/dist/assets/worker-HPY9fbhz.js +114 -0
  13. package/dist/{asterisk-B3I8SNb5.js → asterisk-lE36-hJK.js} +1 -1
  14. package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-Cg25UrxT.js} +9 -9
  15. package/dist/{brainfuck-DXjk3bQe.js → brainfuck-BQCYDheZ.js} +1 -1
  16. package/dist/{button-B0Xgl-Qn.js → button-CvjkwdSk.js} +304 -287
  17. package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-BxFgrnNV.js} +7 -7
  18. package/dist/{capabilities-D7Ad8-zw.js → capabilities-CQ5IjhzL.js} +1 -1
  19. package/dist/{cells-5ppES-Un.js → cells-C8iCYvLU.js} +5949 -4892
  20. package/dist/{channel-z7HZXHwv.js → channel-CPObtJXj.js} +1 -1
  21. package/dist/{chat-ui-Dv2V95k6.js → chat-ui-BDpymeoe.js} +1595 -1402
  22. package/dist/{check-DGZ74tV2.js → check-EDwSwP89.js} +1 -1
  23. package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-D4eFPyFh.js} +5 -5
  24. package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-D7gxIs2Q.js} +1 -1
  25. package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BwiyaNpg.js} +2 -2
  26. package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-ufseIn5y.js} +1 -1
  27. package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-BhaJx0X3.js} +3 -3
  28. package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-Cwbt-lF0.js} +2 -2
  29. package/dist/{chunk-IMKFNOWR-Cm3RgLDj.js → chunk-IMKFNOWR-CoIFEo-1.js} +6 -6
  30. package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-n-zgIVSy.js} +5 -5
  31. package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-DXa-Cxbn.js} +6 -6
  32. package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-B_Zd3-X0.js} +1 -1
  33. package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-hYOXbYH_.js} +1 -1
  34. package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-CQw5qATZ.js} +1 -1
  35. package/dist/{chunk-SHT3W25Y-DedDYSP5.js → chunk-SHT3W25Y-lHiGx3ZC.js} +8 -8
  36. package/dist/{chunk-SVP7TREG-B2SFkCAL.js → chunk-SVP7TREG-BvsHIrY_.js} +2 -2
  37. package/dist/{chunk-TICWLB2K-DB6hjNOL.js → chunk-TICWLB2K-BC8YIm_n.js} +6 -6
  38. package/dist/{chunk-YOKDWASO-DrWbKnxA.js → chunk-YOKDWASO-DPZk8vhS.js} +6 -6
  39. package/dist/classDiagram-ZZMXUADV-Bt98lkkv.js +30 -0
  40. package/dist/classDiagram-v2-VYDZK3BY-D9bfbcC3.js +30 -0
  41. package/dist/{clike-E2lFbGVj.js → clike-CxK9W55Z.js} +1 -1
  42. package/dist/{clojure-Dn_K4RlK.js → clojure-Dzcvwpxk.js} +1 -1
  43. package/dist/{cmake-DpN2Top5.js → cmake-DYr-71zp.js} +1 -1
  44. package/dist/{cobol-Chf22-GM.js → cobol-DC3g37Kq.js} +1 -1
  45. package/dist/{code-visibility-Clbu601l.js → code-visibility-DSbYTcxC.js} +8 -8
  46. package/dist/{coffeescript-BVe1OiD9.js → coffeescript-C-eFwH5N.js} +1 -1
  47. package/dist/{common-DnmYjCVM.js → common-CZoGPEDT.js} +13579 -14584
  48. package/dist/{commonlisp-DxoBG7fU.js → commonlisp-CyaNXrJR.js} +1 -1
  49. package/dist/{compiler-runtime-Cj8ZWiNS.js → compiler-runtime-CldRdSsv.js} +2 -2
  50. package/dist/{copy-icon-qmRg_VTX.js → copy-icon-Ft7t9bqz.js} +6 -6
  51. package/dist/{crystal-DCM3yc4r.js → crystal-ih5ax5tQ.js} +1 -1
  52. package/dist/{css-DkZ9mMyI.js → css-CN_wP7_R.js} +1 -1
  53. package/dist/{cynefinDiagram-5FMLGOSQ-DzaZEqgD.js → cynefinDiagram-5FMLGOSQ-CgWra7wt.js} +3 -3
  54. package/dist/{cypher-Drw_8U5I.js → cypher-CqGRcmZo.js} +1 -1
  55. package/dist/{d-CsVGcKMF.js → d-Cj0sOW2z.js} +1 -1
  56. package/dist/{dagre-GXQ25YYZ-Cjf5GjU3.js → dagre-GXQ25YYZ-CFZ8-35c.js} +10 -10
  57. package/dist/{data-grid-overlay-editor-CYhrcE4X.js → data-grid-overlay-editor-Bahjo5W-.js} +7 -7
  58. package/dist/{data-grid-types-BucVmDDp.js → data-grid-types-BH_r7g7l.js} +1 -1
  59. package/dist/{diagram-S7CK7UJ4-IhLt_khx.js → diagram-S7CK7UJ4-lCNQrW7d.js} +4 -4
  60. package/dist/{diagram-UQ7AKVKN-CQc6KLPB.js → diagram-UQ7AKVKN-CQPQ6pP_.js} +3 -3
  61. package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-BJWcVVJY.js} +2 -2
  62. package/dist/{diagram-VX7I27RA-DHmW9N1T.js → diagram-VX7I27RA-Cf3b0llz.js} +5 -5
  63. package/dist/{diagram-Z3DM3KII-zVKsg-Ty.js → diagram-Z3DM3KII-Bt4QLrpn.js} +3 -3
  64. package/dist/{dialog-CILKhbsG.js → dialog-CEBFZNyc.js} +29 -29
  65. package/dist/{diff-CBikYCUF.js → diff-B_hUkiat.js} +1 -1
  66. package/dist/{dist-Df0wKI0F.js → dist-BK4Oj99o.js} +1 -1
  67. package/dist/{dist-BVGtK7Ht.js → dist-BLfKmR-l.js} +1 -1
  68. package/dist/{dist-B8D7McG3.js → dist-BMQf5zIS.js} +46 -46
  69. package/dist/{dist-C2KzV-vf.js → dist-BorMD-uX.js} +2 -2
  70. package/dist/{dist-Cs2FijYk.js → dist-BuaRHxOc.js} +2 -2
  71. package/dist/{dist-DPcEtqmG.js → dist-Bvs24R_E.js} +47 -47
  72. package/dist/{dist-lA1Cttkb.js → dist-C8fAKSH1.js} +41 -41
  73. package/dist/{dist-DszxuxS1.js → dist-CLdpGQVr.js} +2 -2
  74. package/dist/{dist-CO1AwwG_.js → dist-CN8zI-XC.js} +209 -209
  75. package/dist/{dist-D1PpnuZB.js → dist-CN_BeG2I.js} +1 -1
  76. package/dist/{dist-CPGxfVGX.js → dist-CSJ0MDRw.js} +1 -1
  77. package/dist/{dist-Cm3iAFMD.js → dist-CSbh1PNP.js} +3 -3
  78. package/dist/{dist-9x1ZRe-e.js → dist-Cg7gzw-a.js} +2 -2
  79. package/dist/{dist-B1vYLK28.js → dist-CkTTIdBe.js} +345 -345
  80. package/dist/{dist-BRxfaJgs.js → dist-CrSP_H1M.js} +296 -296
  81. package/dist/{dist-C2wDlYdD.js → dist-D-wwqlzJ.js} +2 -2
  82. package/dist/{dist-BtKIs9N-.js → dist-D6d86eNJ.js} +1 -1
  83. package/dist/{dist-DHOTQar0.js → dist-DBtSl3sf.js} +1 -1
  84. package/dist/{dist-KzZ7WELx.js → dist-DiDibOYr.js} +120 -120
  85. package/dist/{dist-Kxgjxakw.js → dist-DoE4XJBC.js} +1277 -1222
  86. package/dist/{dist-CcyKTBTF.js → dist-DpBpA_n1.js} +2 -2
  87. package/dist/{dist-BHCHt1NI.js → dist-F8Ep36rk.js} +1 -1
  88. package/dist/{dist-C8xMLVYi.js → dist-OR1OnN-y.js} +44 -44
  89. package/dist/{dist-1HDa70oE.js → dist-PXYI_yuP.js} +3 -3
  90. package/dist/{dist-CMh_W4y4.js → dist-diIx5qJW.js} +2 -2
  91. package/dist/{dockerfile-DJnSntVB.js → dockerfile-D0VKN500.js} +2 -2
  92. package/dist/dropdown-menu-CP_qCYHC.js +4678 -0
  93. package/dist/{dtd-BHa4v0Bn.js → dtd-B8FGSWWe.js} +1 -1
  94. package/dist/{dylan-BypL2Zz8.js → dylan-DbIBYIrw.js} +1 -1
  95. package/dist/{ebnf-5guncNu-.js → ebnf-D-YbYLdk.js} +1 -1
  96. package/dist/{ebnfDiagram-PWID7BFC-DDd5hCRC.js → ebnfDiagram-PWID7BFC-D3NAyPFY.js} +3 -3
  97. package/dist/{ecl-iRcVIKYZ.js → ecl-DBmkdWAd.js} +1 -1
  98. package/dist/{eiffel-BEqF9aU4.js → eiffel-CcWSDDzK.js} +1 -1
  99. package/dist/{elm-DYcfNE9c.js → elm-MC-b8a6C.js} +1 -1
  100. package/dist/{erDiagram-RLTQ6QDP-D10NP0eI.js → erDiagram-RLTQ6QDP-Tlu09_Nm.js} +12 -12
  101. package/dist/{erlang-BtAuIoF0.js → erlang-AdO1-xtV.js} +1 -1
  102. package/dist/error-banner-Da600cwz.js +362 -0
  103. package/dist/{error-entries-B2Ux3Z2X.js → error-entries-CzoYkIQZ.js} +2 -2
  104. package/dist/{esm-h8f7-1CJ.js → esm-AMFssoNp.js} +380 -374
  105. package/dist/{esm-BElI3qKH.js → esm-D2gTsXEV.js} +579 -579
  106. package/dist/{factor-3nzOwLuN.js → factor-Ys-13HOP.js} +2 -2
  107. package/dist/{fcl-C90TGnJJ.js → fcl-DnwditDr.js} +1 -1
  108. package/dist/{feedback-button-DQUXhzxG.js → feedback-button-DzW23W2G.js} +13 -13
  109. package/dist/flowDiagram-HODETNUW-CAYbpJmV.js +16 -0
  110. package/dist/{formats-Q9gwlLyD.js → formats-BGh2thRc.js} +6 -6
  111. package/dist/{forth-DEaRrLUi.js → forth-DiMuIXFe.js} +1 -1
  112. package/dist/{fortran-Bv6JRUjY.js → fortran-hkrF2eM4.js} +1 -1
  113. package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-BQT16JSc.js} +2 -2
  114. package/dist/{gas-JNerWj3-.js → gas-DlhqN9k8.js} +1 -1
  115. package/dist/{gherkin-CSrl-H70.js → gherkin-0SlhEZ3t.js} +1 -1
  116. package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-D5nSIzdE.js} +2 -2
  117. package/dist/{glide-data-editor-B4sl2a3f.js → glide-data-editor-VRZlRc-O.js} +60 -60
  118. package/dist/{glide-utils-CzzWU59p.js → glide-utils-DJyqh0EM.js} +4 -4
  119. package/dist/{globals-DZ0cKrtp.js → globals-FYJ8OxBd.js} +3 -3
  120. package/dist/{groovy-X7euO_vE.js → groovy-YhcTMyvX.js} +1 -1
  121. package/dist/{haskell-C48Z70Az.js → haskell-CodLxrtT.js} +1 -1
  122. package/dist/{haxe-CAUWMmwR.js → haxe-CiRWNFkH.js} +1 -1
  123. package/dist/{highlighted-body-KPVGNVTW-Ad3MKZ18.js → highlighted-body-KPVGNVTW-zwjq21tf.js} +4 -4
  124. package/dist/{html-to-image-BZBwkkDG.js → html-to-image-CZY1pIZH.js} +547 -569
  125. package/dist/{http-BrSBnhDH.js → http-Bh6HhdNR.js} +1 -1
  126. package/dist/{idl-BXuPleZv.js → idl-DZgBq75I.js} +1 -1
  127. package/dist/{infoDiagram-27XIBGKW-DrYu3UZC.js → infoDiagram-27XIBGKW-XrDxhr0x.js} +2 -2
  128. package/dist/{ishikawaDiagram-5VMMS53U-pmkGQJsA.js → ishikawaDiagram-5VMMS53U-CD1muzov.js} +3 -3
  129. package/dist/{javascript-B4EPWJf_.js → javascript-BfNytHiM.js} +1 -1
  130. package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BaLqn-dZ.js} +2 -2
  131. package/dist/{jsx-runtime-DgDPJV9S.js → jsx-runtime-3BD1kT0s.js} +1 -1
  132. package/dist/{julia-ke9Kh8b7.js → julia--tLIAG7q.js} +1 -1
  133. package/dist/{kanban-definition-UXKFOSKX-wWGD9VLW.js → kanban-definition-UXKFOSKX-Dg9W142_.js} +9 -9
  134. package/dist/{katex-BNCmKUol.js → katex-BIdZGsyO.js} +141 -116
  135. package/dist/label-BDKF3Afc.js +281 -0
  136. package/dist/{livescript-Ce4uqGAC.js → livescript-CVPfYnY_.js} +1 -1
  137. package/dist/{loader-C9OUkMrj.js → loader-BQOfjTIJ.js} +1 -1
  138. package/dist/{lua-D6fti_Jk.js → lua-4Fa-T-qq.js} +1 -1
  139. package/dist/main.js +7059 -6908
  140. package/dist/{mathematica-DcEpZ3Vj.js → mathematica-CtYAy6GG.js} +1 -1
  141. package/dist/{mbox-DFBbOu0X.js → mbox-D0w9Ah1C.js} +1 -1
  142. package/dist/{mermaid-Dfvntf3s.js → mermaid-CiAXjLpA.js} +57 -57
  143. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +2 -0
  144. package/dist/{mhchem-BEc7A1or.js → mhchem-CdWPJK6g.js} +1 -1
  145. package/dist/{mindmap-definition-YA3MSWOX-C2f1VIBR.js → mindmap-definition-YA3MSWOX-DgCidgYJ.js} +11 -11
  146. package/dist/{mirc-CqeibO3N.js → mirc-De9aSAZM.js} +1 -1
  147. package/dist/{mllike-D54QZYTP.js → mllike-BbugeaY_.js} +1 -1
  148. package/dist/{modelica-DuML2-8V.js → modelica-BjJwWw1F.js} +1 -1
  149. package/dist/{mscgen-CJmKwp3b.js → mscgen-DwiRH5ma.js} +1 -1
  150. package/dist/{mumps-DaVgFtkd.js → mumps--plbDM9o.js} +1 -1
  151. package/dist/{nginx-BXN1rqI0.js → nginx-C4Df7REc.js} +1 -1
  152. package/dist/{nsis-CMfRqf0V.js → nsis-fiiOqLc3.js} +7 -7
  153. package/dist/{ntriples-BiOGlMDR.js → ntriples-jV77I4k8.js} +1 -1
  154. package/dist/{number-overlay-editor-CbKIioUo.js → number-overlay-editor-BZVTQDVj.js} +5 -5
  155. package/dist/{octave-CgVnzxKk.js → octave-Cztd01tF.js} +1 -1
  156. package/dist/{oz-B2mky97X.js → oz-Bl8o3BDl.js} +1 -1
  157. package/dist/{pascal-BoZhBf6s.js → pascal-BO5JqysR.js} +1 -1
  158. package/dist/{pegDiagram-XKGWAZYB-D6v5dz4M.js → pegDiagram-XKGWAZYB-coOYYKB6.js} +3 -3
  159. package/dist/{perl-DjzMqXtt.js → perl-Drlh9s6m.js} +1 -1
  160. package/dist/{pieDiagram-E7YTZNPT-BwFAhpYD.js → pieDiagram-E7YTZNPT-BnXTc3bj.js} +3 -3
  161. package/dist/{pig-B2mB-01d.js → pig-BWGR8wZw.js} +1 -1
  162. package/dist/{powershell-D0zT88Aj.js → powershell-DT99xlz_.js} +1 -1
  163. package/dist/{process-output-BSsWzfnY.js → process-output-e4jj9Ijt.js} +4 -4
  164. package/dist/{properties-3_5qCgOj.js → properties-Q-rkxld0.js} +1 -1
  165. package/dist/{protobuf-Dgoxfi1H.js → protobuf-DKyWZbs7.js} +1 -1
  166. package/dist/{pug-CNRdd8oG.js → pug-42ZJUbEC.js} +2 -2
  167. package/dist/{puppet-DzILxZfz.js → puppet-B4UozHhh.js} +1 -1
  168. package/dist/purify.es-DMv5zIkJ.js +866 -0
  169. package/dist/{python-AfVdMn_l.js → python-DREjAV__.js} +1 -1
  170. package/dist/{q-C6p-CGWh.js → q-Bi63IpBO.js} +1 -1
  171. package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-Ccw0xMjN.js} +1 -1
  172. package/dist/{r-CzKF1D2X.js → r-DSwXWKMR.js} +1 -1
  173. package/dist/{railroadDiagram-O6MQD6OU-D6eOFr6Z.js → railroadDiagram-O6MQD6OU-B28-u83n.js} +3 -3
  174. package/dist/{react-dom-BUgJ-ab_.js → react-dom-DUmH0GXv.js} +29 -21
  175. package/dist/{react-ofJbxM4x.js → react-sHtZdjeP.js} +103 -94
  176. package/dist/{react-vega-ewj7q_U5.js → react-vega-BED0DjiB.js} +3 -3
  177. package/dist/{requirementDiagram-BXWQKSXE-CHYsMgDR.js → requirementDiagram-BXWQKSXE-CdYCTMu0.js} +11 -11
  178. package/dist/{reveal-component-CSChrj7R.js → reveal-component-BU1x-Q6a.js} +906 -878
  179. package/dist/{rpm-Bx7FkjTO.js → rpm-DPb1DeKM.js} +1 -1
  180. package/dist/{ruby-BMzgq2bf.js → ruby-U7fZA4DP.js} +2 -2
  181. package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-ELvOcnZH.js} +1 -1
  182. package/dist/{sas-ClGVnK3F.js → sas-CLk1JpTn.js} +1 -1
  183. package/dist/{scheme-C0MXqXep.js → scheme-CT-2k2Tl.js} +1 -1
  184. package/dist/select-BButFi-d.js +1344 -0
  185. package/dist/{sequenceDiagram-WJ2MYXX4-BPAknhBp.js → sequenceDiagram-WJ2MYXX4-CM3aRAe_.js} +4 -4
  186. package/dist/{shell-CiQZv6oG.js → shell-BLO7fcsk.js} +1 -1
  187. package/dist/{sieve-BiIMePvV.js → sieve-nG3C7WNH.js} +1 -1
  188. package/dist/{simple-mode-8ETW2RS6.js → simple-mode-C683Q7or.js} +1 -1
  189. package/dist/{smalltalk-9-llftyG.js → smalltalk-BROcZybA.js} +1 -1
  190. package/dist/{solr-CxCKEuwq.js → solr-mVltHNc5.js} +1 -1
  191. package/dist/{sparql-BRmy7pzx.js → sparql-Cv1Ksr4v.js} +1 -1
  192. package/dist/{spec-D62vWpMT.js → spec-BwarBpUJ.js} +116 -135
  193. package/dist/{spreadsheet-UCNUIGsn.js → spreadsheet-BwTnp5K_.js} +1 -1
  194. package/dist/{sql-D0hSGZ-H.js → sql-CjLt0122.js} +1 -1
  195. package/dist/{stateDiagram-D77RDMKH-Cq249IQ4.js → stateDiagram-D77RDMKH-DOZUMVj8.js} +13 -13
  196. package/dist/stateDiagram-v2-MP3YSRHH-CISYxma6.js +30 -0
  197. package/dist/{stex-UeT_Aofp.js → stex-Btf3omL8.js} +1 -1
  198. package/dist/style.css +1 -1
  199. package/dist/{stylus-Fi4waA2H.js → stylus-Dt4VvLXL.js} +1 -1
  200. package/dist/{swift-NqPyaBye.js → swift-DHsn_CVI.js} +1 -1
  201. package/dist/{swimlanes-42K2YHIH-Bh_S_HKD.js → swimlanes-42K2YHIH-BkSppxp8.js} +10 -10
  202. package/dist/swimlanesDiagram-VR7AAH4N-c8G5pGxC.js +30 -0
  203. package/dist/{swiper-component-DkV7T44B.js → swiper-component-DKntyn8p.js} +5 -5
  204. package/dist/{tcl-B4f0xfmM.js → tcl-CV0OLBOl.js} +1 -1
  205. package/dist/{textile-CnNbnPTe.js → textile-D320oKVM.js} +1 -1
  206. package/dist/{tiddlywiki-CSGSOg38.js → tiddlywiki-BVVNvfy4.js} +1 -1
  207. package/dist/{tiki-9F02WBA6.js → tiki-BF2aDPlB.js} +1 -1
  208. package/dist/{timeline-definition-24CTP7MA-ByNMgBE7.js → timeline-definition-24CTP7MA-CaMQayqK.js} +3 -3
  209. package/dist/{toDate-DWVp6uE1.js → toDate-BNJf01u1.js} +8 -9
  210. package/dist/{toast-DcoJGS3-.js → toast-B9UMEi8u.js} +161 -165
  211. package/dist/{toml-AesZ6RBt.js → toml-CaUN7UHo.js} +1 -1
  212. package/dist/{tooltip-Bi36DgYh.js → tooltip-BO1REbqs.js} +548 -584
  213. package/dist/{troff-DlfvveK1.js → troff-DQUFcClZ.js} +1 -1
  214. package/dist/{ttcn--YVSkGs_.js → ttcn-CQL1duJS.js} +1 -1
  215. package/dist/{ttcn-cfg-Bb1Knl_J.js → ttcn-cfg-BMmEFJPu.js} +1 -1
  216. package/dist/{turtle-DC24v1bz.js → turtle-C3esgsRr.js} +1 -1
  217. package/dist/{use-restore-focus-ZgG5Br63.js → use-restore-focus-BEM7sFWl.js} +2430 -2007
  218. package/dist/{use-vega-container-remeasure-4DwJbPWu.js → use-vega-container-remeasure-Bz4PZMtt.js} +2 -2
  219. package/dist/{useAsyncData-BD7NLQ3_.js → useAsyncData-Deh5kszT.js} +3 -3
  220. package/dist/{useDateFormatter-D8XWr8lL.js → useDateFormatter-D8XruNGG.js} +53 -32
  221. package/dist/{useDeepCompareMemoize-CawMGSRU.js → useDeepCompareMemoize-DXwzRINI.js} +2 -2
  222. package/dist/{useIframeCapabilities-BUMBOpsM.js → useIframeCapabilities-DBETvvPl.js} +2 -2
  223. package/dist/{useLifecycle-3vGhRa1o.js → useLifecycle-j7D9uD1o.js} +6 -6
  224. package/dist/{useTheme-BOw801nZ.js → useTheme-CRnjkku0.js} +7 -7
  225. package/dist/{vb-Dpc8vhvF.js → vb-RK1eDXRl.js} +1 -1
  226. package/dist/{vbscript-B-Y1XnZe.js → vbscript-BCOeM0de.js} +1 -1
  227. package/dist/{vega-component-9siY74NS.js → vega-component-DG29TAB7.js} +14 -14
  228. package/dist/{vega-embed-container-sSR5hAsy.js → vega-embed-container-BNHE18G9.js} +5 -5
  229. package/dist/{velocity-DHMu9kc-.js → velocity-CZKOFbOI.js} +1 -1
  230. package/dist/{vennDiagram-4TSXK5OY-DY8CySdO.js → vennDiagram-4TSXK5OY-CF8pfaK3.js} +3 -3
  231. package/dist/{verilog-DhiEaoUl.js → verilog-DqQTzVn8.js} +1 -1
  232. package/dist/{vhdl-D4X23YKO.js → vhdl-vQr2bfmi.js} +1 -1
  233. package/dist/{wardleyDiagram-VM6X3IG4-DYC1AFni.js → wardleyDiagram-VM6X3IG4-dGPu39d-.js} +3 -3
  234. package/dist/{webidl-SyzNxWpJ.js → webidl-DzX7N40e.js} +1 -1
  235. package/dist/{xquery-BC2R4Hk6.js → xquery-Cw_Q_hGR.js} +1 -1
  236. package/dist/{xychartDiagram-S5SC5T6Z-Df8LLnuY.js → xychartDiagram-S5SC5T6Z-CP6-9q56.js} +5 -5
  237. package/dist/{yacas-DLNXPMmH.js → yacas-DiC4jJBE.js} +1 -1
  238. package/dist/{z80-CDXWHOO6.js → z80-CUOQDEJO.js} +1 -1
  239. package/package.json +38 -37
  240. package/src/__tests__/mount.test.ts +6 -6
  241. package/src/components/chat/__tests__/chat-history-popover.test.tsx +157 -0
  242. package/src/components/chat/chat-history-popover.tsx +98 -17
  243. package/src/components/chat/chat-panel.tsx +29 -0
  244. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  245. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  246. package/src/components/data-table/TableTopBar.tsx +4 -0
  247. package/src/components/data-table/__tests__/column_formatting.test.ts +30 -0
  248. package/src/components/data-table/__tests__/columns.test.tsx +70 -0
  249. package/src/components/data-table/__tests__/export-actions.test.tsx +1111 -14
  250. package/src/components/data-table/__tests__/pagination.test.tsx +85 -1
  251. package/src/components/data-table/__tests__/schemas.test.ts +57 -0
  252. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  253. package/src/components/data-table/charts/__tests__/slider-field.test.tsx +54 -0
  254. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  255. package/src/components/data-table/charts/components/form-fields.tsx +3 -1
  256. package/src/components/data-table/charts/constants.ts +11 -10
  257. package/src/components/data-table/charts/types.ts +1 -0
  258. package/src/components/data-table/column-formatting/feature.ts +20 -1
  259. package/src/components/data-table/columns.tsx +25 -18
  260. package/src/components/data-table/data-table.tsx +3 -0
  261. package/src/components/data-table/export-actions.tsx +365 -81
  262. package/src/components/data-table/pagination.tsx +16 -2
  263. package/src/components/data-table/schemas.ts +90 -14
  264. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +32 -46
  265. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +29 -40
  266. package/src/components/editor/actions/pair-with-agent-commands.ts +3 -4
  267. package/src/components/editor/actions/pair-with-agent-modal.tsx +4 -7
  268. package/src/components/editor/actions/useRestartKernel.tsx +2 -2
  269. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +224 -17
  270. package/src/components/editor/alerts/connection-details.tsx +61 -0
  271. package/src/components/editor/alerts/connection-notice.tsx +46 -53
  272. package/src/components/editor/alerts/startup-progress.tsx +73 -129
  273. package/src/components/editor/app-container.tsx +2 -2
  274. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +2 -2
  275. package/src/components/editor/cell/CreateCellButton.tsx +2 -2
  276. package/src/components/editor/cell/DeleteButton.tsx +2 -2
  277. package/src/components/editor/cell/RunButton.tsx +3 -3
  278. package/src/components/editor/cell/StopButton.tsx +2 -2
  279. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +4 -4
  280. package/src/components/editor/chrome/components/feedback-button.tsx +3 -3
  281. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +8 -8
  282. package/src/components/editor/chrome/panels/__tests__/{sandbox-details.test.tsx → runtime-details.test.tsx} +94 -22
  283. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +4 -4
  284. package/src/components/editor/chrome/panels/packages-panel.tsx +8 -29
  285. package/src/components/editor/chrome/panels/{sandbox-details-state.ts → runtime-details-state.ts} +1 -1
  286. package/src/components/editor/chrome/panels/{sandbox-panel.tsx → runtime-panel.tsx} +38 -66
  287. package/src/components/editor/chrome/panels/runtime-status-toggle.tsx +56 -0
  288. package/src/components/editor/chrome/panels/sandbox-controller.tsx +2 -2
  289. package/src/components/editor/chrome/wrapper/app-chrome.tsx +3 -3
  290. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +2 -2
  291. package/src/components/editor/controls/Controls.tsx +3 -3
  292. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +6 -5
  293. package/src/components/editor/header/__tests__/status.test.tsx +4 -4
  294. package/src/components/editor/header/app-header.tsx +2 -2
  295. package/src/components/editor/header/status.tsx +3 -3
  296. package/src/components/editor/navigation/__tests__/navigation.test.ts +8 -8
  297. package/src/components/editor/output/console/ConsoleOutput.tsx +5 -3
  298. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +18 -0
  299. package/src/components/storage/__tests__/storage-file-viewer.test.tsx +2 -1
  300. package/src/components/ui/__tests__/slider.test.tsx +37 -0
  301. package/src/components/ui/progress-stages.tsx +114 -0
  302. package/src/components/ui/slider.tsx +2 -0
  303. package/src/core/ai/__tests__/state.test.ts +120 -0
  304. package/src/core/ai/state.ts +36 -10
  305. package/src/core/cells/__tests__/document-roundtrip.test.ts +16 -0
  306. package/src/core/codemirror/copilot/__tests__/completion-integration.test.ts +447 -0
  307. package/src/core/codemirror/copilot/__tests__/inline-completion.test.ts +395 -0
  308. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +511 -2
  309. package/src/core/codemirror/copilot/__tests__/rpc-cancellation.test.ts +201 -0
  310. package/src/core/codemirror/copilot/extension.ts +22 -11
  311. package/src/core/codemirror/copilot/language-server.ts +109 -60
  312. package/src/core/codemirror/language/__tests__/sql.test.ts +4 -3
  313. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +138 -26
  314. package/src/core/codemirror/language/embedded/embedded-python.ts +47 -13
  315. package/src/core/codemirror/language/embedded/latex.ts +20 -13
  316. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +106 -5
  317. package/src/core/codemirror/lsp/notebook-lsp.ts +16 -2
  318. package/src/core/codemirror/readonly/__tests__/extension.test.ts +6 -6
  319. package/src/core/codemirror/readonly/extension.ts +2 -2
  320. package/src/core/config/pair.ts +0 -1
  321. package/src/core/datasets/__tests__/data-source-discovery.test.ts +20 -13
  322. package/src/core/edit-app.tsx +5 -1
  323. package/src/core/export/hooks.ts +2 -2
  324. package/src/core/islands/bootstrap.ts +1 -0
  325. package/src/core/islands/bridge.ts +2 -2
  326. package/src/core/kernel/messages.ts +4 -7
  327. package/src/core/kernel/session.ts +9 -0
  328. package/src/core/network/__tests__/api.test.ts +114 -1
  329. package/src/core/network/__tests__/connection.test.ts +3 -3
  330. package/src/core/network/api.ts +3 -2
  331. package/src/core/network/connection-notice.ts +5 -5
  332. package/src/core/network/connection.ts +9 -9
  333. package/src/core/network/requests-lazy.ts +2 -2
  334. package/src/core/packages/__tests__/useSandboxController.test.tsx +2 -2
  335. package/src/core/packages/useSandboxController.ts +6 -6
  336. package/src/core/runtime/__tests__/adapter.test.ts +6 -6
  337. package/src/core/runtime/adapter.ts +7 -7
  338. package/src/core/runtime/config.ts +2 -2
  339. package/src/core/saving/filename.ts +2 -2
  340. package/src/core/saving/save-component.tsx +5 -5
  341. package/src/core/saving/useAutoSave.ts +2 -2
  342. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  343. package/src/core/wasm/bridge.ts +2 -2
  344. package/src/core/wasm/worker/bootstrap.ts +22 -3
  345. package/src/core/wasm/worker/types.ts +2 -2
  346. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +30 -25
  347. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +5 -5
  348. package/src/core/websocket/connection-utils.ts +21 -21
  349. package/src/core/websocket/types.ts +8 -9
  350. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -22
  351. package/src/css/katex-css.test.ts +166 -0
  352. package/src/css/katex.min.css +175 -169
  353. package/src/hooks/__tests__/useEventListener.test.tsx +45 -1
  354. package/src/hooks/useEventListener.ts +6 -1
  355. package/src/mount.tsx +2 -2
  356. package/src/plugins/core/__test__/registerReactComponent.test.ts +55 -0
  357. package/src/plugins/core/registerReactComponent.tsx +3 -1
  358. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  359. package/src/plugins/impl/DataTablePlugin.tsx +23 -2
  360. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  361. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  362. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  363. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  364. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  365. package/src/plugins/impl/NumberPlugin.tsx +21 -4
  366. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  367. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  368. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  369. package/src/plugins/impl/SliderPlugin.tsx +5 -1
  370. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  371. package/src/plugins/impl/TextAreaPlugin.tsx +23 -4
  372. package/src/plugins/impl/TextInputPlugin.tsx +10 -2
  373. package/src/plugins/impl/__test__/slider-labels.test.tsx +136 -0
  374. package/src/plugins/impl/__test__/text-labels.test.tsx +141 -0
  375. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +65 -8
  376. package/src/plugins/impl/__tests__/NumberPlugin.test.tsx +159 -1
  377. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  378. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  379. package/src/plugins/impl/common/labeled.tsx +9 -3
  380. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +15 -3
  381. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +0 -22
  382. package/src/stories/cell.stories.tsx +2 -2
  383. package/src/stories/dataframe.stories.tsx +7 -0
  384. package/src/stories/layout/vertical/one-column.stories.tsx +5 -5
  385. package/src/stories/progress-stages.stories.tsx +62 -0
  386. package/src/stories/runtime-existing.stories.tsx +44 -0
  387. package/src/stories/runtime-maintenance.stories.tsx +40 -0
  388. package/src/stories/runtime-pixi.stories.tsx +28 -0
  389. package/src/stories/{sandbox.stories.tsx → runtime-story.tsx} +191 -152
  390. package/src/stories/runtime-uv.stories.tsx +56 -0
  391. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  392. package/dist/assets/worker-D7hWi02M.js +0 -109
  393. package/dist/classDiagram-ZZMXUADV-BwYhrSEX.js +0 -30
  394. package/dist/classDiagram-v2-VYDZK3BY-HecM04TM.js +0 -30
  395. package/dist/dropdown-menu-BaqM0t4N.js +0 -4502
  396. package/dist/error-banner-DzAmP0AQ.js +0 -391
  397. package/dist/flowDiagram-HODETNUW-DgcjSdPV.js +0 -16
  398. package/dist/label-MNhNNoN6.js +0 -278
  399. package/dist/mermaid-HWGCJPDP-DYCzSILp.js +0 -2
  400. package/dist/purify.es-DgKyQviY.js +0 -805
  401. package/dist/select-BcObMjGz.js +0 -970
  402. package/dist/stateDiagram-v2-MP3YSRHH-Dk5QgdXF.js +0 -30
  403. package/dist/swimlanesDiagram-VR7AAH4N-CbztusY8.js +0 -30
  404. package/src/components/editor/chrome/panels/sandbox-toggle.tsx +0 -52
@@ -1,7 +1,91 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
+ import { getCoreRowModel, useReactTable } from "@tanstack/react-table";
4
+ import { fireEvent, render, screen } from "@testing-library/react";
3
5
  import { expect, test } from "vitest";
4
- import { matchingPageRanges } from "../pagination";
6
+ import { TooltipProvider } from "@/components/ui/tooltip";
7
+ import { DataTablePagination, matchingPageRanges } from "../pagination";
8
+
9
+ function PaginationHarness({
10
+ totalPages = 3,
11
+ loading = false,
12
+ }: {
13
+ totalPages?: number;
14
+ loading?: boolean;
15
+ }) {
16
+ const table = useReactTable({
17
+ locale: "en-US",
18
+ data: [],
19
+ columns: [],
20
+ getCoreRowModel: getCoreRowModel(),
21
+ manualPagination: true,
22
+ pageCount: totalPages,
23
+ });
24
+ return (
25
+ <TooltipProvider>
26
+ <DataTablePagination table={table} tableLoading={loading} />
27
+ </TooltipProvider>
28
+ );
29
+ }
30
+
31
+ test("named navigation controls preserve page updates and boundaries", () => {
32
+ render(<PaginationHarness />);
33
+ expect(screen.getByRole("button", { name: "First page" })).toBeDisabled();
34
+ expect(screen.getByRole("button", { name: "Previous page" })).toBeDisabled();
35
+ fireEvent.click(screen.getByRole("button", { name: "Next page" }));
36
+ expect(
37
+ screen.getByRole("button", { name: "Choose page, current page 2 of 3" }),
38
+ ).toBeEnabled();
39
+ fireEvent.click(screen.getByRole("button", { name: "Last page" }));
40
+ expect(screen.getByRole("button", { name: "Next page" })).toBeDisabled();
41
+ expect(screen.getByRole("button", { name: "Last page" })).toBeDisabled();
42
+ fireEvent.click(screen.getByRole("button", { name: "Previous page" }));
43
+ fireEvent.click(screen.getByRole("button", { name: "First page" }));
44
+ expect(
45
+ screen.getByRole("button", { name: "Choose page, current page 1 of 3" }),
46
+ ).toBeEnabled();
47
+ expect(screen.getByRole("button", { name: "First page" })).toBeDisabled();
48
+ expect(screen.getByRole("button", { name: "Previous page" })).toBeDisabled();
49
+ expect(screen.getByRole("button", { name: "Next page" })).toBeEnabled();
50
+ expect(screen.getByRole("button", { name: "Last page" })).toBeEnabled();
51
+ });
52
+
53
+ test("loading prevents navigation and a single page disables controls", () => {
54
+ const { rerender } = render(<PaginationHarness loading={true} />);
55
+ fireEvent.click(screen.getByRole("button", { name: "Next page" }));
56
+ fireEvent.click(screen.getByRole("button", { name: "Last page" }));
57
+ expect(
58
+ screen.getByRole("button", { name: "Choose page, current page 1 of 3" }),
59
+ ).toBeEnabled();
60
+ rerender(<PaginationHarness />);
61
+ fireEvent.click(screen.getByRole("button", { name: "Next page" }));
62
+ expect(
63
+ screen.getByRole("button", { name: "Choose page, current page 2 of 3" }),
64
+ ).toBeEnabled();
65
+ rerender(<PaginationHarness key="single-page" totalPages={1} />);
66
+ for (const name of [
67
+ "First page",
68
+ "Previous page",
69
+ "Next page",
70
+ "Last page",
71
+ "Choose page, current page 1 of 1",
72
+ ]) {
73
+ expect(screen.getByRole("button", { name })).toBeDisabled();
74
+ }
75
+ });
76
+
77
+ test("page picker exposes named dialog and search", () => {
78
+ render(<PaginationHarness />);
79
+ fireEvent.click(
80
+ screen.getByRole("button", { name: "Choose page, current page 1 of 3" }),
81
+ );
82
+ expect(
83
+ screen.getByRole("dialog", { name: "Choose page" }),
84
+ ).toBeInTheDocument();
85
+ expect(
86
+ screen.getByRole("combobox", { name: "Search pages" }),
87
+ ).toBeInTheDocument();
88
+ });
5
89
 
6
90
  test("empty prefix returns no ranges", () => {
7
91
  expect(matchingPageRanges("", 500)).toEqual([]);
@@ -0,0 +1,57 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import {
5
+ DownloadAsSchema,
6
+ DownloadGeoJSONSchema,
7
+ GetExportMetadataSchema,
8
+ } from "../schemas";
9
+
10
+ describe("geometry export contracts", () => {
11
+ it("keeps the existing download_as formats unchanged", () => {
12
+ for (const format of ["csv", "tsv", "json", "parquet"]) {
13
+ expect(DownloadAsSchema.input.parse({ format })).toEqual({ format });
14
+ }
15
+ expect(
16
+ DownloadAsSchema.input.safeParse({ format: "geojson" }).success,
17
+ ).toBe(false);
18
+ });
19
+ it.each([undefined, "geom_b", ""])(
20
+ "accepts a GeoJSON request with geometry %s",
21
+ (geometry_column) => {
22
+ const request = { format: "geojson", geometry_column };
23
+ expect(DownloadGeoJSONSchema.input.parse(request)).toEqual(request);
24
+ },
25
+ );
26
+
27
+ it("accepts a missing CRS response for an unnamed geometry", () => {
28
+ const response = {
29
+ url: "",
30
+ filename: "",
31
+ code: "missing_crs",
32
+ column: "",
33
+ error: "Declare a CRS.",
34
+ };
35
+ expect(DownloadGeoJSONSchema.output.parse(response)).toEqual(response);
36
+ });
37
+
38
+ it("accepts GeoJSON support when the default geometry has no CRS", () => {
39
+ const metadata = {
40
+ geometry_columns: [
41
+ { name: "", encoding: "objects", crs: null },
42
+ { name: "alternate", encoding: "objects", crs: "EPSG:4326" },
43
+ ],
44
+ primary_geometry_column: "",
45
+ default_geometry_column: "",
46
+ formats: {
47
+ geojson: { available: true, reason: null, missing_packages: [] },
48
+ parquet: {
49
+ available: false,
50
+ reason: "GeoParquet export requires pyarrow.",
51
+ missing_packages: ["pyarrow"],
52
+ },
53
+ },
54
+ };
55
+ expect(GetExportMetadataSchema.output.parse(metadata)).toEqual(metadata);
56
+ });
57
+ });
@@ -4,6 +4,31 @@ import { describe, expect, it } from "vitest";
4
4
  import { ChartSchema } from "../schemas";
5
5
 
6
6
  describe("ChartSchema", () => {
7
+ it.each(["hours", "yearmonthdatehours"] as const)(
8
+ "preserves the %s time unit in saved chart configurations",
9
+ (timeUnit) => {
10
+ const column = {
11
+ field: "timestamp",
12
+ selectedDataType: "temporal",
13
+ sort: "ascending",
14
+ timeUnit,
15
+ };
16
+ const config = {
17
+ general: {
18
+ xColumn: { ...column, aggregate: "none" },
19
+ yColumn: { ...column, aggregate: "none" },
20
+ facet: {
21
+ row: { ...column, linkYAxis: true, binned: true, maxbins: 6 },
22
+ column: { ...column, linkXAxis: true, binned: true, maxbins: 6 },
23
+ },
24
+ },
25
+ tooltips: { auto: true, fields: [] },
26
+ };
27
+
28
+ expect(ChartSchema.parse(config)).toEqual(config);
29
+ },
30
+ );
31
+
7
32
  it("keeps a known axis column type", () => {
8
33
  const result = ChartSchema.parse({
9
34
  general: { xColumn: { field: "count", type: "integer" } },
@@ -0,0 +1,54 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import { fireEvent, render, screen } from "@testing-library/react";
3
+ import { useForm, useWatch } from "react-hook-form";
4
+ import { describe, expect, test } from "vitest";
5
+ import { SetupMocks } from "@/__mocks__/common";
6
+ import { Form } from "@/components/ui/form";
7
+ import { SliderField } from "../components/form-fields";
8
+
9
+ SetupMocks.resizeObserver();
10
+ function Harness({ label = "Opacity" }: { label?: string }) {
11
+ const form = useForm({ defaultValues: { xAxis: { width: 400 } } });
12
+ const value = useWatch({ control: form.control, name: "xAxis.width" });
13
+ return (
14
+ <Form {...form}>
15
+ <SliderField
16
+ fieldName="xAxis.width"
17
+ label={label}
18
+ defaultValue={400}
19
+ start={200}
20
+ stop={800}
21
+ step={10}
22
+ />
23
+ <output aria-label="Current opacity">{value}</output>
24
+ </Form>
25
+ );
26
+ }
27
+
28
+ describe("SliderField", () => {
29
+ test("names the chart-form thumb and preserves keyboard value updates", () => {
30
+ const { rerender } = render(<Harness />);
31
+ fireEvent.keyDown(screen.getByRole("slider", { name: "Opacity" }), {
32
+ key: "ArrowRight",
33
+ });
34
+ expect(screen.getByLabelText("Current opacity")).toHaveTextContent("410");
35
+ rerender(<Harness label="Updated opacity" />);
36
+ expect(
37
+ screen.getByRole("slider", { name: "Updated opacity" }),
38
+ ).toHaveAttribute("aria-valuenow", "410");
39
+ });
40
+
41
+ test("independently associates repeated chart form instances", () => {
42
+ render(
43
+ <>
44
+ <Harness />
45
+ <Harness />
46
+ </>,
47
+ );
48
+ const thumbs = screen.getAllByRole("slider", { name: "Opacity" });
49
+ expect(thumbs).toHaveLength(2);
50
+ expect(thumbs[0].getAttribute("aria-labelledby")).not.toBe(
51
+ thumbs[1].getAttribute("aria-labelledby"),
52
+ );
53
+ });
54
+ });
@@ -69,30 +69,33 @@ describe("getAxisEncoding", () => {
69
69
  });
70
70
  });
71
71
 
72
- it("should return correct encoding for temporal field with timeUnit", () => {
73
- const result = getAxisEncoding(
74
- {
75
- field: "date",
76
- selectedDataType: "temporal",
77
- aggregate: NONE_VALUE,
78
- timeUnit: "yearmonth",
79
- },
80
- undefined,
81
- "Date",
82
- undefined,
83
- ChartType.LINE,
84
- );
72
+ it.each(["yearmonth", "hours", "yearmonthdatehours"] as const)(
73
+ "should preserve the %s time unit in temporal axis encodings",
74
+ (timeUnit) => {
75
+ const result = getAxisEncoding(
76
+ {
77
+ field: "date",
78
+ selectedDataType: "temporal",
79
+ aggregate: NONE_VALUE,
80
+ timeUnit,
81
+ },
82
+ undefined,
83
+ "Date",
84
+ undefined,
85
+ ChartType.LINE,
86
+ );
85
87
 
86
- expect(result).toEqual({
87
- field: "date",
88
- type: "temporal",
89
- bin: undefined,
90
- title: "Date",
91
- stack: undefined,
92
- aggregate: undefined,
93
- timeUnit: "yearmonth",
94
- });
95
- });
88
+ expect(result).toEqual({
89
+ field: "date",
90
+ type: "temporal",
91
+ bin: undefined,
92
+ title: "Date",
93
+ stack: undefined,
94
+ aggregate: undefined,
95
+ timeUnit,
96
+ });
97
+ },
98
+ );
96
99
 
97
100
  it("should return correct encoding for categorical field", () => {
98
101
  const result = getAxisEncoding(
@@ -358,6 +358,7 @@ export const SliderField = ({
358
358
  className,
359
359
  }: SliderFieldProps) => {
360
360
  const form = useFormContext();
361
+ const labelId = React.useId();
361
362
 
362
363
  return (
363
364
  <FormField
@@ -378,10 +379,11 @@ export const SliderField = ({
378
379
  <FormItem
379
380
  className={cn("flex flex-row items-center gap-2 w-1/2", className)}
380
381
  >
381
- <FormLabel>{label}</FormLabel>
382
+ <FormLabel id={labelId}>{label}</FormLabel>
382
383
  <FormControl>
383
384
  <Slider
384
385
  {...field}
386
+ aria-labelledby={labelId}
385
387
  id={fieldName}
386
388
  className="relative flex items-center select-none"
387
389
  value={[numericValue]}
@@ -147,17 +147,18 @@ export const TIME_UNIT_DESCRIPTIONS: Record<
147
147
  [title: string, description: string]
148
148
  > = {
149
149
  year: ["Year", "2025"],
150
- quarter: ["Quarter", "Q1 2025"],
151
- month: ["Month", "Jan 2025"],
152
- week: ["Week", "Jan 01, 2025"],
153
- day: ["Day", "Jan 01, 2025"],
154
- hours: ["Hour", "Jan 01, 2025 12:00"],
155
- minutes: ["Minute", "Jan 01, 2025 12:34"],
156
- seconds: ["Second", "Jan 01, 2025 12:34:56"],
157
- milliseconds: ["Millisecond", "Jan 01, 2025 12:34:56.789"],
158
- date: ["Date", "Jan 01, 2025"],
159
- dayofyear: ["Day of Year", "Day 1 of 2025"],
150
+ quarter: ["Quarter of year", "Q1"],
151
+ month: ["Month of year", "Jan"],
152
+ week: ["Week of year", "Week 1"],
153
+ day: ["Day of week", "Sunday"],
154
+ hours: ["Hour of day", "12:00"],
155
+ minutes: ["Minute of hour", "34"],
156
+ seconds: ["Second of minute", "56"],
157
+ milliseconds: ["Millisecond of second", "789"],
158
+ date: ["Day of month", "1"],
159
+ dayofyear: ["Day of year", "Day 1"],
160
160
  yearmonth: ["Year Month", "Jan 2025"],
161
161
  yearmonthdate: ["Year Month Date", "Jan 01, 2025"],
162
+ yearmonthdatehours: ["Year Month Date Hours", "Jan 01, 2025 12:00"],
162
163
  monthdate: ["Month Date", "Jan 01"],
163
164
  };
@@ -40,6 +40,7 @@ export const SINGLE_TIME_UNITS = [
40
40
  export const COMBINED_TIME_UNITS = [
41
41
  "yearmonth",
42
42
  "yearmonthdate",
43
+ "yearmonthdatehours",
43
44
  "monthdate",
44
45
  ] as const;
45
46
  export const TIME_UNITS = [
@@ -97,6 +97,7 @@ export const getFormatters = memoizeLastValue((locale: string) => {
97
97
 
98
98
  const dateFormatter = new Intl.DateTimeFormat(locale, {
99
99
  dateStyle: "short", // 3/4/2024
100
+ timeZone: "UTC",
100
101
  });
101
102
 
102
103
  const dateTimeFormatter = new Intl.DateTimeFormat(locale, {
@@ -123,6 +124,24 @@ export const getFormatters = memoizeLastValue((locale: string) => {
123
124
  };
124
125
  });
125
126
 
127
+ const TIMEZONE_SUFFIX = /(?:Z|[+-]\d{2}:?\d{2})$/i;
128
+
129
+ /**
130
+ * The date formatters render in UTC. A naive datetime string carries no
131
+ * offset, and `new Date` would read it as local time, so pin it to UTC
132
+ * to keep the wall-clock fields the backend sent.
133
+ */
134
+ function parseDateAsUTC(value: unknown): Date {
135
+ if (typeof value !== "string") {
136
+ return new Date(value as number | Date);
137
+ }
138
+ const trimmed = value.trim();
139
+ if (TIMEZONE_SUFFIX.test(trimmed) || !trimmed.includes(":")) {
140
+ return new Date(trimmed);
141
+ }
142
+ return new Date(`${trimmed.replace(" ", "T")}Z`);
143
+ }
144
+
126
145
  // Apply formatting to a value given a format and data type
127
146
  export const applyFormat = (
128
147
  value: unknown,
@@ -152,7 +171,7 @@ export const applyFormat = (
152
171
  return value;
153
172
  case "datetime":
154
173
  case "date": {
155
- const date = new Date(value as string);
174
+ const date = parseDateAsUTC(value);
156
175
  switch (format) {
157
176
  case "Date":
158
177
  return dateFormatter.format(date);
@@ -6,14 +6,14 @@ import { Popover as PopoverPrimitive } from "radix-ui";
6
6
  const PopoverClose = PopoverPrimitive.Close;
7
7
 
8
8
  import type { Column, ColumnDef } from "@tanstack/react-table";
9
- import { formatDate, isValid } from "date-fns";
9
+ import { isValid } from "date-fns";
10
10
  import { useRef } from "react";
11
11
  import { useLocale, useNumberFormatter } from "react-aria";
12
12
  import { WithLocale } from "@/core/i18n/with-locale";
13
13
  import type { DataType } from "@/core/kernel/messages";
14
14
  import type { CalculateTopKRows } from "@/plugins/impl/DataTablePlugin";
15
15
  import { cn } from "@/utils/cn";
16
- import { type DateFormat, exactDateTime, getDateFormat } from "@/utils/dates";
16
+ import { exactDateTime } from "@/utils/dates";
17
17
  import { Events } from "@/utils/events";
18
18
  import { Logger } from "@/utils/Logger";
19
19
  import { Maps } from "@/utils/maps";
@@ -583,21 +583,19 @@ function renderDate({
583
583
  value,
584
584
  dataType,
585
585
  dtype,
586
- format,
586
+ displayValue,
587
587
  locale,
588
588
  }: {
589
589
  value: Date;
590
590
  dataType?: DataType;
591
591
  dtype?: string;
592
- format?: DateFormat | null;
592
+ displayValue?: string;
593
593
  locale: string;
594
594
  }): React.ReactNode {
595
595
  const type = dataType === "date" ? "date" : "datetime";
596
596
  const timezone = extractTimezone(dtype);
597
597
 
598
- const exactValue = format
599
- ? formatDate(value, format)
600
- : exactDateTime(value, timezone, locale);
598
+ const exactValue = displayValue ?? exactDateTime(value, timezone, locale);
601
599
 
602
600
  return (
603
601
  <DatePopover date={value} type={type}>
@@ -640,7 +638,8 @@ export function renderCellValue<TData, TValue>({
640
638
 
641
639
  if (dataType === "datetime" && typeof value === "string") {
642
640
  try {
643
- if (!isValid(value)) {
641
+ const date = new Date(value);
642
+ if (!format || !isValid(date)) {
644
643
  return (
645
644
  <div onClick={selectCell} className={cellStyles}>
646
645
  {value}
@@ -648,14 +647,15 @@ export function renderCellValue<TData, TValue>({
648
647
  );
649
648
  }
650
649
 
651
- const date = new Date(value);
652
- const format = getDateFormat(value);
650
+ const displayValue = String(column.applyColumnFormatting(value));
653
651
  return (
654
- <WithLocale>
655
- {(locale) =>
656
- renderDate({ value: date, dataType, dtype, format, locale })
657
- }
658
- </WithLocale>
652
+ <div onClick={selectCell} className={cellStyles}>
653
+ <WithLocale>
654
+ {(locale) =>
655
+ renderDate({ value: date, dataType, dtype, displayValue, locale })
656
+ }
657
+ </WithLocale>
658
+ </div>
659
659
  );
660
660
  } catch (error) {
661
661
  Logger.error("Error parsing datetime, fallback to string", error);
@@ -672,10 +672,17 @@ export function renderCellValue<TData, TValue>({
672
672
  }
673
673
 
674
674
  // e.g. 2010-10-07 17:15:00
675
+ const displayValue = format
676
+ ? String(column.applyColumnFormatting(value))
677
+ : undefined;
675
678
  return (
676
- <WithLocale>
677
- {(locale) => renderDate({ value, dataType, dtype, locale })}
678
- </WithLocale>
679
+ <div onClick={selectCell} className={cellStyles}>
680
+ <WithLocale>
681
+ {(locale) =>
682
+ renderDate({ value, dataType, dtype, displayValue, locale })
683
+ }
684
+ </WithLocale>
685
+ </div>
679
686
  );
680
687
  }
681
688
 
@@ -155,6 +155,7 @@ const DataTableInternal = <TData,>({
155
155
  paginationState,
156
156
  setPaginationState,
157
157
  downloadAs,
158
+ getExportMetadata,
158
159
  manualPagination = false,
159
160
  pagination = false,
160
161
  onRowSelectionChange,
@@ -376,6 +377,8 @@ const DataTableInternal = <TData,>({
376
377
  togglePanel={togglePanel}
377
378
  isAnyPanelOpen={isAnyPanelOpen}
378
379
  downloadAs={downloadAs}
380
+ getExportMetadata={getExportMetadata}
381
+ metadataSource={data}
379
382
  sizeBytes={sizeBytes}
380
383
  sizeBytesIsLoading={sizeBytesIsLoading}
381
384
  />