@marimo-team/islands 0.19.10-dev4 → 0.19.10-dev41

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 (435) hide show
  1. package/dist/{ConnectedDataExplorerComponent-BAeQ8DWw.js → ConnectedDataExplorerComponent-CkXO-pKy.js} +6 -6
  2. package/dist/Plot-C9vQQj4X.js +172249 -0
  3. package/dist/{any-language-editor-D0UQItkS.js → any-language-editor-t_VsTNa-.js} +16 -16
  4. package/dist/apl-C1bki_dE.js +4 -0
  5. package/dist/{arc-CEWBr4jc.js → arc-9nABupDE.js} +2 -2
  6. package/dist/{architectureDiagram-VXUJARFQ-DPPYVq8H.js → architectureDiagram-VXUJARFQ-DmJQhcJb.js} +6 -6
  7. package/dist/asciiarmor-BdlkCCRr.js +4 -0
  8. package/dist/asn1-CvE30hox.js +4 -0
  9. package/dist/{blockDiagram-VD42YOAC-BA5N05Y9.js → blockDiagram-VD42YOAC-CRofISJs.js} +10 -10
  10. package/dist/brainfuck-BalwWy1a.js +4 -0
  11. package/dist/{c4Diagram-YG6GDRKO-DJLzuGJJ.js → c4Diagram-YG6GDRKO-Deqoag4I.js} +4 -4
  12. package/dist/{channel-Dob5kWXR.js → channel-CMsnebrL.js} +1 -1
  13. package/dist/{chunk-4BX2VUAB-DZQibjKA.js → chunk-4BX2VUAB-WmXmzRBr.js} +1 -1
  14. package/dist/{chunk-55IACEB6-C3BASkh4.js → chunk-55IACEB6-irYMvHJu.js} +1 -1
  15. package/dist/{chunk-5FQGJX7Z-BEb20Lzt.js → chunk-5FQGJX7Z-pOElJy8t.js} +2 -2
  16. package/dist/{chunk-ABZYJK2D-BXTC53mt.js → chunk-ABZYJK2D-BGWvKte3.js} +2 -2
  17. package/dist/{chunk-ATLVNIR6-BJDjUR_c.js → chunk-ATLVNIR6-BYZB6C5T.js} +2 -2
  18. package/dist/{chunk-B4BG7PRW-DzmUUpfH.js → chunk-B4BG7PRW-CwYUp6Uj.js} +7 -7
  19. package/dist/{chunk-CVBHYZKI-Dhc_e3rA.js → chunk-CVBHYZKI-Bb2XMuXJ.js} +1 -1
  20. package/dist/{chunk-DI55MBZ5-gTd3J8Tu.js → chunk-DI55MBZ5-Gyro6dvN.js} +6 -6
  21. package/dist/{chunk-EXTU4WIE-DyoOs5QX.js → chunk-EXTU4WIE-BlA7aWEw.js} +2 -2
  22. package/dist/{chunk-FMBD7UC4-geNUIndh.js → chunk-FMBD7UC4-C0DZU_4q.js} +1 -1
  23. package/dist/{chunk-HN2XXSSU-CqPwpolw.js → chunk-HN2XXSSU-BsB4dtgF.js} +1 -1
  24. package/dist/{chunk-JA3XYJ7Z-BGnAIbOP.js → chunk-JA3XYJ7Z-Cm-pccR-.js} +3 -3
  25. package/dist/{chunk-JZLCHNYA-CIRgweVQ.js → chunk-JZLCHNYA-CoLqqXMe.js} +6 -6
  26. package/dist/{chunk-MI3HLSF2-DOJkNER1.js → chunk-MI3HLSF2-DeDZS-tQ.js} +1 -1
  27. package/dist/{chunk-N4CR4FBY-DKSvXAIS.js → chunk-N4CR4FBY-ByLbY9L-.js} +7 -7
  28. package/dist/{chunk-QN33PNHL-B6zC8BTi.js → chunk-QN33PNHL-eodIiY9F.js} +2 -2
  29. package/dist/{chunk-QXUST7PY-C7750n_u.js → chunk-QXUST7PY-CuJlDW6A.js} +10 -10
  30. package/dist/{chunk-QZHKN3VN-BF_oGUlG.js → chunk-QZHKN3VN-Diy_Cdek.js} +1 -1
  31. package/dist/{chunk-S3R3BYOJ-CBkH6JZZ.js → chunk-S3R3BYOJ-CwDGYMVf.js} +3 -3
  32. package/dist/{chunk-TZMSLE5B-DObGL7xi.js → chunk-TZMSLE5B-DFDr5FCr.js} +2 -2
  33. package/dist/classDiagram-2ON5EDUG-BDBX9etk.js +30 -0
  34. package/dist/classDiagram-v2-WZHVMYZB-Bzj_L_BF.js +30 -0
  35. package/dist/{clike-B1zispTy.js → clike-B90WKs4D.js} +1 -1
  36. package/dist/clojure-CUC2I1hM.js +4 -0
  37. package/dist/cmake-8PcMxXnB.js +4 -0
  38. package/dist/cobol-DkkkDz5v.js +4 -0
  39. package/dist/{code-block-37QAKDTI-u5kgjqmr.js → code-block-37QAKDTI-zh5AeoJo.js} +1 -1
  40. package/dist/coffeescript-CCupxOZf.js +4 -0
  41. package/dist/commonlisp-DhUfGX6b.js +4 -0
  42. package/dist/{cose-bilkent-S5V4N54A-CO4ORQHF.js → cose-bilkent-S5V4N54A-BK1nIR2J.js} +1 -1
  43. package/dist/crystal-DSaw6rFQ.js +4 -0
  44. package/dist/css-D4QDewkG.js +4 -0
  45. package/dist/cypher-CrYVqw_F.js +4 -0
  46. package/dist/d-Cr3H3pPx.js +4 -0
  47. package/dist/{dagre-6UL2VRFP-C2C2XxsB.js → dagre-6UL2VRFP-r2rSdJYL.js} +9 -9
  48. package/dist/{data-grid-overlay-editor-BXqtz1ia.js → data-grid-overlay-editor-BVFT970w.js} +2 -2
  49. package/dist/{diagram-PSM6KHXK-DHBY-94p.js → diagram-PSM6KHXK-BpxVUe9U.js} +10 -10
  50. package/dist/{diagram-QEK2KX5R-CgMshOwn.js → diagram-QEK2KX5R-q3dHUcp6.js} +5 -5
  51. package/dist/{diagram-S2PKOQOG-F1KPva3Y.js → diagram-S2PKOQOG-MDBKrxSC.js} +5 -5
  52. package/dist/diff-ODiZJGls.js +4 -0
  53. package/dist/dist-4YNZxwMI.js +8 -0
  54. package/dist/dist-7nR3r2kG.js +5 -0
  55. package/dist/{dist-CBA36Nuy.js → dist-B2-r9y-0.js} +109 -109
  56. package/dist/dist-B2gkyT3r.js +5 -0
  57. package/dist/{dist--JwRU9u5.js → dist-B4tYJP_i.js} +2 -2
  58. package/dist/{dist-DA1J6LvO.js → dist-B5ATpkxy.js} +2 -2
  59. package/dist/dist-B8G3I6vJ.js +8 -0
  60. package/dist/{dist-DKnxaCRl.js → dist-B94MxrQS.js} +2 -2
  61. package/dist/dist-BJ96Ykfp.js +8 -0
  62. package/dist/dist-BKLIWGw4.js +5 -0
  63. package/dist/{dist-l0KayR2-.js → dist-BLwfpZD-.js} +2 -2
  64. package/dist/{dist-C_Kw_Kc0.js → dist-BYmtF1W6.js} +2 -2
  65. package/dist/{dist-Cpj5BHNP.js → dist-BbBnU4tG.js} +1 -1
  66. package/dist/dist-Bf3ou00A.js +6 -0
  67. package/dist/{dist-CITQGRtG.js → dist-BfactX3G.js} +4 -4
  68. package/dist/{dist-CsN7lsea.js → dist-BoAHOW2l.js} +2 -2
  69. package/dist/{dist-BcXuIt-h.js → dist-Bsv_ARko.js} +4 -4
  70. package/dist/dist-BvkKXuPm.js +5 -0
  71. package/dist/{dist-DsqQCNKw.js → dist-C2-m5aEk.js} +119 -119
  72. package/dist/dist-C6NJ3n6r.js +5 -0
  73. package/dist/{dist-DIVeCGlI.js → dist-CC9VUnXd.js} +1 -1
  74. package/dist/{dist-BKGWAN8J.js → dist-CE43BRmt.js} +1 -1
  75. package/dist/{dist-COp5dkis.js → dist-CJrHMxlI.js} +31 -31
  76. package/dist/{dist-BbQ-5HAA.js → dist-CPTE45iS.js} +1 -1
  77. package/dist/{dist-9trj4p6n.js → dist-CcOGT46m.js} +27 -27
  78. package/dist/dist-CecLPYY5.js +5 -0
  79. package/dist/{dist-BSMZYwqW.js → dist-Cgf353Ki.js} +1 -1
  80. package/dist/dist-Ch0SwRzK.js +5 -0
  81. package/dist/{dist-C6p7UKkB.js → dist-CkEUrAus.js} +2 -2
  82. package/dist/{dist-MFzhAmKV.js → dist-CmZYrgd_.js} +1 -1
  83. package/dist/{dist-b7Sc3Tj8.js → dist-Crk9ejOy.js} +4 -4
  84. package/dist/dist-D6eWHiFh.js +6 -0
  85. package/dist/dist-DCQ710Bv.js +5 -0
  86. package/dist/{dist-r6N_0WG-.js → dist-DOil6y-3.js} +4 -4
  87. package/dist/{dist-CPd_adhw.js → dist-Dc1SFk5I.js} +2 -2
  88. package/dist/dist-Dit9tk8a.js +1242 -0
  89. package/dist/{dist-B7NoEgR4.js → dist-DqJdzAYM.js} +2 -2
  90. package/dist/dist-P_pkS5f-.js +8 -0
  91. package/dist/{dist--Em7gfgX.js → dist-T4g7Sr6e.js} +3 -3
  92. package/dist/{dist-BhBtK2sL.js → dist-glA_fIK_.js} +2 -2
  93. package/dist/{dist-9J8_3DZN.js → dist-iiugPhCC.js} +1 -1
  94. package/dist/{dist-D7jHtwN8.js → dist-r8ecBV-v.js} +135 -65
  95. package/dist/{dist-BlRm4v0e.js → dist-yVJ4xE5n.js} +5 -5
  96. package/dist/{dockerfile-BBT_Ira6.js → dockerfile-D1Q_4uCN.js} +1 -1
  97. package/dist/dtd-C-t2Rk7F.js +4 -0
  98. package/dist/dylan-B4ctBLGp.js +4 -0
  99. package/dist/ecl-DqWfymni.js +4 -0
  100. package/dist/eiffel-DjBKKAr7.js +4 -0
  101. package/dist/elm--fxeC0FV.js +4 -0
  102. package/dist/{erDiagram-Q2GNP2WA-18gGng8V.js → erDiagram-Q2GNP2WA-CX1XdqVD.js} +13 -13
  103. package/dist/erlang-CaKXCX6H.js +4 -0
  104. package/dist/{esm-CgRNPmz8.js → esm-BAS2d2Ad.js} +1503 -1536
  105. package/dist/{factor-DdqWbSyy.js → factor--4HHM8Rw.js} +1 -1
  106. package/dist/factor-DlLO5EFS.js +4 -0
  107. package/dist/{flowDiagram-NV44I4VS-iHFiHYe0.js → flowDiagram-NV44I4VS-BCj-ONTw.js} +15 -15
  108. package/dist/forth-rOO6LVj_.js +4 -0
  109. package/dist/fortran-CUg15VGR.js +4 -0
  110. package/dist/{ganttDiagram-JELNMOA3-D7GixxiF.js → ganttDiagram-JELNMOA3-D1l5ewiQ.js} +8 -8
  111. package/dist/gas-BMRJspiW.js +4 -0
  112. package/dist/gherkin-DRxzijZU.js +4 -0
  113. package/dist/{gitGraphDiagram-NY62KEGX-CJFHytRK.js → gitGraphDiagram-NY62KEGX-KdZh0iiW.js} +5 -5
  114. package/dist/{glide-data-editor-BYwb17Bf.js → glide-data-editor-2RvcPqmc.js} +75 -76
  115. package/dist/groovy-BmrQ8pUP.js +4 -0
  116. package/dist/haskell-BuaYfKOz.js +4 -0
  117. package/dist/haxe-DcH9eA0a.js +5 -0
  118. package/dist/idl-DGlcm4Ls.js +4 -0
  119. package/dist/{infoDiagram-WHAUD3N6-B5Lkh3A9.js → infoDiagram-WHAUD3N6-PSH7lQ0D.js} +3 -3
  120. package/dist/javascript-CeTk7rzr.js +4 -0
  121. package/dist/{journeyDiagram-XKPGCS4Q-CV_9R9iP.js → journeyDiagram-XKPGCS4Q-BrTAxQ1J.js} +5 -5
  122. package/dist/julia-BoP_q1gm.js +4 -0
  123. package/dist/{kanban-definition-3W4ZIXB7-Dp21D5Ym.js → kanban-definition-3W4ZIXB7-BoYCDp_9.js} +10 -10
  124. package/dist/{katex-CX2BKujk.js → katex-DaGuLbVh.js} +1 -1
  125. package/dist/{line-LK_5q2B9.js → line-Bc27KE1D.js} +3 -3
  126. package/dist/{linear-vWf1Qj0e.js → linear-Bnc6E9kA.js} +4 -4
  127. package/dist/livescript-B7IMN-ba.js +4 -0
  128. package/dist/{loader-B0KEFFi-.js → loader-C0-eIoas.js} +1 -1
  129. package/dist/lua-q1InavKb.js +4 -0
  130. package/dist/main.js +525 -488
  131. package/dist/mathematica-DvR8-_EI.js +4 -0
  132. package/dist/mbox-7h5MNBS_.js +4 -0
  133. package/dist/{mermaid-4DMBBIKO-BhDCqnO1.js → mermaid-4DMBBIKO-BmJdHPwx.js} +1 -1
  134. package/dist/{mermaid-B__BZSXU.js → mermaid-C2cSe5YL.js} +40 -40
  135. package/dist/{mhchem-w1tkUnWr.js → mhchem-B_tiMbKF.js} +1 -1
  136. package/dist/{mindmap-definition-VGOIOE7T-B_5mfdYp.js → mindmap-definition-VGOIOE7T-CmRjsKEt.js} +12 -12
  137. package/dist/mirc-D-XM8A5c.js +4 -0
  138. package/dist/mllike-BQGkkbmf.js +6 -0
  139. package/dist/modelica-D_yRj_WU.js +4 -0
  140. package/dist/mscgen-B-rltAjp.js +6 -0
  141. package/dist/mumps-2kh8TU2b.js +4 -0
  142. package/dist/{nsis-CunMjZ_n.js → nsis-B6EN9LWI.js} +1 -1
  143. package/dist/nsis-CtusEqwb.js +4 -0
  144. package/dist/ntriples-BdAXw6zV.js +4 -0
  145. package/dist/{number-overlay-editor-D-4WQAGX.js → number-overlay-editor-DKVJgXpp.js} +1 -1
  146. package/dist/octave-CsNFmVp5.js +4 -0
  147. package/dist/{ordinal-IlASfRja.js → ordinal-DLLbwLkP.js} +1 -1
  148. package/dist/oz-odIXCrKd.js +4 -0
  149. package/dist/pascal-B9Mfk3Fo.js +4 -0
  150. package/dist/perl-C48inLcz.js +4 -0
  151. package/dist/{pieDiagram-ADFJNKIX-B-DGEopK.js → pieDiagram-ADFJNKIX-CtxQlnsU.js} +10 -10
  152. package/dist/pig-uwRtAssU.js +4 -0
  153. package/dist/powershell-CXqlca-i.js +4 -0
  154. package/dist/{precisionRound-CGLoV26P.js → precisionRound-Duzbr5ur.js} +1 -1
  155. package/dist/properties-D6Zu1rpK.js +4 -0
  156. package/dist/protobuf-BlNNWZaR.js +4 -0
  157. package/dist/pug-DytcK7bv.js +4 -0
  158. package/dist/{pug-Dr-sA_9V.js → pug-xrm7jQ2R.js} +1 -1
  159. package/dist/puppet-lJ8Ok3iY.js +4 -0
  160. package/dist/python-cMaF7kUp.js +4 -0
  161. package/dist/q-Dgt2HYQh.js +4 -0
  162. package/dist/{quadrantDiagram-AYHSOK5B-M_yRSIZn.js → quadrantDiagram-AYHSOK5B-DllnB2Hl.js} +4 -4
  163. package/dist/r-Bm4S4awf.js +4 -0
  164. package/dist/react-vega-1ub36dPZ.js +9 -0
  165. package/dist/{react-vega-DLFvGrpJ.js → react-vega-CCNu2JE0.js} +18 -18
  166. package/dist/{requirementDiagram-UZGBJVZJ-9Wt82hOZ.js → requirementDiagram-UZGBJVZJ-D36MI1k0.js} +12 -12
  167. package/dist/rpm-_8LbzMVc.js +5 -0
  168. package/dist/ruby-Cr8IJ5VZ.js +4 -0
  169. package/dist/{sankeyDiagram-TZEHDZUN-x_aTXZeN.js → sankeyDiagram-TZEHDZUN-D1mygNPC.js} +4 -4
  170. package/dist/sas-CFcSfo2_.js +4 -0
  171. package/dist/scheme-N4XRoKgc.js +4 -0
  172. package/dist/{sequenceDiagram-WL72ISMW-CXXmJqiQ.js → sequenceDiagram-WL72ISMW-CWdn91Rf.js} +6 -6
  173. package/dist/shell-B4L7f_ds.js +4 -0
  174. package/dist/sieve-UI6J3Gm0.js +4 -0
  175. package/dist/smalltalk-BuaPZAZU.js +4 -0
  176. package/dist/sparql-1rKrq463.js +4 -0
  177. package/dist/{src-szye8OCw.js → src-jICM_d2B.js} +1 -1
  178. package/dist/{stateDiagram-FKZM4ZOC-CiSKS_Mx.js → stateDiagram-FKZM4ZOC-CPxroWXd.js} +15 -15
  179. package/dist/{stateDiagram-v2-4FDKWEC3-A43Itnjp.js → stateDiagram-v2-4FDKWEC3-BpM9Q54b.js} +13 -13
  180. package/dist/{step-1PmBKr2y.js → step-BqVgkWtk.js} +1 -1
  181. package/dist/style.css +1 -1
  182. package/dist/stylus-DvSovJEP.js +4 -0
  183. package/dist/swift-D-_E7Yyb.js +4 -0
  184. package/dist/tcl-Di5sAVHN.js +4 -0
  185. package/dist/textile-Benwt66z.js +4 -0
  186. package/dist/{time-DC4qQGmA.js → time-CrYsYnQU.js} +4 -4
  187. package/dist/{timeline-definition-IT6M3QCI-DR26eWb4.js → timeline-definition-IT6M3QCI-CVnRHx_t.js} +3 -3
  188. package/dist/toml-CeOvPOkY.js +4 -0
  189. package/dist/troff-DJN9hfgu.js +4 -0
  190. package/dist/ttcn-DQW2Psjf.js +4 -0
  191. package/dist/ttcn-cfg-zFG_MNpg.js +4 -0
  192. package/dist/turtle-DHRyNlSc.js +4 -0
  193. package/dist/{types-Bb-6p8hv.js → types-Ckva8JJq.js} +203 -156
  194. package/dist/{useDeepCompareMemoize-BhZZsis0.js → useDeepCompareMemoize-ChviuF5n.js} +1 -1
  195. package/dist/vb-CXWH9DD-.js +4 -0
  196. package/dist/vbscript-qr8qVck5.js +4 -0
  197. package/dist/{vega-component-DCxUyPnb.js → vega-component-CnG0vAjf.js} +7 -7
  198. package/dist/{vega-loader.browser-BJ1uJidF.js → vega-loader.browser-DqHiiBeQ.js} +3 -3
  199. package/dist/velocity-C_9pUJRx.js +4 -0
  200. package/dist/verilog-DxBstgBa.js +4 -0
  201. package/dist/vhdl-odUxAbE6.js +4 -0
  202. package/dist/webidl-Dfn5Rku4.js +4 -0
  203. package/dist/xquery-CrJs6SXr.js +4 -0
  204. package/dist/{xychartDiagram-PRI3JC2R-BcVxCRox.js → xychartDiagram-PRI3JC2R-BltwMWKC.js} +11 -11
  205. package/dist/yacas-B-uDDLZe.js +4 -0
  206. package/dist/z80-51gxgAXE.js +4 -0
  207. package/package.json +12 -13
  208. package/src/components/data-table/TableActions.tsx +8 -1
  209. package/src/components/data-table/__tests__/columns.test.tsx +47 -0
  210. package/src/components/data-table/column-header.tsx +3 -0
  211. package/src/components/data-table/columns.tsx +17 -2
  212. package/src/components/data-table/data-table.tsx +2 -0
  213. package/src/components/data-table/download-actions.tsx +6 -1
  214. package/src/components/dependency-graph/dependency-graph-tree.tsx +10 -1
  215. package/src/components/dependency-graph/dependency-graph.tsx +1 -0
  216. package/src/components/dependency-graph/elements.ts +20 -9
  217. package/src/components/dependency-graph/panels.tsx +27 -11
  218. package/src/components/dependency-graph/types.ts +1 -0
  219. package/src/components/editor/chrome/wrapper/app-chrome.tsx +4 -1
  220. package/src/components/editor/package-alert.tsx +4 -4
  221. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +3 -5
  222. package/src/core/codemirror/misc/__tests__/paste.test.ts +18 -0
  223. package/src/core/codemirror/misc/paste.ts +14 -10
  224. package/src/core/wasm/__tests__/store.test.ts +33 -0
  225. package/src/core/wasm/bridge.ts +2 -1
  226. package/src/core/wasm/store.ts +13 -1
  227. package/src/plugins/impl/DataTablePlugin.tsx +4 -0
  228. package/src/plugins/impl/chat/ChatPlugin.tsx +2 -0
  229. package/src/plugins/impl/chat/chat-ui.tsx +10 -1
  230. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +4 -0
  231. package/src/plugins/impl/plotly/Plot.tsx +173 -0
  232. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +41 -10
  233. package/src/plugins/impl/plotly/__tests__/parse-from-template.test.ts +1 -0
  234. package/src/plugins/impl/plotly/__tests__/usePlotlyLayout.test.ts +2 -1
  235. package/src/plugins/impl/plotly/parse-from-template.ts +1 -0
  236. package/src/plugins/impl/plotly/usePlotlyLayout.ts +2 -1
  237. package/src/theme/ThemeProvider.tsx +2 -0
  238. package/dist/apl-BuwKwesW.js +0 -4
  239. package/dist/asciiarmor-zAEd_wtn.js +0 -4
  240. package/dist/asn1-DWEA66J4.js +0 -4
  241. package/dist/brainfuck-mIPR6Ong.js +0 -4
  242. package/dist/classDiagram-2ON5EDUG-B9pkKjjc.js +0 -30
  243. package/dist/classDiagram-v2-WZHVMYZB-CRhhA0tV.js +0 -30
  244. package/dist/clojure-DkhhNHNQ.js +0 -4
  245. package/dist/cmake-1obPvqtc.js +0 -4
  246. package/dist/cobol-oWNTiXPE.js +0 -4
  247. package/dist/coffeescript-LtYUvf6r.js +0 -4
  248. package/dist/commonlisp-C_06qBYF.js +0 -4
  249. package/dist/crystal-CDJkbx14.js +0 -4
  250. package/dist/css-Bi_Nk0uN.js +0 -4
  251. package/dist/cypher-TrG0NvZ0.js +0 -4
  252. package/dist/d-CFKOrZsi.js +0 -4
  253. package/dist/diff-CfnSF48q.js +0 -4
  254. package/dist/dist-2OSzSqy2.js +0 -5
  255. package/dist/dist-B1H2TQGB.js +0 -8
  256. package/dist/dist-BNvasp6N.js +0 -5
  257. package/dist/dist-CFi_P6cs.js +0 -5
  258. package/dist/dist-CG4LWTPv.js +0 -8
  259. package/dist/dist-CHWVQZ6Z.js +0 -6
  260. package/dist/dist-C_8-swED.js +0 -5
  261. package/dist/dist-DIhtur5b.js +0 -5
  262. package/dist/dist-DoQ7RS4e.js +0 -5
  263. package/dist/dist-DsMd-F9h.js +0 -5
  264. package/dist/dist-DurmUshd.js +0 -8
  265. package/dist/dist-PZgrh2z6.js +0 -6
  266. package/dist/dist-g1p2PEVs.js +0 -1242
  267. package/dist/dist-wudNDAiO.js +0 -5
  268. package/dist/dist-zVskjQcA.js +0 -8
  269. package/dist/dtd-Ctw8_JkU.js +0 -4
  270. package/dist/dylan-f7rMBKDP.js +0 -4
  271. package/dist/ecl-C2h3oBMY.js +0 -4
  272. package/dist/eiffel-Ce81wv20.js +0 -4
  273. package/dist/elm-BVV8QQcc.js +0 -4
  274. package/dist/erlang-DjB35ZUh.js +0 -4
  275. package/dist/factor-CIcp3U2B.js +0 -4
  276. package/dist/forth-CVgjsHhD.js +0 -4
  277. package/dist/fortran-CcTXj0d_.js +0 -4
  278. package/dist/gas-JWpamkLf.js +0 -4
  279. package/dist/gherkin-BveSCSJV.js +0 -4
  280. package/dist/groovy-Np3AZt00.js +0 -4
  281. package/dist/haskell-CVfmFALm.js +0 -4
  282. package/dist/haxe-C10xkMLg.js +0 -5
  283. package/dist/idl-CKBSGnKC.js +0 -4
  284. package/dist/javascript-Cur-15Bn.js +0 -4
  285. package/dist/julia-BZZH2Gnx.js +0 -4
  286. package/dist/livescript-D_rTTm_U.js +0 -4
  287. package/dist/lua-Mf_Of7eV.js +0 -4
  288. package/dist/mathematica-DCYjugDb.js +0 -4
  289. package/dist/mbox-KBWrT8JD.js +0 -4
  290. package/dist/mirc-JwEQJ8Fb.js +0 -4
  291. package/dist/mllike-C7TxLvh6.js +0 -6
  292. package/dist/modelica-uvNgvUyw.js +0 -4
  293. package/dist/mscgen-CGnokp5x.js +0 -6
  294. package/dist/mumps-Dl9QdOZz.js +0 -4
  295. package/dist/nsis-BbDhbgPN.js +0 -4
  296. package/dist/ntriples-ChL1mlp7.js +0 -4
  297. package/dist/octave-B9ZGG6zv.js +0 -4
  298. package/dist/oz-XHEu31wr.js +0 -4
  299. package/dist/pascal-BxtYw-iH.js +0 -4
  300. package/dist/perl-Br5BgHPb.js +0 -4
  301. package/dist/pig-BByO2hBz.js +0 -4
  302. package/dist/powershell-Cd4Zaef3.js +0 -4
  303. package/dist/prop-types-C9QZf2SY.js +0 -51
  304. package/dist/properties-B-BOCIOl.js +0 -4
  305. package/dist/protobuf-CaLimlho.js +0 -4
  306. package/dist/pug-bonARSG6.js +0 -4
  307. package/dist/puppet-BSlT-3sc.js +0 -4
  308. package/dist/python-BIJhGYYP.js +0 -4
  309. package/dist/q-D9TX8A0B.js +0 -4
  310. package/dist/r-BXelX7Rl.js +0 -4
  311. package/dist/react-plotly-BuRa9xtI.js +0 -169447
  312. package/dist/react-vega-3WcLHYC7.js +0 -9
  313. package/dist/rpm-BxAh9B1A.js +0 -5
  314. package/dist/ruby-BCZLQyhc.js +0 -4
  315. package/dist/sas-Bo7lsyNX.js +0 -4
  316. package/dist/scheme-Brhptkt-.js +0 -4
  317. package/dist/shell-fWWb8_qx.js +0 -4
  318. package/dist/sieve-Ba8_hMLn.js +0 -4
  319. package/dist/smalltalk-7sHxwMDT.js +0 -4
  320. package/dist/sparql-BBFrPJ7z.js +0 -4
  321. package/dist/stylus-CIB0KT46.js +0 -4
  322. package/dist/swift-CZinekXz.js +0 -4
  323. package/dist/tcl-DCHZJVq_.js +0 -4
  324. package/dist/textile-ThTMxgkN.js +0 -4
  325. package/dist/toml-DK17wlJ7.js +0 -4
  326. package/dist/troff-CuUAOgMy.js +0 -4
  327. package/dist/ttcn-DS2tj6rW.js +0 -4
  328. package/dist/ttcn-cfg-CdZGarnc.js +0 -4
  329. package/dist/turtle-Bkz-FLZ7.js +0 -4
  330. package/dist/vb-ITdOmxvR.js +0 -4
  331. package/dist/vbscript-B7oeGyfL.js +0 -4
  332. package/dist/velocity-D__EkuSd.js +0 -4
  333. package/dist/verilog-CPH50gr9.js +0 -4
  334. package/dist/vhdl-CQAwKCk_.js +0 -4
  335. package/dist/webidl-BnEptfVX.js +0 -4
  336. package/dist/xquery-D7eTv-CR.js +0 -4
  337. package/dist/yacas-0x1rX89s.js +0 -4
  338. package/dist/z80-B25SJVDf.js +0 -4
  339. /package/dist/{ImageComparisonComponent-DkEXPki_.js → ImageComparisonComponent-CRbA-1eg.js} +0 -0
  340. /package/dist/{apl-D9gTcP3Q.js → apl-Oc3bL26_.js} +0 -0
  341. /package/dist/{array-D7wW5QoO.js → array-CEIRxyh3.js} +0 -0
  342. /package/dist/{asciiarmor-mLyg-Z5h.js → asciiarmor-DTbPh2VI.js} +0 -0
  343. /package/dist/{asn1-AE7eHomk.js → asn1-CGhwu1Ri.js} +0 -0
  344. /package/dist/{brainfuck-Bdd6NcL6.js → brainfuck-CA0L8lRq.js} +0 -0
  345. /package/dist/{click-outside-container-DNfggvIW.js → click-outside-container-C_k38vlR.js} +0 -0
  346. /package/dist/{clike-D_s3fKg5.js → clike-CEtUBPHD.js} +0 -0
  347. /package/dist/{clojure-zTYBCd80.js → clojure-BszjvdGo.js} +0 -0
  348. /package/dist/{cmake-BnJV90fC.js → cmake-B2Gvps8b.js} +0 -0
  349. /package/dist/{cobol-CH0OZO8A.js → cobol-DuMch8nn.js} +0 -0
  350. /package/dist/{coffeescript-CLhc1U6Q.js → coffeescript-L9aKXVsJ.js} +0 -0
  351. /package/dist/{colors-6DRQ0kEF.js → colors-DR_aHfmQ.js} +0 -0
  352. /package/dist/{commonlisp-8K2-IkUD.js → commonlisp-CrtdssxB.js} +0 -0
  353. /package/dist/{crystal-8to4H-ep.js → crystal-vvNY0LpY.js} +0 -0
  354. /package/dist/{css-BVo-JOy5.js → css-B1GdzqT1.js} +0 -0
  355. /package/dist/{cypher-BTFaDDd_.js → cypher-BtZvV7bW.js} +0 -0
  356. /package/dist/{d-c9bddW2W.js → d-B0UN3V-Z.js} +0 -0
  357. /package/dist/{defaultLocale-Bxoo2-30.js → defaultLocale-B_A76Zpk.js} +0 -0
  358. /package/dist/{defaultLocale-qS7DaAmi.js → defaultLocale-DjFHq3Xk.js} +0 -0
  359. /package/dist/{diff-PA28xMKg.js → diff-DOpgjj1W.js} +0 -0
  360. /package/dist/{dist-BBYTEAvO.js → dist-DF_77D2B.js} +0 -0
  361. /package/dist/{dtd-DRlC7Bx8.js → dtd-Ctnjxrle.js} +0 -0
  362. /package/dist/{dylan-d5ufc25E.js → dylan-DFXkoaZy.js} +0 -0
  363. /package/dist/{ecl-Ci3afVKc.js → ecl-C1NExZip.js} +0 -0
  364. /package/dist/{eiffel-G6DmeEi3.js → eiffel-uXVGgleg.js} +0 -0
  365. /package/dist/{elm-ByYWHu8b.js → elm-CBOFnnib.js} +0 -0
  366. /package/dist/{erlang-C7_LcVDw.js → erlang-DMnrT8XK.js} +0 -0
  367. /package/dist/{esm-CAd2HmbR.js → esm-0_ieXYNc.js} +0 -0
  368. /package/dist/{forth-BgUerAyz.js → forth-DDpxS4nw.js} +0 -0
  369. /package/dist/{fortran-BCXxm4xF.js → fortran-B6uYqQMz.js} +0 -0
  370. /package/dist/{gas-CKTQRKLl.js → gas-BKnWzuFz.js} +0 -0
  371. /package/dist/{gherkin-ByVP9cY_.js → gherkin-pBt0wT4X.js} +0 -0
  372. /package/dist/{groovy-BPbrw0GZ.js → groovy-DKsn4ppB.js} +0 -0
  373. /package/dist/{haskell-B8fq1DW4.js → haskell-BJVBJQcy.js} +0 -0
  374. /package/dist/{haxe-B7SHQmJo.js → haxe-rLN5UZU5.js} +0 -0
  375. /package/dist/{idl-CeJBDjsl.js → idl-B4mwMAo-.js} +0 -0
  376. /package/dist/{init-BfRhston.js → init-TaqZJsBY.js} +0 -0
  377. /package/dist/{javascript-dCv9_Kn8.js → javascript-Hf2NLNC0.js} +0 -0
  378. /package/dist/{julia-CD5lO88_.js → julia-GGpx21YN.js} +0 -0
  379. /package/dist/{katex-Db0k5oV_.js → katex-Ba7xZPrx.js} +0 -0
  380. /package/dist/{livescript-Cc8RvFBv.js → livescript-CSvXMspZ.js} +0 -0
  381. /package/dist/{lua-4nedfnvd.js → lua-CVMR5LMW.js} +0 -0
  382. /package/dist/{math-BbMyrONz.js → math-CTnb-N1W.js} +0 -0
  383. /package/dist/{mathematica-BIufdZr2.js → mathematica-JENNt-p4.js} +0 -0
  384. /package/dist/{mbox-DQkYSHKe.js → mbox-mzifoc8E.js} +0 -0
  385. /package/dist/{mirc-CI-RWqUR.js → mirc-BXoiItvN.js} +0 -0
  386. /package/dist/{mllike-DQzbf1xo.js → mllike-H-KR9OuH.js} +0 -0
  387. /package/dist/{modelica-BnF_cDWj.js → modelica-B6Hm3mMl.js} +0 -0
  388. /package/dist/{mscgen-MirFrDhW.js → mscgen-D8TF_Hei.js} +0 -0
  389. /package/dist/{mumps-eNRTuWOD.js → mumps-CD-kNPt4.js} +0 -0
  390. /package/dist/{ntriples-BLneip4i.js → ntriples-DgnpxU40.js} +0 -0
  391. /package/dist/{octave-C0eG-pKq.js → octave-CkobqyVm.js} +0 -0
  392. /package/dist/{oz-BPMLow2T.js → oz-ChDLd9tS.js} +0 -0
  393. /package/dist/{pascal-5eb9v5Dl.js → pascal-CvlkwK7E.js} +0 -0
  394. /package/dist/{path-C_x2ySFi.js → path-7gr7eZmp.js} +0 -0
  395. /package/dist/{perl-DOu6rCkF.js → perl-BNEFTNbM.js} +0 -0
  396. /package/dist/{pig-CRW0kne3.js → pig-Cd1DMS7P.js} +0 -0
  397. /package/dist/{powershell-CWgJhiiJ.js → powershell-CPxA0zpc.js} +0 -0
  398. /package/dist/{properties-CHxpmfXW.js → properties-BaFBm-Xa.js} +0 -0
  399. /package/dist/{protobuf-DGUXb_-T.js → protobuf-BQV_-X0H.js} +0 -0
  400. /package/dist/{puppet-C7uSiW6_.js → puppet-LXLST0mx.js} +0 -0
  401. /package/dist/{python-DAbhVcUr.js → python-DLjLzX4k.js} +0 -0
  402. /package/dist/{q-DKjWHias.js → q-DswTX1Y9.js} +0 -0
  403. /package/dist/{r-KD2KhyeL.js → r-CO7NpMwE.js} +0 -0
  404. /package/dist/{range-BYuZFTbA.js → range-DwpxnYuB.js} +0 -0
  405. /package/dist/{rpm-GFtnpQ6M.js → rpm-BlmEDT6r.js} +0 -0
  406. /package/dist/{ruby-CBAewzLY.js → ruby-BTPKgeZZ.js} +0 -0
  407. /package/dist/{sas-CCi_AaZi.js → sas-DTDTiNO8.js} +0 -0
  408. /package/dist/{scheme-CGGGD6kR.js → scheme-UzAAg4GJ.js} +0 -0
  409. /package/dist/{shell-b7vZ8ucI.js → shell-DQ0hQCsB.js} +0 -0
  410. /package/dist/{sieve-ClXOUV85.js → sieve-BVyYIx9u.js} +0 -0
  411. /package/dist/{simple-mode-Uad4lEG7.js → simple-mode-Dryu-fC9.js} +0 -0
  412. /package/dist/{slides-component-Dp-y50K9.js → slides-component-DfwLApNr.js} +0 -0
  413. /package/dist/{smalltalk-_PFt9_gp.js → smalltalk-DAdMAHTu.js} +0 -0
  414. /package/dist/{sparql-BCF6qcHt.js → sparql-Bi7quYgw.js} +0 -0
  415. /package/dist/{stylus-DMFZWz-G.js → stylus-jhpzcQ6Y.js} +0 -0
  416. /package/dist/{swift-De2YpSxT.js → swift-BrO8qThZ.js} +0 -0
  417. /package/dist/{tcl-jV8Xs_1k.js → tcl-s5QI5gv3.js} +0 -0
  418. /package/dist/{textile-D_zo778l.js → textile-ClhvJrxM.js} +0 -0
  419. /package/dist/{timer-pEiW44EO.js → timer-DV8t68ti.js} +0 -0
  420. /package/dist/{toml-_M0gsKn5.js → toml-TFa3EJQE.js} +0 -0
  421. /package/dist/{treemap-BzS5cW_6.js → treemap-CQJ0bIDy.js} +0 -0
  422. /package/dist/{troff-B06gyD33.js → troff-SqLg0heF.js} +0 -0
  423. /package/dist/{ttcn-DoQoQNUM.js → ttcn-Cfrap7HJ.js} +0 -0
  424. /package/dist/{ttcn-cfg-l_6PksD2.js → ttcn-cfg-Dopc-iwE.js} +0 -0
  425. /package/dist/{turtle-zEnD4bpn.js → turtle-Dt52DvVH.js} +0 -0
  426. /package/dist/{useAsyncData-Dyq3DyOF.js → useAsyncData-dr8GazGv.js} +0 -0
  427. /package/dist/{vb-fUsnAuzb.js → vb-D1pAvfDe.js} +0 -0
  428. /package/dist/{vbscript-CVlD7uZQ.js → vbscript-DZ7RBxn5.js} +0 -0
  429. /package/dist/{velocity-CHkEIdMC.js → velocity-Csau7eZy.js} +0 -0
  430. /package/dist/{verilog-B3ctZTB4.js → verilog-gXlZACs5.js} +0 -0
  431. /package/dist/{vhdl-rXdBgR5O.js → vhdl-NaUWbI1B.js} +0 -0
  432. /package/dist/{webidl-Cv9aQfcc.js → webidl-BJmPjW01.js} +0 -0
  433. /package/dist/{xquery-Du0w47aa.js → xquery-CJIPsC0g.js} +0 -0
  434. /package/dist/{yacas-Eq4p_g3L.js → yacas-8f2Vjiiz.js} +0 -0
  435. /package/dist/{z80-Dz4HTTRf.js → z80-s5Xk2hCP.js} +0 -0
