@marimo-team/frontend 0.25.2-dev97 → 0.25.2

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 (387) hide show
  1. package/dist/assets/{CellStatus-Bj7PvY_u.js → CellStatus-BP2mavAq.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-C5UW0p9I.js → ConnectedDataExplorerComponent-t8fH_TNc.js} +1 -1
  3. package/dist/assets/{ErrorBoundary-CG6gtgym.js → ErrorBoundary-Gl5nCA8C.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-D6HIIsCb.js +11 -0
  8. package/dist/assets/{LazyAnyLanguageCodeMirror-CeTd_wFt.js → LazyAnyLanguageCodeMirror-CKcCbG2G.js} +2 -2
  9. package/dist/assets/{MarimoErrorOutput-BEsxXqp6.js → MarimoErrorOutput-D60XkCny.js} +1 -1
  10. package/dist/assets/{Plot-CNtRAZBG.js → Plot-B8w5_jU-.js} +1 -1
  11. package/dist/assets/{RenderHTML-C7QcdAgB.js → RenderHTML-BbOqmHy3.js} +1 -1
  12. package/dist/assets/{RunButton-A__3wcpF.js → RunButton-CK3LhnP5.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-8UBC0xwR.js +76 -0
  17. package/dist/assets/{add-connection-dialog-bl8dqCVs.js → add-connection-dialog-DXQnd6eB.js} +1 -1
  18. package/dist/assets/{agent-panel-BPLrf7mA.js → agent-panel-D7kMZLG-.js} +5 -5
  19. package/dist/assets/ai-model-dropdown-B0z6-zhp.js +5 -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/{api-DVLtXyp7.js → api-BeC_VSGv.js} +1 -1
  24. package/dist/assets/app-config-button-BKEG4x9u.js +1 -0
  25. package/dist/assets/{architectureDiagram-5GKGNRK7-DvIXijdN.js → architectureDiagram-5GKGNRK7-Bx_zXJUH.js} +1 -1
  26. package/dist/assets/arrow-down-C9Bslqr3.js +1 -0
  27. package/dist/assets/arrow-left-BaPN-xbg.js +1 -0
  28. package/dist/assets/arrow-right-Cgit4Nk2.js +1 -0
  29. package/dist/assets/{badge-DFf033uX.js → badge-crT3E0Rm.js} +1 -1
  30. package/dist/assets/ban-YzvUro5I.js +1 -0
  31. package/dist/assets/{blob-Bx8A10xl.js → blob-D5nfNHOo.js} +1 -1
  32. package/dist/assets/{blockDiagram-I7D4REHJ-DGAMO17L.js → blockDiagram-I7D4REHJ-CuwUGEGQ.js} +1 -1
  33. package/dist/assets/{bot-message-square-BfGaNy9r.js → bot-message-square-8xmbrehG.js} +1 -1
  34. package/dist/assets/{bundle.esm-CklCb9AD.js → bundle.esm-D3tw5rqW.js} +1 -1
  35. package/dist/assets/{button-M49xxKoi.js → button-COI-NGrx.js} +1 -1
  36. package/dist/assets/{c4Diagram-7LVT6UL2-qqO5IOnV.js → c4Diagram-7LVT6UL2-nj0NbEUh.js} +1 -1
  37. package/dist/assets/{cache-panel-BNPF4X5e.js → cache-panel-DTY1dqvi.js} +1 -1
  38. package/dist/assets/{capabilities-BScjbYOK.js → capabilities-BJvf-MD4.js} +1 -1
  39. package/dist/assets/{card-BYZGhhhx.js → card-DOABds5l.js} +1 -1
  40. package/dist/assets/{cell-editor-C3818WlB.js → cell-editor-ADVfycpN.js} +12 -12
  41. package/dist/assets/{cell-link-DC1UZQr_.js → cell-link-LSth_8hT.js} +1 -1
  42. package/dist/assets/cells-BRkCaSsh.js +220 -0
  43. package/dist/assets/channel-DtckUh1_.js +1 -0
  44. package/dist/assets/{chart-no-axes-column-B6FT5Xvu.js → chart-no-axes-column-C4_v6fQW.js} +1 -1
  45. package/dist/assets/{chat-display-YETh6yXV.js → chat-display-Dnagy4Nv.js} +1 -1
  46. package/dist/assets/chat-panel-DQ6HkWEF.js +4 -0
  47. package/dist/assets/{chat-ui-D_QL46qM.js → chat-ui-Df8Vcj6n.js} +1 -1
  48. package/dist/assets/check-BQNapYaf.js +1 -0
  49. package/dist/assets/chevron-right-eAtVhbNZ.js +1 -0
  50. package/dist/assets/{chunk-2E4U76K2-DqA2CBL0.js → chunk-2E4U76K2-dDf4JvCq.js} +1 -1
  51. package/dist/assets/{chunk-4HAMMTFA-DaFOJTOO.js → chunk-4HAMMTFA-Bhjs7H7G.js} +1 -1
  52. package/dist/assets/{chunk-75Z2AOVW-DEp7Wbaj.js → chunk-75Z2AOVW-DlSlUzCU.js} +1 -1
  53. package/dist/assets/{chunk-CLGD4ZFX-BxW11Imt.js → chunk-CLGD4ZFX-CvGMvSe-.js} +1 -1
  54. package/dist/assets/{chunk-DU6HZSFF-CDmPCRkr.js → chunk-DU6HZSFF-BxQd02hX.js} +2 -2
  55. package/dist/assets/{chunk-F27PBJKO-455JWNM3.js → chunk-F27PBJKO-DL9FG-iN.js} +1 -1
  56. package/dist/assets/{chunk-GMAD6QVW-ahdTJvh0.js → chunk-GMAD6QVW-B1Ai6qbk.js} +1 -1
  57. package/dist/assets/{chunk-GVQU2GXP-CPkYne1h.js → chunk-GVQU2GXP-a_N0QLD4.js} +1 -1
  58. package/dist/assets/{chunk-IMKFNOWR-fARccL86.js → chunk-IMKFNOWR-7KbFyW3C.js} +1 -1
  59. package/dist/assets/{chunk-L3NEJ4N5-BOK6HmaY.js → chunk-L3NEJ4N5-BcHj9aiN.js} +1 -1
  60. package/dist/assets/{chunk-OSK3NFVY-CEcyPnHo.js → chunk-OSK3NFVY-Dc7tMbN9.js} +1 -1
  61. package/dist/assets/{chunk-P2QGCYS3-Bw5LRT6S.js → chunk-P2QGCYS3-G6pmnA0z.js} +1 -1
  62. package/dist/assets/{chunk-POPQ4Y6H-C--NLIXc.js → chunk-POPQ4Y6H-C3iw1mOR.js} +1 -1
  63. package/dist/assets/{chunk-PWAF6VOD-B1mxlptQ.js → chunk-PWAF6VOD-Dy1Fp4eJ.js} +1 -1
  64. package/dist/assets/{chunk-SHT3W25Y-Diet96b1.js → chunk-SHT3W25Y-B3kFJuvo.js} +1 -1
  65. package/dist/assets/{chunk-SVP7TREG-BbcEGfNl.js → chunk-SVP7TREG-BNmfcKnL.js} +1 -1
  66. package/dist/assets/{chunk-TICWLB2K-BypOyFjf.js → chunk-TICWLB2K-CI3x9ENh.js} +1 -1
  67. package/dist/assets/{chunk-TLUHSLCS-DvvqZUl_.js → chunk-TLUHSLCS-Q72uYeUY.js} +2 -2
  68. package/dist/assets/{chunk-YOKDWASO-84E-_nIR.js → chunk-YOKDWASO-BIpRENEC.js} +4 -4
  69. package/dist/assets/{circle-Bb1IbBVn.js → circle-DXf-VWZG.js} +1 -1
  70. package/dist/assets/circle-check-BCurAHEb.js +1 -0
  71. package/dist/assets/{circle-play-X3K8DkEc.js → circle-play-CYIb0qT6.js} +1 -1
  72. package/dist/assets/classDiagram-ZZMXUADV-vm4wDTPy.js +1 -0
  73. package/dist/assets/classDiagram-v2-VYDZK3BY-vm4wDTPy.js +1 -0
  74. package/dist/assets/{clear-button-BGfeXcJ3.js → clear-button-p6YcvzLy.js} +1 -1
  75. package/dist/assets/{click-outside-container-CHoodRk9.js → click-outside-container-D_Dy5sZY.js} +1 -1
  76. package/dist/assets/{clipboard-paste-D0gau9Xw.js → clipboard-paste-HVpozQmt.js} +1 -1
  77. package/dist/assets/code-BEiQP4pS.js +1 -0
  78. package/dist/assets/{code-visibility-DNzJgrTz.js → code-visibility-B-_GvwR5.js} +1 -1
  79. package/dist/assets/{code-xml-CW65k2pN.js → code-xml-SQaZqvcO.js} +1 -1
  80. package/dist/assets/coerce-CpE6kUdX.js +1 -0
  81. package/dist/assets/{column-preview-fD3qW2B5.js → column-preview-Cm2D6vyX.js} +1 -1
  82. package/dist/assets/command-palette-DTSQ7gOC.js +1 -0
  83. package/dist/assets/{common-Cy3lJDvJ.js → common-Cu6CDbuw.js} +1 -1
  84. package/dist/assets/{compiler-runtime-BQ9S8nyo.js → compiler-runtime-BrajqUja.js} +1 -1
  85. package/dist/assets/{components-D9ZIJGG8.js → components-CGw16R_N.js} +1 -1
  86. package/dist/assets/{components-M5WFQ0gs.js → components-CP_UoFtT.js} +1 -1
  87. package/dist/assets/{components-ufN33X-R.js → components-CXfO-F47.js} +1 -1
  88. package/dist/assets/{config-CR2d-XsP.js → config-BOKzA3tF.js} +1 -1
  89. package/dist/assets/{config-D_c_6ce1.js → config-DX8Y2WbJ.js} +1 -1
  90. package/dist/assets/{config-Cyum2gRs.js → config-VPSq73n8.js} +1 -1
  91. package/dist/assets/{copy-D03Y7IMR.js → copy-D8O_CYCG.js} +1 -1
  92. package/dist/assets/{copy-RyCOE8jo.js → copy-Djr5m5ac.js} +1 -1
  93. package/dist/assets/{copy-icon-wfSGfX8v.js → copy-icon-BIiRXh_3.js} +1 -1
  94. package/dist/assets/{createLucideIcon-rHn2EdoM.js → createLucideIcon-DfJ2oMlA.js} +1 -1
  95. package/dist/assets/{createReducer-W5dowuCe.js → createReducer-DgRODTW6.js} +1 -1
  96. package/dist/assets/{cynefinDiagram-5FMLGOSQ-BW3uXbHa.js → cynefinDiagram-5FMLGOSQ-Cy86eSwK.js} +1 -1
  97. package/dist/assets/{dagre-GXQ25YYZ-DIV0whJf.js → dagre-GXQ25YYZ-CcWiU9Wf.js} +1 -1
  98. package/dist/assets/{data-grid-overlay-editor-DuYKABwo.js → data-grid-overlay-editor-CMnBpfPb.js} +1 -1
  99. package/dist/assets/{database-zap-CrkOvbyN.js → database-zap-B_PMVg8T.js} +1 -1
  100. package/dist/assets/{datasource-Tst92Pzi.js → datasource-Cq6x_5ML.js} +1 -1
  101. package/dist/assets/dates-BbFQ2oE4.js +1 -0
  102. package/dist/assets/{dependency-graph-panel-CLrAZrHA.js → dependency-graph-panel--Kgtktcw.js} +1 -1
  103. package/dist/assets/{diagram-S7CK7UJ4-BzoPaaoH.js → diagram-S7CK7UJ4-hmuvh6TI.js} +1 -1
  104. package/dist/assets/{diagram-UQ7AKVKN-BnOSn29R.js → diagram-UQ7AKVKN-CM3XDKRP.js} +1 -1
  105. package/dist/assets/{diagram-VSXAHHWV-DAz8vger.js → diagram-VSXAHHWV-B8HedxR3.js} +1 -1
  106. package/dist/assets/{diagram-VX7I27RA-BQOZxgYE.js → diagram-VX7I27RA-D_5dmdWD.js} +1 -1
  107. package/dist/assets/{diagram-Z3DM3KII-B_OF69Ac.js → diagram-Z3DM3KII-DWHvDoOc.js} +1 -1
  108. package/dist/assets/{dist-DoyTOIOd.js → dist-D6KQW558.js} +1 -1
  109. package/dist/assets/{dist-Cm7MoInu.js → dist-DR-Kwzb9.js} +1 -1
  110. package/dist/assets/{dist-Bqtq4wYM.js → dist-iaThVDkA.js} +1 -1
  111. package/dist/assets/{documentation-panel-OMUbXgKW.js → documentation-panel-BHmbeznw.js} +1 -1
  112. package/dist/assets/{download-CPMAf7re.js → download-DCJXy66H.js} +1 -1
  113. package/dist/assets/{dropdown-menu-B2JUUcK7.js → dropdown-menu-C1rnl-0o.js} +1 -1
  114. package/dist/assets/{ebnfDiagram-PWID7BFC-BbkBTazy.js → ebnfDiagram-PWID7BFC-2XbadxRe.js} +1 -1
  115. package/dist/assets/{edit-page-Ctwp3mZE.js → edit-page-ChcSgpke.js} +6 -6
  116. package/dist/assets/{ellipsis-CLMWXUqY.js → ellipsis-63DyBLHQ.js} +1 -1
  117. package/dist/assets/{empty-state-CzxjZqGW.js → empty-state-BaCKb7o3.js} +1 -1
  118. package/dist/assets/{en-US-B4U3zuiu.js → en-US-Buu61juQ.js} +1 -1
  119. package/dist/assets/{erDiagram-RLTQ6QDP-DxDHwsU0.js → erDiagram-RLTQ6QDP-DbTcKdOV.js} +1 -1
  120. package/dist/assets/{error-banner-D1_bPN9u.js → error-banner-Cd69vvyX.js} +1 -1
  121. package/dist/assets/{error-entries-DBpwg0GC.js → error-entries-Dk3VZ-OK.js} +1 -1
  122. package/dist/assets/{error-panel-BgYJTJpA.js → error-panel-BPRYmC5J.js} +1 -1
  123. package/dist/assets/{errors-D9vyuMar.js → errors-DCrsa1nH.js} +1 -1
  124. package/dist/assets/{es-KNLgCZL4.js → es-Cqst59WX.js} +1 -1
  125. package/dist/assets/{esm-3WkPrffD.js → esm-CI_o7NhW.js} +1 -1
  126. package/dist/assets/{external-link-D2lKwXyB.js → external-link-UrX9KO36.js} +1 -1
  127. package/dist/assets/{eye-off-CfkK-QS3.js → eye-off-CxVozGAC.js} +1 -1
  128. package/dist/assets/feedback-button-B2gKC5cn.js +1 -0
  129. package/dist/assets/{feedback-button-7KY7nL-j.js → feedback-button-Bik2-e33.js} +1 -1
  130. package/dist/assets/{file-mCR_SMtq.js → file-BPBVl9pl.js} +1 -1
  131. package/dist/assets/{file-explorer-panel-HvVNt0Qs.js → file-explorer-panel-BEEK5lcl.js} +1 -1
  132. package/dist/assets/{file-headphone-DKocX1z0.js → file-headphone-Dl35U6h3.js} +1 -1
  133. package/dist/assets/{file-icons-e7tmeyP-.js → file-icons-CdJgUy-I.js} +1 -1
  134. package/dist/assets/{file-name-input-DZehOHLA.js → file-name-input-Cdc-TVqO.js} +1 -1
  135. package/dist/assets/{fileToBase64-aqhlf6Jj.js → fileToBase64-BgBraYAr.js} +1 -1
  136. package/dist/assets/{floating-outline-K7cVdOlC.js → floating-outline-XD9FAV-f.js} +1 -1
  137. package/dist/assets/flowDiagram-HODETNUW-DR34jHUd.js +1 -0
  138. package/dist/assets/{formats-DkOlpVdf.js → formats-yZ06h1Pl.js} +1 -1
  139. package/dist/assets/{formatting-Civx9FAg.js → formatting-BqrP-n49.js} +1 -1
  140. package/dist/assets/{fullscreen-DEBblJKh.js → fullscreen-B9tHcfpV.js} +1 -1
  141. package/dist/assets/{gallery-page-DoriMrLH.js → gallery-page-Dm6mGwBi.js} +1 -1
  142. package/dist/assets/{ganttDiagram-EL5Y4UJY-BzkL5tY7.js → ganttDiagram-EL5Y4UJY-2n7Ig5Jm.js} +1 -1
  143. package/dist/assets/{gitGraphDiagram-WWUBYQGX-DqtmYSBS.js → gitGraphDiagram-WWUBYQGX-DxR7RNkL.js} +1 -1
  144. package/dist/assets/{github-khsXwCtv.js → github-DQZhN3La.js} +1 -1
  145. package/dist/assets/{glide-data-editor-DWyeHe3u.js → glide-data-editor-J9CAb70d.js} +4 -4
  146. package/dist/assets/{glide-utils-BzwA3q-e.js → glide-utils-CIrAxdjv.js} +1 -1
  147. package/dist/assets/{globe-CmFhHoL1.js → globe-UdPdIbF7.js} +1 -1
  148. package/dist/assets/{hat-glasses-DVgK5i5l.js → hat-glasses-C8RhSVii.js} +1 -1
  149. package/dist/assets/{highlighted-body-KPVGNVTW-DxcqwMAu.js → highlighted-body-KPVGNVTW-BBA_Oaqj.js} +1 -1
  150. package/dist/assets/{home-page-BcJJsD_Q.js → home-page-DMHnsRxm.js} +1 -1
  151. package/dist/assets/{hooks-Qxjt0Ypd.js → hooks-93IwHd2u.js} +1 -1
  152. package/dist/assets/{house-CbkYoQ5W.js → house-CpsMWsLL.js} +1 -1
  153. package/dist/assets/{html-to-image-CFVIG1VZ.js → html-to-image-DK9Zl1lU.js} +1 -1
  154. package/dist/assets/{icons-CVdkfEA3.js → icons-CiZ_8zS-.js} +1 -1
  155. package/dist/assets/{image-CTch9x2I.js → image-wZvTj8WY.js} +1 -1
  156. package/dist/assets/{index-Xxay17E9.css → index-Bcdzex-3.css} +1 -1
  157. package/dist/assets/{index-B5XWyg6n.js → index-s-M1OXjs.js} +6 -6
  158. package/dist/assets/{infoDiagram-27XIBGKW-7rLCp1UQ.js → infoDiagram-27XIBGKW-U5Oqw16-.js} +1 -1
  159. package/dist/assets/{input-DPd57MDP.js → input-BoBxR50a.js} +1 -1
  160. package/dist/assets/{isValid-BEbe1fFs.js → isValid-q_Ad80ug.js} +1 -1
  161. package/dist/assets/{ishikawaDiagram-5VMMS53U-BH7XUtkN.js → ishikawaDiagram-5VMMS53U-Bob74yfq.js} +1 -1
  162. package/dist/assets/{journeyDiagram-3NMN7TZE-BOj0kV6v.js → journeyDiagram-3NMN7TZE-CO3wos0F.js} +1 -1
  163. package/dist/assets/{kanban-definition-UXKFOSKX-CPrudFOv.js → kanban-definition-UXKFOSKX-HnyRfUfJ.js} +1 -1
  164. package/dist/assets/katex-C9vVdkK0.js +1 -0
  165. package/dist/assets/{katex-DUp2KybH.js → katex-CF1UBJcr.js} +5 -5
  166. package/dist/assets/{kbd-BnUiViRu.js → kbd-pdKBv96t.js} +1 -1
  167. package/dist/assets/kiosk-mode-BZECfg9k.js +1 -0
  168. package/dist/assets/{layout-CSLw6wGo.js → layout-DmcNEu3P.js} +4 -4
  169. package/dist/assets/{link-BF4dGmOQ.js → link-NuFVR7G9.js} +1 -1
  170. package/dist/assets/links-DkkL9DVa.js +1 -0
  171. package/dist/assets/{logs-panel-OkoO5mbN.js → logs-panel-ABM16htT.js} +1 -1
  172. package/dist/assets/loro_wasm_bg-C2Fqi8D-.js +1 -0
  173. package/dist/assets/loro_wasm_bg-CSolyDSZ.wasm +0 -0
  174. package/dist/assets/loro_wasm_bg-Ctp2cNI9.js +1 -0
  175. package/dist/assets/{marimo-icons-B_1oPpIE.js → marimo-icons-CqliHyTr.js} +1 -1
  176. package/dist/assets/{markdown-renderer-mDlWBE1M.js → markdown-renderer-BG3sp2rs.js} +2 -2
  177. package/dist/assets/{menu-items-DAaNKHJF.js → menu-items-BrwnTgyK.js} +1 -1
  178. package/dist/assets/mermaid-HWGCJPDP-B7ByBG-a.js +1 -0
  179. package/dist/assets/{mermaid-CX6aTquk.js → mermaid-a3xYymTy.js} +3 -3
  180. package/dist/assets/{message-circle-OTHnVlxO.js → message-circle-C3rKm8_a.js} +1 -1
  181. package/dist/assets/{mhchem-hMh9XtQZ.js → mhchem-B6WrVrmp.js} +1 -1
  182. package/dist/assets/{mindmap-definition-YA3MSWOX-kWyI8sXl.js → mindmap-definition-YA3MSWOX-Tl5cqnHr.js} +1 -1
  183. package/dist/assets/{multi-icon-DWzZu-9u.js → multi-icon-DL465pPF.js} +1 -1
  184. package/dist/assets/{name-cell-input-D_Q2IhP9.js → name-cell-input-BgEBmqyL.js} +1 -1
  185. package/dist/assets/{number-overlay-editor-myrryj7o.js → number-overlay-editor-DS8xi0jE.js} +1 -1
  186. package/dist/assets/{numbers-BEfBaQtu.js → numbers-Mk3-CcoU.js} +1 -1
  187. package/dist/assets/{outline-panel-Dy2cmYDF.js → outline-panel-DCXQ3_F6.js} +1 -1
  188. package/dist/assets/{package-BeYhVWvM.js → package-GSoSTiIK.js} +1 -1
  189. package/dist/assets/{package-data-BwaspaKJ.js → package-data-dv4FBHxR.js} +1 -1
  190. package/dist/assets/{packages-panel-CIvhx0hb.js → packages-panel-BMGOmZkR.js} +1 -1
  191. package/dist/assets/pair-CaQyK6En.js +1 -0
  192. package/dist/assets/{panel-accordion-state-BI4SU22L.js → panel-accordion-state-C1sdPp0m.js} +1 -1
  193. package/dist/assets/{panel-context-BPaQeOuV.js → panel-context-C2QXpKfx.js} +1 -1
  194. package/dist/assets/{panels-BdsXFz1w.js → panels-CxVG8-v2.js} +1 -1
  195. package/dist/assets/{pathUtils-BKesuhdv.js → pathUtils-DPmlLd-r.js} +1 -1
  196. package/dist/assets/{paths-CzfpItSz.js → paths-bkIFVj8h.js} +1 -1
  197. package/dist/assets/{pegDiagram-XKGWAZYB-CiBJGPte.js → pegDiagram-XKGWAZYB-a0itOiYa.js} +1 -1
  198. package/dist/assets/{pieDiagram-E7YTZNPT-RpjpKhU6.js → pieDiagram-E7YTZNPT-DFve8H9P.js} +1 -1
  199. package/dist/assets/plus-C5silF6g.js +1 -0
  200. package/dist/assets/process-output-D0KGq04R.js +1 -0
  201. package/dist/assets/{quadrantDiagram-AXDQQJYC-Ci_qzCqs.js → quadrantDiagram-AXDQQJYC-yBhCDI7E.js} +1 -1
  202. package/dist/assets/{railroadDiagram-O6MQD6OU-B2IWK3fJ.js → railroadDiagram-O6MQD6OU-CgwdYhrd.js} +1 -1
  203. package/dist/assets/react-DVplv7_D.js +1 -0
  204. package/dist/assets/react-dom-_LrxgvjW.js +1 -0
  205. package/dist/assets/{react-icons.esm-C6SMwKZH.js → react-icons.esm-D6tfmvq8.js} +1 -1
  206. package/dist/assets/{react-resizable-panels.browser.esm-BL2E7f5c.js → react-resizable-panels.browser.esm-Dbe0MrFr.js} +1 -1
  207. package/dist/assets/{react-vega-Jq3Jd7eX.js → react-vega-C3rYGtP6.js} +1 -1
  208. package/dist/assets/{readonly-code-display-CNbw6v1-.js → readonly-code-display-Do50PHI8.js} +1 -1
  209. package/dist/assets/{readonly-python-code-DcYhdd1B.js → readonly-python-code-DCSMIsTX.js} +1 -1
  210. package/dist/assets/{refresh-cw-CEGpOrzd.js → refresh-cw-Qw1f8Jhy.js} +1 -1
  211. package/dist/assets/{renderShortcut-BnRfkbwf.js → renderShortcut-BkVJQ_Zh.js} +1 -1
  212. package/dist/assets/requests-CgSY1X4a.js +1 -0
  213. package/dist/assets/{requests-yTHMxhVa.js → requests-lt0JK8Jt.js} +1 -1
  214. package/dist/assets/{requirementDiagram-BXWQKSXE-B0_CyV0T.js → requirementDiagram-BXWQKSXE-BCDzS-aV.js} +1 -1
  215. package/dist/assets/{reveal-component-wEV_sB3u.css → reveal-component-DMRR6gKy.css} +1 -1
  216. package/dist/assets/reveal-component-ltaepAqw.js +1069 -0
  217. package/dist/assets/{rotate-ccw-se3Oa1US.js → rotate-ccw-D8WCVWNE.js} +1 -1
  218. package/dist/assets/{rotate-cw-BcRERxHa.js → rotate-cw-CZ2syZTu.js} +1 -1
  219. package/dist/assets/{run-page-CVWospEP.js → run-page-DF3c5cDk.js} +1 -1
  220. package/dist/assets/{runs-DyluVj69.js → runs-BLp5jezv.js} +1 -1
  221. package/dist/assets/{runtime-details-state-lxXYwJcI.js → runtime-details-state-CSPobEdR.js} +1 -1
  222. package/dist/assets/{sankeyDiagram-P5KCCOFB-BekzhMvv.js → sankeyDiagram-P5KCCOFB-byYeKbB2.js} +1 -1
  223. package/dist/assets/{save-D4cG4pP2.js → save-Dgoim6QF.js} +1 -1
  224. package/dist/assets/save-worker-BbUSwZRG.js +118 -0
  225. package/dist/assets/schemas-Dv42wLFq.js +56 -0
  226. package/dist/assets/{scratchpad-panel-B4qlmwP-.js → scratchpad-panel-Dwd6W5PE.js} +1 -1
  227. package/dist/assets/{scroll-to-bottom-button-Dmrd5bjQ.js → scroll-to-bottom-button-1FyowpWV.js} +1 -1
  228. package/dist/assets/{secrets-panel-DT1Nansx.js → secrets-panel-Bctbtkrp.js} +1 -1
  229. package/dist/assets/{select-BwRFbZty.js → select-DTBn5eTb.js} +1 -1
  230. package/dist/assets/{sequenceDiagram-WJ2MYXX4-DELi1Kz5.js → sequenceDiagram-WJ2MYXX4-CLLPBM4B.js} +1 -1
  231. package/dist/assets/{session-BykGt6S3.js → session-DqoWmb7X.js} +1 -1
  232. package/dist/assets/{session-panel-Ch5jQNj0.js → session-panel-VdDhEBa-.js} +1 -1
  233. package/dist/assets/{settings-DlKTeV_0.js → settings-BpdQZRgT.js} +1 -1
  234. package/dist/assets/{shell-BSnvn9t7.js → shell-Fj8a65ii.js} +1 -1
  235. package/dist/assets/{shim-5li_pJY_.js → shim-CjjJUhDo.js} +1 -1
  236. package/dist/assets/{skeleton-CKpBjoLm.js → skeleton-Cqh4O9g1.js} +1 -1
  237. package/dist/assets/{snippets-panel-YttkYAW9.js → snippets-panel-Bh1oTw4m.js} +1 -1
  238. package/dist/assets/{spec-D9d9nT0z.js → spec-BfSBcO5B.js} +1 -1
  239. package/dist/assets/{spinner-CGdRKCnw.js → spinner-DyNE-o8o.js} +1 -1
  240. package/dist/assets/square-BPmgQFnh.js +1 -0
  241. package/dist/assets/{square-function-DyFIOFp5.js → square-function-_W_Lo0P4.js} +1 -1
  242. package/dist/assets/state-BAJYRhmO.js +1 -0
  243. package/dist/assets/{state-ja7GWeCS.js → state-C3oDoyFe.js} +1 -1
  244. package/dist/assets/{state-B2ZbImvm.js → state-DxQnC_1I.js} +1 -1
  245. package/dist/assets/{state-BI0fn_YF.js → state-XsPO8hNi.js} +1 -1
  246. package/dist/assets/{state-sbCCk7ZP.js → state-_Qai_QyX.js} +2 -2
  247. package/dist/assets/{state-BxLm8vme.js → state-uwRvJLb8.js} +1 -1
  248. package/dist/assets/{stateDiagram-D77RDMKH-udui7EYS.js → stateDiagram-D77RDMKH-BeIsqkgQ.js} +1 -1
  249. package/dist/assets/stateDiagram-v2-MP3YSRHH-YdOj4q4D.js +1 -0
  250. package/dist/assets/{strings-hlCLC-K1.js → strings-B2vv-ENv.js} +1 -1
  251. package/dist/assets/{swimlanes-42K2YHIH-C-iTrYJs.js → swimlanes-42K2YHIH-CIhaeNCx.js} +1 -1
  252. package/dist/assets/swimlanesDiagram-VR7AAH4N-BLZbCKkx.js +8 -0
  253. package/dist/assets/{swiper-component-eXUBvFuA.js → swiper-component-a07domrZ.js} +1 -1
  254. package/dist/assets/{switch-C-83e2fG.js → switch-CTaiAjrz.js} +1 -1
  255. package/dist/assets/{table-B7KYyTxw.js → table-DG7Ap4H4.js} +1 -1
  256. package/dist/assets/{table-Dg1KxH-q.js → table-vrvqpuKJ.js} +1 -1
  257. package/dist/assets/{tabs-QRT1DYjj.js → tabs-BuQlZFbt.js} +1 -1
  258. package/dist/assets/{terminal-3hxM6K9q.js → terminal-Ck_vK-34.js} +1 -1
  259. package/dist/assets/{timeline-definition-24CTP7MA-D2u0nOZp.js → timeline-definition-24CTP7MA-BSH7-Tss.js} +1 -1
  260. package/dist/assets/toDate-DOj9Q6uC.js +1 -0
  261. package/dist/assets/{toast-BRwEbWb6.js → toast-BGzLGnvw.js} +1 -1
  262. package/dist/assets/{tooltip-B5pI8o2n.js → tooltip-C9TuY18o.js} +1 -1
  263. package/dist/assets/{tooltip-BeP4eX87.js → tooltip-mT3CGest.js} +1 -1
  264. package/dist/assets/{tracing-DZYfCw6p.js → tracing-Di6pUmX8.js} +1 -1
  265. package/dist/assets/tracing-panel-PeRXHD8_.js +2 -0
  266. package/dist/assets/{trash-2-BJG-7Qob.js → trash-2-DcgaW8fn.js} +1 -1
  267. package/dist/assets/{trash-BKbZYRHl.js → trash-ChRHEGfM.js} +1 -1
  268. package/dist/assets/{tree-actions-D5clvgKl.js → tree-actions-GM5E_bUs.js} +1 -1
  269. package/dist/assets/{triangle-alert-BeRqoThc.js → triangle-alert-DmIqR8sY.js} +1 -1
  270. package/dist/assets/{use-restore-focus-GUh2Nd8Z.js → use-restore-focus-BxEGwIbk.js} +1 -1
  271. package/dist/assets/{use-toast-CC89xOwH.js → use-toast-Wu434mLr.js} +1 -1
  272. package/dist/assets/{use-vega-container-remeasure-CS3c8wGN.js → use-vega-container-remeasure-BpmHehNK.js} +1 -1
  273. package/dist/assets/{useAddCell-Bhv6GT3m.js → useAddCell-GR7eEQrT.js} +1 -1
  274. package/dist/assets/{useAsyncData-DucTwMkf.js → useAsyncData-C7aJJz0Y.js} +1 -1
  275. package/dist/assets/{useBoolean-Co-_MyFz.js → useBoolean-BDD6_xQQ.js} +1 -1
  276. package/dist/assets/{useCellActionButton-BTsPn8Dv.js → useCellActionButton-B-9eG5z_.js} +1 -1
  277. package/dist/assets/{useDateFormatter-CTYCgKB-.js → useDateFormatter-DA-62E-Y.js} +1 -1
  278. package/dist/assets/{useDebounce-DMbg9X18.js → useDebounce-B_ccBZTp.js} +1 -1
  279. package/dist/assets/useDeepCompareMemoize-DFIVN9dn.js +1 -0
  280. package/dist/assets/{useDeleteCell-BKN7t4DH.js → useDeleteCell-2_bMClHd.js} +1 -1
  281. package/dist/assets/{useDependencyPanelTab-BTsnw2rN.js → useDependencyPanelTab-k3C3M18S.js} +1 -1
  282. package/dist/assets/{useEvent-Dc9HkKI2.js → useEvent-Dfcbgjhg.js} +1 -1
  283. package/dist/assets/{useEventListener-IRzG-0mH.js → useEventListener-D9cftcHj.js} +1 -1
  284. package/dist/assets/useIframeCapabilities-CwTkczVN.js +1 -0
  285. package/dist/assets/{useInstallPackage-HTUlGg0U.js → useInstallPackage-iX1eufdl.js} +1 -1
  286. package/dist/assets/{useInterval-D1QGqQ_I.js → useInterval--x3s1VpI.js} +1 -1
  287. package/dist/assets/{useLifecycle-DKSBdWUf.js → useLifecycle-Mq4gc5kS.js} +1 -1
  288. package/dist/assets/useNotebookActions-NHN6A-cN.js +1 -0
  289. package/dist/assets/{useNumberFormatter-BP99Zbyy.js → useNumberFormatter-D7O_26UI.js} +1 -1
  290. package/dist/assets/{useRunCells-zMO43eNR.js → useRunCells-B2vUhREg.js} +1 -1
  291. package/dist/assets/useSplitCell-DEb03htp.js +1 -0
  292. package/dist/assets/{useTheme-BkPLyRl9.js → useTheme-COhSHkCj.js} +1 -1
  293. package/dist/assets/{vega-component-Chbfi__Q.js → vega-component-CnadTgoE.js} +1 -1
  294. package/dist/assets/vega-embed-container-DJPNkHPb.js +1 -0
  295. package/dist/assets/{vennDiagram-4TSXK5OY-BKSHsv-w.js → vennDiagram-4TSXK5OY-DsmfChmC.js} +1 -1
  296. package/dist/assets/{wardleyDiagram-VM6X3IG4-CUDQDDoy.js → wardleyDiagram-VM6X3IG4-BDZlVpJI.js} +1 -1
  297. package/dist/assets/worker-DTQ7oH2A.js +158 -0
  298. package/dist/assets/{workflow-nBi9HGeO.js → workflow-cw-0b9g5.js} +1 -1
  299. package/dist/assets/{write-secret-modal-BcosCmZy.js → write-secret-modal-DzKAInL2.js} +1 -1
  300. package/dist/assets/{xychartDiagram-S5SC5T6Z-BXDsTxGu.js → xychartDiagram-S5SC5T6Z-KbGzG6-u.js} +1 -1
  301. package/dist/assets/{youtube-2MBs34oQ.js → youtube-CbJhsgLy.js} +1 -1
  302. package/dist/index.html +123 -123
  303. package/package.json +23 -22
  304. package/src/components/data-table/__tests__/column_formatting.test.ts +30 -0
  305. package/src/components/data-table/__tests__/columns.test.tsx +70 -0
  306. package/src/components/data-table/column-formatting/feature.ts +20 -1
  307. package/src/components/data-table/columns.tsx +25 -18
  308. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +4 -3
  309. package/src/components/editor/output/console/ConsoleOutput.tsx +5 -3
  310. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +18 -0
  311. package/src/components/storage/__tests__/storage-file-viewer.test.tsx +2 -1
  312. package/src/core/cells/__tests__/document-roundtrip.test.ts +16 -0
  313. package/src/core/codemirror/copilot/__tests__/completion-integration.test.ts +447 -0
  314. package/src/core/codemirror/copilot/__tests__/inline-completion.test.ts +395 -0
  315. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +511 -2
  316. package/src/core/codemirror/copilot/__tests__/rpc-cancellation.test.ts +201 -0
  317. package/src/core/codemirror/copilot/extension.ts +22 -11
  318. package/src/core/codemirror/copilot/language-server.ts +109 -60
  319. package/src/core/codemirror/language/__tests__/sql.test.ts +4 -3
  320. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +138 -26
  321. package/src/core/codemirror/language/embedded/embedded-python.ts +47 -13
  322. package/src/core/codemirror/language/embedded/latex.ts +20 -13
  323. package/src/core/datasets/__tests__/data-source-discovery.test.ts +18 -11
  324. package/src/core/islands/bridge.ts +2 -2
  325. package/src/core/kernel/messages.ts +4 -7
  326. package/src/core/network/__tests__/api.test.ts +114 -1
  327. package/src/core/network/api.ts +3 -2
  328. package/src/core/wasm/bridge.ts +2 -2
  329. package/src/core/wasm/worker/types.ts +2 -2
  330. package/src/css/katex-css.test.ts +166 -0
  331. package/src/css/katex.min.css +33 -28
  332. package/src/hooks/__tests__/useEventListener.test.tsx +45 -1
  333. package/src/hooks/useEventListener.ts +6 -1
  334. package/src/plugins/impl/NumberPlugin.tsx +20 -3
  335. package/src/plugins/impl/__tests__/NumberPlugin.test.tsx +159 -1
  336. package/dist/assets/JsonOutput-DCGUcLVV.js +0 -11
  337. package/dist/assets/__vite-browser-external-BgsHWynV.js +0 -1
  338. package/dist/assets/__vite-browser-external-DMJaCYJh.js +0 -1
  339. package/dist/assets/add-cell-with-ai-Wyt6GBhk.js +0 -76
  340. package/dist/assets/ai-model-dropdown-CvJsRj9y.js +0 -5
  341. package/dist/assets/app-config-button-C7QrZbqr.js +0 -1
  342. package/dist/assets/arrow-down-BFFrjzad.js +0 -1
  343. package/dist/assets/arrow-left-DzPJ79ZB.js +0 -1
  344. package/dist/assets/arrow-right-xoNT7eIQ.js +0 -1
  345. package/dist/assets/ban-3HAzm9Fj.js +0 -1
  346. package/dist/assets/cells-CxY8RSp7.js +0 -220
  347. package/dist/assets/channel-DXBvxHxq.js +0 -1
  348. package/dist/assets/chat-panel-BZipGUZV.js +0 -4
  349. package/dist/assets/check-Wea4hZ6R.js +0 -1
  350. package/dist/assets/chevron-right-DOPs2jx8.js +0 -1
  351. package/dist/assets/circle-check-BF80fXZd.js +0 -1
  352. package/dist/assets/classDiagram-ZZMXUADV--9ShP1h2.js +0 -1
  353. package/dist/assets/classDiagram-v2-VYDZK3BY--9ShP1h2.js +0 -1
  354. package/dist/assets/code-DW4kNwKG.js +0 -1
  355. package/dist/assets/coerce-CZiN7rQ_.js +0 -1
  356. package/dist/assets/command-palette-BM9fUfEe.js +0 -1
  357. package/dist/assets/dates-BgcKUsHb.js +0 -1
  358. package/dist/assets/feedback-button-DxjoRfo3.js +0 -1
  359. package/dist/assets/flowDiagram-HODETNUW-BGVnBaF-.js +0 -1
  360. package/dist/assets/katex-CQIbPNPT.js +0 -1
  361. package/dist/assets/kiosk-mode-DCHo0R3W.js +0 -1
  362. package/dist/assets/links-BJx6KCyC.js +0 -1
  363. package/dist/assets/loro_wasm_bg-PyJsS6iH.wasm +0 -0
  364. package/dist/assets/loro_wasm_bg-Vo2IoHaL.js +0 -1
  365. package/dist/assets/loro_wasm_bg-oTW3uoGB.js +0 -1
  366. package/dist/assets/mermaid-HWGCJPDP-Bk1fR60Q.js +0 -1
  367. package/dist/assets/pair-_FSgYVX4.js +0 -1
  368. package/dist/assets/plus-gbN72xHe.js +0 -1
  369. package/dist/assets/process-output-Crm0vqbi.js +0 -1
  370. package/dist/assets/react-CUdNIagt.js +0 -1
  371. package/dist/assets/react-dom-CKsE8sC1.js +0 -1
  372. package/dist/assets/requests-DFPPfagc.js +0 -1
  373. package/dist/assets/reveal-component-B5GUiD5Q.js +0 -1069
  374. package/dist/assets/save-worker-C880NC3o.js +0 -113
  375. package/dist/assets/schemas-BL-NsLlF.js +0 -51
  376. package/dist/assets/square-DvOKKLHZ.js +0 -1
  377. package/dist/assets/state-YaAkDV8S.js +0 -1
  378. package/dist/assets/stateDiagram-v2-MP3YSRHH-BhduIvF1.js +0 -1
  379. package/dist/assets/swimlanesDiagram-VR7AAH4N-WC2Zewqb.js +0 -8
  380. package/dist/assets/toDate-BbJ1_N2T.js +0 -1
  381. package/dist/assets/tracing-panel-BUPJ77jB.js +0 -2
  382. package/dist/assets/useDeepCompareMemoize-DSlTt6u_.js +0 -1
  383. package/dist/assets/useIframeCapabilities-yd8sMuIo.js +0 -1
  384. package/dist/assets/useNotebookActions-BzJtySGp.js +0 -1
  385. package/dist/assets/useSplitCell-xEtFLByO.js +0 -1
  386. package/dist/assets/vega-embed-container-CRZZ4FTx.js +0 -1
  387. package/dist/assets/worker-B5tVfGoh.js +0 -153
@@ -0,0 +1,166 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { readFile } from "node:fs/promises";
4
+ import postcss from "postcss";
5
+ import { beforeAll, describe, expect, it } from "vitest";
6
+ import {
7
+ checkKatexCss,
8
+ generateKatexCss,
9
+ readUpstreamCss,
10
+ stylesheetPath,
11
+ } from "../../scripts/katex-css";
12
+
13
+ let upstream: string;
14
+ let generated: string;
15
+
16
+ beforeAll(async () => {
17
+ upstream = await readUpstreamCss();
18
+ generated = await generateKatexCss(upstream);
19
+ });
20
+
21
+ describe("copied KaTeX stylesheet", () => {
22
+ it("matches the installed package with only documented marimo overrides", async () => {
23
+ await expect(
24
+ checkKatexCss(upstream, await readFile(stylesheetPath, "utf8")),
25
+ ).resolves.toBeUndefined();
26
+ });
27
+
28
+ it.each(["added", "removed", "changed"])(
29
+ "detects %s upstream rule without a version change",
30
+ async (change) => {
31
+ const root = postcss.parse(upstream);
32
+ if (change === "added") {
33
+ root.append(
34
+ postcss.parse(
35
+ ".katex .upstream-drift-probe { display: inline-block; }",
36
+ ),
37
+ );
38
+ } else {
39
+ root.walkRules(".katex .mspace", (rule) => {
40
+ if (change === "removed") {
41
+ rule.remove();
42
+ } else {
43
+ rule.append(postcss.decl({ prop: "color", value: "red" }));
44
+ }
45
+ });
46
+ }
47
+ await expect(checkKatexCss(root.toString(), generated)).rejects.toThrow(
48
+ "pnpm sync-katex-css",
49
+ );
50
+ const regenerated = await generateKatexCss(root.toString());
51
+ await checkKatexCss(root.toString(), regenerated);
52
+ },
53
+ );
54
+
55
+ it.each(["added", "removed", "changed"])(
56
+ "detects %s local rule",
57
+ async (change) => {
58
+ const root = postcss.parse(generated);
59
+ if (change === "added") {
60
+ root.append(postcss.parse(".katex .unexpected { display: none; }"));
61
+ } else {
62
+ root.walkRules(".katex .mspace", (rule) => {
63
+ if (change === "removed") {
64
+ rule.remove();
65
+ } else {
66
+ rule.append(postcss.decl({ prop: "color", value: "red" }));
67
+ }
68
+ });
69
+ }
70
+ await expect(checkKatexCss(upstream, root.toString())).rejects.toThrow(
71
+ "pnpm sync-katex-css",
72
+ );
73
+ },
74
+ );
75
+
76
+ it("preserves math sizing, tag alignment, and equation counters without bundling font faces", () => {
77
+ const root = postcss.parse(generated);
78
+ const declarations = (selector: string) => {
79
+ const values: Record<string, string> = {};
80
+ root.walkRules(selector, (rule) => {
81
+ rule.walkDecls((decl) => {
82
+ values[decl.prop] = decl.value;
83
+ });
84
+ });
85
+ return values;
86
+ };
87
+ expect(declarations(".katex")).toEqual({
88
+ "font-family": '"KaTeX_Main", "Times New Roman", serif',
89
+ "font-size": "110%",
90
+ "font-style": "normal",
91
+ "line-height": "inherit",
92
+ position: "relative",
93
+ "text-indent": "0",
94
+ "text-rendering": "auto",
95
+ });
96
+ expect(
97
+ declarations(".katex-display > .katex > .katex-html > .katex-tag"),
98
+ ).toEqual({ position: "absolute", right: "0", "text-align": "right" });
99
+ expect(declarations("body,\n.katex-display")).toEqual({
100
+ "counter-reset": "katexEqnNo mmlEqnNo",
101
+ });
102
+ expect(declarations(".katex .angl")["border-right"]).toBe("0.049em solid");
103
+ const fontFaces: postcss.AtRule[] = [];
104
+ root.walkAtRules("font-face", (rule) => {
105
+ fontFaces.push(rule);
106
+ });
107
+ expect(fontFaces).toEqual([]);
108
+ });
109
+
110
+ it.each(["root", "media"])(
111
+ "preserves SVG rule order and %s scope when upstream adds a competing rule",
112
+ async (scope) => {
113
+ const root = postcss.parse(upstream);
114
+ const svgRules: postcss.Rule[] = [];
115
+ root.walkRules(".katex svg", (rule) => {
116
+ svgRules.push(rule);
117
+ });
118
+ const secondSvg = svgRules[1];
119
+ secondSvg.before(postcss.parse(".katex :is(svg) { stroke-width: 3; }"));
120
+ if (scope === "media") {
121
+ const media = postcss.atRule({ name: "media", params: "print" });
122
+ secondSvg.before(media);
123
+ media.append(secondSvg);
124
+ }
125
+
126
+ const svgCascade = (css: string) => {
127
+ const rules: {
128
+ selector: string;
129
+ scope: string;
130
+ strokeWidth: string | undefined;
131
+ }[] = [];
132
+ postcss.parse(css).walkRules((rule) => {
133
+ if (
134
+ rule.selector !== ".katex svg" &&
135
+ rule.selector !== ".katex :is(svg)"
136
+ ) {
137
+ return;
138
+ }
139
+ let strokeWidth: string | undefined;
140
+ rule.walkDecls("stroke-width", (decl) => {
141
+ strokeWidth = decl.value;
142
+ });
143
+ const parent = rule.parent;
144
+ rules.push({
145
+ selector: rule.selector,
146
+ scope:
147
+ parent?.type === "atrule"
148
+ ? `${parent.name} ${parent.params}`
149
+ : "root",
150
+ strokeWidth,
151
+ });
152
+ });
153
+ return rules;
154
+ };
155
+ const regenerated = await generateKatexCss(root.toString());
156
+ expect(svgCascade(regenerated)).toEqual(svgCascade(root.toString()));
157
+ await checkKatexCss(root.toString(), regenerated);
158
+ },
159
+ );
160
+
161
+ it("requires review when an overridden upstream declaration changes", async () => {
162
+ await expect(
163
+ generateKatexCss(upstream.replace("line-height:1.2", "line-height:1.3")),
164
+ ).rejects.toThrow("review overrides");
165
+ });
166
+ });
@@ -1,23 +1,20 @@
1
1
  /*
2
- * Adapted from https://cdn.jsdelivr.net/npm/katex@0.18.5/dist/katex.min.css
2
+ * Generated from the installed katex/dist/katex.min.css.
3
+ * Run `pnpm sync-katex-css` from the repository root or frontend to regenerate.
4
+ * Do not edit this file directly; update scripts/katex-css.ts for local overrides.
3
5
  *
4
- * KaTeX's class names change between versions (0.18 prefixed most of its
5
- * internal classes with `katex-`), so this file must be regenerated whenever
6
- * the `katex` package is bumped. Steps:
7
- *
8
- * 1. Copy the upstream katex.min.css for the installed version.
9
- * 2. Delete every `@font-face` block. The fonts are declared in katex-fonts.css.
10
- * 3. Keep the upstream `em` values. KaTeX sizes scripts, rules, and spacing
11
- * relative to the surrounding math, which can differ from the root size.
12
- * 4. Run oxfmt to expand the file, then stylelint with --fix. Merge the two
13
- * `.katex svg` rules stylelint flags as duplicates.
14
- * 5. Re-apply the marimo edits below:
15
- * - `.katex`: `font-size: 110%`, `line-height: inherit` and
16
- * `font-style: normal` in place of the upstream `font` shorthand, so math
17
- * follows the surrounding text size and stays upright in blockquotes.
18
- * - `.katex-tag` inside `.katex-display`: `text-align: right`.
19
- * - `counter-reset` on `.katex-display` as well as `body`, so equation
20
- * numbers restart for each display block.
6
+ * Documented marimo overrides:
7
+ * - Remove @font-face: font declarations live in katex-fonts.css.
8
+ * - Preserve em units so scripts, rules, and spacing scale with surrounding math.
9
+ * - Replace .katex's font shorthand with its font-family, font-size: 110%,
10
+ * font-style: normal, and line-height: inherit to follow surrounding text size
11
+ * and keep math upright in blockquotes.
12
+ * - Right-align display equation tags.
13
+ * - Reset equation counters on each display block as well as body.
14
+ * - Preserve duplicate SVG rules in their upstream order and scope, with a
15
+ * targeted stylelint exemption so their cascade remains intact.
16
+ * Formatting and syntax normalization use oxfmt and stylelint; adjacent exact
17
+ * duplicate declarations left by vendor-prefix normalization are removed.
21
18
  */
22
19
 
23
20
  /* stylelint-disable unit-allowed-list -- KaTeX sizes are relative to the math. */
@@ -38,7 +35,7 @@
38
35
  }
39
36
 
40
37
  .katex .katex-version::after {
41
- content: "0.18.5";
38
+ content: "0.18.7";
42
39
  }
43
40
 
44
41
  .katex .katex-mathml {
@@ -1002,6 +999,17 @@
1002
999
  .katex svg {
1003
1000
  fill: currentcolor;
1004
1001
  stroke: currentcolor;
1002
+ display: block;
1003
+ height: inherit;
1004
+ position: absolute;
1005
+ width: 100%;
1006
+ }
1007
+
1008
+ .katex svg path {
1009
+ stroke: none;
1010
+ }
1011
+ /* stylelint-disable no-duplicate-selectors -- Preserve the upstream SVG cascade. */
1012
+ .katex svg {
1005
1013
  fill-rule: nonzero;
1006
1014
  fill-opacity: 1;
1007
1015
  stroke-width: 1;
@@ -1011,16 +1019,8 @@
1011
1019
  stroke-dasharray: none;
1012
1020
  stroke-dashoffset: 0;
1013
1021
  stroke-opacity: 1;
1014
- display: block;
1015
- height: inherit;
1016
- position: absolute;
1017
- width: 100%;
1018
1022
  }
1019
-
1020
- .katex svg path {
1021
- stroke: none;
1022
- }
1023
-
1023
+ /* stylelint-enable no-duplicate-selectors */
1024
1024
  .katex img {
1025
1025
  border-style: none;
1026
1026
  max-height: none;
@@ -1131,6 +1131,11 @@
1131
1131
  padding: 0 0.03889em;
1132
1132
  }
1133
1133
 
1134
+ .katex .reflectbox {
1135
+ display: inline-block;
1136
+ transform: scaleX(-1);
1137
+ }
1138
+
1134
1139
  .katex .eqn-num::before {
1135
1140
  content: "(" counter(katexEqnNo) ")";
1136
1141
  counter-increment: katexEqnNo;
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { renderHook } from "@testing-library/react";
4
4
  import { useRef } from "react";
5
- import { beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
6
  import {
7
7
  type HTMLElementNotDerivedFromRef,
8
8
  isRefObject,
@@ -28,6 +28,50 @@ describe("isRefObject", () => {
28
28
  });
29
29
  });
30
30
 
31
+ describe.each([1, 2])("with %i anchors named current", (count) => {
32
+ let iframe: HTMLIFrameElement;
33
+ let browserWindow: Window;
34
+
35
+ beforeEach(() => {
36
+ // An iframe preserves named properties hidden by Vitest's global window.
37
+ iframe = document.createElement("iframe");
38
+ document.body.append(iframe);
39
+ if (!iframe.contentWindow) {
40
+ throw new Error("Expected an iframe window");
41
+ }
42
+ browserWindow = iframe.contentWindow;
43
+ const anchors = Array.from({ length: count }, () => {
44
+ const anchor = browserWindow.document.createElement("a");
45
+ anchor.id = "current";
46
+ return anchor;
47
+ });
48
+ browserWindow.document.body.append(...anchors);
49
+ });
50
+
51
+ afterEach(() => {
52
+ iframe.remove();
53
+ });
54
+
55
+ it("does not mistake window for a React ref", () => {
56
+ expect("current" in browserWindow).toBe(true);
57
+ expect(isRefObject(browserWindow)).toBe(false);
58
+ });
59
+
60
+ it("attaches and removes the listener on window", () => {
61
+ const listener = vi.fn();
62
+ const { unmount } = renderHook(() =>
63
+ useEventListener(browserWindow, "resize", listener),
64
+ );
65
+
66
+ browserWindow.dispatchEvent(new Event("resize"));
67
+ expect(listener).toHaveBeenCalledTimes(1);
68
+
69
+ unmount();
70
+ browserWindow.dispatchEvent(new Event("resize"));
71
+ expect(listener).toHaveBeenCalledTimes(1);
72
+ });
73
+ });
74
+
31
75
  describe("useEventListener", () => {
32
76
  beforeEach(() => {
33
77
  vi.clearAllMocks();
@@ -13,7 +13,12 @@ export type HTMLElementNotDerivedFromRef<T = HTMLElement> = T & {
13
13
  };
14
14
 
15
15
  export function isRefObject<T>(target: unknown): target is RefObject<T | null> {
16
- return target !== null && typeof target === "object" && "current" in target;
16
+ return (
17
+ target !== null &&
18
+ typeof target === "object" &&
19
+ !("addEventListener" in target) &&
20
+ "current" in target
21
+ );
17
22
  }
18
23
 
19
24
  export function useEventListener<K extends keyof DocumentEventMap>(
@@ -4,6 +4,7 @@ import { z } from "zod";
4
4
  import { NumberField } from "@/components/ui/number-field";
5
5
  import { useDebounceControlledState } from "@/hooks/useDebounce";
6
6
  import { cn } from "@/utils/cn";
7
+ import { clamp } from "@/utils/math";
7
8
  import type { IPlugin, IPluginProps, Setter } from "../types";
8
9
  import { Labeled } from "./common/labeled";
9
10
 
@@ -65,8 +66,16 @@ const NumberComponent = (props: NumberComponentProps): JSX.Element => {
65
66
  onChange: props.setValue,
66
67
  });
67
68
 
69
+ const clampToRange = (n: number) =>
70
+ clamp(n, props.start ?? -Infinity, props.stop ?? Infinity);
71
+
68
72
  const handleChange = (newValue: number) => {
69
- onChange(withoutNaN(newValue));
73
+ const n = withoutNaN(newValue);
74
+ const next = n == null ? null : clampToRange(n);
75
+ // e.g. typing past `stop` while already at `stop`
76
+ if (next !== value) {
77
+ onChange(next);
78
+ }
70
79
  };
71
80
 
72
81
  return (
@@ -76,11 +85,19 @@ const NumberComponent = (props: NumberComponentProps): JSX.Element => {
76
85
  className={cn("min-w-[3em]", props.fullWidth && "w-full")}
77
86
  minValue={props.start ?? undefined}
78
87
  maxValue={props.stop ?? undefined}
79
- // This needs to be `?? NaN` since `?? undefined` makes uncontrolled component
88
+ // This needs to be `NaN` since `undefined` makes uncontrolled component
80
89
  // and can lead to leaving the old value in forms (https://github.com/marimo-team/marimo/issues/7352)
81
90
  // We out NaNs later
82
- value={value ?? Number.NaN}
91
+ value={value == null ? Number.NaN : clampToRange(value)}
83
92
  step={props.step}
93
+ // By default React Aria rounds every value to `start + n * step`, but
94
+ // `step` is only the stepper increment: users can enter any value in
95
+ // range (#9106). "validate" turns off that rounding (and the clamping,
96
+ // done above instead); its step validation is turned off so off-step
97
+ // values aren't flagged invalid or block `mo.ui.form` submission.
98
+ commitBehavior="validate"
99
+ validationBehavior="aria"
100
+ isInvalid={false}
84
101
  onChange={handleChange}
85
102
  id={id}
86
103
  aria-label={props.label || "Number input"}
@@ -1,6 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { act, render } from "@testing-library/react";
3
+ import { act, fireEvent, render } from "@testing-library/react";
4
+ import { useState } from "react";
4
5
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
6
  import type { z } from "zod";
6
7
  import { initialModeAtom } from "@/core/mode";
@@ -474,4 +475,161 @@ describe("NumberPlugin", () => {
474
475
  );
475
476
  expect(numberField?.classList.contains("w-full")).toBe(true);
476
477
  });
478
+
479
+ describe("does not snap values to step (#9106)", () => {
480
+ // Feeds `setValue` back into `value`, as the kernel round-trip does.
481
+ const renderNumber = (
482
+ initialValue: number,
483
+ data: Pick<z.infer<NumberPlugin["validator"]>, "start" | "stop" | "step">,
484
+ { debounce = false } = {},
485
+ ) => {
486
+ const plugin = new NumberPlugin();
487
+ const setValue = vi.fn();
488
+ const Harness = () => {
489
+ const [value, setState] = useState<number | null>(initialValue);
490
+ return plugin.render({
491
+ host: document.createElement("div"),
492
+ value,
493
+ setValue: (next) => {
494
+ setValue(next);
495
+ setState(next);
496
+ },
497
+ data: {
498
+ ...data,
499
+ label: null,
500
+ debounce,
501
+ fullWidth: false,
502
+ },
503
+ functions: {},
504
+ });
505
+ };
506
+ const { getByRole } = render(<Harness />);
507
+ act(() => {
508
+ vi.advanceTimersByTime(0);
509
+ });
510
+ const input = getByRole("textbox", {
511
+ name: "Number input",
512
+ }) as HTMLInputElement;
513
+ return { input, setValue };
514
+ };
515
+
516
+ const typeAndCommit = (input: HTMLInputElement, text: string) => {
517
+ act(() => {
518
+ input.focus();
519
+ });
520
+ fireEvent.change(input, { target: { value: text } });
521
+ act(() => {
522
+ input.blur();
523
+ });
524
+ };
525
+
526
+ it.each([
527
+ { value: 2.23, start: 1.255_57, step: 0.001 },
528
+ { value: 2.233_45, start: 1, step: 0.001 },
529
+ ])(
530
+ "displays $value as-is with start=$start and step=$step",
531
+ ({ value, start, step }) => {
532
+ const { input } = renderNumber(value, { start, stop: 20, step });
533
+ expect(input.value).toBe(String(value));
534
+ },
535
+ );
536
+
537
+ it.each([
538
+ { typed: "2.3377", start: 1, step: 0.01 },
539
+ { typed: "2.23111", start: 1.222, step: 0.01 },
540
+ ])(
541
+ "keeps typed value $typed with start=$start and step=$step",
542
+ ({ typed, start, step }) => {
543
+ const { input, setValue } = renderNumber(2.233_45, {
544
+ start,
545
+ stop: 20,
546
+ step,
547
+ });
548
+ typeAndCommit(input, typed);
549
+ expect(setValue).toHaveBeenLastCalledWith(Number(typed));
550
+ expect(input.value).toBe(typed);
551
+ expect(input.getAttribute("aria-invalid")).not.toBe("true");
552
+ // React Aria sets a custom validity on this text input in native mode,
553
+ // which would block `mo.ui.form` submission.
554
+ expect(input.validity.valid).toBe(true);
555
+ },
556
+ );
557
+
558
+ it("clamps typed values to start and stop", () => {
559
+ const { input, setValue } = renderNumber(5, {
560
+ start: 2,
561
+ stop: 10,
562
+ step: 1,
563
+ });
564
+ typeAndCommit(input, "25");
565
+ expect(setValue).toHaveBeenLastCalledWith(10);
566
+ expect(input.value).toBe("10");
567
+ typeAndCommit(input, "1");
568
+ expect(setValue).toHaveBeenLastCalledWith(2);
569
+ expect(input.value).toBe("2");
570
+ });
571
+
572
+ it("shows the bound when typing past a bound it is already at", () => {
573
+ const { input, setValue } = renderNumber(10, {
574
+ start: 2,
575
+ stop: 10,
576
+ step: 1,
577
+ });
578
+ typeAndCommit(input, "50");
579
+ expect(setValue).not.toHaveBeenCalled();
580
+ expect(input.value).toBe("10");
581
+ });
582
+
583
+ it("increments and decrements by step", () => {
584
+ const { input, setValue } = renderNumber(5, {
585
+ start: 0,
586
+ stop: 10,
587
+ step: 0.5,
588
+ });
589
+ fireEvent.keyDown(input, { key: "ArrowUp" });
590
+ expect(setValue).toHaveBeenLastCalledWith(5.5);
591
+ expect(input.value).toBe("5.5");
592
+ fireEvent.keyDown(input, { key: "ArrowDown" });
593
+ expect(setValue).toHaveBeenLastCalledWith(5);
594
+ expect(input.value).toBe("5");
595
+ });
596
+
597
+ it.each([
598
+ { key: "ArrowUp", expected: 3 },
599
+ { key: "ArrowDown", expected: 2 },
600
+ ])(
601
+ "$key from an off-step value moves to the nearest step ($expected)",
602
+ ({ key, expected }) => {
603
+ const { input, setValue } = renderNumber(2.23, {
604
+ start: 0,
605
+ stop: 10,
606
+ step: 1,
607
+ });
608
+ fireEvent.keyDown(input, { key });
609
+ expect(setValue).toHaveBeenLastCalledWith(expected);
610
+ expect(input.value).toBe(String(expected));
611
+ },
612
+ );
613
+
614
+ it.each([
615
+ { typed: "2.3377", expected: 2.3377 },
616
+ { typed: "50", expected: 20 },
617
+ ])(
618
+ "commits typed $typed as $expected after the debounce delay",
619
+ ({ typed, expected }) => {
620
+ const { input, setValue } = renderNumber(
621
+ 2.233_45,
622
+ { start: 1, stop: 20, step: 0.01 },
623
+ { debounce: true },
624
+ );
625
+ typeAndCommit(input, typed);
626
+ expect(setValue).not.toHaveBeenCalled();
627
+ act(() => {
628
+ vi.advanceTimersByTime(200);
629
+ });
630
+ expect(setValue).toHaveBeenLastCalledWith(expected);
631
+ expect(input.value).toBe(String(expected));
632
+ },
633
+ );
634
+ });
477
635
  });