@marimo-team/frontend 0.19.10-dev4 → 0.19.10-dev40

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 (263) hide show
  1. package/dist/assets/{CellStatus-CZlcjSUO.js → CellStatus-BAeLnQ68.js} +1 -1
  2. package/dist/assets/JsonOutput-CZpjHc50.js +46 -0
  3. package/dist/assets/{LazyAnyLanguageCodeMirror-DgZ8iknE.js → LazyAnyLanguageCodeMirror-BTO7DS3k.js} +2 -2
  4. package/dist/assets/{MarimoErrorOutput-Lf9P8Fhl.js → MarimoErrorOutput-C90djx1V.js} +1 -1
  5. package/dist/assets/Plot-DolV1EVq.js +3789 -0
  6. package/dist/assets/{RenderHTML-D-of_-s7.js → RenderHTML-ByTXWSgj.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-e_HMl7UU.js → add-cell-with-ai-CnyhGSdf.js} +2 -2
  8. package/dist/assets/{add-database-form-DvnhmpaG.js → add-database-form-DqVwhh_K.js} +1 -1
  9. package/dist/assets/{agent-panel-bOQya9ER.js → agent-panel-vT94Mpn2.js} +1 -1
  10. package/dist/assets/{ai-model-dropdown-Dk2SdB3C.js → ai-model-dropdown-C_pphOGv.js} +1 -1
  11. package/dist/assets/{any-language-editor-BODEG_5g.js → any-language-editor-BdrnE_3i.js} +1 -1
  12. package/dist/assets/{app-config-button-DMsJtN9b.js → app-config-button-BariZTN8.js} +1 -1
  13. package/dist/assets/{architecture-U656AL7Q-DENTsr7c.js → architecture-U656AL7Q-DQB1ihe9.js} +1 -1
  14. package/dist/assets/{architectureDiagram-VXUJARFQ-CDeVogFv.js → architectureDiagram-VXUJARFQ-aV-hwsKI.js} +1 -1
  15. package/dist/assets/{blockDiagram-VD42YOAC-Bol-uwBO.js → blockDiagram-VD42YOAC-CJeGIMJm.js} +1 -1
  16. package/dist/assets/{c4Diagram-YG6GDRKO-C-eNQ40H.js → c4Diagram-YG6GDRKO-aLqv1M3N.js} +1 -1
  17. package/dist/assets/{cell-editor-BW4w46wt.js → cell-editor-8s2G7FD2.js} +12 -12
  18. package/dist/assets/{cell-link-B9b7J8QK.js → cell-link-D46k36Xe.js} +1 -1
  19. package/dist/assets/{cells-DPp5cDaO.js → cells-DG7rjkOQ.js} +14 -14
  20. package/dist/assets/channel-C1Usuv02.js +1 -0
  21. package/dist/assets/{chat-display--jAB7huF.js → chat-display-hQ2Dy5fa.js} +1 -1
  22. package/dist/assets/{chat-panel-DzMwk8Wu.js → chat-panel-D4Bcz2Sv.js} +1 -1
  23. package/dist/assets/{chunk-4BX2VUAB-KawmK-5L.js → chunk-4BX2VUAB-BP-RGZn9.js} +1 -1
  24. package/dist/assets/chunk-55IACEB6-DJOXjhUm.js +1 -0
  25. package/dist/assets/{chunk-ABZYJK2D-0jga8uiE.js → chunk-ABZYJK2D-CNf44YbG.js} +1 -1
  26. package/dist/assets/{chunk-ATLVNIR6-B17dg7Ry.js → chunk-ATLVNIR6-dMFR1SFQ.js} +1 -1
  27. package/dist/assets/{chunk-B4BG7PRW-DoVbcCDm.js → chunk-B4BG7PRW-CtXWCWTB.js} +1 -1
  28. package/dist/assets/{chunk-CVBHYZKI-DU48rJVu.js → chunk-CVBHYZKI-Brsoob-W.js} +1 -1
  29. package/dist/assets/{chunk-DI55MBZ5-rLpl7joX.js → chunk-DI55MBZ5-BAPPLtVz.js} +1 -1
  30. package/dist/assets/{chunk-EXTU4WIE-Dmu97ZvI.js → chunk-EXTU4WIE-DhUL3hgE.js} +1 -1
  31. package/dist/assets/{chunk-FMBD7UC4-CHJv683r.js → chunk-FMBD7UC4-kejklSRQ.js} +1 -1
  32. package/dist/assets/{chunk-HN2XXSSU-Bdbi3Mns.js → chunk-HN2XXSSU-BBxJMYrA.js} +1 -1
  33. package/dist/assets/{chunk-JA3XYJ7Z-DOm8KfKa.js → chunk-JA3XYJ7Z-BBDBNwto.js} +1 -1
  34. package/dist/assets/{chunk-JZLCHNYA-48QVgmR4.js → chunk-JZLCHNYA-BXs7PoCi.js} +1 -1
  35. package/dist/assets/{chunk-MI3HLSF2-n3vxgSbN.js → chunk-MI3HLSF2-D6we5Ftb.js} +1 -1
  36. package/dist/assets/{chunk-N4CR4FBY-BNoQB557.js → chunk-N4CR4FBY-G8sTCjxn.js} +2 -2
  37. package/dist/assets/{chunk-QN33PNHL-BOQncxfy.js → chunk-QN33PNHL-BXnZwF56.js} +1 -1
  38. package/dist/assets/{chunk-QXUST7PY-DkCIa8tJ.js → chunk-QXUST7PY-DaTIHluG.js} +1 -1
  39. package/dist/assets/{chunk-QZHKN3VN-Cp_TxrNJ.js → chunk-QZHKN3VN-DCq7JxLD.js} +1 -1
  40. package/dist/assets/{chunk-S3R3BYOJ-8loRaCFh.js → chunk-S3R3BYOJ-OezEEdUG.js} +1 -1
  41. package/dist/assets/{chunk-TZMSLE5B-CPHBPwrM.js → chunk-TZMSLE5B-BUnfEuEz.js} +1 -1
  42. package/dist/assets/classDiagram-2ON5EDUG-DQZw7BDP.js +1 -0
  43. package/dist/assets/classDiagram-v2-WZHVMYZB-BBniC-qJ.js +1 -0
  44. package/dist/assets/{column-preview-CXjSXUhP.js → column-preview-CPvYaDNg.js} +1 -1
  45. package/dist/assets/{command-2ElA5IkO.js → command-Djb6VJ8T.js} +1 -1
  46. package/dist/assets/{command-palette-DrD2qhGV.js → command-palette-CENytI3Y.js} +1 -1
  47. package/dist/assets/{common-DSlhalAu.js → common-B9j0Q2gP.js} +1 -1
  48. package/dist/assets/{cose-bilkent-S5V4N54A-tFAvjCRW.js → cose-bilkent-S5V4N54A-BjwT10E5.js} +1 -1
  49. package/dist/assets/{dagre-6UL2VRFP-DOB6anec.js → dagre-6UL2VRFP-oY6KaDGH.js} +1 -1
  50. package/dist/assets/{datasource-CtyqtITR.js → datasource-w1NuMzfo.js} +1 -1
  51. package/dist/assets/dependency-graph-panel-DED_3Q6I.js +4 -0
  52. package/dist/assets/{diagram-PSM6KHXK-DpuCiAS7.js → diagram-PSM6KHXK-D3RUn56c.js} +1 -1
  53. package/dist/assets/{diagram-QEK2KX5R-IlkvvuKX.js → diagram-QEK2KX5R-BDPgp5cV.js} +1 -1
  54. package/dist/assets/{diagram-S2PKOQOG-DJt_T1Gq.js → diagram-S2PKOQOG-NhFH98y0.js} +1 -1
  55. package/dist/assets/dist--lWkNwLa.js +1 -0
  56. package/dist/assets/{dist-CRjEDsfC.js → dist-8qtC33as.js} +1 -1
  57. package/dist/assets/{dist-CsRJPnA9.js → dist-B0T008FI.js} +1 -1
  58. package/dist/assets/dist-B1Jd_IvQ.js +1 -0
  59. package/dist/assets/dist-B5vqrkGM.js +1 -0
  60. package/dist/assets/dist-BDTS_4tQ.js +1 -0
  61. package/dist/assets/{dist-C5H5qIvq.js → dist-BHxWJlYy.js} +1 -1
  62. package/dist/assets/{dist-sMh6mJ2d.js → dist-BNkRH34W.js} +2 -2
  63. package/dist/assets/{dist-tLOz534J.js → dist-BP9zs-JA.js} +1 -1
  64. package/dist/assets/dist-BeHHM5ER.js +1 -0
  65. package/dist/assets/dist-BkTLZYtq.js +1 -0
  66. package/dist/assets/dist-Bl-MdZlw.js +1 -0
  67. package/dist/assets/dist-Bouhdq2b.js +1 -0
  68. package/dist/assets/{dist-CtrmRz20.js → dist-BqBWjk9M.js} +3 -3
  69. package/dist/assets/{dist-Gqv0jSNr.js → dist-Bt3KRZho.js} +1 -1
  70. package/dist/assets/dist-BtnFSOCN.js +1 -0
  71. package/dist/assets/{dist-B62Xo7-b.js → dist-C0vFollF.js} +1 -1
  72. package/dist/assets/dist-CBgJfRVh.js +1 -0
  73. package/dist/assets/{dist-CEaOyZOW.js → dist-CCX32maQ.js} +1 -1
  74. package/dist/assets/dist-CDTDwVaL.js +1 -0
  75. package/dist/assets/dist-CF9gSfGe.js +2 -0
  76. package/dist/assets/{dist-BpuNldXk.js → dist-CShMY7yu.js} +1 -1
  77. package/dist/assets/{dist-CEEqzIVj.js → dist-CUeuuHG_.js} +1 -1
  78. package/dist/assets/dist-CY47RP0T.js +1 -0
  79. package/dist/assets/dist-D1HV0xoM.js +1 -0
  80. package/dist/assets/{dist-BZWmfQbq.js → dist-DDhEwFtR.js} +1 -1
  81. package/dist/assets/{dist-BXnpRw3d.js → dist-DDoTyiJg.js} +1 -1
  82. package/dist/assets/{dist-DLgWirXg.js → dist-DKmfcej2.js} +1 -1
  83. package/dist/assets/{dist-Dv0MupEh.js → dist-DPQdWUrU.js} +1 -1
  84. package/dist/assets/dist-DYjR2ilN.js +1 -0
  85. package/dist/assets/{dist-8kKeYgOg.js → dist-D_DbFqxl.js} +1 -1
  86. package/dist/assets/dist-DdDowPeI.js +1 -0
  87. package/dist/assets/{dist-B83wRp_v.js → dist-Dt1by2kD.js} +1 -1
  88. package/dist/assets/dist-Dt_gLA9L.js +1 -0
  89. package/dist/assets/dist-DxWb3aMV.js +13 -0
  90. package/dist/assets/dist-Dz922FNY.js +1 -0
  91. package/dist/assets/dist-GRPM_OuL.js +1 -0
  92. package/dist/assets/{dist-CF4gkF4y.js → dist-K8bI26Ke.js} +1 -1
  93. package/dist/assets/{dist-Btv5Rh1v.js → dist-LUpffRIq.js} +1 -1
  94. package/dist/assets/{dist-bBwmhqty.js → dist-MyTWYTLd.js} +4 -4
  95. package/dist/assets/dist-NOntBqny.js +1 -0
  96. package/dist/assets/{dist-Dcqqg9UU.js → dist-PzrizfuL.js} +1 -1
  97. package/dist/assets/{dist-CNW1zLeq.js → dist-dnoBqBf0.js} +1 -1
  98. package/dist/assets/{dist-CLc5WXWw.js → dist-kjrKkhgz.js} +1 -1
  99. package/dist/assets/{dist-CoCQUAeM.js → dist-maX8rbyb.js} +1 -1
  100. package/dist/assets/{documentation-panel-BDQNa1xE.js → documentation-panel-CG2t9UyE.js} +1 -1
  101. package/dist/assets/{download-os8QlW6l.js → download-B6duieQs.js} +1 -1
  102. package/dist/assets/{edit-page-Bx2U8f0j.js → edit-page-CI1wrWLw.js} +7 -7
  103. package/dist/assets/{erDiagram-Q2GNP2WA-CekwCx1v.js → erDiagram-Q2GNP2WA-DKwbR5cV.js} +1 -1
  104. package/dist/assets/{error-panel-B_234Lt3.js → error-panel-CDGOPmKx.js} +1 -1
  105. package/dist/assets/{esm-D82gQH1f.js → esm-BeuExXY6.js} +1 -1
  106. package/dist/assets/{esm-Bmu2DhPy.js → esm-BqiVbELQ.js} +1 -1
  107. package/dist/assets/{file-explorer-panel-T3oL7Bzx.js → file-explorer-panel-Bu9K_P9d.js} +1 -1
  108. package/dist/assets/{floating-outline-BtdqbkUq.js → floating-outline--UenxIj3.js} +1 -1
  109. package/dist/assets/{flowDiagram-NV44I4VS-BhCyaqwV.js → flowDiagram-NV44I4VS-uysyk7eQ.js} +1 -1
  110. package/dist/assets/{focus-C1YokgL7.js → focus-n0WPxeOV.js} +1 -1
  111. package/dist/assets/{form-BidPUZUn.js → form-C59_eE2a.js} +1 -1
  112. package/dist/assets/{ganttDiagram-JELNMOA3-Ct2B_ci4.js → ganttDiagram-JELNMOA3-Dl5P96jD.js} +1 -1
  113. package/dist/assets/{gitGraph-F6HP7TQM-BwJPuiCH.js → gitGraph-F6HP7TQM-ULnyMCh9.js} +1 -1
  114. package/dist/assets/{gitGraphDiagram-NY62KEGX-DOBPUqeq.js → gitGraphDiagram-NY62KEGX-66npzzTR.js} +1 -1
  115. package/dist/assets/{glide-data-editor-D1ZoJKPr.js → glide-data-editor-DXeMF5KH.js} +3 -3
  116. package/dist/assets/{globals-BgACvYmr.js → globals-CP-h_Os3.js} +1 -1
  117. package/dist/assets/{home-page-DUMF8ZY4.js → home-page-DnqxPw6c.js} +1 -1
  118. package/dist/assets/{hooks-BGeojgid.js → hooks-DSgfibiE.js} +1 -1
  119. package/dist/assets/{html-to-image-CIQqSu-S.js → html-to-image-BXhYNOMC.js} +1 -1
  120. package/dist/assets/index-DG3GipFF.css +2 -0
  121. package/dist/assets/index-OSsO2iNY.js +38 -0
  122. package/dist/assets/{info-NVLQJR56-Ccg18Lpe.js → info-NVLQJR56-gsco60Pt.js} +1 -1
  123. package/dist/assets/{infoDiagram-WHAUD3N6-Cytag0-K.js → infoDiagram-WHAUD3N6-DneTtUPV.js} +1 -1
  124. package/dist/assets/{journeyDiagram-XKPGCS4Q-CPDnALH5.js → journeyDiagram-XKPGCS4Q-Cpn7DMNv.js} +1 -1
  125. package/dist/assets/{kanban-definition-3W4ZIXB7-D0-Tthpw.js → kanban-definition-3W4ZIXB7-Dt7HC9K8.js} +1 -1
  126. package/dist/assets/{kiosk-mode-WmM7aFkh.js → kiosk-mode-CPN0mq4M.js} +1 -1
  127. package/dist/assets/{layout-_O8thjaV.js → layout-C91DpyBS.js} +3 -3
  128. package/dist/assets/{logs-panel-C3cavnFO.js → logs-panel-CZIVXROt.js} +1 -1
  129. package/dist/assets/{markdown-renderer-DJy8ww5d.js → markdown-renderer-CnImn_qm.js} +1 -1
  130. package/dist/assets/{mermaid-y-IBDpJK.js → mermaid-8YdCU498.js} +3 -3
  131. package/dist/assets/{mermaid-parser.core-BLHYb13y.js → mermaid-parser.core-DWPZKg0k.js} +2 -2
  132. package/dist/assets/{mindmap-definition-VGOIOE7T-BflEJS3A.js → mindmap-definition-VGOIOE7T-D81SsTqK.js} +1 -1
  133. package/dist/assets/{mode-Bn7pdJvO.js → mode-a9XOBfse.js} +1 -1
  134. package/dist/assets/{name-cell-input-Bc7geMVf.js → name-cell-input-BhJdGpGA.js} +1 -1
  135. package/dist/assets/{outline-panel-Bxt_JABC.js → outline-panel-BGroTTXd.js} +1 -1
  136. package/dist/assets/{packages-panel-yEp7rAYf.js → packages-panel-CQGOcCdz.js} +1 -1
  137. package/dist/assets/{packet-BFZMPI3H-C_EwQwCX.js → packet-BFZMPI3H-CnHEXEVi.js} +1 -1
  138. package/dist/assets/{panels-DW8vF5Az.js → panels-Dx4knZNw.js} +1 -1
  139. package/dist/assets/{pie-7BOR55EZ-B2NFlNeo.js → pie-7BOR55EZ-C5Sp4r8f.js} +1 -1
  140. package/dist/assets/{pieDiagram-ADFJNKIX-DXRnX2TS.js → pieDiagram-ADFJNKIX-DhavwtGF.js} +1 -1
  141. package/dist/assets/{process-output-ByfLnk6j.js → process-output-C4GYMI00.js} +1 -1
  142. package/dist/assets/{quadrantDiagram-AYHSOK5B-e3OVACTV.js → quadrantDiagram-AYHSOK5B-DMBGpNwx.js} +1 -1
  143. package/dist/assets/{radar-NHE76QYJ-C3XGuwbG.js → radar-NHE76QYJ-DAElyE_r.js} +1 -1
  144. package/dist/assets/{readonly-python-code-WjTf6Pdd.js → readonly-python-code-BvJmyMxd.js} +1 -1
  145. package/dist/assets/{requirementDiagram-UZGBJVZJ-DMbzgjKI.js → requirementDiagram-UZGBJVZJ-Cjwe-82R.js} +1 -1
  146. package/dist/assets/{run-page-D4d7rFuk.js → run-page-CMS44SX5.js} +1 -1
  147. package/dist/assets/{sankeyDiagram-TZEHDZUN-B90PTMUW.js → sankeyDiagram-TZEHDZUN-5-vnnmzf.js} +1 -1
  148. package/dist/assets/{scratchpad-panel-C6thsU6k.js → scratchpad-panel-vqg3jZ3X.js} +1 -1
  149. package/dist/assets/{sequenceDiagram-WL72ISMW-DKFGl_80.js → sequenceDiagram-WL72ISMW-Co6SHGCI.js} +1 -1
  150. package/dist/assets/{session-panel-3zs_-lnF.js → session-panel-pkllmhqQ.js} +1 -1
  151. package/dist/assets/{snippets-panel-Bbk7MFBI.js → snippets-panel-Dg7V8q_w.js} +1 -1
  152. package/dist/assets/{state-D4T75eZb.js → state-C-B637hX.js} +1 -1
  153. package/dist/assets/{stateDiagram-FKZM4ZOC-Czf6mxbq.js → stateDiagram-FKZM4ZOC-Bhirefzg.js} +1 -1
  154. package/dist/assets/stateDiagram-v2-4FDKWEC3-CJnByxam.js +1 -0
  155. package/dist/assets/{switch-dWLWbbtg.js → switch-B-UXYPJj.js} +1 -1
  156. package/dist/assets/{textarea-CRI7xDBj.js → textarea-gBSp2Bx0.js} +1 -1
  157. package/dist/assets/{timeline-definition-IT6M3QCI-Cr57imdX.js → timeline-definition-IT6M3QCI-C5mDI6KK.js} +1 -1
  158. package/dist/assets/{tracing-U3RlLbPJ.js → tracing-Dy8UdLvI.js} +1 -1
  159. package/dist/assets/{tracing-panel-D6GhZuLA.js → tracing-panel-BKDVrccB.js} +2 -2
  160. package/dist/assets/{treemap-KMMF4GRG-CQXdJ2ER.js → treemap-KMMF4GRG-Bf9yeA5X.js} +1 -1
  161. package/dist/assets/{types-BRfQN3HL.js → types-Cggdh96K.js} +1 -1
  162. package/dist/assets/{useAddCell-CmuX2hOk.js → useAddCell-CkxiWxI4.js} +1 -1
  163. package/dist/assets/{useCellActionButton-DUDHPTmq.js → useCellActionButton-BCYKogBW.js} +1 -1
  164. package/dist/assets/{useDeleteCell-DdRX94yC.js → useDeleteCell-CU4wVnMY.js} +1 -1
  165. package/dist/assets/{useDependencyPanelTab-CeDmKn0Z.js → useDependencyPanelTab-Dc4i3G5R.js} +1 -1
  166. package/dist/assets/{useNotebookActions-BFGSBiOA.js → useNotebookActions-BiCGf528.js} +1 -1
  167. package/dist/assets/{useRunCells-D2HBb4DB.js → useRunCells-DnyQs7_N.js} +1 -1
  168. package/dist/assets/{useSplitCell-C4khe6eU.js → useSplitCell-CSr3as14.js} +1 -1
  169. package/dist/assets/utilities.esm-CqG5UDNh.js +3 -0
  170. package/dist/assets/{xychartDiagram-PRI3JC2R-DtYN6-1-.js → xychartDiagram-PRI3JC2R-BhdCuImZ.js} +1 -1
  171. package/dist/index.html +42 -42
  172. package/package.json +12 -13
  173. package/src/components/data-table/TableActions.tsx +8 -1
  174. package/src/components/data-table/__tests__/columns.test.tsx +47 -0
  175. package/src/components/data-table/column-header.tsx +3 -0
  176. package/src/components/data-table/columns.tsx +17 -2
  177. package/src/components/data-table/data-table.tsx +2 -0
  178. package/src/components/data-table/download-actions.tsx +6 -1
  179. package/src/components/dependency-graph/dependency-graph-tree.tsx +10 -1
  180. package/src/components/dependency-graph/dependency-graph.tsx +1 -0
  181. package/src/components/dependency-graph/elements.ts +20 -9
  182. package/src/components/dependency-graph/panels.tsx +27 -11
  183. package/src/components/dependency-graph/types.ts +1 -0
  184. package/src/components/editor/chrome/wrapper/app-chrome.tsx +4 -1
  185. package/src/components/editor/package-alert.tsx +4 -4
  186. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +3 -5
  187. package/src/core/codemirror/misc/__tests__/paste.test.ts +18 -0
  188. package/src/core/codemirror/misc/paste.ts +14 -10
  189. package/src/core/wasm/__tests__/store.test.ts +33 -0
  190. package/src/core/wasm/bridge.ts +2 -1
  191. package/src/core/wasm/store.ts +13 -1
  192. package/src/plugins/impl/DataTablePlugin.tsx +4 -0
  193. package/src/plugins/impl/chat/ChatPlugin.tsx +2 -0
  194. package/src/plugins/impl/chat/chat-ui.tsx +10 -1
  195. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +4 -0
  196. package/src/plugins/impl/plotly/Plot.tsx +173 -0
  197. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +41 -10
  198. package/src/plugins/impl/plotly/__tests__/parse-from-template.test.ts +1 -0
  199. package/src/plugins/impl/plotly/__tests__/usePlotlyLayout.test.ts +2 -1
  200. package/src/plugins/impl/plotly/parse-from-template.ts +1 -0
  201. package/src/plugins/impl/plotly/usePlotlyLayout.ts +2 -1
  202. package/src/theme/ThemeProvider.tsx +2 -0
  203. package/dist/assets/JsonOutput-PE5ko4gi.js +0 -46
  204. package/dist/assets/channel-CdzZX-OR.js +0 -1
  205. package/dist/assets/chunk-55IACEB6-njZIr50E.js +0 -1
  206. package/dist/assets/classDiagram-2ON5EDUG-CUlU7OLD.js +0 -1
  207. package/dist/assets/classDiagram-v2-WZHVMYZB-DAwrDtTO.js +0 -1
  208. package/dist/assets/dependency-graph-panel-Cbke_QgZ.js +0 -4
  209. package/dist/assets/dist-4mAhUzty.js +0 -1
  210. package/dist/assets/dist-5CXgzdUa.js +0 -1
  211. package/dist/assets/dist-B27MCO52.js +0 -1
  212. package/dist/assets/dist-Bc7uxGRW.js +0 -1
  213. package/dist/assets/dist-BtJZmWkg.js +0 -1
  214. package/dist/assets/dist-ByjGU_ag.js +0 -1
  215. package/dist/assets/dist-C-V6lvxH.js +0 -1
  216. package/dist/assets/dist-C6SivM7z.js +0 -1
  217. package/dist/assets/dist-C9k2RMmO.js +0 -1
  218. package/dist/assets/dist-ChS0Dc_R.js +0 -1
  219. package/dist/assets/dist-CtsanegT.js +0 -2
  220. package/dist/assets/dist-Cx8mOJOB.js +0 -1
  221. package/dist/assets/dist-DBwNzi3C.js +0 -13
  222. package/dist/assets/dist-DOZ8nmkC.js +0 -1
  223. package/dist/assets/dist-DUlOLsKi.js +0 -1
  224. package/dist/assets/dist-OlCHPNfN.js +0 -1
  225. package/dist/assets/dist-Z4EybR_c.js +0 -1
  226. package/dist/assets/dist-fO1a06Tp.js +0 -1
  227. package/dist/assets/dist-iXB2pOUD.js +0 -1
  228. package/dist/assets/dist-lTwzYaMX.js +0 -1
  229. package/dist/assets/dist-wS1s8MYb.js +0 -1
  230. package/dist/assets/index-CD6Gw4UH.js +0 -38
  231. package/dist/assets/index-CeUwN_0i.css +0 -2
  232. package/dist/assets/react-plotly-kw5W3sN8.js +0 -4030
  233. package/dist/assets/stateDiagram-v2-4FDKWEC3-DT577w6p.js +0 -1
  234. package/dist/assets/utilities.esm-dm9SQStE.js +0 -3
  235. /package/dist/assets/{asterisk-B04IJwAt.js → asterisk-Cy-53Fu-.js} +0 -0
  236. /package/dist/assets/{chunk-76Q3JFCE-BAZ3z-Fu.js → chunk-76Q3JFCE-B261Xkae.js} +0 -0
  237. /package/dist/assets/{chunk-FWNWRKHM-DzIkWreD.js → chunk-FWNWRKHM-C0b0DIG0.js} +0 -0
  238. /package/dist/assets/{chunk-LBM3YZW2-BRBe7ZaP.js → chunk-LBM3YZW2-D3uTpSOd.js} +0 -0
  239. /package/dist/assets/{chunk-LHMN2FUI-C4onQD9F.js → chunk-LHMN2FUI-2FK1AIwU.js} +0 -0
  240. /package/dist/assets/{chunk-O7ZBX7Z2-CFqB9i7k.js → chunk-O7ZBX7Z2-DoE29Zoe.js} +0 -0
  241. /package/dist/assets/{chunk-S6J4BHB3-C4KwSfr_.js → chunk-S6J4BHB3-Cvr0itXK.js} +0 -0
  242. /package/dist/assets/{chunk-T53DSG4Q-Bhd043Cg.js → chunk-T53DSG4Q-C7bPrBIt.js} +0 -0
  243. /package/dist/assets/{chunk-XAJISQIX-0gvwv13B.js → chunk-XAJISQIX-TwS9jXHm.js} +0 -0
  244. /package/dist/assets/{common-keywords-D6ImdZX8.js → common-keywords-CU-S2Vqm.js} +0 -0
  245. /package/dist/assets/{cytoscape.esm-BauVghWH.js → cytoscape.esm-BihqZ2_-.js} +0 -0
  246. /package/dist/assets/{data-grid-overlay-editor-D8lE4fym.js → data-grid-overlay-editor-lP_r54zS.js} +0 -0
  247. /package/dist/assets/{dist-C1VXabOr.js → dist-DxxvVPQH.js} +0 -0
  248. /package/dist/assets/{dockerfile-BmwSYxi2.js → dockerfile-Cq6vOmt3.js} +0 -0
  249. /package/dist/assets/{duckdb-keywords-5i8us9ML.js → duckdb-keywords-CR9f4wu5.js} +0 -0
  250. /package/dist/assets/{ebnf--2SLsnbd.js → ebnf-BdwTqLUx.js} +0 -0
  251. /package/dist/assets/{fcl-CcJxrJDr.js → fcl-BFWIADMy.js} +0 -0
  252. /package/dist/assets/{http-BBXW5Cu0.js → http-CgzOAOXj.js} +0 -0
  253. /package/dist/assets/{mhchem-ICopO0mb.js → mhchem-CJmb5HsA.js} +0 -0
  254. /package/dist/assets/{nginx-CiiHaY6Q.js → nginx-CFpObAqg.js} +0 -0
  255. /package/dist/assets/{node-sql-parser-Bzh-sm1v.js → node-sql-parser-UQ9Ur_LP.js} +0 -0
  256. /package/dist/assets/{number-overlay-editor-Dylprn80.js → number-overlay-editor-CY6Dxl9c.js} +0 -0
  257. /package/dist/assets/{solr-DYYuHZ7Q.js → solr-BkyoAXqg.js} +0 -0
  258. /package/dist/assets/{spreadsheet-hVThRh5Z.js → spreadsheet-7FZkhkVo.js} +0 -0
  259. /package/dist/assets/{sql-DG1AJQLP.js → sql-BNnXxKXA.js} +0 -0
  260. /package/dist/assets/{src-CsZby044.js → src-CmKhyEBC.js} +0 -0
  261. /package/dist/assets/{tiddlywiki-Dc8c_QaF.js → tiddlywiki-DE5lnTl3.js} +0 -0
  262. /package/dist/assets/{tiki-CwGnGueS.js → tiki-Dt9oCY2i.js} +0 -0
  263. /package/dist/assets/{vega-component-D4L27L4Y.js → vega-component-BxXt5fsA.js} +0 -0