@@ -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}
@@ -0,0 +1,173 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import type * as PlotlyTypes from "plotly.js";
4
+ // Import the pre-built dist bundle, not the source entry point.
5
+ // The source entry point requires Node.js polyfills (e.g. `buffer/`)
6
+ // that are unavailable in the browser/bundler environment.
7
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
8
+ // @ts-expect-error — no type declarations for dist path, we use PlotlyTypes above
9
+ import Plotly from "plotly.js/dist/plotly";
10
+ import { useEffect, useRef } from "react";
11
+
12
+ // Plotly attaches `on` and `removeListener` to the DOM element at runtime.
13
+ // The @types/plotly.js PlotlyHTMLElement type includes `on` and `removeAllListeners`
14
+ // but not the per-handler `removeListener`. We extend the type to include it.
15
+ interface PlotlyElement extends PlotlyTypes.PlotlyHTMLElement {
16
+ removeListener(event: string, handler: (...args: never[]) => void): void;
17
+ }
18
+
19
+ export interface Figure {
20
+ data: PlotlyTypes.Data[];
21
+ layout: Partial<PlotlyTypes.Layout>;
22
+ frames: PlotlyTypes.Frame[] | null;
23
+ }
24
+
25
+ export interface PlotProps {
26
+ data: PlotlyTypes.Data[];
27
+ layout: Partial<PlotlyTypes.Layout>;
28
+ frames?: PlotlyTypes.Frame[];
29
+ config?: Partial<PlotlyTypes.Config>;
30
+ className?: string;
31
+ style?: React.CSSProperties;
32
+ useResizeHandler?: boolean;
33
+ divId?: string;
34
+ onRelayout?: (event: PlotlyTypes.PlotRelayoutEvent) => void;
35
+ onRelayouting?: (event: PlotlyTypes.PlotRelayoutEvent) => void;
36
+ onSelected?: (event: PlotlyTypes.PlotSelectionEvent) => void;
37
+ onDeselect?: () => void;
38
+ onClick?: (event: PlotlyTypes.PlotMouseEvent) => void;
39
+ onSunburstClick?: (event: PlotlyTypes.PlotMouseEvent) => void;
40
+ onTreemapClick?: (event: PlotlyTypes.PlotMouseEvent) => void;
41
+ onError?: (err: Error) => void;
42
+ }
43
+
44
+ // Plotly event name convention:
45
+ // - events are attached as `'plotly_' + name.toLowerCase()`
46
+ // - react props are `'on' + name`
47
+ const EVENT_NAMES = [
48
+ "Relayout",
49
+ "Relayouting",
50
+ "Selected",
51
+ "Deselect",
52
+ "Click",
53
+ "SunburstClick",
54
+ "TreemapClick",
55
+ ] as const;
56
+
57
+ type EventName = (typeof EVENT_NAMES)[number];
58
+
59
+ function propName(event: EventName): keyof PlotProps {
60
+ return `on${event}` as keyof PlotProps;
61
+ }
62
+
63
+ function plotlyEventName(event: EventName): string {
64
+ return `plotly_${event.toLowerCase()}`;
65
+ }
66
+
67
+ export const Plot = (props: PlotProps) => {
68
+ const containerRef = useRef<HTMLDivElement>(null);
69
+
70
+ const {
71
+ data,
72
+ layout,
73
+ config,
74
+ frames,
75
+ className,
76
+ style,
77
+ useResizeHandler,
78
+ divId,
79
+ onError,
80
+ } = props;
81
+
82
+ // Render / update the plot
83
+ useEffect(() => {
84
+ const el = containerRef.current;
85
+ if (!el) {
86
+ return;
87
+ }
88
+
89
+ Plotly.react(el, data, layout, config)
90
+ .then(() => {
91
+ if (frames && frames.length > 0) {
92
+ return Plotly.addFrames(el as unknown as PlotlyTypes.Root, frames);
93
+ }
94
+ })
95
+ .catch((error: Error) => {
96
+ onError?.(error);
97
+ });
98
+ }, [data, layout, config, frames, onError]);
99
+
100
+ // Sync event handlers
101
+ useEffect(
102
+ () => {
103
+ const el = containerRef.current;
104
+ if (!el) {
105
+ return;
106
+ }
107
+
108
+ const plotlyEl = el as unknown as PlotlyElement;
109
+
110
+ // eslint-disable-next-line @typescript-eslint/ban-types -- Plotly's event API uses generic function references
111
+ const attached: {
112
+ plotlyName: string;
113
+ handler: (...args: never[]) => void;
114
+ }[] = [];
115
+
116
+ for (const name of EVENT_NAMES) {
117
+ const handler = props[propName(name)];
118
+ if (typeof handler === "function") {
119
+ const plotlyName = plotlyEventName(name);
120
+ plotlyEl.on(plotlyName as never, handler as never);
121
+ attached.push({
122
+ plotlyName,
123
+ handler: handler as (...args: never[]) => void,
124
+ });
125
+ }
126
+ }
127
+
128
+ return () => {
129
+ for (const { plotlyName, handler } of attached) {
130
+ plotlyEl.removeListener(plotlyName, handler as never);
131
+ }
132
+ };
133
+ // Re-sync whenever any event handler prop changes
134
+ // eslint-disable-next-line react-hooks/exhaustive-deps
135
+ },
136
+ EVENT_NAMES.map((name) => props[propName(name)]),
137
+ );
138
+
139
+ // Window resize handler
140
+ useEffect(() => {
141
+ if (!useResizeHandler) {
142
+ return;
143
+ }
144
+
145
+ const el = containerRef.current;
146
+ if (!el) {
147
+ return;
148
+ }
149
+
150
+ const handler = () => {
151
+ Plotly.Plots.resize(el as unknown as PlotlyTypes.Root);
152
+ };
153
+
154
+ window.addEventListener("resize", handler);
155
+ return () => {
156
+ window.removeEventListener("resize", handler);
157
+ };
158
+ }, [useResizeHandler]);
159
+
160
+ // Cleanup on unmount
161
+ useEffect(() => {
162
+ const el = containerRef.current;
163
+ return () => {
164
+ if (el) {
165
+ Plotly.purge(el as unknown as PlotlyTypes.Root);
166
+ }
167
+ };
168
+ }, []);
169
+
170
+ return (
171
+ <div id={divId} className={className} style={style} ref={containerRef} />
172
+ );
173
+ };
@@ -1,9 +1,10 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import type { Figure, PlotParams } from "react-plotly.js";
3
+ import type * as Plotly from "plotly.js";
4
4
  import { z } from "zod";
