@marimo-team/frontend 0.25.2-dev99 → 0.25.3-dev10

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 (441) hide show
  1. package/dist/assets/{CellStatus-Bj7PvY_u.js → CellStatus-nZpuDkm7.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-C5UW0p9I.js → ConnectedDataExplorerComponent-t8fH_TNc.js} +1 -1
  3. package/dist/assets/{ErrorBoundary-CG6gtgym.js → ErrorBoundary-B4n9EnHB.js} +2 -2
  4. package/dist/assets/{I18nProvider-BFOBKCJB.js → I18nProvider-Cg2I_s1_.js} +1 -1
  5. package/dist/assets/{ImageComparisonComponent-pCLPT6RA.js → ImageComparisonComponent-Bq-l26rq.js} +1 -1
  6. package/dist/assets/{Inputs-BlygJyl1.js → Inputs-BsQm29hD.js} +1 -1
  7. package/dist/assets/JsonOutput-BxB0NL8w.js +11 -0
  8. package/dist/assets/{LazyAnyLanguageCodeMirror-CeTd_wFt.js → LazyAnyLanguageCodeMirror-CKcCbG2G.js} +2 -2
  9. package/dist/assets/MarimoErrorOutput-BTy4MOzX.js +10 -0
  10. package/dist/assets/{Plot-CNtRAZBG.js → Plot-B8w5_jU-.js} +1 -1
  11. package/dist/assets/{RenderHTML-C7QcdAgB.js → RenderHTML-9bMgbYmo.js} +1 -1
  12. package/dist/assets/{RunButton-A__3wcpF.js → RunButton-CFQUNN5c.js} +1 -1
  13. package/dist/assets/__vite-browser-external-CYO_P3S8.js +1 -0
  14. package/dist/assets/__vite-browser-external-FeDVGZU8.js +1 -0
  15. package/dist/assets/{abnfDiagram-VCTEODGH-BuHNQB7l.js → abnfDiagram-VCTEODGH-3eD1PSvc.js} +1 -1
  16. package/dist/assets/add-cell-with-ai-f_MnLCwI.js +76 -0
  17. package/dist/assets/{add-connection-dialog-bl8dqCVs.js → add-connection-dialog-CoE_PhuD.js} +1 -1
  18. package/dist/assets/{agent-panel-BPLrf7mA.js → agent-panel-BWZz24jK.js} +5 -5
  19. package/dist/assets/ai-model-dropdown-zm-2fXzf.js +13 -0
  20. package/dist/assets/{alert-MrQXRIin.js → alert-DTaqCu_d.js} +1 -1
  21. package/dist/assets/{alert-dialog-DlL1c-bx.js → alert-dialog-BaPGzeOK.js} +1 -1
  22. package/dist/assets/{any-language-editor-DtOWujZJ.js → any-language-editor-BLCAD3yx.js} +1 -1
  23. package/dist/assets/app-config-button-BhU0ulYs.js +1 -0
  24. package/dist/assets/{architectureDiagram-5GKGNRK7-DvIXijdN.js → architectureDiagram-5GKGNRK7-Bx_zXJUH.js} +1 -1
  25. package/dist/assets/arrow-down-C9Bslqr3.js +1 -0
  26. package/dist/assets/arrow-left-BaPN-xbg.js +1 -0
  27. package/dist/assets/arrow-right-Cgit4Nk2.js +1 -0
  28. package/dist/assets/{badge-DFf033uX.js → badge-crT3E0Rm.js} +1 -1
  29. package/dist/assets/ban-YzvUro5I.js +1 -0
  30. package/dist/assets/{blob-Bx8A10xl.js → blob-iOBwGaP9.js} +1 -1
  31. package/dist/assets/{blockDiagram-I7D4REHJ-DGAMO17L.js → blockDiagram-I7D4REHJ-CuwUGEGQ.js} +1 -1
  32. package/dist/assets/{bot-message-square-BfGaNy9r.js → bot-message-square-8xmbrehG.js} +1 -1
  33. package/dist/assets/{bundle.esm-CklCb9AD.js → bundle.esm-D3tw5rqW.js} +1 -1
  34. package/dist/assets/{button-M49xxKoi.js → button-COI-NGrx.js} +1 -1
  35. package/dist/assets/{c4Diagram-7LVT6UL2-qqO5IOnV.js → c4Diagram-7LVT6UL2-nj0NbEUh.js} +1 -1
  36. package/dist/assets/{cache-panel-BNPF4X5e.js → cache-panel-DTY1dqvi.js} +1 -1
  37. package/dist/assets/{capabilities-BScjbYOK.js → capabilities-BJvf-MD4.js} +1 -1
  38. package/dist/assets/{card-BYZGhhhx.js → card-DOABds5l.js} +1 -1
  39. package/dist/assets/{cell-editor-C3818WlB.js → cell-editor-CAj1UKxx.js} +12 -12
  40. package/dist/assets/{cell-link-DC1UZQr_.js → cell-link-1CynTVGQ.js} +1 -1
  41. package/dist/assets/cells-rA_jsZCj.js +220 -0
  42. package/dist/assets/channel-DtckUh1_.js +1 -0
  43. package/dist/assets/{chart-no-axes-column-B6FT5Xvu.js → chart-no-axes-column-C4_v6fQW.js} +1 -1
  44. package/dist/assets/{chat-display-YETh6yXV.js → chat-display-BmEPmhDP.js} +1 -1
  45. package/dist/assets/chat-panel-Ce2Xh7dM.js +4 -0
  46. package/dist/assets/{chat-ui-D_QL46qM.js → chat-ui-DTy98rP3.js} +1 -1
  47. package/dist/assets/check-BQNapYaf.js +1 -0
  48. package/dist/assets/chevron-right-eAtVhbNZ.js +1 -0
  49. package/dist/assets/{chunk-2E4U76K2-DqA2CBL0.js → chunk-2E4U76K2-dDf4JvCq.js} +1 -1
  50. package/dist/assets/{chunk-4HAMMTFA-DaFOJTOO.js → chunk-4HAMMTFA-Bhjs7H7G.js} +1 -1
  51. package/dist/assets/{chunk-75Z2AOVW-DEp7Wbaj.js → chunk-75Z2AOVW-DlSlUzCU.js} +1 -1
  52. package/dist/assets/{chunk-CLGD4ZFX-BxW11Imt.js → chunk-CLGD4ZFX-CvGMvSe-.js} +1 -1
  53. package/dist/assets/{chunk-DU6HZSFF-CDmPCRkr.js → chunk-DU6HZSFF-BxQd02hX.js} +2 -2
  54. package/dist/assets/{chunk-F27PBJKO-455JWNM3.js → chunk-F27PBJKO-DL9FG-iN.js} +1 -1
  55. package/dist/assets/{chunk-GMAD6QVW-ahdTJvh0.js → chunk-GMAD6QVW-B1Ai6qbk.js} +1 -1
  56. package/dist/assets/{chunk-GVQU2GXP-CPkYne1h.js → chunk-GVQU2GXP-a_N0QLD4.js} +1 -1
  57. package/dist/assets/{chunk-IMKFNOWR-fARccL86.js → chunk-IMKFNOWR-7KbFyW3C.js} +1 -1
  58. package/dist/assets/{chunk-L3NEJ4N5-BOK6HmaY.js → chunk-L3NEJ4N5-BcHj9aiN.js} +1 -1
  59. package/dist/assets/{chunk-OSK3NFVY-CEcyPnHo.js → chunk-OSK3NFVY-Dc7tMbN9.js} +1 -1
  60. package/dist/assets/{chunk-P2QGCYS3-Bw5LRT6S.js → chunk-P2QGCYS3-G6pmnA0z.js} +1 -1
  61. package/dist/assets/{chunk-POPQ4Y6H-C--NLIXc.js → chunk-POPQ4Y6H-C3iw1mOR.js} +1 -1
  62. package/dist/assets/{chunk-PWAF6VOD-B1mxlptQ.js → chunk-PWAF6VOD-Dy1Fp4eJ.js} +1 -1
  63. package/dist/assets/{chunk-SHT3W25Y-Diet96b1.js → chunk-SHT3W25Y-B3kFJuvo.js} +1 -1
  64. package/dist/assets/{chunk-SVP7TREG-BbcEGfNl.js → chunk-SVP7TREG-BNmfcKnL.js} +1 -1
  65. package/dist/assets/{chunk-TICWLB2K-BypOyFjf.js → chunk-TICWLB2K-CI3x9ENh.js} +1 -1
  66. package/dist/assets/{chunk-TLUHSLCS-DvvqZUl_.js → chunk-TLUHSLCS-Q72uYeUY.js} +2 -2
  67. package/dist/assets/{chunk-YOKDWASO-84E-_nIR.js → chunk-YOKDWASO-BIpRENEC.js} +4 -4
  68. package/dist/assets/{circle-Bb1IbBVn.js → circle-DXf-VWZG.js} +1 -1
  69. package/dist/assets/circle-check-BCurAHEb.js +1 -0
  70. package/dist/assets/{circle-play-X3K8DkEc.js → circle-play-CYIb0qT6.js} +1 -1
  71. package/dist/assets/classDiagram-ZZMXUADV-vm4wDTPy.js +1 -0
  72. package/dist/assets/classDiagram-v2-VYDZK3BY-vm4wDTPy.js +1 -0
  73. package/dist/assets/{clear-button-BGfeXcJ3.js → clear-button-p6YcvzLy.js} +1 -1
  74. package/dist/assets/{click-outside-container-CHoodRk9.js → click-outside-container-D_Dy5sZY.js} +1 -1
  75. package/dist/assets/{clipboard-paste-D0gau9Xw.js → clipboard-paste-HVpozQmt.js} +1 -1
  76. package/dist/assets/code-BEiQP4pS.js +1 -0
  77. package/dist/assets/{code-visibility-DNzJgrTz.js → code-visibility-B-_GvwR5.js} +1 -1
  78. package/dist/assets/{code-xml-CW65k2pN.js → code-xml-SQaZqvcO.js} +1 -1
  79. package/dist/assets/coerce-CpE6kUdX.js +1 -0
  80. package/dist/assets/{column-preview-fD3qW2B5.js → column-preview-DU6dT80y.js} +1 -1
  81. package/dist/assets/command-palette-BMqFKXVr.js +1 -0
  82. package/dist/assets/{common-Cy3lJDvJ.js → common-lisZ0l6a.js} +1 -1
  83. package/dist/assets/{compiler-runtime-BQ9S8nyo.js → compiler-runtime-BrajqUja.js} +1 -1
  84. package/dist/assets/{components-M5WFQ0gs.js → components-CP_UoFtT.js} +1 -1
  85. package/dist/assets/{components-ufN33X-R.js → components-CXfO-F47.js} +1 -1
  86. package/dist/assets/{components-D9ZIJGG8.js → components-Dvd1GnD6.js} +1 -1
  87. package/dist/assets/config-DJLAC21v.js +1 -0
  88. package/dist/assets/{config-D_c_6ce1.js → config-DX8Y2WbJ.js} +1 -1
  89. package/dist/assets/{config-Cyum2gRs.js → config-VPSq73n8.js} +1 -1
  90. package/dist/assets/{copy-D03Y7IMR.js → copy-D8O_CYCG.js} +1 -1
  91. package/dist/assets/{copy-RyCOE8jo.js → copy-Djr5m5ac.js} +1 -1
  92. package/dist/assets/{copy-icon-wfSGfX8v.js → copy-icon-BIiRXh_3.js} +1 -1
  93. package/dist/assets/{createLucideIcon-rHn2EdoM.js → createLucideIcon-DfJ2oMlA.js} +1 -1
  94. package/dist/assets/{createReducer-W5dowuCe.js → createReducer-DgRODTW6.js} +1 -1
  95. package/dist/assets/{cynefinDiagram-5FMLGOSQ-BW3uXbHa.js → cynefinDiagram-5FMLGOSQ-Cy86eSwK.js} +1 -1
  96. package/dist/assets/{dagre-GXQ25YYZ-DIV0whJf.js → dagre-GXQ25YYZ-CcWiU9Wf.js} +1 -1
  97. package/dist/assets/{data-grid-overlay-editor-DuYKABwo.js → data-grid-overlay-editor-CMnBpfPb.js} +1 -1
  98. package/dist/assets/{database-zap-CrkOvbyN.js → database-zap-B_PMVg8T.js} +1 -1
  99. package/dist/assets/{datasource-Tst92Pzi.js → datasource-Dr1xNKUn.js} +1 -1
  100. package/dist/assets/dates-CfmdTL6B.js +1 -0
  101. package/dist/assets/{dependency-graph-panel-CLrAZrHA.js → dependency-graph-panel-B0uP-_id.js} +1 -1
  102. package/dist/assets/{diagram-S7CK7UJ4-BzoPaaoH.js → diagram-S7CK7UJ4-hmuvh6TI.js} +1 -1
  103. package/dist/assets/{diagram-UQ7AKVKN-BnOSn29R.js → diagram-UQ7AKVKN-CM3XDKRP.js} +1 -1
  104. package/dist/assets/{diagram-VSXAHHWV-DAz8vger.js → diagram-VSXAHHWV-B8HedxR3.js} +1 -1
  105. package/dist/assets/{diagram-VX7I27RA-BQOZxgYE.js → diagram-VX7I27RA-D_5dmdWD.js} +1 -1
  106. package/dist/assets/{diagram-Z3DM3KII-B_OF69Ac.js → diagram-Z3DM3KII-DWHvDoOc.js} +1 -1
  107. package/dist/assets/{dist-DoyTOIOd.js → dist-D6KQW558.js} +1 -1
  108. package/dist/assets/{dist-Cm7MoInu.js → dist-DR-Kwzb9.js} +1 -1
  109. package/dist/assets/{dist-Bqtq4wYM.js → dist-iaThVDkA.js} +1 -1
  110. package/dist/assets/{documentation-panel-OMUbXgKW.js → documentation-panel-DVl_ebWy.js} +1 -1
  111. package/dist/assets/{download-CPMAf7re.js → download-Bx55LMki.js} +1 -1
  112. package/dist/assets/{dropdown-menu-B2JUUcK7.js → dropdown-menu-C1rnl-0o.js} +1 -1
  113. package/dist/assets/{ebnfDiagram-PWID7BFC-BbkBTazy.js → ebnfDiagram-PWID7BFC-2XbadxRe.js} +1 -1
  114. package/dist/assets/edit-page-DlfCLUaq.js +9 -0
  115. package/dist/assets/{ellipsis-CLMWXUqY.js → ellipsis-63DyBLHQ.js} +1 -1
  116. package/dist/assets/{empty-state-CzxjZqGW.js → empty-state-BaCKb7o3.js} +1 -1
  117. package/dist/assets/{en-US-B4U3zuiu.js → en-US-Buu61juQ.js} +1 -1
  118. package/dist/assets/{erDiagram-RLTQ6QDP-DxDHwsU0.js → erDiagram-RLTQ6QDP-DbTcKdOV.js} +1 -1
  119. package/dist/assets/{error-banner-D1_bPN9u.js → error-banner-Cd69vvyX.js} +1 -1
  120. package/dist/assets/{error-entries-DBpwg0GC.js → error-entries-DOWpdGvI.js} +1 -1
  121. package/dist/assets/{error-panel-BgYJTJpA.js → error-panel-DpbNKSLs.js} +1 -1
  122. package/dist/assets/{errors-D9vyuMar.js → errors-DCrsa1nH.js} +1 -1
  123. package/dist/assets/{es-KNLgCZL4.js → es-Cqst59WX.js} +1 -1
  124. package/dist/assets/{esm-3WkPrffD.js → esm-CI_o7NhW.js} +1 -1
  125. package/dist/assets/{external-link-D2lKwXyB.js → external-link-UrX9KO36.js} +1 -1
  126. package/dist/assets/{eye-off-CfkK-QS3.js → eye-off-CxVozGAC.js} +1 -1
  127. package/dist/assets/{feedback-button-7KY7nL-j.js → feedback-button-B99ThNJW.js} +1 -1
  128. package/dist/assets/feedback-button-DlqZkJwz.js +1 -0
  129. package/dist/assets/{file-mCR_SMtq.js → file-BPBVl9pl.js} +1 -1
  130. package/dist/assets/{file-explorer-panel-HvVNt0Qs.js → file-explorer-panel-Bo9eN3rW.js} +1 -1
  131. package/dist/assets/{file-headphone-DKocX1z0.js → file-headphone-Dl35U6h3.js} +1 -1
  132. package/dist/assets/{file-icons-e7tmeyP-.js → file-icons-CdJgUy-I.js} +1 -1
  133. package/dist/assets/{file-name-input-DZehOHLA.js → file-name-input-ChnBsDE_.js} +1 -1
  134. package/dist/assets/{fileToBase64-aqhlf6Jj.js → fileToBase64-BgBraYAr.js} +1 -1
  135. package/dist/assets/{floating-outline-K7cVdOlC.js → floating-outline-MYqQW4Vp.js} +1 -1
  136. package/dist/assets/flowDiagram-HODETNUW-DR34jHUd.js +1 -0
  137. package/dist/assets/{formats-DkOlpVdf.js → formats-yZ06h1Pl.js} +1 -1
  138. package/dist/assets/{formatting-Civx9FAg.js → formatting-BqrP-n49.js} +1 -1
  139. package/dist/assets/{fullscreen-DEBblJKh.js → fullscreen-B9tHcfpV.js} +1 -1
  140. package/dist/assets/{gallery-page-DoriMrLH.js → gallery-page-DSL0J4md.js} +1 -1
  141. package/dist/assets/{ganttDiagram-EL5Y4UJY-BzkL5tY7.js → ganttDiagram-EL5Y4UJY-2n7Ig5Jm.js} +1 -1
  142. package/dist/assets/{gitGraphDiagram-WWUBYQGX-DqtmYSBS.js → gitGraphDiagram-WWUBYQGX-DxR7RNkL.js} +1 -1
  143. package/dist/assets/{github-khsXwCtv.js → github-DQZhN3La.js} +1 -1
  144. package/dist/assets/{glide-data-editor-DWyeHe3u.js → glide-data-editor-B1MWlKeM.js} +4 -4
  145. package/dist/assets/{glide-utils-BzwA3q-e.js → glide-utils-CIrAxdjv.js} +1 -1
  146. package/dist/assets/{globe-CmFhHoL1.js → globe-UdPdIbF7.js} +1 -1
  147. package/dist/assets/{hat-glasses-DVgK5i5l.js → hat-glasses-C8RhSVii.js} +1 -1
  148. package/dist/assets/{highlighted-body-KPVGNVTW-DxcqwMAu.js → highlighted-body-KPVGNVTW-BBA_Oaqj.js} +1 -1
  149. package/dist/assets/{home-page-BcJJsD_Q.js → home-page-KrhQ55Vg.js} +1 -1
  150. package/dist/assets/{hooks-Qxjt0Ypd.js → hooks-BIogTGCr.js} +1 -1
  151. package/dist/assets/{house-CbkYoQ5W.js → house-CpsMWsLL.js} +1 -1
  152. package/dist/assets/{html-to-image-CFVIG1VZ.js → html-to-image-DK9Zl1lU.js} +1 -1
  153. package/dist/assets/{icons-CVdkfEA3.js → icons-CiZ_8zS-.js} +1 -1
  154. package/dist/assets/{image-CTch9x2I.js → image-wZvTj8WY.js} +1 -1
  155. package/dist/assets/index-6b4mf8Ai.css +2 -0
  156. package/dist/assets/index-B3fcrmuf.js +30 -0
  157. package/dist/assets/{infoDiagram-27XIBGKW-7rLCp1UQ.js → infoDiagram-27XIBGKW-U5Oqw16-.js} +1 -1
  158. package/dist/assets/{input-DPd57MDP.js → input-BoBxR50a.js} +1 -1
  159. package/dist/assets/{isValid-BEbe1fFs.js → isValid-q_Ad80ug.js} +1 -1
  160. package/dist/assets/{ishikawaDiagram-5VMMS53U-BH7XUtkN.js → ishikawaDiagram-5VMMS53U-Bob74yfq.js} +1 -1
  161. package/dist/assets/{journeyDiagram-3NMN7TZE-BOj0kV6v.js → journeyDiagram-3NMN7TZE-CO3wos0F.js} +1 -1
  162. package/dist/assets/{kanban-definition-UXKFOSKX-CPrudFOv.js → kanban-definition-UXKFOSKX-HnyRfUfJ.js} +1 -1
  163. package/dist/assets/katex-C9vVdkK0.js +1 -0
  164. package/dist/assets/{katex-DUp2KybH.js → katex-CF1UBJcr.js} +5 -5
  165. package/dist/assets/{kbd-BnUiViRu.js → kbd-pdKBv96t.js} +1 -1
  166. package/dist/assets/kiosk-mode-BZECfg9k.js +1 -0
  167. package/dist/assets/{layout-CSLw6wGo.js → layout-DOpdUwym.js} +4 -4
  168. package/dist/assets/{link-BF4dGmOQ.js → link-NuFVR7G9.js} +1 -1
  169. package/dist/assets/links-DkkL9DVa.js +1 -0
  170. package/dist/assets/{logs-panel-OkoO5mbN.js → logs-panel-y0XnfulJ.js} +1 -1
  171. package/dist/assets/loro_wasm_bg-C2Fqi8D-.js +1 -0
  172. package/dist/assets/loro_wasm_bg-CSolyDSZ.wasm +0 -0
  173. package/dist/assets/loro_wasm_bg-Ctp2cNI9.js +1 -0
  174. package/dist/assets/{marimo-icons-B_1oPpIE.js → marimo-icons-CqliHyTr.js} +1 -1
  175. package/dist/assets/{markdown-renderer-mDlWBE1M.js → markdown-renderer-Q5AhbRU3.js} +2 -2
  176. package/dist/assets/{menu-items-DAaNKHJF.js → menu-items-BrwnTgyK.js} +1 -1
  177. package/dist/assets/mermaid-HWGCJPDP-B7ByBG-a.js +1 -0
  178. package/dist/assets/{mermaid-CX6aTquk.js → mermaid-a3xYymTy.js} +3 -3
  179. package/dist/assets/{message-circle-OTHnVlxO.js → message-circle-C3rKm8_a.js} +1 -1
  180. package/dist/assets/{mhchem-hMh9XtQZ.js → mhchem-B6WrVrmp.js} +1 -1
  181. package/dist/assets/{mindmap-definition-YA3MSWOX-kWyI8sXl.js → mindmap-definition-YA3MSWOX-Tl5cqnHr.js} +1 -1
  182. package/dist/assets/{multi-icon-DWzZu-9u.js → multi-icon-DL465pPF.js} +1 -1
  183. package/dist/assets/{name-cell-input-D_Q2IhP9.js → name-cell-input-BNOnF6-0.js} +1 -1
  184. package/dist/assets/{number-overlay-editor-myrryj7o.js → number-overlay-editor-DS8xi0jE.js} +1 -1
  185. package/dist/assets/{numbers-BEfBaQtu.js → numbers-Mk3-CcoU.js} +1 -1
  186. package/dist/assets/{outline-panel-Dy2cmYDF.js → outline-panel-Be7stWwv.js} +1 -1
  187. package/dist/assets/{package-BeYhVWvM.js → package-GSoSTiIK.js} +1 -1
  188. package/dist/assets/{package-data-BwaspaKJ.js → package-data-dv4FBHxR.js} +1 -1
  189. package/dist/assets/{packages-panel-CIvhx0hb.js → packages-panel-ClxOAEGy.js} +1 -1
  190. package/dist/assets/{panel-accordion-state-BI4SU22L.js → panel-accordion-state-GeMEdCPw.js} +1 -1
  191. package/dist/assets/{panel-context-BPaQeOuV.js → panel-context-C2QXpKfx.js} +1 -1
  192. package/dist/assets/panels-DfCmzLtT.js +4 -0
  193. package/dist/assets/{pathUtils-BKesuhdv.js → pathUtils-DPmlLd-r.js} +1 -1
  194. package/dist/assets/{paths-CzfpItSz.js → paths-bkIFVj8h.js} +1 -1
  195. package/dist/assets/{pegDiagram-XKGWAZYB-CiBJGPte.js → pegDiagram-XKGWAZYB-a0itOiYa.js} +1 -1
  196. package/dist/assets/{pieDiagram-E7YTZNPT-RpjpKhU6.js → pieDiagram-E7YTZNPT-DFve8H9P.js} +1 -1
  197. package/dist/assets/plus-C5silF6g.js +1 -0
  198. package/dist/assets/process-output-DNFKMODr.js +1 -0
  199. package/dist/assets/{quadrantDiagram-AXDQQJYC-Ci_qzCqs.js → quadrantDiagram-AXDQQJYC-yBhCDI7E.js} +1 -1
  200. package/dist/assets/{railroadDiagram-O6MQD6OU-B2IWK3fJ.js → railroadDiagram-O6MQD6OU-CgwdYhrd.js} +1 -1
  201. package/dist/assets/react-DVplv7_D.js +1 -0
  202. package/dist/assets/react-dom-_LrxgvjW.js +1 -0
  203. package/dist/assets/{react-icons.esm-C6SMwKZH.js → react-icons.esm-D6tfmvq8.js} +1 -1
  204. package/dist/assets/{react-resizable-panels.browser.esm-BL2E7f5c.js → react-resizable-panels.browser.esm-Dbe0MrFr.js} +1 -1
  205. package/dist/assets/{react-vega-Jq3Jd7eX.js → react-vega-C3rYGtP6.js} +1 -1
  206. package/dist/assets/{readonly-code-display-CNbw6v1-.js → readonly-code-display-YULOXf4h.js} +1 -1
  207. package/dist/assets/{readonly-python-code-DcYhdd1B.js → readonly-python-code-CadgXgRu.js} +1 -1
  208. package/dist/assets/{refresh-cw-CEGpOrzd.js → refresh-cw-Qw1f8Jhy.js} +1 -1
  209. package/dist/assets/{renderShortcut-BnRfkbwf.js → renderShortcut-BkVJQ_Zh.js} +1 -1
  210. package/dist/assets/requests-CgSY1X4a.js +1 -0
  211. package/dist/assets/{requests-yTHMxhVa.js → requests-lt0JK8Jt.js} +1 -1
  212. package/dist/assets/{requirementDiagram-BXWQKSXE-B0_CyV0T.js → requirementDiagram-BXWQKSXE-BCDzS-aV.js} +1 -1
  213. package/dist/assets/reveal-component-BVAR7ayZ.js +1069 -0
  214. package/dist/assets/{reveal-component-wEV_sB3u.css → reveal-component-DMRR6gKy.css} +1 -1
  215. package/dist/assets/{rotate-ccw-se3Oa1US.js → rotate-ccw-D8WCVWNE.js} +1 -1
  216. package/dist/assets/{rotate-cw-BcRERxHa.js → rotate-cw-CZ2syZTu.js} +1 -1
  217. package/dist/assets/{run-page-CVWospEP.js → run-page-Cxu1yV8Q.js} +1 -1
  218. package/dist/assets/{runs-DyluVj69.js → runs-BLp5jezv.js} +1 -1
  219. package/dist/assets/{runtime-details-state-lxXYwJcI.js → runtime-details-state-DuChzsA6.js} +1 -1
  220. package/dist/assets/{sankeyDiagram-P5KCCOFB-BekzhMvv.js → sankeyDiagram-P5KCCOFB-byYeKbB2.js} +1 -1
  221. package/dist/assets/{save-D4cG4pP2.js → save-Dgoim6QF.js} +1 -1
  222. package/dist/assets/save-worker-BbUSwZRG.js +118 -0
  223. package/dist/assets/schemas-Dv42wLFq.js +56 -0
  224. package/dist/assets/{scratchpad-panel-B4qlmwP-.js → scratchpad-panel-By-ybhjg.js} +1 -1
  225. package/dist/assets/{scroll-to-bottom-button-Dmrd5bjQ.js → scroll-to-bottom-button-1FyowpWV.js} +1 -1
  226. package/dist/assets/{secrets-panel-DT1Nansx.js → secrets-panel-Bctbtkrp.js} +1 -1
  227. package/dist/assets/{select-BwRFbZty.js → select-DTBn5eTb.js} +1 -1
  228. package/dist/assets/{sequenceDiagram-WJ2MYXX4-DELi1Kz5.js → sequenceDiagram-WJ2MYXX4-CLLPBM4B.js} +1 -1
  229. package/dist/assets/{session-BykGt6S3.js → session-DqoWmb7X.js} +1 -1
  230. package/dist/assets/session-panel-BmW6PH4z.js +1 -0
  231. package/dist/assets/{settings-DlKTeV_0.js → settings-BpdQZRgT.js} +1 -1
  232. package/dist/assets/{shell-BSnvn9t7.js → shell-Fj8a65ii.js} +1 -1
  233. package/dist/assets/{shim-5li_pJY_.js → shim-CjjJUhDo.js} +1 -1
  234. package/dist/assets/{skeleton-CKpBjoLm.js → skeleton-Cqh4O9g1.js} +1 -1
  235. package/dist/assets/{snippets-panel-YttkYAW9.js → snippets-panel-CQ1dn3lA.js} +1 -1
  236. package/dist/assets/{spec-D9d9nT0z.js → spec-BfSBcO5B.js} +1 -1
  237. package/dist/assets/{spinner-CGdRKCnw.js → spinner-DyNE-o8o.js} +1 -1
  238. package/dist/assets/square-BPmgQFnh.js +1 -0
  239. package/dist/assets/{square-function-DyFIOFp5.js → square-function-_W_Lo0P4.js} +1 -1
  240. package/dist/assets/state-BAJYRhmO.js +1 -0
  241. package/dist/assets/{state-BI0fn_YF.js → state-Bfh_2SLl.js} +1 -1
  242. package/dist/assets/{state-ja7GWeCS.js → state-C3oDoyFe.js} +1 -1
  243. package/dist/assets/{state-B2ZbImvm.js → state-DxQnC_1I.js} +1 -1
  244. package/dist/assets/{state-BxLm8vme.js → state-uwRvJLb8.js} +1 -1
  245. package/dist/assets/state-z3dlofZB.js +3 -0
  246. package/dist/assets/{stateDiagram-D77RDMKH-udui7EYS.js → stateDiagram-D77RDMKH-BeIsqkgQ.js} +1 -1
  247. package/dist/assets/stateDiagram-v2-MP3YSRHH-YdOj4q4D.js +1 -0
  248. package/dist/assets/{strings-hlCLC-K1.js → strings-B2vv-ENv.js} +1 -1
  249. package/dist/assets/{swimlanes-42K2YHIH-C-iTrYJs.js → swimlanes-42K2YHIH-CIhaeNCx.js} +1 -1
  250. package/dist/assets/swimlanesDiagram-VR7AAH4N-BLZbCKkx.js +8 -0
  251. package/dist/assets/{swiper-component-eXUBvFuA.js → swiper-component-a07domrZ.js} +1 -1
  252. package/dist/assets/{switch-C-83e2fG.js → switch-CTaiAjrz.js} +1 -1
  253. package/dist/assets/{table-B7KYyTxw.js → table-DG7Ap4H4.js} +1 -1
  254. package/dist/assets/{table-Dg1KxH-q.js → table-vrvqpuKJ.js} +1 -1
  255. package/dist/assets/{tabs-QRT1DYjj.js → tabs-BuQlZFbt.js} +1 -1
  256. package/dist/assets/{terminal-3hxM6K9q.js → terminal-Ck_vK-34.js} +1 -1
  257. package/dist/assets/{timeline-definition-24CTP7MA-D2u0nOZp.js → timeline-definition-24CTP7MA-BSH7-Tss.js} +1 -1
  258. package/dist/assets/toDate-DOj9Q6uC.js +1 -0
  259. package/dist/assets/{toast-BRwEbWb6.js → toast-BGzLGnvw.js} +1 -1
  260. package/dist/assets/{tooltip-B5pI8o2n.js → tooltip-C9TuY18o.js} +1 -1
  261. package/dist/assets/{tooltip-BeP4eX87.js → tooltip-mT3CGest.js} +1 -1
  262. package/dist/assets/{tracing-DZYfCw6p.js → tracing-BARlJ_Dk.js} +1 -1
  263. package/dist/assets/tracing-panel-dgnr2fIN.js +2 -0
  264. package/dist/assets/{trash-2-BJG-7Qob.js → trash-2-DcgaW8fn.js} +1 -1
  265. package/dist/assets/{trash-BKbZYRHl.js → trash-ChRHEGfM.js} +1 -1
  266. package/dist/assets/{tree-actions-D5clvgKl.js → tree-actions-DAd80MbP.js} +1 -1
  267. package/dist/assets/{triangle-alert-BeRqoThc.js → triangle-alert-DmIqR8sY.js} +1 -1
  268. package/dist/assets/{use-restore-focus-GUh2Nd8Z.js → use-restore-focus-BxEGwIbk.js} +1 -1
  269. package/dist/assets/{use-toast-CC89xOwH.js → use-toast-Wu434mLr.js} +1 -1
  270. package/dist/assets/{use-vega-container-remeasure-CS3c8wGN.js → use-vega-container-remeasure-BpmHehNK.js} +1 -1
  271. package/dist/assets/{useAddCell-Bhv6GT3m.js → useAddCell-DGstJK0S.js} +1 -1
  272. package/dist/assets/{useAsyncData-DucTwMkf.js → useAsyncData-C7aJJz0Y.js} +1 -1
  273. package/dist/assets/{useBoolean-Co-_MyFz.js → useBoolean-BDD6_xQQ.js} +1 -1
  274. package/dist/assets/{useCellActionButton-BTsPn8Dv.js → useCellActionButton-DY9RlJTb.js} +1 -1
  275. package/dist/assets/{useDateFormatter-CTYCgKB-.js → useDateFormatter-DA-62E-Y.js} +1 -1
  276. package/dist/assets/{useDebounce-DMbg9X18.js → useDebounce-B_ccBZTp.js} +1 -1
  277. package/dist/assets/useDeepCompareMemoize-DFIVN9dn.js +1 -0
  278. package/dist/assets/{useDeleteCell-BKN7t4DH.js → useDeleteCell-DFBGlSQk.js} +1 -1
  279. package/dist/assets/{useDependencyPanelTab-BTsnw2rN.js → useDependencyPanelTab-DydxsE5d.js} +1 -1
  280. package/dist/assets/{useEvent-Dc9HkKI2.js → useEvent-Dfcbgjhg.js} +1 -1
  281. package/dist/assets/{useEventListener-IRzG-0mH.js → useEventListener-D9cftcHj.js} +1 -1
  282. package/dist/assets/useIframeCapabilities-CwTkczVN.js +1 -0
  283. package/dist/assets/{useInstallPackage-HTUlGg0U.js → useInstallPackage-iX1eufdl.js} +1 -1
  284. package/dist/assets/{useInterval-D1QGqQ_I.js → useInterval--x3s1VpI.js} +1 -1
  285. package/dist/assets/{useLifecycle-DKSBdWUf.js → useLifecycle-Mq4gc5kS.js} +1 -1
  286. package/dist/assets/useNotebookActions-DfvB7RD_.js +1 -0
  287. package/dist/assets/{useNumberFormatter-BP99Zbyy.js → useNumberFormatter-D7O_26UI.js} +1 -1
  288. package/dist/assets/{useRunCells-zMO43eNR.js → useRunCells-BFjFX3hz.js} +1 -1
  289. package/dist/assets/useSplitCell-Tqv5pPtL.js +1 -0
  290. package/dist/assets/{useTheme-BkPLyRl9.js → useTheme-COhSHkCj.js} +1 -1
  291. package/dist/assets/{vega-component-Chbfi__Q.js → vega-component-CnadTgoE.js} +1 -1
  292. package/dist/assets/vega-embed-container-DJPNkHPb.js +1 -0
  293. package/dist/assets/{vennDiagram-4TSXK5OY-BKSHsv-w.js → vennDiagram-4TSXK5OY-DsmfChmC.js} +1 -1
  294. package/dist/assets/{wardleyDiagram-VM6X3IG4-CUDQDDoy.js → wardleyDiagram-VM6X3IG4-BDZlVpJI.js} +1 -1
  295. package/dist/assets/worker-DTQ7oH2A.js +158 -0
  296. package/dist/assets/{workflow-nBi9HGeO.js → workflow-cw-0b9g5.js} +1 -1
  297. package/dist/assets/{write-secret-modal-BcosCmZy.js → write-secret-modal-DzKAInL2.js} +1 -1
  298. package/dist/assets/{xychartDiagram-S5SC5T6Z-BXDsTxGu.js → xychartDiagram-S5SC5T6Z-KbGzG6-u.js} +1 -1
  299. package/dist/assets/{youtube-2MBs34oQ.js → youtube-CbJhsgLy.js} +1 -1
  300. package/dist/index.html +122 -123
  301. package/package.json +25 -22
  302. package/src/__tests__/fixtures/{pair-preview.ts → pair-config.ts} +3 -2
  303. package/src/__tests__/host-imports.test.ts +100 -0
  304. package/src/__tests__/mount.test.ts +8 -8
  305. package/src/components/data-table/__tests__/column_formatting.test.ts +30 -0
  306. package/src/components/data-table/__tests__/columns.test.tsx +70 -0
  307. package/src/components/data-table/__tests__/context-menu.test.ts +176 -0
  308. package/src/components/data-table/__tests__/date-filter-inputs.test.tsx +24 -1
  309. package/src/components/data-table/__tests__/export-actions.test.tsx +329 -6
  310. package/src/components/data-table/column-formatting/feature.ts +20 -1
  311. package/src/components/data-table/columns.tsx +25 -18
  312. package/src/components/data-table/context-menu.tsx +125 -26
  313. package/src/components/data-table/date-filter-inputs.tsx +15 -42
  314. package/src/components/data-table/export-actions.tsx +192 -116
  315. package/src/components/data-table/schemas.ts +14 -36
  316. package/src/components/data-table/utils.ts +18 -0
  317. package/src/components/editor/Output.tsx +9 -2
  318. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +80 -252
  319. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +186 -34
  320. package/src/components/editor/actions/pair-with-agent-commands.ts +42 -51
  321. package/src/components/editor/actions/pair-with-agent-modal.tsx +96 -36
  322. package/src/components/editor/chrome/panels/error-panel.tsx +1 -0
  323. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +372 -0
  324. package/src/components/editor/chrome/wrapper/footer-item.tsx +32 -24
  325. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +237 -0
  326. package/src/components/editor/chrome/wrapper/footer.tsx +2 -0
  327. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +4 -3
  328. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +548 -0
  329. package/src/components/editor/errors/send-error-report-button.tsx +69 -0
  330. package/src/components/editor/output/MarimoErrorOutput.tsx +21 -5
  331. package/src/components/editor/output/MarimoTracebackOutput.tsx +35 -20
  332. package/src/components/editor/output/__tests__/ansi-reduce.test.ts +18 -0
  333. package/src/components/editor/output/ansi-reduce.ts +6 -0
  334. package/src/components/editor/output/console/ConsoleOutput.tsx +5 -3
  335. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +18 -0
  336. package/src/components/storage/__tests__/storage-file-viewer.test.tsx +2 -1
  337. package/src/core/attachments/__tests__/toast.test.tsx +58 -0
  338. package/src/core/attachments/state.ts +21 -0
  339. package/src/core/attachments/toast.ts +15 -0
  340. package/src/core/cells/__tests__/cells.test.ts +52 -0
  341. package/src/core/cells/__tests__/document-roundtrip.test.ts +16 -0
  342. package/src/core/cells/__tests__/error-report.test.ts +139 -0
  343. package/src/core/cells/__tests__/session.test.ts +50 -1
  344. package/src/core/cells/error-report.ts +63 -0
  345. package/src/core/cells/session.ts +28 -1
  346. package/src/core/codemirror/copilot/__tests__/completion-integration.test.ts +447 -0
  347. package/src/core/codemirror/copilot/__tests__/inline-completion.test.ts +395 -0
  348. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +511 -2
  349. package/src/core/codemirror/copilot/__tests__/rpc-cancellation.test.ts +201 -0
  350. package/src/core/codemirror/copilot/extension.ts +22 -11
  351. package/src/core/codemirror/copilot/language-server.ts +109 -60
  352. package/src/core/codemirror/language/__tests__/sql.test.ts +4 -3
  353. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +138 -26
  354. package/src/core/codemirror/language/embedded/embedded-python.ts +47 -13
  355. package/src/core/codemirror/language/embedded/latex.ts +20 -13
  356. package/src/core/config/pair.ts +5 -3
  357. package/src/core/datasets/__tests__/data-source-discovery.test.ts +18 -11
  358. package/src/core/host/AGENTS.md +6 -0
  359. package/src/core/host/__tests__/protocol.test.ts +214 -0
  360. package/src/core/host/protocol.ts +1943 -0
  361. package/src/core/islands/__tests__/bootstrap.test.ts +26 -0
  362. package/src/core/islands/bootstrap.ts +1 -0
  363. package/src/core/islands/bridge.ts +2 -2
  364. package/src/core/kernel/messages.ts +4 -7
  365. package/src/core/network/__tests__/api.test.ts +114 -1
  366. package/src/core/network/api.ts +3 -2
  367. package/src/core/wasm/bridge.ts +2 -2
  368. package/src/core/wasm/worker/types.ts +2 -2
  369. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +193 -0
  370. package/src/core/websocket/useMarimoKernelConnection.tsx +9 -0
  371. package/src/css/katex-css.test.ts +1 -1
  372. package/src/css/katex.min.css +6 -1
  373. package/src/hooks/__tests__/useEventListener.test.tsx +45 -1
  374. package/src/hooks/useEventListener.ts +6 -1
  375. package/src/mount.tsx +3 -3
  376. package/src/plugins/impl/NumberPlugin.tsx +20 -3
  377. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +84 -0
  378. package/src/plugins/impl/__tests__/NumberPlugin.test.tsx +159 -1
  379. package/src/utils/__tests__/dates.test.ts +116 -0
  380. package/src/utils/dates.ts +94 -0
  381. package/dist/assets/JsonOutput-DCGUcLVV.js +0 -11
  382. package/dist/assets/MarimoErrorOutput-BEsxXqp6.js +0 -6
  383. package/dist/assets/__vite-browser-external-BgsHWynV.js +0 -1
  384. package/dist/assets/__vite-browser-external-DMJaCYJh.js +0 -1
  385. package/dist/assets/add-cell-with-ai-Wyt6GBhk.js +0 -76
  386. package/dist/assets/ai-model-dropdown-CvJsRj9y.js +0 -5
  387. package/dist/assets/api-DVLtXyp7.js +0 -1
  388. package/dist/assets/app-config-button-C7QrZbqr.js +0 -1
  389. package/dist/assets/arrow-down-BFFrjzad.js +0 -1
  390. package/dist/assets/arrow-left-DzPJ79ZB.js +0 -1
  391. package/dist/assets/arrow-right-xoNT7eIQ.js +0 -1
  392. package/dist/assets/ban-3HAzm9Fj.js +0 -1
  393. package/dist/assets/cells-CxY8RSp7.js +0 -220
  394. package/dist/assets/channel-DXBvxHxq.js +0 -1
  395. package/dist/assets/chat-panel-BZipGUZV.js +0 -4
  396. package/dist/assets/check-Wea4hZ6R.js +0 -1
  397. package/dist/assets/chevron-right-DOPs2jx8.js +0 -1
  398. package/dist/assets/circle-check-BF80fXZd.js +0 -1
  399. package/dist/assets/classDiagram-ZZMXUADV--9ShP1h2.js +0 -1
  400. package/dist/assets/classDiagram-v2-VYDZK3BY--9ShP1h2.js +0 -1
  401. package/dist/assets/code-DW4kNwKG.js +0 -1
  402. package/dist/assets/coerce-CZiN7rQ_.js +0 -1
  403. package/dist/assets/command-palette-BM9fUfEe.js +0 -1
  404. package/dist/assets/config-CR2d-XsP.js +0 -1
  405. package/dist/assets/dates-BgcKUsHb.js +0 -1
  406. package/dist/assets/edit-page-Ctwp3mZE.js +0 -9
  407. package/dist/assets/feedback-button-DxjoRfo3.js +0 -1
  408. package/dist/assets/flowDiagram-HODETNUW-BGVnBaF-.js +0 -1
  409. package/dist/assets/index-B3pNgH5o.js +0 -29
  410. package/dist/assets/index-CXX6l_22.css +0 -2
  411. package/dist/assets/katex-CQIbPNPT.js +0 -1
  412. package/dist/assets/kiosk-mode-DCHo0R3W.js +0 -1
  413. package/dist/assets/links-BJx6KCyC.js +0 -1
  414. package/dist/assets/loro_wasm_bg-PyJsS6iH.wasm +0 -0
  415. package/dist/assets/loro_wasm_bg-Vo2IoHaL.js +0 -1
  416. package/dist/assets/loro_wasm_bg-oTW3uoGB.js +0 -1
  417. package/dist/assets/mermaid-HWGCJPDP-Bk1fR60Q.js +0 -1
  418. package/dist/assets/pair-_FSgYVX4.js +0 -1
  419. package/dist/assets/panels-BdsXFz1w.js +0 -4
  420. package/dist/assets/plus-gbN72xHe.js +0 -1
  421. package/dist/assets/process-output-Crm0vqbi.js +0 -1
  422. package/dist/assets/react-CUdNIagt.js +0 -1
  423. package/dist/assets/react-dom-CKsE8sC1.js +0 -1
  424. package/dist/assets/requests-DFPPfagc.js +0 -1
  425. package/dist/assets/reveal-component-B5GUiD5Q.js +0 -1069
  426. package/dist/assets/save-worker-C880NC3o.js +0 -113
  427. package/dist/assets/schemas-BL-NsLlF.js +0 -51
  428. package/dist/assets/session-panel-Ch5jQNj0.js +0 -1
  429. package/dist/assets/square-DvOKKLHZ.js +0 -1
  430. package/dist/assets/state-YaAkDV8S.js +0 -1
  431. package/dist/assets/state-sbCCk7ZP.js +0 -3
  432. package/dist/assets/stateDiagram-v2-MP3YSRHH-BhduIvF1.js +0 -1
  433. package/dist/assets/swimlanesDiagram-VR7AAH4N-WC2Zewqb.js +0 -8
  434. package/dist/assets/toDate-BbJ1_N2T.js +0 -1
  435. package/dist/assets/tracing-panel-BUPJ77jB.js +0 -2
  436. package/dist/assets/useDeepCompareMemoize-DSlTt6u_.js +0 -1
  437. package/dist/assets/useIframeCapabilities-yd8sMuIo.js +0 -1
  438. package/dist/assets/useNotebookActions-BzJtySGp.js +0 -1
  439. package/dist/assets/useSplitCell-xEtFLByO.js +0 -1
  440. package/dist/assets/vega-embed-container-CRZZ4FTx.js +0 -1
  441. package/dist/assets/worker-B5tVfGoh.js +0 -153