@@ -14,6 +14,7 @@ import { logNever } from "@/utils/assertNever";
14
14
  import { copyToClipboard } from "@/utils/copy";
15
15
  import { downloadByURL } from "@/utils/download";
16
16
  import { prettyError } from "@/utils/errors";
17
+ import { Filenames } from "@/utils/filenames";
17
18
  import {
18
19
  jsonParseWithSpecialChar,
19
20
  jsonToMarkdown,
@@ -36,6 +37,7 @@ type DownloadFormat = "csv" | "json" | "parquet";
36
37
 
37
38
  export interface DownloadActionProps {
38
39
  downloadAs: (req: { format: DownloadFormat }) => Promise<string>;
40
+ downloadFileName?: string;
39
41
  }
40
42
 
41
43
  const options = [
@@ -158,7 +160,10 @@ export const DownloadAs: React.FC<DownloadActionProps> = (props) => {
158
160
  onSelect={async () => {
159
161
  const downloadUrl = await getDownloadUrl(option.format);
160
162
  const ext = option.format;
161
- downloadByURL(downloadUrl, `download.${ext}`);
163
+ const rawName = (props.downloadFileName ?? "").trim();
164
+ const baseName =
165
+ Filenames.withoutExtension(rawName) || "download";
166
+ downloadByURL(downloadUrl, `${baseName}.${ext}`);
162
167
  }}
163
168
  >
164
169
  <option.icon className="mo-dropdown-icon" />
@@ -58,6 +58,7 @@ export const DependencyGraphTree: React.FC<PropsWithChildren<Props>> = ({
58
58
  cellAtoms,
59
59
  variables,
60
60
  settings.hidePureMarkdown,
61
+ settings.hideReusableFunctions,
61
62
  );
62
63
  elements = layoutElements({
63
64
  nodes: elements.nodes,
@@ -94,9 +95,17 @@ export const DependencyGraphTree: React.FC<PropsWithChildren<Props>> = ({
94
95
  cellAtoms,
95
96
  variables,
96
97
  settings.hidePureMarkdown,
98
+ settings.hideReusableFunctions,
97
99
  ),
98
100
  );
99
- }, [cellIds, variables, cellAtoms, syncChanges, settings.hidePureMarkdown]);
101
+ }, [
102
+ cellIds,
103
+ variables,
104
+ cellAtoms,
105
+ syncChanges,
106
+ settings.hidePureMarkdown,
107
+ settings.hideReusableFunctions,
108
+ ]);
100
109
 
101
110
  const [selection, setSelection] = useState<GraphSelection>();
102
111
  useFitToViewOnDimensionChange();
@@ -24,6 +24,7 @@ interface Props {
24
24
  const graphViewAtom = atom<LayoutDirection>("TB");
25
25
  const graphViewSettings = atom<GraphSettings>({
26
26
  hidePureMarkdown: true,
27
+ hideReusableFunctions: false,
27
28
  });
28
29
 
29
30
  export const DependencyGraph: React.FC<Props> = (props) => {
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type { Atom } from "jotai";
4
4
  import { type Edge, MarkerType, type Node, type NodeProps } from "reactflow";
5
+ import { getNotebook } from "@/core/cells/cells";
5
6
  import type { CellId } from "@/core/cells/ids";
6
7
  import type { CellData } from "@/core/cells/types";
7
8
  import { store } from "@/core/state/jotai";
@@ -29,6 +30,7 @@ interface ElementsBuilder {
29
30
  cellAtoms: Atom<CellData>[],
30
31
  variables: Variables,
31
32
  hidePureMarkdown: boolean,
33
+ hideReusableFunctions: boolean,
32
34
  ) => { nodes: Node<NodeData>[]; edges: Edge[] };
33
35
  }
34
36
 
@@ -76,6 +78,7 @@ export class VerticalElementsBuilder implements ElementsBuilder {
76
78
  cellAtoms: Atom<CellData>[],
77
79
  variables: Variables,
78
80
  _hidePureMarkdown: boolean,
81
+ _hideReusableFunctions: boolean,
79
82
  ) {
80
83
  let prevY = 0;
81
84
  const nodes: Node<NodeData>[] = [];
@@ -143,6 +146,7 @@ export class TreeElementsBuilder implements ElementsBuilder {
143
146
  cellAtoms: Atom<CellData>[],
144
147
  variables: Variables,
145
148
  hidePureMarkdown: boolean,
149
+ hideReusableFunctions: boolean,
146
150
  ) {
147
151
  const nodes: Node<NodeData>[] = [];
148
152
  const edges: Edge[] = [];
@@ -171,18 +175,25 @@ export class TreeElementsBuilder implements ElementsBuilder {
171
175
  }
172
176
  }
173
177
 
174
- for (const [cellId, cellAtom] of Arrays.zip(cellIds, cellAtoms)) {
175
- // Show every cell
176
- if (!hidePureMarkdown) {
177
- nodes.push(this.createNode(cellId, cellAtom));
178
- }
178
+ const cellRuntime = getNotebook().cellRuntime;
179
179
 
180
+ for (const [cellId, cellAtom] of Arrays.zip(cellIds, cellAtoms)) {
181
+ const code = store.get(cellAtom).code.trim();
180
182
  const hasEdge = nodesWithEdges.has(cellId);
181
- const isMarkdown = store.get(cellAtom).code.trim().startsWith("mo.md");
182
- // Show only cells with edges or non-markdown cells
183
- if (hasEdge || !isMarkdown) {
184
- nodes.push(this.createNode(cellId, cellAtom));
183
+ const isMarkdown = code.startsWith("mo.md");
184
+ const runtime = cellRuntime[cellId];
185
+ const isReusable = runtime?.serialization?.toLowerCase() === "valid";
186
+
187
+ // Apply filters
188
+ if (hidePureMarkdown && isMarkdown && !hasEdge) {
189
+ continue;
190
+ }
191
+ if (hideReusableFunctions && isReusable && !hasEdge) {
192
+ continue;
185
193
  }
194
+
195
+ // Show every cell that wasn't filtered out
196
+ nodes.push(this.createNode(cellId, cellAtom));
186
197
  }
187
198
 
188
199
  return { nodes, edges };
@@ -43,7 +43,8 @@ export const GraphToolbar: React.FC<Props> = memo(
43
43
  onSettingsChange({ ...settings, [key]: value });
44
44
  };
45
45
 
46
- const checkboxId = useId();
46
+ const markdownCheckboxId = useId();
47
+ const functionsCheckboxId = useId();
47
48
 
48
49
  const settingsButton = (
49
50
  <Popover>
@@ -54,16 +55,31 @@ export const GraphToolbar: React.FC<Props> = memo(
54
55
  </PopoverTrigger>
55
56
  <PopoverContent className="w-auto p-2 text-muted-foreground">
56
57
  <div className="font-semibold pb-4">Settings</div>
57
- <div className="flex items-center gap-2">
58
- <Checkbox
59
- data-testid="hide-pure-markdown-checkbox"
60
- id={checkboxId}
61
- checked={settings.hidePureMarkdown}
62
- onCheckedChange={(checked) =>
63
- handleSettingChange("hidePureMarkdown", Boolean(checked))
64
- }
65
- />
66
- <Label htmlFor={checkboxId}>Hide pure markdown</Label>
58
+ <div className="flex flex-col gap-2">
59
+ <div className="flex items-center gap-2">
60
+ <Checkbox
61
+ data-testid="hide-pure-markdown-checkbox"
62
+ id={markdownCheckboxId}
63
+ checked={settings.hidePureMarkdown}
64
+ onCheckedChange={(checked) =>
65
+ handleSettingChange("hidePureMarkdown", Boolean(checked))
66
+ }
67
+ />
68
+ <Label htmlFor={markdownCheckboxId}>Hide pure markdown</Label>
69
+ </div>
70
+ <div className="flex items-center gap-2">
71
+ <Checkbox
72
+ data-testid="hide-reusable-functions-checkbox"
73
+ id={functionsCheckboxId}
74
+ checked={settings.hideReusableFunctions}
75
+ onCheckedChange={(checked) =>
76
+ handleSettingChange("hideReusableFunctions", Boolean(checked))
77
+ }
78
+ />
79
+ <Label htmlFor={functionsCheckboxId}>
80
+ Hide reusable functions
81
+ </Label>
82
+ </div>
67
83
  </div>
68
84
  </PopoverContent>
69
85
  </Popover>
@@ -17,4 +17,5 @@ export type GraphSelection =
17
17
 
18
18
  export interface GraphSettings {
19
19
  hidePureMarkdown: boolean;
20
+ hideReusableFunctions: boolean;
20
21
  }
@@ -226,7 +226,9 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
226
226
 
227
227
  const helperResizeHandle = (
228
228
  <PanelResizeHandle
229
+ disabled={!isSidebarOpen}
229
230
  onDragging={handleDragging}
231
+ hitAreaMargins={{ coarse: 15, fine: 2 }}
230
232
  className={cn(
231
233
  "border-border print:hidden z-10",
232
234
  isSidebarOpen ? "resize-handle" : "resize-handle-collapsed",
@@ -237,6 +239,7 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
237
239
 
238
240
  const panelResizeHandle = (
239
241
  <PanelResizeHandle
242
+ disabled={!isDeveloperPanelOpen}
240
243
  onDragging={handleDragging}
241
244
  className={cn(
242
245
  "border-border print:hidden z-20",
@@ -281,7 +284,7 @@ export const AppChrome: React.FC<PropsWithChildren> = ({ children }) => {
281
284
  const helpPaneBody = (
282
285
  <ErrorBoundary>
283
286
  <PanelSectionProvider value="sidebar">
284
- <div className="flex flex-col h-full flex-1 overflow-hidden mr-[-4px]">
287
+ <div className="flex flex-col h-full flex-1 overflow-hidden">
285
288
  <div className="p-3 border-b flex justify-between items-center">
286
289
  {selectedPanel === "dependencies" ? (
287
290
  <div className="flex items-center justify-between flex-1">
@@ -96,10 +96,10 @@ export const PackageAlert: React.FC = () => {
96
96
 
97
97
  if (isMissingPackageAlert(packageAlert)) {
98
98
  return (
99
- <div className="flex flex-col gap-4 mb-5 fixed top-5 left-12 min-w-[400px] z-200 opacity-95 max-w-[600px]">
99
+ <div className="flex flex-col gap-4 mb-5 fixed top-5 left-12 min-w-[400px] z-200 opacity-95 max-w-[600px] pointer-events-none">
100
100
  <Banner
101
101
  kind="danger"
102
- className="flex flex-col rounded py-3 px-5 animate-in slide-in-from-left overflow-auto max-h-[80vh] scrollbar-thin"
102
+ className="flex flex-col rounded py-3 px-5 animate-in slide-in-from-left overflow-auto max-h-[80vh] scrollbar-thin pointer-events-auto"
103
103
  >
104
104
  <div className="flex justify-between">
105
105
  <span className="font-bold text-lg flex items-center mb-2">
@@ -207,10 +207,10 @@ export const PackageAlert: React.FC = () => {
207
207
  }
208
208
 
209
209
  return (
210
- <div className="flex flex-col gap-4 mb-5 fixed top-5 left-12 min-w-[400px] z-200 opacity-95 max-w-[600px] ">
210
+ <div className="flex flex-col gap-4 mb-5 fixed top-5 left-12 min-w-[400px] z-200 opacity-95 max-w-[600px] pointer-events-none">
211
211
  <Banner
212
212
  kind={status === "failed" ? "danger" : "info"}
213
- className="flex flex-col rounded pt-3 pb-4 px-5 overflow-auto max-h-[80vh] scrollbar-thin"
213
+ className="flex flex-col rounded pt-3 pb-4 px-5 overflow-auto max-h-[80vh] scrollbar-thin pointer-events-auto"
214
214
  >
215
215
  <div className="flex justify-between">
216
216
  <span className="font-bold text-lg flex items-center mb-2">
@@ -172,11 +172,9 @@ const VerticalLayoutRenderer: React.FC<VerticalLayoutProps> = ({
172
172
  // spacing is handled elsewhere
173
173
  return (
174
174
  <VerticalLayoutWrapper invisible={invisible} appConfig={appConfig}>
175
- {showCode && canShowCode ? (
176
- <div className="flex flex-col gap-5"> {renderCells()}</div>
177
- ) : (
178
- renderCells()
179
- )}
175
+ <div className={cn("flex flex-col", showCode && canShowCode && "gap-5")}>
176
+ {renderCells()}
177
+ </div>
180
178
  {mode === "read" && (
181
179
  <ActionButtons
182
180
  canShowCode={canShowCode}
@@ -140,6 +140,24 @@ def _(
140
140
  expect(extractCells(input)).toEqual(["x = a + b + c"]);
141
141
  });
142
142
 
143
+ it("preserves return statements inside nested functions", () => {
144
+ const input = `
145
+ @app.cell
146
+ def _(mo, px):
147
+ def make_fig():
148
+ data = {'category': ['foo', 'bar'], 'value': [10, 20]}
149
+ fig = px.bar(data, x='category', y='value')
150
+ return fig
151
+
152
+ fig = make_fig()
153
+ mo.ui.plotly(fig)
154
+ return
155
+ `;
156
+ expect(extractCells(input)).toEqual([
157
+ "def make_fig():\n data = {'category': ['foo', 'bar'], 'value': [10, 20]}\n fig = px.bar(data, x='category', y='value')\n return fig\n\nfig = make_fig()\nmo.ui.plotly(fig)",
158
+ ]);
159
+ });
160
+
143
161
  it("handles cells with config", () => {
144
162
  const input = `
145
163
  @app.cell(hide_code=True, column=2)
@@ -42,6 +42,7 @@ export function extractCells(text: string): string[] {
42
42
  let inMultilineArgs = false;
43
43
  let inMultilineReturn = false;
44
44
  let parenCount = 0;
45
+ let cellBaseIndent: number | null = null;
45
46
 
46
47
  // Pre-compile regex patterns
47
48
  const leadingParenRegex = /\(/g;
@@ -55,19 +56,16 @@ export function extractCells(text: string): string[] {
55
56
  );
56
57
  }
57
58
 
59
+ function getIndent(line: string): number {
60
+ const match = line.match(/^\s*/);
61
+ return match ? match[0].length : 0;
62
+ }
63
+
58
64
  function finalizeCellIfNeeded() {
59
65
  if (currentCell.length === 0) {
60
66
  return;
61
67
  }
62
68
 
63
- // Remove trailing returns
64
- while (
65
- currentCell.length > 0 &&
66
- currentCell[currentCell.length - 1].trim().startsWith("return")
67
- ) {
68
- currentCell.pop();
69
- }
70
-
71
69
  // Only add non-empty cells
72
70
  if (currentCell.some((l) => l.trim() !== "")) {
73
71
  cells.push(dedent(currentCell.join("\n")));
@@ -88,6 +86,7 @@ export function extractCells(text: string): string[] {
88
86
  finalizeCellIfNeeded();
89
87
  inCell = true;
90
88
  skipLines = 1; // Skip the def line
89
+ cellBaseIndent = null;
91
90
  continue;
92
91
  }
93
92
 
@@ -125,8 +124,13 @@ export function extractCells(text: string): string[] {
125
124
  continue;
126
125
  }
127
126
 
128
- // Handle return statements
129
- if (trimmed.startsWith("return")) {
127
+ // Detect base indentation of cell body from first content line
128
+ if (cellBaseIndent === null && trimmed) {
129
+ cellBaseIndent = getIndent(line);
130
+ }
131
+
132
+ // Handle return statements — only strip cell-level returns
133
+ if (trimmed.startsWith("return") && getIndent(line) === cellBaseIndent) {
130
134
  if (trimmed.includes("(") && !trimmed.endsWith(")")) {
131
135
  inMultilineReturn = true;
132
136
  parenCount = countParens(trimmed);
@@ -1,9 +1,13 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import { describe, expect, it, vi } from "vitest";
3
+ import { codeAtom } from "../../saving/file-state";
4
+ import { store } from "../../state/jotai";
3
5
  import {
4
6
  CompositeFileStore,
5
7
  domElementFileStore,
6
8
  localStorageFileStore,
9
+ mountConfigFileStore,
10
+ notebookFileStore,
7
11
  } from "../store";
8
12
 
9
13
  describe("localStorageFileStore", () => {
@@ -53,3 +57,32 @@ describe("CompositeFileStore", () => {
53
57
  expect(saved).toHaveBeenCalledTimes(3);
54
58
  });
55
59
  });
60
+
61
+ describe("mountConfigFileStore", () => {
62
+ it("returns null when no code is set", () => {
63
+ store.set(codeAtom, undefined);
64
+ expect(mountConfigFileStore.readFile()).toBeNull();
65
+ });
66
+
67
+ it("returns code when set", () => {
68
+ store.set(codeAtom, "print('hello')");
69
+ expect(mountConfigFileStore.readFile()).toBe("print('hello')");
70
+ });
71
+
72
+ it("does not save files", () => {
73
+ store.set(codeAtom, "original");
74
+ mountConfigFileStore.saveFile("new content");
75
+ expect(mountConfigFileStore.readFile()).toBe("original");
76
+ });
77
+ });
78
+
79
+ describe("notebookFileStore priority", () => {
80
+ it("prefers mount config over marimo-code and URL", () => {
81
+ store.set(codeAtom, "mount config code");
82
+ const element = document.createElement("marimo-code");
83
+ element.textContent = "marimo-code element";
84
+ document.body.replaceChildren(element);
85
+
86
+ expect(notebookFileStore.readFile()).toBe("mount config code");
87
+ });
88
+ });
@@ -29,6 +29,7 @@ import type {
29
29
  SaveUserConfigurationRequest,
30
30
  Snippets,
31
31
  } from "../network/types";
32
+ import { filenameAtom } from "../saving/file-state";
32
33
  import { store } from "../state/jotai";
33
34
  import { BasicTransport } from "../websocket/transports/basic";
34
35
  import type { IConnectionTransport } from "../websocket/transports/transport";
@@ -146,7 +147,7 @@ export class PyodideBridge implements RunRequests, EditRequests {
146
147
 
147
148
  const code = await notebookFileStore.readFile();
148
149
  const fallbackCode = await fallbackFileStore.readFile();
149
- const filename = PyodideRouter.getFilename();
150
+ const filename = store.get(filenameAtom) ?? PyodideRouter.getFilename();
150
151
  const userConfig = store.get(userConfigAtom);
151
152
 
152
153
  const queryParameters: Record<string, string | string[]> = {};
@@ -4,6 +4,8 @@ import {
4
4
  compressToEncodedURIComponent,
5
5
  decompressFromEncodedURIComponent,
6
6
  } from "lz-string";
7
+ import { codeAtom } from "@/core/saving/file-state";
8
+ import { store } from "@/core/state/jotai";
7
9
  import { TypedLocalStorage } from "@/utils/storage/typed";
8
10
  import { PyodideRouter } from "./router";
9
11
 
@@ -67,6 +69,15 @@ const remoteDefaultFileStore: FileStore = {
67
69
  },
68
70
  };
69
71
 
72
+ export const mountConfigFileStore: FileStore = {
73
+ saveFile(_contents: string) {
74
+ // Read-only: mount config code is set via codeAtom
75
+ },
76
+ readFile() {
77
+ return store.get(codeAtom) ?? null;
78
+ },
79
+ };
80
+
70
81
  const emptyFileStore: FileStore = {
71
82
  saveFile(contents: string) {
72
83
  // Do nothing
@@ -112,7 +123,8 @@ export class CompositeFileStore implements FileStore {
112
123
  }
113
124
 
114
125
  export const notebookFileStore = new CompositeFileStore([
115
- // Prefer <marimo-code>, then URL
126
+ // Prefer mount config, then <marimo-code>, then URL
127
+ mountConfigFileStore,
116
128
  domElementFileStore,
117
129
  urlFileStore,
118
130
  ]);
@@ -195,6 +195,7 @@ interface Data<T> {
195
195
  hasStableRowId: boolean;
196
196
  lazy: boolean;
197
197
  cellHoverTexts?: Record<string, Record<string, string | null>> | null;
198
+ downloadFileName?: string;
198
199
  }
199
200
 
200
201
  // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
@@ -278,6 +279,7 @@ export const DataTablePlugin = createPlugin<S>("marimo-table")
278
279
  // If lazy, this will preload the first page of data
279
280
  // without user confirmation.
280
281
  preload: z.boolean().default(false),
282
+ downloadFileName: z.string().optional(),
281
283
  }),
282
284
  )
283
285
  .withFunctions<DataTableFunctions>({
@@ -752,6 +754,7 @@ const DataTableComponent = ({
752
754
  cellStyles,
753
755
  hoverTemplate,
754
756
  cellHoverTexts,
757
+ downloadFileName,
755
758
  toggleDisplayHeader,
756
759
  calculate_top_k_rows,
757
760
  preview_column,
@@ -981,6 +984,7 @@ const DataTableComponent = ({
981
984
  hoverTemplate={hoverTemplate}
982
985
  cellHoverTexts={cellHoverTexts}
983
986
  downloadAs={showDownload ? downloadAs : undefined}
987
+ downloadFileName={downloadFileName}
984
988
  enableSearch={enableSearch}
985
989
  searchQuery={searchQuery}
986
990
  onSearchQueryChange={setSearchQuery}
@@ -47,6 +47,7 @@ export const ChatPlugin = createPlugin<{ messages: UIMessage[] }>(
47
47
  maxHeight: z.number().optional(),
48
48
  config: configSchema,
49
49
  allowAttachments: z.union([z.boolean(), z.string().array()]),
50
+ disabled: z.boolean().default(false),
50
51
  }),
51
52
  )
52
53
  .withFunctions<PluginFunctions>({
@@ -76,6 +77,7 @@ export const ChatPlugin = createPlugin<{ messages: UIMessage[] }>(
76
77
  showConfigurationControls={props.data.showConfigurationControls}
77
78
  maxHeight={props.data.maxHeight}
78
79
  allowAttachments={props.data.allowAttachments}
80
+ disabled={props.data.disabled}
79
81
  config={props.data.config}
80
82
  get_chat_history={props.functions.get_chat_history}
81
83
  delete_chat_history={props.functions.delete_chat_history}
@@ -67,6 +67,7 @@ interface Props extends PluginFunctions {
67
67
  showConfigurationControls: boolean;
68
68
  maxHeight: number | undefined;
69
69
  allowAttachments: boolean | string[];
70
+ disabled: boolean;
70
71
  value: UIMessage[];
71
72
  setValue: (messages: UIMessage[]) => void;
72
73
  host: HTMLElement;
@@ -450,6 +451,9 @@ export const Chatbot: React.FC<Props> = (props) => {
450
451
  <form
451
452
  onSubmit={async (evt) => {
452
453
  evt.preventDefault();
454
+ if (props.disabled) {
455
+ return;
456
+ }
453
457
 
454
458
  const fileParts = files
455
459
  ? await convertToFileUIPart(files)
@@ -462,7 +466,12 @@ export const Chatbot: React.FC<Props> = (props) => {
462
466
  resetInput();
463
467
  }}
464
468
  ref={formRef}
465
- className="flex w-full border-t border-(--slate-6) px-2 py-1 items-center"
469
+ // biome-ignore lint/a11y/useSemanticElements: inert is used to disable the entire form
470
+ inert={props.disabled || undefined}
471
+ className={cn(
472
+ "flex w-full border-t border-(--slate-6) px-2 py-1 items-center",
473
+ props.disabled && "opacity-50 cursor-not-allowed",
474
+ )}
466
475
  >
467
476
  {props.showConfigurationControls && (
468
477
  <ConfigPopup config={config} onChange={setConfig} />
@@ -48,6 +48,7 @@ type TableData<T> = T[] | CsvURL;
48
48
  interface Data {
49
49
  label?: string | null;
50
50
  columns: ColumnDataTypes;
51
+ dataframeName?: string;
51
52
  pageSize: number;
52
53
  showDownload: boolean;
53
54
  lazy: boolean;
@@ -93,6 +94,7 @@ export const DataFramePlugin = createPlugin<S>("marimo-dataframe")
93
94
  label: z.string().nullish(),
94
95
  pageSize: z.number().default(5),
95
96
  showDownload: z.boolean().default(true),
97
+ dataframeName: z.string().optional(),
96
98
  columns: z
97
99
  .array(z.tuple([z.string().or(z.number()), z.string(), z.string()]))
98
100
  .transform((value) => {
@@ -176,6 +178,7 @@ const EMPTY: Transformations = {
176
178
  export const DataFrameComponent = memo(
177
179
  ({
178
180
  columns,
181
+ dataframeName,
179
182
  pageSize,
180
183
  showDownload,
181
184
  lazy,
@@ -326,6 +329,7 @@ export const DataFrameComponent = memo(
326
329
  fieldTypes={field_types}
327
330
  rowHeaders={row_headers || Arrays.EMPTY}
328
331
  showDownload={showDownload}
332
+ downloadFileName={dataframeName}
329
333
  download_as={download_as}
330
334
  enableSearch={false}
331
335
  showFilters={false}