5
5
  import type { IPlugin, IPluginProps, Setter } from "@/plugins/types";
6
6
  import { Logger } from "@/utils/Logger";
7
+ import type { Figure } from "./Plot";
7
8
 
8
9
  import "./plotly.css";
9
10
  import "./mapbox.css";
@@ -70,13 +71,8 @@ interface PlotlyPluginProps extends Data {
70
71
  host: HTMLElement;
71
72
  }
72
73
 
73
- // For whatever reason, the version of vite-rolldown that we are one is not exporting this default export correctly.
74
- export const LazyPlot = lazy(() =>
75
- import("react-plotly.js").then((module) => {
76
- return module.default as unknown as {
77
- default: React.ComponentType<PlotParams>;
78
- };
79
- }),
74
+ const LazyPlot = lazy(() =>
75
+ import("./Plot").then((mod) => ({ default: mod.Plot })),
80
76
  );
81
77
 
82
78
  const SUNBURST_DATA_KEYS: (keyof Plotly.SunburstPlotDatum)[] = [
@@ -176,7 +172,6 @@ export const PlotlyComponent = memo(
176
172
  };
177
173
  });
178
174
  })}
179
- // @ts-expect-error We patched this prop here so it doesn't exist in the types
180
175
  onTreemapClick={useEvent((evt: Readonly<Plotly.PlotMouseEvent>) => {
181
176
  if (!evt) {
182
177
  return;
@@ -198,6 +193,24 @@ export const PlotlyComponent = memo(
198
193
  }));
199
194
  })}