@@ -54,6 +54,7 @@ function renderExportActions(
54
54
  props: Partial<ExportActionProps> = {},
55
55
  sizeLimit: { limitBytes: number; unavailableMessage: string } | null = null,
56
56
  mode: AppMode = "edit",
57
+ strictMode = false,
57
58
  ) {
58
59
  const store = createStore();
59
60
  store.set(downloadSizeLimitAtom, sizeLimit);
@@ -66,7 +67,7 @@ function renderExportActions(
66
67
  </TooltipProvider>
67
68
  </Provider>
68
69
  );
69
- const result = render(view(props));
70
+ const result = render(view(props), { reactStrictMode: strictMode });
70
71
  return {
71
72
  ...result,
72
73
  rerenderExportActions: (nextProps: Partial<ExportActionProps>) =>
@@ -284,7 +285,7 @@ describe("ExportActions dialog", () => {
284
285
  await waitFor(() => {
285
286
  expect(downloadByURL).toHaveBeenCalled();
286
287
  });
287
- expect(getExportMetadata).toHaveBeenCalledTimes(2);
288
+ expect(getExportMetadata).toHaveBeenCalledTimes(3);
288
289
  expect(
289
290
  screen.queryByText("GeoParquet export requires pyarrow."),
290
291
  ).not.toBeInTheDocument();
@@ -310,10 +311,10 @@ describe("ExportActions dialog", () => {
310
311
  mocks.handleInstallPackages.mock.calls[0][1]();
311
312
  });
312
313
  await waitFor(() => {
313
- expect(getExportMetadata).toHaveBeenCalledTimes(2);
314
+ expect(getExportMetadata).toHaveBeenCalledTimes(3);
314
315
  });
315
316
  expect(
316
- screen.getByRole("button", { name: "Install pyarrow" }),
317
+ await screen.findByRole("button", { name: "Install pyarrow" }),
317
318
  ).toBeInTheDocument();
318
319
  expect(
319
320
  screen.getByRole("button", { name: "Download GeoParquet" }),
@@ -530,6 +531,328 @@ describe("ExportActions dialog", () => {
530
531
  expect(downloadByURL).not.toHaveBeenCalled();
531
532
  });
532
533
 
534
+ async function startGeoParquetInstall(strictMode = false) {
535
+ const getExportMetadata = vi.fn().mockResolvedValue(geometryMetadata);
536
+ downloadAs.mockResolvedValueOnce({
537
+ url: "",
538
+ filename: "",
539
+ error: "GeoParquet export requires pyarrow.",
540
+ missing_packages: ["pyarrow"],
541
+ });
542
+ const { rerenderExportActions, unmount } = renderExportActions(
543
+ { getExportMetadata, metadataSource: "first" },
544
+ null,
545
+ "edit",
546
+ strictMode,
547
+ );
548
+ const dialog = await openDialog();
549
+ fireEvent.click(
550
+ await screen.findByRole("button", { name: "Download GeoParquet" }),
551
+ );
552
+ fireEvent.click(
553
+ await screen.findByRole("button", { name: "Install pyarrow" }),
554
+ );
555
+ return { dialog, getExportMetadata, rerenderExportActions, unmount };
556
+ }
557
+
558
+ it("does not retry with a geometry choice after the final geometry disappears", async () => {
559
+ const { getExportMetadata } = await startGeoParquetInstall();
560
+ getExportMetadata.mockResolvedValue({
561
+ geometry_columns: [],
562
+ primary_geometry_column: null,
563
+ default_geometry_column: null,
564
+ formats: {},
565
+ });
566
+
567
+ await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
568
+
569
+ expect(downloadAs).toHaveBeenCalledTimes(1);
570
+ expect(downloadByURL).not.toHaveBeenCalled();
571
+ expect(
572
+ await screen.findByText(
573
+ "The selected geometry is no longer available. Choose another geometry to export.",
574
+ ),
575
+ ).toBeInTheDocument();
576
+ fireEvent.click(screen.getByRole("button", { name: "Download Parquet" }));
577
+ await waitFor(() => expect(downloadByURL).toHaveBeenCalledTimes(1));
578
+ expect(downloadAs).toHaveBeenLastCalledWith({ format: "parquet" });
579
+ });
580
+
581
+ it("does not export when installation finishes after the widget unmounts", async () => {
582
+ const { getExportMetadata, unmount } = await startGeoParquetInstall();
583
+ unmount();
584
+
585
+ await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
586
+
587
+ expect(getExportMetadata).toHaveBeenCalledTimes(1);
588
+ expect(downloadAs).toHaveBeenCalledTimes(1);
589
+ expect(downloadByURL).not.toHaveBeenCalled();
590
+ });
591
+
592
+ it("does not export when post-install metadata resolves after unmount", async () => {
593
+ const { getExportMetadata, unmount } = await startGeoParquetInstall();
594
+ let resolveCheck: (value: ExportMetadata) => void = () => undefined;
595
+ getExportMetadata.mockImplementationOnce(
596
+ () =>
597
+ new Promise<ExportMetadata>((resolve) => {
598
+ resolveCheck = resolve;
599
+ }),
600
+ );
601
+ await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
602
+ expect(getExportMetadata).toHaveBeenCalledTimes(2);
603
+ unmount();
604
+
605
+ await act(async () => resolveCheck(geometryMetadata));
606
+
607
+ expect(downloadAs).toHaveBeenCalledTimes(1);
608
+ expect(downloadByURL).not.toHaveBeenCalled();
609
+ });
610
+
611
+ it("does not deliver a retried export that resolves after unmount", async () => {
612
+ const { unmount } = await startGeoParquetInstall();
613
+ let resolveDownload: (value: {
614
+ url: string;
615
+ filename: string;
616
+ }) => void = () => undefined;
617
+ downloadAs.mockImplementationOnce(
618
+ () =>
619
+ new Promise((resolve) => {
620
+ resolveDownload = resolve;
621
+ }),
622
+ );
623
+ await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
624
+ expect(downloadAs).toHaveBeenCalledTimes(2);
625
+ unmount();
626
+
627
+ await act(async () =>
628
+ resolveDownload({
629
+ url: "https://example.test/export",
630
+ filename: "table",
631
+ }),
632
+ );
633
+
634
+ expect(downloadByURL).not.toHaveBeenCalled();
635
+ });
636
+
637
+ it("retries after installation under StrictMode effect replay", async () => {
638
+ await startGeoParquetInstall(true);
639
+
640
+ await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
641
+
642
+ await waitFor(() => expect(downloadByURL).toHaveBeenCalledTimes(1));
643
+ expect(downloadAs).toHaveBeenLastCalledWith({
644
+ format: "parquet",
645
+ geometry_column: "location",
646
+ });
647
+ });
648
+
649
+ it("does not export when installation finishes after the dialog closes", async () => {
650
+ const { dialog, getExportMetadata } = await startGeoParquetInstall();
651
+ fireEvent.click(within(dialog).getByRole("button", { name: "Close" }));
652
+ await waitFor(() => {
653
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
654
+ });
655
+
656
+ await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
657
+
658
+ expect(getExportMetadata).toHaveBeenCalledTimes(1);
659
+ expect(downloadAs).toHaveBeenCalledTimes(1);
660
+ expect(downloadByURL).not.toHaveBeenCalled();
661
+ });
662
+
663
+ it("does not export when installation finishes after the source changes", async () => {
664
+ const { getExportMetadata, rerenderExportActions } =
665
+ await startGeoParquetInstall();
666
+ rerenderExportActions({ getExportMetadata, metadataSource: "second" });
667
+ await waitFor(() => {
668
+ expect(getExportMetadata).toHaveBeenCalledTimes(2);
669
+ });
670
+
671
+ await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
672
+
673
+ expect(getExportMetadata).toHaveBeenCalledTimes(2);
674
+ expect(downloadAs).toHaveBeenCalledTimes(1);
675
+ expect(downloadByURL).not.toHaveBeenCalled();
676
+ });
677
+
678
+ it("does not export a non-geographic retry after the dialog closes", async () => {
679
+ downloadAs.mockResolvedValueOnce({
680
+ url: "",
681
+ filename: "",
682
+ error: "Parquet export requires pyarrow.",
683
+ missing_packages: ["pyarrow"],
684
+ });
685
+ renderExportActions();
686
+ const dialog = await openDialog();
687
+ fireEvent.click(screen.getByRole("button", { name: "Download Parquet" }));
688
+ fireEvent.click(
689
+ await screen.findByRole("button", { name: "Install pyarrow" }),
690
+ );
691
+ fireEvent.click(within(dialog).getByRole("button", { name: "Close" }));
692
+
693
+ await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
694
+
695
+ expect(downloadAs).toHaveBeenCalledTimes(1);
696
+ expect(downloadByURL).not.toHaveBeenCalled();
697
+ });
698
+
699
+ it("retries after installation when an earlier export succeeded", async () => {
700
+ const getExportMetadata = vi.fn().mockResolvedValue({
701
+ ...geometryMetadata,
702
+ formats: {
703
+ parquet: {
704
+ available: false,
705
+ reason: "GeoParquet export requires pyarrow.",
706
+ missing_packages: ["pyarrow"],
707
+ },
708
+ },
709
+ });
710
+ renderExportActions({ getExportMetadata });
711
+ await openDialog();
712
+ fireEvent.click(screen.getByRole("button", { name: "Download CSV" }));
713
+ await waitFor(() => expect(downloadByURL).toHaveBeenCalledTimes(1));
714
+ fireEvent.click(
715
+ await screen.findByRole("button", { name: "Install pyarrow" }),
716
+ );
717
+ getExportMetadata.mockResolvedValue(geometryMetadata);
718
+
719
+ await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
720
+
721
+ await waitFor(() => expect(downloadByURL).toHaveBeenCalledTimes(2));
722
+ expect(downloadAs).toHaveBeenLastCalledWith({
723
+ format: "parquet",
724
+ geometry_column: "location",
725
+ });
726
+ });
727
+
728
+ it("waits for the post-install metadata check before exporting", async () => {
729
+ let resolveCheck: (value: ExportMetadata) => void = () => undefined;
730
+ const getExportMetadata = vi.fn().mockResolvedValue({
731
+ ...geometryMetadata,
732
+ formats: {
733
+ parquet: {
734
+ available: false,
735
+ reason: "GeoParquet export requires pyarrow.",
736
+ missing_packages: ["pyarrow"],
737
+ },
738
+ },
739
+ });
740
+ renderExportActions({ getExportMetadata });
741
+ await openDialog();
742
+ fireEvent.click(
743
+ await screen.findByRole("button", { name: "Install pyarrow" }),
744
+ );
745
+ getExportMetadata.mockImplementationOnce(
746
+ () =>
747
+ new Promise((resolve) => {
748
+ resolveCheck = resolve;
749
+ }),
750
+ );
751
+
752
+ await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
753
+ expect(downloadAs).not.toHaveBeenCalled();
754
+
755
+ getExportMetadata.mockResolvedValue(geometryMetadata);
756
+ await act(async () => resolveCheck(geometryMetadata));
757
+ await waitFor(() => expect(downloadByURL).toHaveBeenCalled());
758
+ expect(downloadAs).toHaveBeenCalledTimes(1);
759
+ });
760
+
761
+ it("uses the new source eligibility after a settled package failure", async () => {
762
+ const getExportMetadata = vi.fn().mockResolvedValue(geometryMetadata);
763
+ downloadAs.mockResolvedValueOnce({
764
+ url: "",
765
+ filename: "",
766
+ error: "GeoParquet export requires pyarrow.",
767
+ missing_packages: ["pyarrow"],
768
+ });
769
+ const { rerenderExportActions } = renderExportActions({
770
+ getExportMetadata,
771
+ metadataSource: "first",
772
+ });
773
+ await openDialog();
774
+ fireEvent.click(
775
+ await screen.findByRole("button", { name: "Download GeoParquet" }),
776
+ );
777
+ await screen.findByRole("button", { name: "Install pyarrow" });
778
+
779
+ rerenderExportActions({ getExportMetadata, metadataSource: "second" });
780
+
781
+ await waitFor(() =>
782
+ expect(
783
+ screen.getByRole("button", { name: "Download GeoParquet" }),
784
+ ).toBeEnabled(),
785
+ );
786
+ expect(
787
+ screen.queryByRole("button", { name: "Install pyarrow" }),
788
+ ).not.toBeInTheDocument();
789
+ });
790
+
791
+ it("ignores metadata for an earlier source that resolves late", async () => {
792
+ let resolveFirst: (value: ExportMetadata) => void = () => undefined;
793
+ const first = vi.fn(
794
+ () =>
795
+ new Promise<ExportMetadata>((resolve) => {
796
+ resolveFirst = resolve;
797
+ }),
798
+ );
799
+ const second = vi.fn().mockResolvedValue({
800
+ ...geometryMetadata,
801
+ geometry_columns: [
802
+ { name: "region", encoding: "objects", crs: "EPSG:3857" },
803
+ ],
804
+ primary_geometry_column: "region",
805
+ default_geometry_column: "region",
806
+ });
807
+ const { rerenderExportActions } = renderExportActions({
808
+ getExportMetadata: first,
809
+ metadataSource: "first",
810
+ });
811
+ await openDialog();
812
+ rerenderExportActions({
813
+ getExportMetadata: second,
814
+ metadataSource: "second",
815
+ });
816
+ await waitFor(() =>
817
+ expect(screen.getByTestId("export-summary-parquet")).toHaveTextContent(
818
+ "region",
819
+ ),
820
+ );
821
+
822
+ await act(async () => resolveFirst(geometryMetadata));
823
+
824
+ expect(screen.getByTestId("export-summary-parquet")).toHaveTextContent(
825
+ "region",
826
+ );
827
+ });
828
+
829
+ it("does not use earlier metadata when the new source request fails", async () => {
830
+ const getExportMetadata = vi.fn().mockResolvedValue(geometryMetadata);
831
+ const { rerenderExportActions } = renderExportActions({
832
+ getExportMetadata,
833
+ metadataSource: "first",
834
+ });
835
+ await openDialog();
836
+ await waitFor(() =>
837
+ expect(
838
+ screen.getByRole("button", { name: "Download GeoParquet" }),
839
+ ).toBeEnabled(),
840
+ );
841
+ getExportMetadata.mockRejectedValueOnce(new Error("Connection lost"));
842
+
843
+ rerenderExportActions({ getExportMetadata, metadataSource: "second" });
844
+
845
+ expect(
846
+ await screen.findByText(
847
+ "Could not load geometry options: Connection lost",
848
+ ),
849
+ ).toBeInTheDocument();
850
+ expect(
851
+ screen.getByRole("button", { name: "Download Parquet" }),
852
+ ).toBeDisabled();
853
+ expect(screen.getByRole("button", { name: "Download CSV" })).toBeEnabled();
854
+ });
855
+
533
856
  it("shows formats in the approved order with an options toggle where supported", async () => {
534
857
  renderExportActions();
535
858
  const dialog = await openDialog();
@@ -1412,7 +1735,7 @@ describe("ExportActions GeoJSON", () => {
1412
1735
  );
1413
1736
  await act(async () => mocks.handleInstallPackages.mock.calls[0][1]());
1414
1737
  await waitFor(() => expect(downloadByURL).toHaveBeenCalled());
1415
- expect(getExportMetadata).toHaveBeenCalledTimes(2);
1738
+ expect(getExportMetadata).toHaveBeenCalledTimes(3);
1416
1739
  expect(downloadAs).toHaveBeenLastCalledWith({
1417
1740
  format: "geojson",
1418
1741
  geometry_column: "boundary",
@@ -1685,7 +2008,7 @@ describe("ExportActions GeoJSON clipboard", () => {
1685
2008
  format: "geojson",
1686
2009
  geometry_column: "boundary",
1687
2010
  });
1688
- expect(getExportMetadata).toHaveBeenCalledTimes(2);
2011
+ expect(getExportMetadata).toHaveBeenCalledTimes(3);
1689
2012
  expect(downloadByURL).not.toHaveBeenCalled();
1690
2013
  });
1691
2014
 
@@ -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