@marimo-team/frontend 0.19.8-dev4 → 0.19.8-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.
- package/dist/assets/{CellStatus-CTtb89yx.js → CellStatus-D-CCv4h6.js} +1 -1
- package/dist/assets/{Combination-C_mRvd_Z.js → Combination-izwufzWe.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-CX7YQX42.js → ConnectedDataExplorerComponent-C1BlkUlk.js} +1 -1
- package/dist/assets/{DeferredRequestRegistry-CO2AyNfd.js → DeferredRequestRegistry-tv0PqJZ0.js} +1 -1
- package/dist/assets/{ErrorBoundary-ChCiwl15.js → ErrorBoundary-B9Ifj8Jf.js} +1 -1
- package/dist/assets/{ImageComparisonComponent-BVBGmVcA.js → ImageComparisonComponent-BVXYpigZ.js} +1 -1
- package/dist/assets/{ImperativeModal-CKeCkc1k.js → ImperativeModal-DZr52ffu.js} +1 -1
- package/dist/assets/{Inputs-CBxLLWdV.js → Inputs-CbenuziM.js} +1 -1
- package/dist/assets/{JsonOutput-BTBD86gT.js → JsonOutput-CU0ad2LH.js} +11 -11
- package/dist/assets/{LazyAnyLanguageCodeMirror-Be7SB10I.js → LazyAnyLanguageCodeMirror-BqosdyZU.js} +2 -2
- package/dist/assets/MarimoErrorOutput-BydcsyYP.js +7 -0
- package/dist/assets/{RenderHTML-IBhB_MjX.js → RenderHTML-3amWMGgo.js} +1 -1
- package/dist/assets/{SSRProvider-DBS9qs3r.js → SSRProvider-DrpctNAg.js} +1 -1
- package/dist/assets/__vite-browser-external-D-ioOGDE.js +1 -0
- package/dist/assets/__vite-browser-external-DBckR0WR.js +1 -0
- package/dist/assets/{add-cell-with-ai-DsiiVErB.js → add-cell-with-ai-B07D0AiE.js} +6 -6
- package/dist/assets/{add-database-form-B1frIn24.js → add-database-form-BnEY6X5s.js} +3 -3
- package/dist/assets/{agent-panel-B_Ur2utx.js → agent-panel-C1O0Y8Bi.js} +5 -5
- package/dist/assets/{ai-model-dropdown-Dix8JIRc.js → ai-model-dropdown-Cugcw6NV.js} +4 -4
- package/dist/assets/{alert-adkp2Qj8.js → alert-Cx8eFRUM.js} +1 -1
- package/dist/assets/{alert-dialog-CordKci7.js → alert-dialog-Ctz24SMn.js} +1 -1
- package/dist/assets/{any-language-editor-Z9d2XKUM.js → any-language-editor-DyXJSyeK.js} +1 -1
- package/dist/assets/{app-config-button-CYFJH9oz.js → app-config-button-66OSct-U.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-B-zQV2Ro.js → architectureDiagram-VXUJARFQ-B8zMpJcM.js} +1 -1
- package/dist/assets/{arrow-left-Cb_73j1f.js → arrow-left-VDC1u5rq.js} +1 -1
- package/dist/assets/{badge-Ce8wRjuQ.js → badge-D4keL3YC.js} +1 -1
- package/dist/assets/blob-Bgnx1kuY.js +1 -0
- package/dist/assets/{blockDiagram-VD42YOAC-B7BRAty8.js → blockDiagram-VD42YOAC-CF1a-_t0.js} +1 -1
- package/dist/assets/{bundle.esm-B-jCcPJK.js → bundle.esm-CBAPjfrh.js} +1 -1
- package/dist/assets/{button-YC1gW_kJ.js → button-CZ3Cs4qb.js} +1 -1
- package/dist/assets/{c4Diagram-YG6GDRKO-C5JyC9v_.js → c4Diagram-YG6GDRKO-YIsEsUdQ.js} +1 -1
- package/dist/assets/{cache-panel-BfCxvTOh.js → cache-panel-C_9WDApV.js} +1 -1
- package/dist/assets/{card-BAxUmnnT.js → card-DdlNjkEA.js} +1 -1
- package/dist/assets/{cell-editor-BQ5bBOiS.js → cell-editor-DZgQrVMs.js} +14 -14
- package/dist/assets/{cell-link-DW0zobk9.js → cell-link-B37i0WNz.js} +1 -1
- package/dist/assets/{cells-BcMpgRWV.js → cells-B0XKj2oa.js} +32 -32
- package/dist/assets/channel-CXFsg7SH.js +1 -0
- package/dist/assets/{chart-no-axes-column-W42b2ZIs.js → chart-no-axes-column-qvVRjhv1.js} +1 -1
- package/dist/assets/{chat-components-BpIX7pUp.js → chat-components-BNjAKvAv.js} +1 -1
- package/dist/assets/{chat-display-CVXM0cmr.js → chat-display-q9RdcWB-.js} +1 -1
- package/dist/assets/chat-panel-viPqlAXC.js +3 -0
- package/dist/assets/check-Dr3SxUsb.js +1 -0
- package/dist/assets/{chevron-right-DwagBitu.js → chevron-right--18M_6o9.js} +1 -1
- package/dist/assets/{chunk-5FQGJX7Z-Bmb7yu_c.js → chunk-5FQGJX7Z-T2jyw7ZD.js} +3 -3
- package/dist/assets/{chunk-ABZYJK2D-Coo5qi7b.js → chunk-ABZYJK2D-D1A06qKo.js} +3 -3
- package/dist/assets/{chunk-ATLVNIR6-C0ULYreM.js → chunk-ATLVNIR6-C5FWd1qN.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-D6Q5lT5Z.js → chunk-B4BG7PRW-BEayfxv_.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-BUUtkB-8.js → chunk-DI55MBZ5-BSrtupT8.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-DQy5cN5X.js → chunk-EXTU4WIE-wi_fHsHN.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-99Y1UR46.js → chunk-JA3XYJ7Z-tKDxhnhw.js} +1 -1
- package/dist/assets/{chunk-JZLCHNYA-DRGkEV50.js → chunk-JZLCHNYA-DtvI9B9X.js} +1 -1
- package/dist/assets/{chunk-N4CR4FBY-DHFG9ldR.js → chunk-N4CR4FBY-BQcJpHO7.js} +2 -2
- package/dist/assets/{chunk-QN33PNHL-DB8FgLRd.js → chunk-QN33PNHL-BboKw3W6.js} +1 -1
- package/dist/assets/{chunk-QXUST7PY-_zxuSm7L.js → chunk-QXUST7PY-C4Ihfbmy.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-PVCoxQeQ.js → chunk-S3R3BYOJ-D1UiABQX.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-KYGSDxPK.js → chunk-TZMSLE5B-BjrxQwUX.js} +1 -1
- package/dist/assets/{circle-check-C57eOpl0.js → circle-check-DquVD4wZ.js} +1 -1
- package/dist/assets/{circle-play-BuOtSgid.js → circle-play-EowqxNIC.js} +1 -1
- package/dist/assets/{circle-plus-CnWl9uZo.js → circle-plus-haI9GLDP.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-BHD5dOKT.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-VYd80hrd.js +1 -0
- package/dist/assets/{clear-button-CF0iBcV9.js → clear-button-DI7_bdOB.js} +1 -1
- package/dist/assets/{click-outside-container-B12FHFHm.js → click-outside-container-Npdlddni.js} +1 -1
- package/dist/assets/{clipboard-paste-BiDF-cqm.js → clipboard-paste-CpyPR-HZ.js} +1 -1
- package/dist/assets/{code-block-37QAKDTI-D5PRUB7R.js → code-block-37QAKDTI-FUPT3-7o.js} +1 -1
- package/dist/assets/{code-xml-XLwHyDBr.js → code-xml-CgN_Yig7.js} +1 -1
- package/dist/assets/{column-preview-v3J210SK.js → column-preview-DrmYyyvE.js} +1 -1
- package/dist/assets/{command-DOzj5zu3.js → command-DTFQw11F.js} +1 -1
- package/dist/assets/{command-palette-B94wuFEk.js → command-palette-CrOe4bpD.js} +1 -1
- package/dist/assets/{common-DHF6uQdA.js → common-C0Pspoza.js} +1 -1
- package/dist/assets/compiler-runtime-B3qBwwSJ.js +1 -0
- package/dist/assets/{config-C3-Nti03.js → config-D2-Bw6QC.js} +1 -1
- package/dist/assets/{context-CJp-B2dx.js → context-Ga_vV5mE.js} +1 -1
- package/dist/assets/{copy-CQ15EONK.js → copy-D-8y6iMN.js} +1 -1
- package/dist/assets/{copy-icon-C1fNHY3M.js → copy-icon-C9v8EtBA.js} +1 -1
- package/dist/assets/createLucideIcon-BCdY6lG5.js +1 -0
- package/dist/assets/{createReducer-Dnna-AUO.js → createReducer-B3rBsy4P.js} +1 -1
- package/dist/assets/{dagre-6UL2VRFP-khPiqbzB.js → dagre-6UL2VRFP-CX3NGWnu.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-Ca1ELXWD.js → data-grid-overlay-editor-BTyw6887.js} +1 -1
- package/dist/assets/{database-zap-B9y7063w.js → database-zap-k4ePIFAU.js} +1 -1
- package/dist/assets/{datasource-BZ3O2HG1.js → datasource-2_-ICoTV.js} +1 -1
- package/dist/assets/{dates-Cx863TsG.js → dates-CT5PUuFo.js} +1 -1
- package/dist/assets/{dependency-graph-panel-s45LIDec.js → dependency-graph-panel-z8kf8Tus.js} +4 -4
- package/dist/assets/{diagram-PSM6KHXK-C7-DZLOE.js → diagram-PSM6KHXK-C0Sfgs1J.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-Ct2_XsRV.js → diagram-QEK2KX5R-DYSkW6Ju.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-C82IZoPA.js → diagram-S2PKOQOG-CfHqQVo3.js} +1 -1
- package/dist/assets/{dialog-Dstm3Ubn.js → dialog-tQELcltn.js} +1 -1
- package/dist/assets/{dist-oarhZoo6.js → dist-BMEHQAhk.js} +1 -1
- package/dist/assets/{dist-PT7WsOdN.js → dist-DDGMbl6p.js} +1 -1
- package/dist/assets/{dist-BhLw_JdQ.js → dist-h1RhtzUB.js} +1 -1
- package/dist/assets/{documentation-panel-DRqbOPwM.js → documentation-panel-DIp1L-6Y.js} +1 -1
- package/dist/assets/{download-zuPzhwvm.js → download-CxmzcjnR.js} +1 -1
- package/dist/assets/{download-B9SUL40m.js → download-Dg7clfkc.js} +1 -1
- package/dist/assets/{dropdown-menu-D8v7RjW8.js → dropdown-menu-BUgFWmX1.js} +1 -1
- package/dist/assets/{edit-page-Dlr4v1eI.js → edit-page-DRwTenyP.js} +7 -7
- package/dist/assets/{ellipsis-5ip-qDfN.js → ellipsis-DfDsMPvA.js} +1 -1
- package/dist/assets/{ellipsis-vertical-C7jYiLCo.js → ellipsis-vertical-J1F7_WS9.js} +1 -1
- package/dist/assets/{empty-state-BAGXXrn8.js → empty-state-DrmGF88A.js} +1 -1
- package/dist/assets/{en-US-XLBup7bs.js → en-US-DU2jJCpg.js} +1 -1
- package/dist/assets/{erDiagram-Q2GNP2WA-Ftt2qDiM.js → erDiagram-Q2GNP2WA-BfRyUS6D.js} +1 -1
- package/dist/assets/{error-banner-JIexM8h5.js → error-banner-w4pz2qUB.js} +1 -1
- package/dist/assets/{error-panel-TqjIx6nC.js → error-panel-Cz3rrpG9.js} +1 -1
- package/dist/assets/{errors-B5AI4nf5.js → errors-CPlNr33a.js} +1 -1
- package/dist/assets/{es-CPSXxuS6.js → es-GXAIFcot.js} +5 -5
- package/dist/assets/{esm-BbNm2fB0.js → esm-BK6tLEHQ.js} +1 -1
- package/dist/assets/{eye-off-BhExYOph.js → eye-off-AK_9uodG.js} +1 -1
- package/dist/assets/{field-1uCBX4j4.js → field-D9jE8HEt.js} +1 -1
- package/dist/assets/{file-Cs1JbsV6.js → file-Ch78NKWp.js} +1 -1
- package/dist/assets/{file-explorer-panel-jku_uMQn.js → file-explorer-panel-BJWXa6fg.js} +1 -1
- package/dist/assets/{file-plus-corner-Da9I6dgU.js → file-plus-corner-CvAy4H5W.js} +1 -1
- package/dist/assets/{file-video-camera-DW3v07j2.js → file-video-camera-C3wGzBnE.js} +1 -1
- package/dist/assets/{floating-outline-CZbF47gm.js → floating-outline-BSd7WV6r.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-Ca9aZp-3.js → flowDiagram-NV44I4VS-DKkZCUwG.js} +1 -1
- package/dist/assets/{focus-BxGelf2n.js → focus-CZLCQiuh.js} +1 -1
- package/dist/assets/{form-DQt-Ldr4.js → form-BQhIjeKF.js} +1 -1
- package/dist/assets/{formats-CobRswjh.js → formats-DGZwRUPy.js} +1 -1
- package/dist/assets/gallery-page-1AmSypJ6.js +1 -0
- package/dist/assets/{ganttDiagram-JELNMOA3-PYFPdyuJ.js → ganttDiagram-JELNMOA3-J8yLTqxn.js} +1 -1
- package/dist/assets/{gitGraphDiagram-NY62KEGX-CfGWoYOo.js → gitGraphDiagram-NY62KEGX-DXw3a-uS.js} +1 -1
- package/dist/assets/{glide-data-editor-8ek3zzAO.js → glide-data-editor-Cw8eE9Xn.js} +4 -4
- package/dist/assets/globals-DvWD0xHx.js +1 -0
- package/dist/assets/{home-page-xDhfcHL1.js → home-page-BaZhe30b.js} +1 -1
- package/dist/assets/{hooks-MQa8CSUr.js → hooks-B2h7NTXb.js} +1 -1
- package/dist/assets/{house-DhFkiXz7.js → house-BI81AWSn.js} +1 -1
- package/dist/assets/{html-to-image-DKqpcM7V.js → html-to-image-Cc7t14sm.js} +1 -1
- package/dist/assets/{icons-Dw4USSvE.js → icons-DjR3qLG_.js} +1 -1
- package/dist/assets/{index-DuqUGjtK.js → index-CQQ-Toaw.js} +18 -18
- package/dist/assets/index-GcHhnSIR.css +2 -0
- package/dist/assets/{infoDiagram-WHAUD3N6-Csbwq6Ks.js → infoDiagram-WHAUD3N6-32du45zK.js} +1 -1
- package/dist/assets/{input-DcAGg_4_.js → input-DHHmNa19.js} +1 -1
- package/dist/assets/{isValid-BLB2jskA.js → isValid-DpSSOU5z.js} +1 -1
- package/dist/assets/{journeyDiagram-XKPGCS4Q-DArwMxlY.js → journeyDiagram-XKPGCS4Q-Bmx7dA25.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-CPjBJiO_.js → kanban-definition-3W4ZIXB7-DJzhLwsl.js} +1 -1
- package/dist/assets/{katex-DYp6oq7P.js → katex-CbllUrnh.js} +1 -1
- package/dist/assets/katex-axIMlGRc.js +1 -0
- package/dist/assets/{kbd-uRyPZ9w_.js → kbd-k3Sn_RwW.js} +1 -1
- package/dist/assets/kiosk-mode-S90PbrZr.js +1 -0
- package/dist/assets/{label-CL9Xfexh.js → label-C--1sWU6.js} +1 -1
- package/dist/assets/{layout-D-YPCWvX.js → layout-BRVYycwo.js} +4 -4
- package/dist/assets/{linear-BxhToEEF.js → linear-DWpCiijk.js} +1 -1
- package/dist/assets/{link-BsTPF7B0.js → link-DxicfMbs.js} +1 -1
- package/dist/assets/{links-BhgWpHdU.js → links-fh_IXIKE.js} +1 -1
- package/dist/assets/{logs-panel-DKSJRyF4.js → logs-panel-DU1PTK6I.js} +1 -1
- package/dist/assets/{loro_wasm_bg-BnAHSQ7o.js → loro_wasm_bg-CdafknAX.js} +2 -2
- package/dist/assets/loro_wasm_bg-WKwciKJa.wasm +0 -0
- package/dist/assets/{loro_wasm_bg-CKQGJrH5.js → loro_wasm_bg-aCueZs8k.js} +1 -1
- package/dist/assets/{maps-t9yNKYA8.js → maps-D2_Mq1pZ.js} +1 -1
- package/dist/assets/markdown-renderer-Y3WEBmX7.js +10 -0
- package/dist/assets/{menu-items-NblnuU_B.js → menu-items-vwmjPhjW.js} +1 -1
- package/dist/assets/mermaid-4DMBBIKO-Dn0v3H8Z.js +1 -0
- package/dist/assets/{mermaid-Bzaf_nA9.js → mermaid-dAaJQU1M.js} +3 -3
- package/dist/assets/{mhchem-DLDYYsJK.js → mhchem-2XRJK9de.js} +1 -1
- package/dist/assets/{mindmap-definition-VGOIOE7T-DVB4z5Yy.js → mindmap-definition-VGOIOE7T-whTFv8Zv.js} +1 -1
- package/dist/assets/{mode-CevBiFCd.js → mode-CTf4rB7H.js} +1 -1
- package/dist/assets/{multi-icon-CLzAg610.js → multi-icon-BWLbAXq5.js} +1 -1
- package/dist/assets/{multi-map-W4zci54U.js → multi-map-A4XNra08.js} +1 -1
- package/dist/assets/{name-cell-input-DwvdP1Ck.js → name-cell-input-Bmq-KdJ-.js} +1 -1
- package/dist/assets/{number-overlay-editor-CvIcqV0W.js → number-overlay-editor-65UcMR52.js} +1 -1
- package/dist/assets/{outline-panel-Bg_CP1WV.js → outline-panel-Cfpy5BTW.js} +1 -1
- package/dist/assets/{packages-panel-DBgrbk-q.js → packages-panel-C2SNGD_P.js} +1 -1
- package/dist/assets/{panel-context-C-UJlFyL.js → panel-context-2mVKaSYm.js} +1 -1
- package/dist/assets/panels-D47UNcb0.js +1 -0
- package/dist/assets/{pieDiagram-ADFJNKIX-vwwb5uL8.js → pieDiagram-ADFJNKIX-4n07I4VV.js} +1 -1
- package/dist/assets/{play-BPIh-ZEU.js → play-GLWQQs7F.js} +1 -1
- package/dist/assets/{plus-BD5o34_i.js → plus-B7DF33lD.js} +1 -1
- package/dist/assets/{popover-BZZFx3Q8.js → popover-B-131r4d.js} +1 -1
- package/dist/assets/{precisionRound-CU2C3Vxx.js → precisionRound-C3fmBb6j.js} +1 -1
- package/dist/assets/{process-output-Cl2N-HlT.js → process-output-CdIpMer6.js} +1 -1
- package/dist/assets/{quadrantDiagram-AYHSOK5B-Y8bEZ32G.js → quadrantDiagram-AYHSOK5B-CNm24EC2.js} +1 -1
- package/dist/assets/{react-BGmjiNul.js → react-Bj1aDYRI.js} +1 -1
- package/dist/assets/{react-dom-C9fstfnp.js → react-dom-CSu739Rf.js} +1 -1
- package/dist/assets/{react-plotly-CZMBCa5P.js → react-plotly-OyYr93y7.js} +1 -1
- package/dist/assets/{react-resizable-panels.browser.esm-BFvP7Upm.js → react-resizable-panels.browser.esm-Mq45xjWt.js} +1 -1
- package/dist/assets/{react-vega-BCDifxTe.js → react-vega-BEiHA2e9.js} +1 -1
- package/dist/assets/react-vega-BrNLU7si.js +1 -0
- package/dist/assets/readonly-python-code-o3TsTcFg.js +1 -0
- package/dist/assets/{refresh-ccw-DLEiQDS3.js → refresh-ccw-DN_xCV6A.js} +1 -1
- package/dist/assets/{refresh-cw-CQd-1kjx.js → refresh-cw-Dx8TEWFP.js} +1 -1
- package/dist/assets/{renderShortcut-zxgoVTeP.js → renderShortcut-Xr6z-RjZ.js} +1 -1
- package/dist/assets/request-registry-BWqkV683.js +1 -0
- package/dist/assets/{requests-BsVD4CdD.js → requests-B4FYHTZl.js} +1 -1
- package/dist/assets/requests-BQkjRazP.js +1 -0
- package/dist/assets/{requirementDiagram-UZGBJVZJ-ChckaTrX.js → requirementDiagram-UZGBJVZJ-B7BwuJGh.js} +1 -1
- package/dist/assets/{rotate-ccw-B_yU4f05.js → rotate-ccw-DPbJxVVN.js} +1 -1
- package/dist/assets/run-page-BRiD7IM8.js +1 -0
- package/dist/assets/{runs-X54OGDTq.js → runs-DyBOFmAK.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-DtU4O0-i.js → sankeyDiagram-TZEHDZUN-C8KpmdhC.js} +1 -1
- package/dist/assets/{save-PMHbdtqc.js → save-DZodxFnE.js} +1 -1
- package/dist/assets/{save-worker-DtF6B3PS.js → save-worker-CtJsIYIM.js} +3 -3
- package/dist/assets/{scratchpad-panel-CIxZIJ-1.js → scratchpad-panel-9Nh-KCKz.js} +1 -1
- package/dist/assets/{secrets-panel-TwfjwIVv.js → secrets-panel-CEMSgQv5.js} +1 -1
- package/dist/assets/{select-CX1Yi8J8.js → select-B7bfltkI.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-BGXrTemh.js → sequenceDiagram-WL72ISMW-D0_AcPzd.js} +1 -1
- package/dist/assets/{session-panel-CNeWVmTR.js → session-panel-9cibvZIi.js} +1 -1
- package/dist/assets/{settings-DOXWMfVd.js → settings-OBbrbhij.js} +1 -1
- package/dist/assets/{share-Ba-pHZtq.js → share-rXkgGlhr.js} +1 -1
- package/dist/assets/{slides-component-CGMJm_kL.js → slides-component-C0UAH9QZ.js} +1 -1
- package/dist/assets/{snippets-panel-DMN_ZSXA.js → snippets-panel-BLiaEg0s.js} +1 -1
- package/dist/assets/{spec-D1kBp3jX.js → spec-Ch0xnJY4.js} +1 -1
- package/dist/assets/{spinner-DaIKav-i.js → spinner-DA8-7wQv.js} +1 -1
- package/dist/assets/{square-C8Tw_XXG.js → square-DPZjfUaq.js} +1 -1
- package/dist/assets/{square-function-CqXXKtIq.js → square-function-B6mgCeFJ.js} +1 -1
- package/dist/assets/{state-n1Xz9vt7.js → state-DAl4qLSi.js} +1 -1
- package/dist/assets/{state-BLsnFVwy.js → state-Q32Iqos3.js} +1 -1
- package/dist/assets/{stateDiagram-FKZM4ZOC-BwSf7RIr.js → stateDiagram-FKZM4ZOC-Dz_iVJd6.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-CupainMB.js +1 -0
- package/dist/assets/{switch-CfRu5JBF.js → switch-D5W4wgWK.js} +1 -1
- package/dist/assets/{table-qbh6Daed.js → table-BOsFCeLh.js} +1 -1
- package/dist/assets/{table-DZR6ewbN.js → table-CfDbAm78.js} +1 -1
- package/dist/assets/{terminal-C0fH4d_0.js → terminal-BLSSaFMR.js} +1 -1
- package/dist/assets/{textarea-3ZXdUni1.js → textarea-UfsPtSW1.js} +1 -1
- package/dist/assets/{time-EL4bnqqQ.js → time-CSCsAxXS.js} +1 -1
- package/dist/assets/{timeline-definition-IT6M3QCI-BZakpQwy.js → timeline-definition-IT6M3QCI-DPXEeoSm.js} +1 -1
- package/dist/assets/{toDate-CgbKQM5E.js → toDate-DETS9bBd.js} +1 -1
- package/dist/assets/{toggle-CWS-iCmF.js → toggle-CriARMQK.js} +1 -1
- package/dist/assets/{tooltip-DH6k_bBY.js → tooltip-C_WgOOcZ.js} +1 -1
- package/dist/assets/{tooltip-DxKBXCGp.js → tooltip-DqsDDLgU.js} +1 -1
- package/dist/assets/{tracing-zzjDz6Hy.js → tracing-BqFhwuOc.js} +1 -1
- package/dist/assets/tracing-panel-R9i0TrmX.js +2 -0
- package/dist/assets/{trash-2-CyqGun26.js → trash-2-B8SQYdQq.js} +1 -1
- package/dist/assets/{trash-DMqDgJ5r.js → trash-Cv0yH8fs.js} +1 -1
- package/dist/assets/{tree-DHpFOpHo.js → tree-Hg81oJmp.js} +1 -1
- package/dist/assets/{triangle-alert-B65rDESJ.js → triangle-alert-U93NZYDl.js} +1 -1
- package/dist/assets/{types-CS34eOZi.js → types-C1UhS3qM.js} +1 -1
- package/dist/assets/{types-CW-zyy80.js → types-DIb0tcCO.js} +1 -1
- package/dist/assets/{use-toast-rmUWldD_.js → use-toast-T0_cQDma.js} +1 -1
- package/dist/assets/useAddCell-CXRk4Ma4.js +1 -0
- package/dist/assets/{useAsyncData-BAVCkkQP.js → useAsyncData-CgmD3hjw.js} +1 -1
- package/dist/assets/{useBoolean-BjVFTMam.js → useBoolean-IZsSX_XF.js} +1 -1
- package/dist/assets/useCellActionButton-Du-bZZ06.js +1 -0
- package/dist/assets/{useDateFormatter-D89e9xZY.js → useDateFormatter-CieT0-H-.js} +1 -1
- package/dist/assets/{useDebounce-CU_caGaU.js → useDebounce-B28kFfrM.js} +1 -1
- package/dist/assets/{useDeepCompareMemoize-DiyglPgJ.js → useDeepCompareMemoize-CFtQU7An.js} +1 -1
- package/dist/assets/{useDeleteCell-B8CxYiji.js → useDeleteCell-D0DAGwMP.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-YtWR0xDK.js → useDependencyPanelTab-CN5-nxOy.js} +1 -1
- package/dist/assets/useEvent-BhXAndur.js +1 -0
- package/dist/assets/{useEventListener-DIUKKfEy.js → useEventListener-Cb-RVVEn.js} +1 -1
- package/dist/assets/{useIframeCapabilities-DzIlROXe.js → useIframeCapabilities-CC8VH6kZ.js} +1 -1
- package/dist/assets/{useInstallPackage-C-gjrVjb.js → useInstallPackage-Co79H1lQ.js} +1 -1
- package/dist/assets/{useInterval-y9MtYlSD.js → useInterval-BNfubus2.js} +1 -1
- package/dist/assets/{useLifecycle-D35CBukS.js → useLifecycle-ClI_npeg.js} +1 -1
- package/dist/assets/{useNonce-_Aax6sXd.js → useNonce-CS26E0hA.js} +1 -1
- package/dist/assets/{useNotebookActions-Dfh_7NPm.js → useNotebookActions--9xrGXss.js} +1 -1
- package/dist/assets/{useNumberFormatter-CTkflual.js → useNumberFormatter-BX4DTYtT.js} +1 -1
- package/dist/assets/{usePress-CoEeT5jq.js → usePress-3CRs0fQg.js} +1 -1
- package/dist/assets/{useRunCells-rjrIgU8v.js → useRunCells-DaW_oMnr.js} +1 -1
- package/dist/assets/{useSplitCell-fcjSuBNO.js → useSplitCell-Cjr7nuBc.js} +1 -1
- package/dist/assets/{useTheme-EGf2UOFo.js → useTheme-CTORu22_.js} +1 -1
- package/dist/assets/utilities.esm-CME5sKpT.js +3 -0
- package/dist/assets/{utils-DXvhzCGS.js → utils-YqBXNpsM.js} +1 -1
- package/dist/assets/{vega-component-DAJbxD47.js → vega-component-7jd4fFCJ.js} +1 -1
- package/dist/assets/{vega-loader.browser-DXARUlxo.js → vega-loader.browser-BegSZk0G.js} +1 -1
- package/dist/assets/{worker-CUL1lW-N.js → worker-CyCdlLVf.js} +3 -3
- package/dist/assets/{workflow-CMjI9cxl.js → workflow-B12dAR4X.js} +1 -1
- package/dist/assets/{write-secret-modal-CgAvgY9w.js → write-secret-modal-DO-EOoNO.js} +1 -1
- package/dist/assets/{x-CoXDX2vQ.js → x-ZP5cObgf.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-CAHFvN1H.js → xychartDiagram-PRI3JC2R-DINfGlOV.js} +1 -1
- package/dist/assets/{youtube-8p26v8EM.js → youtube--tNPNRy6.js} +1 -1
- package/dist/assets/zod-H_cgTO0M.js +40 -0
- package/dist/index.html +139 -139
- package/package.json +18 -18
- package/src/components/app-config/ai-config.tsx +11 -2
- package/src/components/app-config/user-config-form.tsx +0 -54
- package/src/components/chat/acp/__tests__/state.test.ts +69 -0
- package/src/components/chat/acp/state.ts +6 -6
- package/src/components/chat/chat-panel.tsx +47 -30
- package/src/components/data-table/__tests__/data-table.test.tsx +94 -2
- package/src/components/editor/actions/useCellActionButton.tsx +14 -1
- package/src/components/editor/cell/CreateCellButton.tsx +2 -1
- package/src/components/editor/cell/code/cell-editor.tsx +12 -0
- package/src/components/editor/database/__tests__/__snapshots__/as-code.test.ts.snap +15 -0
- package/src/components/editor/database/__tests__/as-code.test.ts +8 -0
- package/src/components/editor/database/as-code.ts +3 -0
- package/src/components/editor/database/schemas.ts +9 -0
- package/src/components/editor/renderers/cell-array.tsx +2 -1
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +12 -0
- package/src/components/pages/gallery-page.tsx +37 -6
- package/src/core/MarimoApp.tsx +12 -8
- package/src/core/ai/context/providers/file.ts +1 -1
- package/src/core/cells/__tests__/cells.test.ts +120 -0
- package/src/core/cells/__tests__/session.test.ts +37 -1
- package/src/core/cells/cells.ts +14 -0
- package/src/core/cells/session.ts +20 -8
- package/src/core/codemirror/language/languages/markdown.ts +7 -0
- package/src/core/config/feature-flag.tsx +0 -4
- package/src/core/dom/uiregistry.ts +4 -1
- package/src/core/run-app.tsx +11 -4
- package/src/core/static/__tests__/files.test.ts +195 -1
- package/src/core/static/files.ts +39 -9
- package/src/plugins/core/registerReactComponent.tsx +9 -1
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +164 -0
- package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +7 -1
- package/src/utils/__tests__/blob.test.ts +3 -3
- package/src/utils/__tests__/id-tree.test.ts +22 -7
- package/src/utils/__tests__/mime-types.test.ts +8 -10
- package/src/utils/__tests__/url-parser.test.ts +22 -0
- package/src/utils/blob.ts +14 -27
- package/src/utils/id-tree.tsx +11 -19
- package/src/utils/mime-types.ts +5 -5
- package/src/utils/url-parser.ts +1 -1
- package/dist/assets/MarimoErrorOutput-DuaUr0W-.js +0 -7
- package/dist/assets/__vite-browser-external-BkzFKOxE.js +0 -1
- package/dist/assets/__vite-browser-external-CPyDqUtZ.js +0 -1
- package/dist/assets/blob-t6qcPM7K.js +0 -1
- package/dist/assets/channel-ownMsSXG.js +0 -1
- package/dist/assets/chat-panel-FiDMP_Qr.js +0 -3
- package/dist/assets/check-DdfN0k2d.js +0 -1
- package/dist/assets/classDiagram-2ON5EDUG-CSgD2v8F.js +0 -1
- package/dist/assets/classDiagram-v2-WZHVMYZB-YTETTIT0.js +0 -1
- package/dist/assets/compiler-runtime-DeeZ7FnK.js +0 -1
- package/dist/assets/createLucideIcon-CnW3RofX.js +0 -1
- package/dist/assets/gallery-page-D_5X4kKx.js +0 -1
- package/dist/assets/globals-D4t_HyAp.js +0 -1
- package/dist/assets/index-CikhHYAB.css +0 -2
- package/dist/assets/katex-BZrXWsTs.js +0 -1
- package/dist/assets/kiosk-mode-C9XznhoS.js +0 -1
- package/dist/assets/loro_wasm_bg-DV7Kb4_M.wasm +0 -0
- package/dist/assets/markdown-renderer-Bu12gPyJ.js +0 -10
- package/dist/assets/mermaid-4DMBBIKO-RE7Z6-fl.js +0 -1
- package/dist/assets/panels-CaoDGKmF.js +0 -1
- package/dist/assets/react-vega-DkHO4e2L.js +0 -1
- package/dist/assets/readonly-python-code-H1kzT-lB.js +0 -1
- package/dist/assets/request-registry-CjZcQuTP.js +0 -1
- package/dist/assets/requests-BSPGoGJL.js +0 -1
- package/dist/assets/run-page-BmTC7uxn.js +0 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-SWMI9LKY.js +0 -1
- package/dist/assets/tracing-panel-DogOVTzf.js +0 -2
- package/dist/assets/useAddCell-mkD8zurm.js +0 -1
- package/dist/assets/useCellActionButton-BZ46_Pdt.js +0 -1
- package/dist/assets/useEvent-DO6uJBas.js +0 -1
- package/dist/assets/utilities.esm-CkqwfzLw.js +0 -3
- package/dist/assets/zod-Cg4WLWh2.js +0 -40
- /package/dist/assets/{copy-DHrHayPa.js → copy-BaRrAFL-.js} +0 -0
- /package/dist/assets/{defaultLocale-BLne0bXb.js → defaultLocale-B6z1Qyqt.js} +0 -0
- /package/dist/assets/{defaultLocale-JieDVWC_.js → defaultLocale-YteS-k_t.js} +0 -0
- /package/dist/assets/{emotion-is-prop-valid.esm-C59xfSYt.js → emotion-is-prop-valid.esm-Dangy3Bv.js} +0 -0
- /package/dist/assets/{extends-BiFDv3jB.js → extends-Dqvpuc10.js} +0 -0
- /package/dist/assets/{objectWithoutPropertiesLoose-DfWeGRFv.js → objectWithoutPropertiesLoose-DoKw85w0.js} +0 -0
- /package/dist/assets/{ordinal-C93T4L8H.js → ordinal-DAqJmfoU.js} +0 -0
- /package/dist/assets/{prop-types-DaaA-ptl.js → prop-types-DVDiRdwc.js} +0 -0
- /package/dist/assets/{purify.es-DZrAQFIu.js → purify.es-B-nzWya6.js} +0 -0
- /package/dist/assets/{range-1DwpgXvM.js → range-7fnH_zLA.js} +0 -0
package/src/core/MarimoApp.tsx
CHANGED
|
@@ -39,14 +39,18 @@ const LazyGalleryPage = reactLazyWithPreload(
|
|
|
39
39
|
);
|
|
40
40
|
|
|
41
41
|
export function preloadPage(mode: string) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
42
|
+
switch (mode) {
|
|
43
|
+
case "home":
|
|
44
|
+
LazyHomePage.preload();
|
|
45
|
+
break;
|
|
46
|
+
case "gallery":
|
|
47
|
+
LazyGalleryPage.preload();
|
|
48
|
+
break;
|
|
49
|
+
case "read":
|
|
50
|
+
LazyRunPage.preload();
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
LazyEditPage.preload();
|
|
50
54
|
}
|
|
51
55
|
}
|
|
52
56
|
|
|
@@ -237,7 +237,7 @@ export class FileContextProvider extends AIContextProvider<FileContextItem> {
|
|
|
237
237
|
fileDetails.contents as Base64String,
|
|
238
238
|
mimeType,
|
|
239
239
|
);
|
|
240
|
-
blob =
|
|
240
|
+
blob = deserializeBlob(dataURL);
|
|
241
241
|
} catch {
|
|
242
242
|
// Fallback to treating as text
|
|
243
243
|
blob = new Blob([fileDetails.contents], { type: mimeType });
|
|
@@ -2561,6 +2561,126 @@ describe("cell reducer", () => {
|
|
|
2561
2561
|
expect(state.untouchedNewCells.has(newCellId)).toBe(false);
|
|
2562
2562
|
expect(exportedForTesting.isCellCodeHidden(state, newCellId)).toBe(true);
|
|
2563
2563
|
});
|
|
2564
|
+
|
|
2565
|
+
it("can mark an existing cell as untouched", () => {
|
|
2566
|
+
// Create a cell without hideCode (not in untouchedNewCells)
|
|
2567
|
+
actions.createNewCell({
|
|
2568
|
+
cellId: "__end__",
|
|
2569
|
+
before: false,
|
|
2570
|
+
hideCode: false,
|
|
2571
|
+
});
|
|
2572
|
+
|
|
2573
|
+
const newCellId =
|
|
2574
|
+
state.cellIds.inOrderIds[state.cellIds.inOrderIds.length - 1];
|
|
2575
|
+
expect(state.untouchedNewCells.has(newCellId)).toBe(false);
|
|
2576
|
+
|
|
2577
|
+
// Mark it as untouched
|
|
2578
|
+
actions.markUntouched({ cellId: newCellId });
|
|
2579
|
+
|
|
2580
|
+
expect(state.untouchedNewCells.has(newCellId)).toBe(true);
|
|
2581
|
+
});
|
|
2582
|
+
|
|
2583
|
+
it("markUntouched is idempotent", () => {
|
|
2584
|
+
// Create a cell without hideCode
|
|
2585
|
+
actions.createNewCell({
|
|
2586
|
+
cellId: "__end__",
|
|
2587
|
+
before: false,
|
|
2588
|
+
hideCode: false,
|
|
2589
|
+
});
|
|
2590
|
+
|
|
2591
|
+
const newCellId =
|
|
2592
|
+
state.cellIds.inOrderIds[state.cellIds.inOrderIds.length - 1];
|
|
2593
|
+
expect(state.untouchedNewCells.has(newCellId)).toBe(false);
|
|
2594
|
+
|
|
2595
|
+
// Mark as untouched multiple times
|
|
2596
|
+
actions.markUntouched({ cellId: newCellId });
|
|
2597
|
+
actions.markUntouched({ cellId: newCellId });
|
|
2598
|
+
actions.markUntouched({ cellId: newCellId });
|
|
2599
|
+
|
|
2600
|
+
expect(state.untouchedNewCells.has(newCellId)).toBe(true);
|
|
2601
|
+
});
|
|
2602
|
+
|
|
2603
|
+
it("markUntouched does not affect already untouched cells", () => {
|
|
2604
|
+
// Create a cell with hideCode (already in untouchedNewCells)
|
|
2605
|
+
actions.createNewCell({
|
|
2606
|
+
cellId: "__end__",
|
|
2607
|
+
before: false,
|
|
2608
|
+
hideCode: true,
|
|
2609
|
+
});
|
|
2610
|
+
|
|
2611
|
+
const newCellId =
|
|
2612
|
+
state.cellIds.inOrderIds[state.cellIds.inOrderIds.length - 1];
|
|
2613
|
+
expect(state.untouchedNewCells.has(newCellId)).toBe(true);
|
|
2614
|
+
|
|
2615
|
+
// Calling markUntouched should not change anything
|
|
2616
|
+
actions.markUntouched({ cellId: newCellId });
|
|
2617
|
+
|
|
2618
|
+
expect(state.untouchedNewCells.has(newCellId)).toBe(true);
|
|
2619
|
+
});
|
|
2620
|
+
|
|
2621
|
+
it("markTouched and markUntouched can toggle cell state", () => {
|
|
2622
|
+
// Create a cell without hideCode
|
|
2623
|
+
actions.createNewCell({
|
|
2624
|
+
cellId: "__end__",
|
|
2625
|
+
before: false,
|
|
2626
|
+
hideCode: false,
|
|
2627
|
+
});
|
|
2628
|
+
|
|
2629
|
+
const newCellId =
|
|
2630
|
+
state.cellIds.inOrderIds[state.cellIds.inOrderIds.length - 1];
|
|
2631
|
+
|
|
2632
|
+
// Initially not untouched
|
|
2633
|
+
expect(state.untouchedNewCells.has(newCellId)).toBe(false);
|
|
2634
|
+
|
|
2635
|
+
// Mark as untouched
|
|
2636
|
+
actions.markUntouched({ cellId: newCellId });
|
|
2637
|
+
expect(state.untouchedNewCells.has(newCellId)).toBe(true);
|
|
2638
|
+
|
|
2639
|
+
// Mark as touched
|
|
2640
|
+
actions.markTouched({ cellId: newCellId });
|
|
2641
|
+
expect(state.untouchedNewCells.has(newCellId)).toBe(false);
|
|
2642
|
+
|
|
2643
|
+
// Mark as untouched again
|
|
2644
|
+
actions.markUntouched({ cellId: newCellId });
|
|
2645
|
+
expect(state.untouchedNewCells.has(newCellId)).toBe(true);
|
|
2646
|
+
});
|
|
2647
|
+
|
|
2648
|
+
it("markUntouched works for markdown cell conversion scenario", () => {
|
|
2649
|
+
// Simulates converting a Python cell to Markdown
|
|
2650
|
+
// 1. Create a regular cell (no hideCode)
|
|
2651
|
+
actions.createNewCell({
|
|
2652
|
+
cellId: "__end__",
|
|
2653
|
+
before: false,
|
|
2654
|
+
hideCode: false,
|
|
2655
|
+
});
|
|
2656
|
+
|
|
2657
|
+
const cellId =
|
|
2658
|
+
state.cellIds.inOrderIds[state.cellIds.inOrderIds.length - 1];
|
|
2659
|
+
|
|
2660
|
+
// Cell starts without hide_code and not in untouchedNewCells
|
|
2661
|
+
expect(state.cellData[cellId].config.hide_code).toBe(false);
|
|
2662
|
+
expect(state.untouchedNewCells.has(cellId)).toBe(false);
|
|
2663
|
+
expect(exportedForTesting.isCellCodeHidden(state, cellId)).toBe(false);
|
|
2664
|
+
|
|
2665
|
+
// 2. Convert to markdown: set hide_code and mark as untouched
|
|
2666
|
+
actions.updateCellConfig({
|
|
2667
|
+
cellId,
|
|
2668
|
+
config: { hide_code: true },
|
|
2669
|
+
});
|
|
2670
|
+
actions.markUntouched({ cellId });
|
|
2671
|
+
|
|
2672
|
+
// Code should NOT be hidden because cell is untouched (user can edit)
|
|
2673
|
+
expect(state.cellData[cellId].config.hide_code).toBe(true);
|
|
2674
|
+
expect(state.untouchedNewCells.has(cellId)).toBe(true);
|
|
2675
|
+
expect(exportedForTesting.isCellCodeHidden(state, cellId)).toBe(false);
|
|
2676
|
+
|
|
2677
|
+
// 3. User blurs the cell (markTouched)
|
|
2678
|
+
actions.markTouched({ cellId });
|
|
2679
|
+
|
|
2680
|
+
// Now code should be hidden
|
|
2681
|
+
expect(state.untouchedNewCells.has(cellId)).toBe(false);
|
|
2682
|
+
expect(exportedForTesting.isCellCodeHidden(state, cellId)).toBe(true);
|
|
2683
|
+
});
|
|
2564
2684
|
});
|
|
2565
2685
|
|
|
2566
2686
|
describe("releaseCellAtoms", () => {
|
|
@@ -7,7 +7,7 @@ import { parseOutline } from "@/core/dom/outline";
|
|
|
7
7
|
import { MultiColumn, visibleForTesting } from "@/utils/id-tree";
|
|
8
8
|
import { invariant } from "@/utils/invariant";
|
|
9
9
|
import { Logger } from "@/utils/Logger";
|
|
10
|
-
import type
|
|
10
|
+
import { type CellId, SETUP_CELL_ID } from "../ids";
|
|
11
11
|
import { notebookStateFromSession } from "../session";
|
|
12
12
|
|
|
13
13
|
// Mock dependencies
|
|
@@ -358,6 +358,42 @@ describe("notebookStateFromSession", () => {
|
|
|
358
358
|
serializedEditorState: null,
|
|
359
359
|
});
|
|
360
360
|
});
|
|
361
|
+
|
|
362
|
+
it("uses SETUP_CELL_ID for setup cell with null id", () => {
|
|
363
|
+
const notebookCell = {
|
|
364
|
+
id: null,
|
|
365
|
+
code: "import marimo as mo",
|
|
366
|
+
name: "setup",
|
|
367
|
+
code_hash: null,
|
|
368
|
+
config: {
|
|
369
|
+
hide_code: null,
|
|
370
|
+
disabled: null,
|
|
371
|
+
column: null,
|
|
372
|
+
},
|
|
373
|
+
};
|
|
374
|
+
const notebook = createNotebook([notebookCell as any]);
|
|
375
|
+
const result = notebookStateFromSession(null, notebook);
|
|
376
|
+
|
|
377
|
+
expect(result).not.toBeNull();
|
|
378
|
+
invariant(result, "result is null");
|
|
379
|
+
expect(result.cellIds.inOrderIds).toEqual(
|
|
380
|
+
MultiColumn.from([[SETUP_CELL_ID]]).inOrderIds,
|
|
381
|
+
);
|
|
382
|
+
expect(result.cellData[SETUP_CELL_ID]).toEqual({
|
|
383
|
+
id: SETUP_CELL_ID,
|
|
384
|
+
name: "setup",
|
|
385
|
+
code: "import marimo as mo",
|
|
386
|
+
edited: false,
|
|
387
|
+
lastCodeRun: null,
|
|
388
|
+
lastExecutionTime: null,
|
|
389
|
+
config: {
|
|
390
|
+
hide_code: false,
|
|
391
|
+
disabled: false,
|
|
392
|
+
column: null,
|
|
393
|
+
},
|
|
394
|
+
serializedEditorState: null,
|
|
395
|
+
});
|
|
396
|
+
});
|
|
361
397
|
});
|
|
362
398
|
|
|
363
399
|
describe("both session and notebook scenarios", () => {
|
package/src/core/cells/cells.ts
CHANGED
|
@@ -1033,6 +1033,20 @@ const {
|
|
|
1033
1033
|
|
|
1034
1034
|
return state;
|
|
1035
1035
|
},
|
|
1036
|
+
markUntouched: (state, action: { cellId: CellId }) => {
|
|
1037
|
+
const { cellId } = action;
|
|
1038
|
+
|
|
1039
|
+
if (!state.untouchedNewCells.has(cellId)) {
|
|
1040
|
+
const nextUntouchedNewCells = new Set(state.untouchedNewCells);
|
|
1041
|
+
nextUntouchedNewCells.add(cellId);
|
|
1042
|
+
return {
|
|
1043
|
+
...state,
|
|
1044
|
+
untouchedNewCells: nextUntouchedNewCells,
|
|
1045
|
+
};
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
return state;
|
|
1049
|
+
},
|
|
1036
1050
|
scrollToTarget: (state) => {
|
|
1037
1051
|
// Scroll to the specified cell and clear the scroll key.
|
|
1038
1052
|
const scrollKey = state.scrollKey;
|
|
@@ -6,7 +6,7 @@ import { MultiColumn } from "@/utils/id-tree";
|
|
|
6
6
|
import { Logger } from "@/utils/Logger";
|
|
7
7
|
import { parseOutline } from "../dom/outline";
|
|
8
8
|
import type { NotebookState } from "./cells";
|
|
9
|
-
import { CellId } from "./ids";
|
|
9
|
+
import { CellId, SETUP_CELL_ID } from "./ids";
|
|
10
10
|
import {
|
|
11
11
|
type CellData,
|
|
12
12
|
type CellRuntimeState,
|
|
@@ -20,6 +20,22 @@ const EMPTY_STRING = "";
|
|
|
20
20
|
type SessionCell = api.Session["NotebookSessionV1"]["cells"][0];
|
|
21
21
|
type NotebookCell = api.Notebook["NotebookV1"]["cells"][0];
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Get the cell ID from a cell object.
|
|
25
|
+
* If the cell has an ID, use it.
|
|
26
|
+
* If the cell has a name of "setup", use the special SETUP_CELL_ID.
|
|
27
|
+
* Otherwise, generate a new random ID.
|
|
28
|
+
*/
|
|
29
|
+
function getCellId(cell: { id?: string | null; name?: string | null }): CellId {
|
|
30
|
+
if (cell.id) {
|
|
31
|
+
return cell.id as CellId;
|
|
32
|
+
}
|
|
33
|
+
if (cell.name === SETUP_CELL_ID) {
|
|
34
|
+
return SETUP_CELL_ID;
|
|
35
|
+
}
|
|
36
|
+
return CellId.create();
|
|
37
|
+
}
|
|
38
|
+
|
|
23
39
|
function mergeSessionAndNotebookCells(
|
|
24
40
|
session: api.Session["NotebookSessionV1"] | null | undefined,
|
|
25
41
|
notebook: api.Notebook["NotebookV1"] | null | undefined,
|
|
@@ -36,9 +52,7 @@ function mergeSessionAndNotebookCells(
|
|
|
36
52
|
}
|
|
37
53
|
|
|
38
54
|
if (!session) {
|
|
39
|
-
const cellIds =
|
|
40
|
-
(cell) => cell.id ?? CellId.create(),
|
|
41
|
-
) || []) as CellId[];
|
|
55
|
+
const cellIds = notebook?.cells.map((cell) => getCellId(cell)) || [];
|
|
42
56
|
return {
|
|
43
57
|
cellIds,
|
|
44
58
|
sessionCellData: new Map(
|
|
@@ -57,9 +71,7 @@ function mergeSessionAndNotebookCells(
|
|
|
57
71
|
}
|
|
58
72
|
|
|
59
73
|
if (!notebook) {
|
|
60
|
-
const cellIds = session.cells.map(
|
|
61
|
-
(cell) => cell.id ?? CellId.create(),
|
|
62
|
-
) as CellId[];
|
|
74
|
+
const cellIds = session.cells.map((cell) => getCellId(cell));
|
|
63
75
|
return {
|
|
64
76
|
cellIds,
|
|
65
77
|
sessionCellData: new Map(
|
|
@@ -105,7 +117,7 @@ function mergeSessionAndNotebookCells(
|
|
|
105
117
|
for (let i = 0; i < notebook.cells.length; i++) {
|
|
106
118
|
const notebookCell = notebook.cells[i];
|
|
107
119
|
if (notebookCell) {
|
|
108
|
-
const id = (notebookCell
|
|
120
|
+
const id = getCellId(notebookCell);
|
|
109
121
|
mergedCellIdsTyped.push(id);
|
|
110
122
|
|
|
111
123
|
// Should always be set, but good typing fallback too.
|
|
@@ -28,6 +28,13 @@ import type { LanguageAdapter } from "../types";
|
|
|
28
28
|
|
|
29
29
|
export type MarkdownLanguageAdapterMetadata = MarkdownMetadata;
|
|
30
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Default hide_code setting for markdown cells.
|
|
33
|
+
* When true, the markdown code is hidden after the cell is blurred,
|
|
34
|
+
* showing only the rendered output.
|
|
35
|
+
*/
|
|
36
|
+
export const MARKDOWN_INITIAL_HIDE_CODE = true;
|
|
37
|
+
|
|
31
38
|
/**
|
|
32
39
|
* Language adapter for Markdown.
|
|
33
40
|
*/
|
|
@@ -9,8 +9,6 @@ export interface ExperimentalFeatures {
|
|
|
9
9
|
markdown: boolean; // Used in playground (community cloud)
|
|
10
10
|
wasm_layouts: boolean; // Used in playground (community cloud)
|
|
11
11
|
rtc_v2: boolean;
|
|
12
|
-
performant_table_charts: boolean;
|
|
13
|
-
chat_modes: boolean;
|
|
14
12
|
cache_panel: boolean;
|
|
15
13
|
external_agents: boolean;
|
|
16
14
|
server_side_pdf_export: boolean;
|
|
@@ -21,8 +19,6 @@ const defaultValues: ExperimentalFeatures = {
|
|
|
21
19
|
markdown: true,
|
|
22
20
|
wasm_layouts: false,
|
|
23
21
|
rtc_v2: false,
|
|
24
|
-
performant_table_charts: false,
|
|
25
|
-
chat_modes: false,
|
|
26
22
|
cache_panel: false,
|
|
27
23
|
external_agents: import.meta.env.DEV,
|
|
28
24
|
server_side_pdf_export: true,
|
|
@@ -51,7 +51,10 @@ export class UIElementRegistry {
|
|
|
51
51
|
|
|
52
52
|
set(objectId: UIElementId, value: ValueType): void {
|
|
53
53
|
if (this.entries.has(objectId)) {
|
|
54
|
-
|
|
54
|
+
Logger.debug(
|
|
55
|
+
"UIElementRegistry overwriting entry for objectId.",
|
|
56
|
+
objectId,
|
|
57
|
+
);
|
|
55
58
|
}
|
|
56
59
|
this.entries.set(objectId, {
|
|
57
60
|
objectId: objectId,
|
package/src/core/run-app.tsx
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { useAtomValue } from "jotai";
|
|
4
|
+
import { ArrowLeftIcon } from "lucide-react";
|
|
4
5
|
import { useEffect } from "react";
|
|
5
6
|
import { AppContainer } from "@/components/editor/app-container";
|
|
6
7
|
import { AppHeader } from "@/components/editor/header/app-header";
|
|
7
8
|
import { Spinner } from "@/components/icons/spinner";
|
|
9
|
+
import { buttonVariants } from "@/components/ui/button";
|
|
8
10
|
import { DelayMount } from "@/components/utils/delay-mount";
|
|
11
|
+
import { cn } from "@/utils/cn";
|
|
9
12
|
import { CellsRenderer } from "../components/editor/renderers/cells-renderer";
|
|
10
13
|
import { notebookIsRunningAtom, useCellActions } from "./cells/cells";
|
|
11
14
|
import type { AppConfig } from "./config/config-schema";
|
|
@@ -75,15 +78,19 @@ export const RunApp: React.FC<AppProps> = ({ appConfig }) => {
|
|
|
75
78
|
isRunning={isRunning}
|
|
76
79
|
width={appConfig.width}
|
|
77
80
|
>
|
|
78
|
-
<AppHeader connection={connection} className=
|
|
81
|
+
<AppHeader connection={connection} className="sm:pt-8">
|
|
79
82
|
{galleryHref && (
|
|
80
|
-
<div className="flex items-center px-6 pt-4">
|
|
83
|
+
<div className="flex items-center px-6 pt-4 sm:-mt-8">
|
|
81
84
|
<a
|
|
82
85
|
href={galleryHref}
|
|
83
86
|
aria-label="Back to gallery"
|
|
84
|
-
className=
|
|
87
|
+
className={cn(
|
|
88
|
+
buttonVariants({ variant: "text", size: "sm" }),
|
|
89
|
+
"gap-2 px-0 text-muted-foreground hover:text-foreground",
|
|
90
|
+
)}
|
|
85
91
|
>
|
|
86
|
-
<
|
|
92
|
+
<ArrowLeftIcon className="size-4" aria-hidden={true} />
|
|
93
|
+
<span>Back</span>
|
|
87
94
|
</a>
|
|
88
95
|
</div>
|
|
89
96
|
)}
|
|
@@ -6,7 +6,7 @@ import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
|
|
6
6
|
import { createLoader } from "@/plugins/impl/vega/vega-loader";
|
|
7
7
|
import { Functions } from "@/utils/functions";
|
|
8
8
|
import type { DataURLString } from "@/utils/json/base64";
|
|
9
|
-
import { patchFetch, patchVegaLoader } from "../files";
|
|
9
|
+
import { patchFetch, patchVegaLoader, resolveVirtualFileURL } from "../files";
|
|
10
10
|
|
|
11
11
|
// Start a tiny server to serve virtual files
|
|
12
12
|
const server = http.createServer((request, response) => {
|
|
@@ -350,6 +350,181 @@ describe("patchVegaLoader - loader.load", () => {
|
|
|
350
350
|
});
|
|
351
351
|
});
|
|
352
352
|
|
|
353
|
+
describe("resolveVirtualFileURL", () => {
|
|
354
|
+
// Mock URL.createObjectURL for jsdom environment
|
|
355
|
+
const mockBlobURLs = new Map<string, Blob>();
|
|
356
|
+
let blobCounter = 0;
|
|
357
|
+
|
|
358
|
+
beforeAll(() => {
|
|
359
|
+
URL.createObjectURL = vi.fn((blob: Blob) => {
|
|
360
|
+
const url = `blob:test-${blobCounter++}`;
|
|
361
|
+
mockBlobURLs.set(url, blob);
|
|
362
|
+
return url;
|
|
363
|
+
});
|
|
364
|
+
URL.revokeObjectURL = vi.fn((url: string) => {
|
|
365
|
+
mockBlobURLs.delete(url);
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
afterAll(() => {
|
|
370
|
+
mockBlobURLs.clear();
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
it("should return a blob URL for virtual files", () => {
|
|
374
|
+
const virtualFiles = {
|
|
375
|
+
"/@file/widget.js":
|
|
376
|
+
"data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQgeyByZW5kZXI6ICgpID0+IHt9IH0=" as DataURLString,
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
const result = resolveVirtualFileURL("/@file/widget.js", virtualFiles);
|
|
380
|
+
|
|
381
|
+
expect(result).toMatch(/^blob:/);
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
it("should return the original URL for non-virtual files", () => {
|
|
385
|
+
const virtualFiles = {};
|
|
386
|
+
|
|
387
|
+
const result = resolveVirtualFileURL(
|
|
388
|
+
"http://example.com/widget.js",
|
|
389
|
+
virtualFiles,
|
|
390
|
+
);
|
|
391
|
+
|
|
392
|
+
expect(result).toBe("http://example.com/widget.js");
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
it("should handle various URL formats", () => {
|
|
396
|
+
const virtualFiles = {
|
|
397
|
+
"/@file/module.js":
|
|
398
|
+
"data:text/javascript;base64,Y29uc29sZS5sb2coJ3Rlc3QnKQ==" as DataURLString,
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
const testUrls = [
|
|
402
|
+
"/@file/module.js",
|
|
403
|
+
"./@file/module.js",
|
|
404
|
+
"http://example.com/@file/module.js",
|
|
405
|
+
];
|
|
406
|
+
|
|
407
|
+
for (const url of testUrls) {
|
|
408
|
+
const result = resolveVirtualFileURL(url, virtualFiles);
|
|
409
|
+
expect(result).toMatch(/^blob:/);
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
it("should create blob URL with correct content", async () => {
|
|
414
|
+
const jsCode = "export default { render: () => {} }";
|
|
415
|
+
const base64Code = btoa(jsCode);
|
|
416
|
+
const virtualFiles = {
|
|
417
|
+
"/@file/test-module.js":
|
|
418
|
+
`data:text/javascript;base64,${base64Code}` as DataURLString,
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
const blobUrl = resolveVirtualFileURL(
|
|
422
|
+
"/@file/test-module.js",
|
|
423
|
+
virtualFiles,
|
|
424
|
+
);
|
|
425
|
+
|
|
426
|
+
expect(blobUrl).toMatch(/^blob:/);
|
|
427
|
+
expect(URL.createObjectURL).toHaveBeenCalled();
|
|
428
|
+
|
|
429
|
+
// Verify blob content through the mock
|
|
430
|
+
const blob = mockBlobURLs.get(blobUrl);
|
|
431
|
+
expect(blob).toBeDefined();
|
|
432
|
+
const text = await blob!.text();
|
|
433
|
+
expect(text).toBe(jsCode);
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
it("should handle file:// URLs with @file/ paths", () => {
|
|
437
|
+
const virtualFiles = {
|
|
438
|
+
"/@file/local-module.js":
|
|
439
|
+
"data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=" as DataURLString,
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
const result = resolveVirtualFileURL(
|
|
443
|
+
"file:///Users/test/@file/local-module.js",
|
|
444
|
+
virtualFiles,
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
expect(result).toMatch(/^blob:/);
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
it("should handle different MIME types", async () => {
|
|
451
|
+
const virtualFiles = {
|
|
452
|
+
"/@file/script.js":
|
|
453
|
+
"data:application/javascript;base64,Y29uc3QgeCA9IDE=" as DataURLString,
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
const blobUrl = resolveVirtualFileURL("/@file/script.js", virtualFiles);
|
|
457
|
+
|
|
458
|
+
// Should still be a valid blob URL
|
|
459
|
+
expect(blobUrl).toMatch(/^blob:/);
|
|
460
|
+
|
|
461
|
+
// Verify blob content through the mock
|
|
462
|
+
const blob = mockBlobURLs.get(blobUrl);
|
|
463
|
+
expect(blob).toBeDefined();
|
|
464
|
+
const text = await blob!.text();
|
|
465
|
+
expect(text).toBe("const x = 1");
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
it("should handle blob: base URIs correctly", () => {
|
|
469
|
+
// Mock document.baseURI to simulate blob: protocol
|
|
470
|
+
const originalBaseURI = document.baseURI;
|
|
471
|
+
Object.defineProperty(document, "baseURI", {
|
|
472
|
+
value: "blob:https://example.com/uuid",
|
|
473
|
+
configurable: true,
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
const virtualFiles = {
|
|
477
|
+
"/@file/blob-module.js":
|
|
478
|
+
"data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQge30=" as DataURLString,
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
const result = resolveVirtualFileURL("/@file/blob-module.js", virtualFiles);
|
|
482
|
+
|
|
483
|
+
expect(result).toMatch(/^blob:/);
|
|
484
|
+
|
|
485
|
+
// Restore original baseURI
|
|
486
|
+
Object.defineProperty(document, "baseURI", {
|
|
487
|
+
value: originalBaseURI,
|
|
488
|
+
configurable: true,
|
|
489
|
+
});
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
it("should handle data URLs with no explicit MIME type", async () => {
|
|
493
|
+
const virtualFiles = {
|
|
494
|
+
"/@file/generic.bin": "data:;base64,SGVsbG8gV29ybGQ=" as DataURLString,
|
|
495
|
+
};
|
|
496
|
+
|
|
497
|
+
const blobUrl = resolveVirtualFileURL("/@file/generic.bin", virtualFiles);
|
|
498
|
+
expect(blobUrl).toMatch(/^blob:/);
|
|
499
|
+
|
|
500
|
+
// Verify blob content through the mock
|
|
501
|
+
const blob = mockBlobURLs.get(blobUrl);
|
|
502
|
+
expect(blob).toBeDefined();
|
|
503
|
+
const text = await blob!.text();
|
|
504
|
+
expect(text).toBe("Hello World");
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
it("should match URLs with prefix paths before /@file/", async () => {
|
|
508
|
+
const virtualFiles = {
|
|
509
|
+
"/@file/4263-66-yUGhgQXp.js":
|
|
510
|
+
"data:application/javascript;base64,ZnVuY3Rpb24gcmVuZGVyKCkge30=" as DataURLString,
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
const blobUrl = resolveVirtualFileURL(
|
|
514
|
+
"https://molab.marimo.app/preview/@file/4263-66-yUGhgQXp.js",
|
|
515
|
+
virtualFiles,
|
|
516
|
+
);
|
|
517
|
+
|
|
518
|
+
expect(blobUrl).toMatch(/^blob:/);
|
|
519
|
+
|
|
520
|
+
// Verify blob content through the mock
|
|
521
|
+
const blob = mockBlobURLs.get(blobUrl);
|
|
522
|
+
expect(blob).toBeDefined();
|
|
523
|
+
const text = await blob!.text();
|
|
524
|
+
expect(text).toBe("function render() {}");
|
|
525
|
+
});
|
|
526
|
+
});
|
|
527
|
+
|
|
353
528
|
describe("maybeGetVirtualFile utility function", () => {
|
|
354
529
|
it("should handle URLs without leading dots correctly", async () => {
|
|
355
530
|
const virtualFiles = {
|
|
@@ -370,6 +545,25 @@ describe("maybeGetVirtualFile utility function", () => {
|
|
|
370
545
|
expect(text2).toBe("test");
|
|
371
546
|
});
|
|
372
547
|
|
|
548
|
+
it("should match URLs with prefix paths before /@file/", async () => {
|
|
549
|
+
const virtualFiles = {
|
|
550
|
+
"/@file/4263-66-yUGhgQXp.js":
|
|
551
|
+
"data:application/javascript;base64,ZnVuY3Rpb24gcmVuZGVyKCkge30=" as DataURLString,
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
const unpatch = patchFetch(virtualFiles);
|
|
555
|
+
|
|
556
|
+
// Test URL with a prefix path before /@file/
|
|
557
|
+
const response = await window.fetch(
|
|
558
|
+
"https://molab.marimo.app/preview/@file/4263-66-yUGhgQXp.js",
|
|
559
|
+
);
|
|
560
|
+
const text = await response.text();
|
|
561
|
+
|
|
562
|
+
expect(text).toBe("function render() {}");
|
|
563
|
+
|
|
564
|
+
unpatch();
|
|
565
|
+
});
|
|
566
|
+
|
|
373
567
|
it("should handle complex file:// URLs with nested paths", async () => {
|
|
374
568
|
const virtualFiles = {
|
|
375
569
|
"/@file/nested/data.json":
|
package/src/core/static/files.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import type { Loader } from "@/plugins/impl/vega/vega-loader";
|
|
4
|
+
import { deserializeBlob } from "@/utils/blob";
|
|
5
|
+
import type { DataURLString } from "@/utils/json/base64";
|
|
4
6
|
import { Logger } from "@/utils/Logger";
|
|
5
7
|
import { getStaticVirtualFiles } from "./static-state";
|
|
6
8
|
import type { StaticVirtualFiles } from "./types";
|
|
@@ -120,6 +122,24 @@ function withoutLeadingDot(path: string): string {
|
|
|
120
122
|
return path.startsWith(".") ? path.slice(1) : path;
|
|
121
123
|
}
|
|
122
124
|
|
|
125
|
+
/**
|
|
126
|
+
* Resolve a URL to a blob URL if it's a virtual file, for use with dynamic import().
|
|
127
|
+
* Unlike fetch, import() can't be patched, so we need to convert data URLs to blob URLs.
|
|
128
|
+
*
|
|
129
|
+
* @returns The original URL if not a virtual file, or a blob URL if it is
|
|
130
|
+
*/
|
|
131
|
+
export function resolveVirtualFileURL(
|
|
132
|
+
url: string,
|
|
133
|
+
files: StaticVirtualFiles = getStaticVirtualFiles(),
|
|
134
|
+
): string {
|
|
135
|
+
const vfile = maybeGetVirtualFile(url, files);
|
|
136
|
+
if (!vfile) {
|
|
137
|
+
return url;
|
|
138
|
+
}
|
|
139
|
+
const blob = deserializeBlob(vfile as DataURLString);
|
|
140
|
+
return URL.createObjectURL(blob);
|
|
141
|
+
}
|
|
142
|
+
|
|
123
143
|
function maybeGetVirtualFile(
|
|
124
144
|
url: string,
|
|
125
145
|
files: StaticVirtualFiles,
|
|
@@ -130,14 +150,11 @@ function maybeGetVirtualFile(
|
|
|
130
150
|
}
|
|
131
151
|
const pathname = new URL(url, base).pathname;
|
|
132
152
|
|
|
133
|
-
//
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
url = url.slice(indexOfFile);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
153
|
+
// Extract the /@file/... suffix from the URL or pathname
|
|
154
|
+
// This handles URLs like https://example.com/prefix/@file/foo.js
|
|
155
|
+
// or file:///path/to/@file/foo.js
|
|
156
|
+
const filePathFromUrl = extractFilePath(url);
|
|
157
|
+
const filePathFromPathname = extractFilePath(pathname);
|
|
141
158
|
|
|
142
159
|
// Few variations to grab the URL.
|
|
143
160
|
// This can happen if a static file was open at file:// or https://
|
|
@@ -145,6 +162,19 @@ function maybeGetVirtualFile(
|
|
|
145
162
|
files[url] ||
|
|
146
163
|
files[withoutLeadingDot(url)] ||
|
|
147
164
|
files[pathname] ||
|
|
148
|
-
files[withoutLeadingDot(pathname)]
|
|
165
|
+
files[withoutLeadingDot(pathname)] ||
|
|
166
|
+
(filePathFromUrl && files[filePathFromUrl]) ||
|
|
167
|
+
(filePathFromPathname && files[filePathFromPathname])
|
|
149
168
|
);
|
|
150
169
|
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Extract the /@file/... path from a URL string
|
|
173
|
+
*/
|
|
174
|
+
function extractFilePath(url: string): string | null {
|
|
175
|
+
const indexOfFile = url.indexOf("/@file/");
|
|
176
|
+
if (indexOfFile !== -1) {
|
|
177
|
+
return url.slice(indexOfFile);
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|