200
195
  config={plotlyConfig}
196
+ onClick={useEvent((evt: Readonly<Plotly.PlotMouseEvent>) => {
197
+ if (!evt) {
198
+ return;
199
+ }
200
+ // Only handle clicks for chart types where box/lasso selection
201
+ // (onSelected) doesn't work, such as heatmaps.
202
+ const isHeatmap = evt.points.some(
203
+ (point) => point.data?.type === "heatmap",
204
+ );
205
+ if (!isHeatmap) {
206
+ return;
207
+ }
208
+ setValue((prev) => ({
209
+ ...prev,
210
+ points: extractPoints(evt.points),
211
+ indices: evt.points.map((point) => point.pointIndex),
212
+ }));
213
+ })}
201
214
  onSelected={useEvent((evt: Readonly<Plotly.PlotSelectionEvent>) => {
202
215
  if (!evt) {
203
216
  return;
@@ -215,7 +228,7 @@ export const PlotlyComponent = memo(
215
228
  className="w-full"
216
229
  useResizeHandler={true}
217
230
  frames={figure.frames ?? undefined}
218
- onError={useEvent((err) => {
231
+ onError={useEvent((err: Error) => {
219
232
  Logger.error("PlotlyPlugin: ", err);
220
233
  })}
221
234
  />
@@ -229,6 +242,17 @@ PlotlyComponent.displayName = "PlotlyComponent";
229
242
  * instead of the ones that Plotly uses internally,
230
243
  * by using the hovertemplate.
231
244
  */
245
+ const STANDARD_POINT_KEYS: string[] = [
246
+ "x",
247
+ "y",
248
+ "z",
249
+ "lat",
250
+ "lon",
251
+ "curveNumber",
252
+ "pointNumber",
253
+ "pointIndex",
254
+ ];
255
+
232
256
  function extractPoints(
233
257
  points: Plotly.PlotDatum[],
234
258
  ): Record<AxisName, AxisDatum>[] {
@@ -243,6 +267,13 @@ function extractPoints(
243
267
  const hovertemplate = Array.isArray(point.data.hovertemplate)
244
268
  ? point.data.hovertemplate[0]
245
269
  : point.data.hovertemplate;
270
+
271
+ // For chart types with standard point keys (e.g. heatmaps),
272
+ // or when there's no hovertemplate, pick keys directly from the point.
273
+ if (!hovertemplate || point.data?.type === "heatmap") {
274
+ return pick(point, STANDARD_POINT_KEYS);
275
+ }
276
+
246
277
  // Update or create a parser
247
278
  parser = parser
248
279
  ? parser.update(hovertemplate)
@@ -1,4 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
+ import type * as Plotly from "plotly.js";
2
3
  import { describe, expect, it } from "vitest";
3
4
  import { createParser } from "../parse-from-template";
4
5
 
@@ -1,7 +1,8 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import type { Figure } from "react-plotly.js";
3
+ import type * as Plotly from "plotly.js";
4
4
  import { describe, expect, it } from "vitest";
5
+ import type { Figure } from "../Plot";
5
6
  import {
6
7
  computeLayoutOnFigureChange,
7
8
  computeLayoutUpdate,
@@ -1,6 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { get } from "lodash-es";
4
+ import type * as Plotly from "plotly.js";
4
5
 
5
6
  export interface PlotlyTemplateParser {
6
7
  /**
@@ -2,9 +2,10 @@
2
2
 
3
3
  import { usePrevious } from "@uidotdev/usehooks";
4
4
  import { isEqual, pick } from "lodash-es";
5
+ import type * as Plotly from "plotly.js";
5
6
  import { useEffect, useState } from "react";
6
- import type { Figure } from "react-plotly.js";
7
7
  import { Objects } from "@/utils/objects";
8
+ import type { Figure } from "./Plot";
8
9
 
9
10
  /**
10
11
  * Keys that are preserved across figure updates when set by user interaction.
@@ -10,8 +10,10 @@ export const ThemeProvider: React.FC<PropsWithChildren> = memo(
10
10
  const { theme } = useTheme();
11
11
  useLayoutEffect(() => {
12
12
  document.body.classList.add(theme, `${theme}-theme`);
13
+ document.body.dataset.theme = theme;
13
14
  return () => {
14
15
  document.body.classList.remove(theme, `${theme}-theme`);
16
+ delete document.body.dataset.theme;
15
17
  };
16
18
  }, [theme]);
17
19
 
@@ -1,4 +0,0 @@
1
- import { t as apl } from "./apl-D9gTcP3Q.js";
2
- export {
3
- apl
4
- };
@@ -1,4 +0,0 @@
1
- import { t as asciiArmor } from "./asciiarmor-mLyg-Z5h.js";
2
- export {
3
- asciiArmor
4
- };
@@ -1,4 +0,0 @@
1
- import { t as asn1 } from "./asn1-AE7eHomk.js";
2
- export {
3
- asn1
4
- };
@@ -1,4 +0,0 @@
1
- import { t as brainfuck } from "./brainfuck-Bdd6NcL6.js";
2
- export {
3
- brainfuck
4
- };
@@ -1,30 +0,0 @@
1
- import "./purify.es-Brw-U87Q.js";
2
- import "./chunk-S3R3BYOJ-CBkH6JZZ.js";
3
- import { r as __name } from "./src-szye8OCw.js";
4
- import "./chunk-ABZYJK2D-BXTC53mt.js";
5
- import "./chunk-HN2XXSSU-CqPwpolw.js";
6
- import "./chunk-CVBHYZKI-Dhc_e3rA.js";
7
- import "./chunk-ATLVNIR6-BJDjUR_c.js";
8
- import "./dist-BYznkC5E.js";
9
- import "./chunk-JA3XYJ7Z-BGnAIbOP.js";
10
- import "./chunk-JZLCHNYA-CIRgweVQ.js";
11
- import "./chunk-QXUST7PY-C7750n_u.js";
12
- import "./chunk-N4CR4FBY-DKSvXAIS.js";
13
- import "./chunk-FMBD7UC4-geNUIndh.js";
14
- import "./chunk-55IACEB6-C3BASkh4.js";
15
- import "./chunk-QN33PNHL-B6zC8BTi.js";
16
- import { i as styles_default, n as classDiagram_default, r as classRenderer_v3_unified_default, t as ClassDB } from "./chunk-B4BG7PRW-DzmUUpfH.js";
17
- var diagram = {
18
- parser: classDiagram_default,
19
- get db() {
20
- return new ClassDB();
21
- },
22
- renderer: classRenderer_v3_unified_default,
23
- styles: styles_default,
24
- init: /* @__PURE__ */ __name((e) => {
25
- e.class || (e.class = {}), e.class.arrowMarkerAbsolute = e.arrowMarkerAbsolute;
26
- }, "init")
27
- };
28
- export {
29
- diagram
30
- };