@marimo-team/frontend 0.20.5-dev5 → 0.20.5-dev51
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-DRjSVmK4.js → CellStatus-Ca1hP5DG.js} +1 -1
- package/dist/assets/{Combination-tjZP3FH6.js → Combination-DwGFeTHV.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-BmYLGaEV.js → ConnectedDataExplorerComponent-Bwz_rRfP.js} +1 -1
- package/dist/assets/{ErrorBoundary-dVj6GVNE.js → ErrorBoundary-BfF3Lb5I.js} +1 -1
- package/dist/assets/{ImperativeModal-CRNJOvqT.js → ImperativeModal-D-MySjpQ.js} +1 -1
- package/dist/assets/{JsonOutput-BW2KjuuO.js → JsonOutput-k4IrWNdN.js} +1 -1
- package/dist/assets/{LazyAnyLanguageCodeMirror-BdX_Y5NA.js → LazyAnyLanguageCodeMirror-DdXhXqHo.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-B0ZtYqUC.js → MarimoErrorOutput-DRIr_Q_Q.js} +1 -1
- package/dist/assets/{RenderHTML-qh-NzTWO.js → RenderHTML-Cd4FyS3e.js} +1 -1
- package/dist/assets/{add-cell-with-ai--4VOMvH8.js → add-cell-with-ai-MGYKaK6j.js} +28 -26
- package/dist/assets/add-connection-dialog-DcC53CRk.js +138 -0
- package/dist/assets/{agent-panel-Dcuv6ZGc.js → agent-panel-Cw7k_Vor.js} +15 -15
- package/dist/assets/ai-model-dropdown-CWIsr8AP.js +5 -0
- package/dist/assets/{alert-dialog-DsNfSYaw.js → alert-dialog-gkPQwL_j.js} +1 -1
- package/dist/assets/{any-language-editor-Drlg63ge.js → any-language-editor-OzhbvHaZ.js} +1 -1
- package/dist/assets/{app-config-button-bnipxY5L.js → app-config-button-CYw1Iska.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-KOgWVxSC.js → architectureDiagram-VXUJARFQ-CwrCrSJf.js} +1 -1
- package/dist/assets/{assertNever-Dw9aFN4h.js → assertNever-Dg4AnA3p.js} +1 -1
- package/dist/assets/{azure-Ddr1pZpW.js → azure-pNN_h2Da.js} +1 -1
- package/dist/assets/{blockDiagram-VD42YOAC-DjazSe-Z.js → blockDiagram-VD42YOAC-Ct5uVfbx.js} +1 -1
- package/dist/assets/{button-BmOH9agK.js → button-BwamPDJi.js} +1 -1
- package/dist/assets/{c4Diagram-YG6GDRKO-CkwpyaIV.js → c4Diagram-YG6GDRKO-S9lnZags.js} +1 -1
- package/dist/assets/{cache-panel-DRhH4wqG.js → cache-panel-DBdmDStL.js} +1 -1
- package/dist/assets/{capabilities-CeYo4YI0.js → capabilities-yFZOze7r.js} +1 -1
- package/dist/assets/{capitalize-irHJCpFh.js → capitalize-DeCS9UqV.js} +1 -1
- package/dist/assets/{cell-editor-BYvliobE.js → cell-editor-DqAzDonn.js} +6 -6
- package/dist/assets/{cell-link-B59Kn5nL.js → cell-link-B3M3sB3h.js} +1 -1
- package/dist/assets/{cells-CCtxWKxf.js → cells-sajCpDTm.js} +4 -4
- package/dist/assets/channel-Ph-lUzX5.js +1 -0
- package/dist/assets/{chat-display-Co6iGNSx.js → chat-display-CtHU9zRu.js} +1 -1
- package/dist/assets/{chat-panel-70sjqZuy.js → chat-panel-z3mwMMS4.js} +1 -1
- package/dist/assets/{chunk-5FQGJX7Z-BJDu6jwt.js → chunk-5FQGJX7Z-CxUvnXIp.js} +2 -2
- package/dist/assets/{chunk-ABZYJK2D-B4uBM2QW.js → chunk-ABZYJK2D-BbkOOdOY.js} +3 -3
- package/dist/assets/{chunk-ATLVNIR6-Du2yaFpm.js → chunk-ATLVNIR6-OBqZNgnu.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-CyuK4uRN.js → chunk-B4BG7PRW-CSEIK9Q4.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-BwWd5dH1.js → chunk-DI55MBZ5-Dk9w4OMu.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-KqUhNQvn.js → chunk-EXTU4WIE-CnJjAokB.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-C-v9pa_-.js → chunk-JA3XYJ7Z-eAjzY7aA.js} +1 -1
- package/dist/assets/{chunk-JZLCHNYA-DNCs8LM0.js → chunk-JZLCHNYA-kmQ6ZBey.js} +1 -1
- package/dist/assets/{chunk-N4CR4FBY-CT58_cui.js → chunk-N4CR4FBY-Id4KvZIh.js} +2 -2
- package/dist/assets/{chunk-QN33PNHL-BboxAxJa.js → chunk-QN33PNHL-BPuXNwnv.js} +1 -1
- package/dist/assets/{chunk-QXUST7PY-BlINr7uS.js → chunk-QXUST7PY-DQJyPxzg.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-DI9xzpBm.js → chunk-S3R3BYOJ-Ds4u094r.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-C4sxb3v-.js → chunk-TZMSLE5B-gAvFbCTg.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-D0DOYh6M.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-D_uMvsus.js +1 -0
- package/dist/assets/{code-block-37QAKDTI-Cl0NTdrS.js → code-block-37QAKDTI-BrNGyIm5.js} +1 -1
- package/dist/assets/{column-preview-Bd1U8JUS.js → column-preview-BMK4Ey6-.js} +1 -1
- package/dist/assets/command-4MXp8mZE.js +1 -0
- package/dist/assets/command-palette-D3rMc0xB.js +1 -0
- package/dist/assets/{common-CKAiz8xx.js → common-CJetJL3X.js} +1 -1
- package/dist/assets/{components-BZCdnYSp.js → components-ButU5ciW.js} +1 -1
- package/dist/assets/components-Dw1qsGKs.js +1 -0
- package/dist/assets/{config-D9X9QKiL.js → config-DPC-pWD_.js} +1 -1
- package/dist/assets/context-CIAP2NOh.js +1 -0
- package/dist/assets/context-aware-panel-DKhFsaDl.js +3 -0
- package/dist/assets/{copy-DMCkK2TI.js → copy-BV-TOnWw.js} +1 -1
- package/dist/assets/{copy-icon-6RnnFDPt.js → copy-icon-cuwSpt3D.js} +1 -1
- package/dist/assets/{createReducer-BcTiTw8T.js → createReducer-BrKCfm9t.js} +1 -1
- package/dist/assets/{dagre-6UL2VRFP-BrBSRtN5.js → dagre-6UL2VRFP-Ck_MBOZE.js} +1 -1
- package/dist/assets/{datasource-B2Fl6iYU.js → datasource-ej7nBVgG.js} +1 -1
- package/dist/assets/{dates-CzBDvj6R.js → dates-Bn5yLR20.js} +1 -1
- package/dist/assets/{dependency-graph-panel-Dk4iQGft.js → dependency-graph-panel-DtKdF1QY.js} +1 -1
- package/dist/assets/{diagram-PSM6KHXK-DPC85L-O.js → diagram-PSM6KHXK-KolOj00O.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-CRPLkmdi.js → diagram-QEK2KX5R-D-eN_rZ-.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-Bsc6mZUW.js → diagram-S2PKOQOG-DUI8YQgO.js} +1 -1
- package/dist/assets/{dialog-BXzvlof-.js → dialog-BDH0wAVp.js} +1 -1
- package/dist/assets/dist-303qfNXF.js +1 -0
- package/dist/assets/dist-B6vIO6Qr.js +1 -0
- package/dist/assets/{dist-CEQIJ2pn.js → dist-B7Qj0ClH.js} +1 -1
- package/dist/assets/{dist-CIU0Lack.js → dist-BEXlfh-0.js} +1 -1
- package/dist/assets/dist-BHV0ZwvR.js +1 -0
- package/dist/assets/{dist-C30-xTdI.js → dist-BIYYQefO.js} +1 -1
- package/dist/assets/{dist-Dq_iQ08e.js → dist-BKh0lnhr.js} +1 -1
- package/dist/assets/{dist-CU-Ty5ht.js → dist-BUr9VSV4.js} +1 -1
- package/dist/assets/{dist-DfBASypd.js → dist-B_Cajyw9.js} +1 -1
- package/dist/assets/dist-BbkZJt99.js +1 -0
- package/dist/assets/{dist-BjnzbwCx.js → dist-BfSn8-kc.js} +1 -1
- package/dist/assets/{dist-DQgu-tmt.js → dist-BhSY2wGF.js} +1 -1
- package/dist/assets/{dist-BTEPE6IB.js → dist-BosZYCjH.js} +1 -1
- package/dist/assets/dist-Br9y_e1t.js +1 -0
- package/dist/assets/{dist-Q0--6AMp.js → dist-BrDOLuMx.js} +1 -1
- package/dist/assets/dist-BvqRyXNf.js +1 -0
- package/dist/assets/dist-C-tYBacB.js +1 -0
- package/dist/assets/{dist-51xFOPFs.js → dist-C1HCH_0P.js} +1 -1
- package/dist/assets/{dist-DFv45CtW.js → dist-C1g0ZQqM.js} +1 -1
- package/dist/assets/dist-C88PeA-j.js +1 -0
- package/dist/assets/{dist-i0ilBbwP.js → dist-CJR8uxqq.js} +1 -1
- package/dist/assets/{dist-Dg61kQNR.js → dist-Cn9Q-NAM.js} +1 -1
- package/dist/assets/{dist-y6DTGoUH.js → dist-CsQrBXB1.js} +1 -1
- package/dist/assets/dist-DHn8amAr.js +1 -0
- package/dist/assets/{dist-CqnPIH_S.js → dist-DIR_AViv.js} +1 -1
- package/dist/assets/{dist-CIuh_TIk.js → dist-DJUbf5IV.js} +1 -1
- package/dist/assets/{dist-Bq1BhBMA.js → dist-DKPpxz2S.js} +1 -1
- package/dist/assets/{dist-Bbmd3uCi.js → dist-D_4TSZPK.js} +1 -1
- package/dist/assets/{dist-BjtLy-VA.js → dist-Da-vP8dl.js} +1 -1
- package/dist/assets/dist-Ddx3eonB.js +1 -0
- package/dist/assets/dist-Doi_61Lm.js +1 -0
- package/dist/assets/dist-Dr9qtoId.js +13 -0
- package/dist/assets/{dist-DwtQnQ8D.js → dist-DxETk19L.js} +1 -1
- package/dist/assets/dist-EtvDr9lo.js +1 -0
- package/dist/assets/dist-GR3Is1gt.js +1 -0
- package/dist/assets/dist-JYMkroTn.js +1 -0
- package/dist/assets/{dist-odxAaH5Z.js → dist-MzyXnvzy.js} +1 -1
- package/dist/assets/dist-QoV0fohO.js +1 -0
- package/dist/assets/dist-SDO5K7hA.js +3 -0
- package/dist/assets/dist-U5wHOgW5.js +1 -0
- package/dist/assets/{dist-DGPCoel5.js → dist-W-yb-STV.js} +1 -1
- package/dist/assets/dist-_p_c6cqQ.js +1 -0
- package/dist/assets/dist-bg6gyVcz.js +1 -0
- package/dist/assets/dist-doJt8agZ.js +1 -0
- package/dist/assets/{dist-DVh79TGS.js → dist-sN-Hs-ZP.js} +1 -1
- package/dist/assets/{dist-6QbI72oM.js → dist-wBVaU_K6.js} +1 -1
- package/dist/assets/{dist-C-_581uo.js → dist-ykiUNgjx.js} +1 -1
- package/dist/assets/{documentation-panel-DSqxsEBu.js → documentation-panel-DqdSQnFI.js} +1 -1
- package/dist/assets/download-CbJRMQgL.js +9 -0
- package/dist/assets/{dropdown-menu-CKhrfxsx.js → dropdown-menu-B9n5pFQo.js} +1 -1
- package/dist/assets/edit-page-PKuq51gy.js +13 -0
- package/dist/assets/{en-US-DBqDb4Nb.js → en-US-Cklu1TV7.js} +1 -1
- package/dist/assets/{erDiagram-Q2GNP2WA-B7kZxL-n.js → erDiagram-Q2GNP2WA-Da7rk8Zl.js} +1 -1
- package/dist/assets/{error-banner-R2OkQKR0.js → error-banner-C6jutgjJ.js} +1 -1
- package/dist/assets/{error-panel-CtyexAW6.js → error-panel-BYtDTl23.js} +1 -1
- package/dist/assets/{es-1hBRXVlM.js → es-DPbYTD70.js} +1 -1
- package/dist/assets/{esm-BQUzYly2.js → esm-ALGIkfiY.js} +1 -1
- package/dist/assets/{esm-BTyesPLl.js → esm-CzZMpkrw.js} +1 -1
- package/dist/assets/{field-DGtw6Lae.js → field-yBJIXwiI.js} +1 -1
- package/dist/assets/file-explorer-panel-DThRnP8y.js +26 -0
- package/dist/assets/{file-video-camera-Fa5c_iPb.js → file-headphone--dkf-Opf.js} +1 -1
- package/dist/assets/file-icons-D11ajeAb.js +1 -0
- package/dist/assets/{floating-outline-BWK_nLJy.js → floating-outline-CfXtjtdU.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-DR-64sse.js → flowDiagram-NV44I4VS-CCFdO5FV.js} +1 -1
- package/dist/assets/{focus-ShrwcKIv.js → focus-BGRfO0DP.js} +1 -1
- package/dist/assets/{form-B7_NRa34.js → form-CTEi2k53.js} +1 -1
- package/dist/assets/{formats-C3K3rlAZ.js → formats-BR4SCgxc.js} +1 -1
- package/dist/assets/{formatting-8bP-RDnl.js → formatting-lD3DPwpf.js} +1 -1
- package/dist/assets/{gallery-page-DRBZRnaN.js → gallery-page-DOD9mSsH.js} +1 -1
- package/dist/assets/{ganttDiagram-JELNMOA3-BWuQMrGd.js → ganttDiagram-JELNMOA3-DWxOnZsV.js} +1 -1
- package/dist/assets/{gitGraphDiagram-V2S2FVAM-Mr5-PYgM.js → gitGraphDiagram-V2S2FVAM-DU44_-Xu.js} +1 -1
- package/dist/assets/{glide-data-editor-BurnHmgR.js → glide-data-editor-DRlmXGoQ.js} +1 -1
- package/dist/assets/{globals-BlB0Ba6E.js → globals-GeuFunZz.js} +1 -1
- package/dist/assets/home-page-B9y95YIB.js +4 -0
- package/dist/assets/{hooks-BllYlfDO.js → hooks-C5nZgXkJ.js} +1 -1
- package/dist/assets/html-to-image-DVYcIaht.js +2 -0
- package/dist/assets/image-BTHu7CJw.js +1 -0
- package/dist/assets/index-BVVET4VT.js +38 -0
- package/dist/assets/index-CDgqxTU8.css +2 -0
- package/dist/assets/{infoDiagram-HS3SLOUP-Bs8aKpuZ.js → infoDiagram-HS3SLOUP-Cj1UhRNa.js} +1 -1
- package/dist/assets/input-fga1V90B.js +1 -0
- package/dist/assets/{isValid-D3F4nmET.js → isValid-BMlg3JzV.js} +1 -1
- package/dist/assets/{journeyDiagram-XKPGCS4Q-aCZRxOHn.js → journeyDiagram-XKPGCS4Q-Bp2zIM8b.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-BlOJJ-5B.js → kanban-definition-3W4ZIXB7-BO9Q_Cij.js} +1 -1
- package/dist/assets/katex-BalO4WMU.js +1 -0
- package/dist/assets/{kiosk-mode-BBqwMND1.js → kiosk-mode-DIRLRtqK.js} +1 -1
- package/dist/assets/{label-DmqkEXI4.js → label-CDwJXweF.js} +1 -1
- package/dist/assets/layout-CzqPAs7A.js +5 -0
- package/dist/assets/{links-syPBpTLO.js → links-BzXEG-CV.js} +1 -1
- package/dist/assets/{logs-panel-BHFI-jG1.js → logs-panel-BruxLxKQ.js} +1 -1
- package/dist/assets/{maps-8VTEe-0T.js → maps-BkFOprnj.js} +1 -1
- package/dist/assets/{marimo-icons-BDAuIiW5.js → marimo-icons-BmYE_Rrf.js} +1 -1
- package/dist/assets/{markdown-renderer-B6a5ZAwT.js → markdown-renderer-DzFSmPG9.js} +4 -4
- package/dist/assets/{menu-items-Bs2e3wuf.js → menu-items-BMC2ADBp.js} +1 -1
- package/dist/assets/mermaid-4DMBBIKO-DeLDp2wT.js +1 -0
- package/dist/assets/{mermaid-Cq8ttjss.js → mermaid-BIylv4-j.js} +3 -3
- package/dist/assets/{mhchem-BJZpIgRF.js → mhchem-DqNBdKjC.js} +1 -1
- package/dist/assets/{mindmap-definition-VGOIOE7T-Dt6ZRws3.js → mindmap-definition-VGOIOE7T-Bm7mGr7S.js} +1 -1
- package/dist/assets/{multi-map-kCmlVJ-5.js → multi-map-BfZ54ByO.js} +1 -1
- package/dist/assets/{name-cell-input-BRHlWy2Y.js → name-cell-input-CpRhYTIx.js} +1 -1
- package/dist/assets/{numbers-44Cj1Me-.js → numbers-CKtO-FK3.js} +1 -1
- package/dist/assets/{outline-panel-uyRmU3NX.js → outline-panel-BqrPSspB.js} +1 -1
- package/dist/assets/{packages-panel-D8d46YWc.js → packages-panel-BiajqQvB.js} +1 -1
- package/dist/assets/{panels-BN71Cgvz.js → panels-D3dh5STn.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-3GEmpmfg.js → pieDiagram-ADFJNKIX-B5etm5AZ.js} +1 -1
- package/dist/assets/{popover-Cvl9xY6R.js → popover-9andRQnP.js} +1 -1
- package/dist/assets/{process-output-4yip1nZE.js → process-output-BdIP7Zxk.js} +1 -1
- package/dist/assets/purify.es-ByGlPBcv.js +2 -0
- package/dist/assets/{quadrantDiagram-AYHSOK5B-Dela17qb.js → quadrantDiagram-AYHSOK5B-D0Rr2ZdK.js} +1 -1
- package/dist/assets/{readonly-python-code-DmjbJYSq.js → readonly-python-code-Cb4NuSjW.js} +1 -1
- package/dist/assets/{renderShortcut-BJEd-iA7.js → renderShortcut-rgxL53rN.js} +1 -1
- package/dist/assets/{requirementDiagram-UZGBJVZJ-CjimGyZ2.js → requirementDiagram-UZGBJVZJ-BEWon1Tt.js} +1 -1
- package/dist/assets/{run-page-aSmNe5eg.js → run-page-BOSNHthW.js} +1 -1
- package/dist/assets/{runs-BMpRKQKC.js → runs-B4QSIylk.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-CBE98yUR.js → sankeyDiagram-TZEHDZUN-CVIOA3fV.js} +1 -1
- package/dist/assets/{scratchpad-panel-B3K7MZ0B.js → scratchpad-panel-D3QZNdMZ.js} +1 -1
- package/dist/assets/{secrets-panel-C2n4dedt.js → secrets-panel-Cyl6d2pO.js} +1 -1
- package/dist/assets/{select-DygbgNTD.js → select-Dc75-Yj7.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-DSgG0Zyn.js → sequenceDiagram-WL72ISMW-V72bggkN.js} +1 -1
- package/dist/assets/{session-DnMOyddG.js → session-DSf7Qrgn.js} +1 -1
- package/dist/assets/session-panel-Bhb6XXzp.js +1 -0
- package/dist/assets/{share-sD4fbzpH.js → share-BnVW-VUF.js} +1 -1
- package/dist/assets/{slides-component-B6-Jz3p0.js → slides-component-6o8TgsRv.js} +1 -1
- package/dist/assets/{snippets-panel-Bzz2M38q.js → snippets-panel-DiEtOai8.js} +1 -1
- package/dist/assets/{spec-Be-iRLAY.js → spec-C0oVDNlg.js} +1 -1
- package/dist/assets/{state-D2jTOQOG.js → state-CTm70Wwu.js} +1 -1
- package/dist/assets/{state-Xu6bDsJl.js → state-Cxaj2QUK.js} +1 -1
- package/dist/assets/state-D3wamK_H.js +1 -0
- package/dist/assets/{stateDiagram-FKZM4ZOC-By2PSLiJ.js → stateDiagram-FKZM4ZOC-BunlPmnb.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-DfBIf_A0.js +1 -0
- package/dist/assets/{switch-tdkZNn4k.js → switch-CS0hWCvD.js} +1 -1
- package/dist/assets/{terminal-CGmjeYqa.js → terminal-BbWefaub.js} +1 -1
- package/dist/assets/{timeline-definition-IT6M3QCI-rq80_nVa.js → timeline-definition-IT6M3QCI-05UkZ9r0.js} +1 -1
- package/dist/assets/{toggle-BhEcsHTu.js → toggle-DM8DJDvs.js} +1 -1
- package/dist/assets/{tooltip-DOQlecCr.js → tooltip-C8P6iW54.js} +1 -1
- package/dist/assets/{tooltip-D_HRHf_c.js → tooltip-Cm9o0BVX.js} +1 -1
- package/dist/assets/{tracing-BZx6nEPl.js → tracing-LTYgekaQ.js} +1 -1
- package/dist/assets/{tracing-panel-Dz9mRjXj.js → tracing-panel-D2BfFVsK.js} +2 -2
- package/dist/assets/{tree-D0AxVJ_I.js → tree-v_y-OV5p.js} +3 -3
- package/dist/assets/{useAddCell-BRlAqdmq.js → useAddCell-CT_muue_.js} +1 -1
- package/dist/assets/useBoolean-DnQsu6rx.js +1 -0
- package/dist/assets/useCellActionButton-CEVjt2wX.js +1 -0
- package/dist/assets/{useDateFormatter-CmtFqjqu.js → useDateFormatter-CpE7XQLs.js} +1 -1
- package/dist/assets/{useDeleteCell-BAfiIxKf.js → useDeleteCell-BrQJSycU.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-jTu3L200.js → useDependencyPanelTab-BDafWVCa.js} +1 -1
- package/dist/assets/useEventListener-DP66hBzA.js +1 -0
- package/dist/assets/{useIframeCapabilities-T3alJPda.js → useIframeCapabilities-BhFmTPLk.js} +1 -1
- package/dist/assets/{useInstallPackage-jGxNsOWc.js → useInstallPackage-BzZRIkCo.js} +1 -1
- package/dist/assets/{useInterval-lamrIyKJ.js → useInterval-Ct4FP8Tw.js} +1 -1
- package/dist/assets/{useLifecycle-BDXC6oVR.js → useLifecycle-BRklGKFJ.js} +1 -1
- package/dist/assets/useNotebookActions-aZAKukNN.js +1 -0
- package/dist/assets/{useNumberFormatter-DMA_kIIZ.js → useNumberFormatter-DbDKSvEd.js} +1 -1
- package/dist/assets/usePress-F6Xaj1I9.js +7 -0
- package/dist/assets/{useSplitCell-CB32IpFa.js → useSplitCell-9AApJTMi.js} +1 -1
- package/dist/assets/{useTheme-CwdqVOYu.js → useTheme-CDtvl_DM.js} +1 -1
- package/dist/assets/{utils-CORJ8yYa.js → utils-C1ZciZbF.js} +1 -1
- package/dist/assets/{vega-component-BLW2fY7v.js → vega-component-XTQy2XUE.js} +1 -1
- package/dist/assets/{write-secret-modal-DuxmGjDn.js → write-secret-modal-CDf1k83O.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-Bnjm0Q9u.js → xychartDiagram-PRI3JC2R-CwD62vJ-.js} +1 -1
- package/dist/index.html +113 -112
- package/package.json +9 -9
- package/src/__mocks__/requests.ts +1 -0
- package/src/components/app-config/ai-config.tsx +10 -0
- package/src/components/datasources/components.tsx +3 -6
- package/src/components/datasources/datasources.tsx +8 -21
- package/src/components/editor/actions/types.ts +6 -1
- package/src/components/editor/actions/useNotebookActions.tsx +50 -13
- package/src/components/editor/chrome/types.ts +17 -0
- package/src/components/editor/controls/command-palette.tsx +7 -0
- package/src/components/editor/controls/keyboard-shortcuts.tsx +3 -1
- package/src/components/editor/file-tree/file-explorer.tsx +48 -62
- package/src/components/editor/file-tree/file-icons.tsx +132 -0
- package/src/components/editor/file-tree/file-viewer.tsx +1 -1
- package/src/components/editor/file-tree/tree-actions.tsx +107 -0
- package/src/components/editor/file-tree/types.ts +2 -96
- package/src/components/editor/header/filename-input.tsx +4 -1
- package/src/components/icons/marimo-icons.tsx +2 -2
- package/src/components/pages/home-page.tsx +5 -5
- package/src/components/storage/__tests__/storage-snippets.test.ts +253 -0
- package/src/components/storage/components.tsx +0 -38
- package/src/components/storage/storage-file-viewer.tsx +1 -1
- package/src/components/storage/storage-inspector.tsx +65 -50
- package/src/components/storage/storage-snippets.ts +67 -0
- package/src/components/ui/command.tsx +2 -0
- package/src/components/ui/links.tsx +1 -0
- package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +206 -0
- package/src/core/ai/tools/run-cells-tool.ts +75 -40
- package/src/core/hotkeys/__tests__/hotkeys.test.ts +64 -1
- package/src/core/hotkeys/hotkeys.ts +29 -3
- package/src/core/islands/bridge.ts +1 -0
- package/src/core/network/__tests__/requests-network.test.ts +17 -0
- package/src/core/network/requests-lazy.ts +1 -0
- package/src/core/network/requests-network.ts +9 -0
- package/src/core/network/requests-static.ts +1 -0
- package/src/core/network/requests-toasting.tsx +1 -0
- package/src/core/network/types.ts +1 -0
- package/src/core/storage/__tests__/state.test.ts +1 -0
- package/src/core/wasm/bridge.ts +1 -0
- package/src/plugins/impl/FileBrowserPlugin.tsx +4 -4
- package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +309 -0
- package/src/plugins/impl/mpl-interactive/__tests__/mpl-websocket-shim.test.ts +110 -0
- package/src/plugins/impl/mpl-interactive/mpl-websocket-shim.ts +57 -0
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +8 -2
- package/src/plugins/plugins.ts +2 -0
- package/src/utils/__tests__/filenames.test.ts +7 -0
- package/src/utils/__tests__/smartMatch.test.ts +61 -0
- package/src/utils/filenames.ts +3 -0
- package/src/utils/smartMatch.ts +62 -0
- package/dist/assets/add-connection-dialog-9CzjZlY9.js +0 -138
- package/dist/assets/ai-model-dropdown-C3Y44M85.js +0 -5
- package/dist/assets/channel-k8gMdpPa.js +0 -1
- package/dist/assets/classDiagram-2ON5EDUG-DDFZaNDy.js +0 -1
- package/dist/assets/classDiagram-v2-WZHVMYZB-CEbmnHKU.js +0 -1
- package/dist/assets/command-DQqqP-WF.js +0 -1
- package/dist/assets/command-palette-CSEjt4e_.js +0 -1
- package/dist/assets/components-CF9x5raB.js +0 -1
- package/dist/assets/context-B1_BdDTF.js +0 -1
- package/dist/assets/context-aware-panel-C1uqjYZU.js +0 -3
- package/dist/assets/dist-B8osAFLA.js +0 -1
- package/dist/assets/dist-BYtATjzn.js +0 -1
- package/dist/assets/dist-Bb40mZM7.js +0 -1
- package/dist/assets/dist-C3z6pMsI.js +0 -1
- package/dist/assets/dist-CA6NQs25.js +0 -1
- package/dist/assets/dist-CCW85AP3.js +0 -1
- package/dist/assets/dist-CCnNQVp_.js +0 -1
- package/dist/assets/dist-CRVvx8nD.js +0 -1
- package/dist/assets/dist-CdZb2Grj.js +0 -1
- package/dist/assets/dist-ClLHDbNP.js +0 -1
- package/dist/assets/dist-CtKltiBh.js +0 -1
- package/dist/assets/dist-D-_c0KFz.js +0 -1
- package/dist/assets/dist-D6kWc2hF.js +0 -1
- package/dist/assets/dist-D89dID68.js +0 -1
- package/dist/assets/dist-DU2EJ7el.js +0 -3
- package/dist/assets/dist-DUY6xZX8.js +0 -13
- package/dist/assets/dist-DVHYieHl.js +0 -1
- package/dist/assets/dist-Q0mIwD1V.js +0 -1
- package/dist/assets/dist-aBuSkHFR.js +0 -1
- package/dist/assets/dist-gm5AeuIM.js +0 -1
- package/dist/assets/dist-p-IM2PMR.js +0 -1
- package/dist/assets/download-BTm4CTKr.js +0 -9
- package/dist/assets/edit-page-goj7Ea_b.js +0 -13
- package/dist/assets/file-code-D9wtWSiR.js +0 -1
- package/dist/assets/file-explorer-panel-UQLj2Iiw.js +0 -1
- package/dist/assets/home-page-BXQp6S6h.js +0 -4
- package/dist/assets/html-to-image-b9BimK8l.js +0 -2
- package/dist/assets/index-Dt_vPSmJ.js +0 -38
- package/dist/assets/index-Dzwe9vKA.css +0 -2
- package/dist/assets/input-BPldEXfy.js +0 -1
- package/dist/assets/katex-YDobqqVd.js +0 -1
- package/dist/assets/layout-DcfIrJXW.js +0 -5
- package/dist/assets/mermaid-4DMBBIKO-C0QemhGt.js +0 -1
- package/dist/assets/purify.es-CPplrWRQ.js +0 -2
- package/dist/assets/session-panel-B5JEvDHe.js +0 -1
- package/dist/assets/state-B_fNn_z_.js +0 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-ct96_mle.js +0 -1
- package/dist/assets/types-DFiYrN2w.js +0 -17
- package/dist/assets/useBoolean-eWwLICkT.js +0 -1
- package/dist/assets/useCellActionButton-DFgACqVf.js +0 -1
- package/dist/assets/useEventListener-CjXriKgk.js +0 -1
- package/dist/assets/useNotebookActions-uvZlYyaW.js +0 -1
- package/dist/assets/usePress-DsLftN-x.js +0 -7
- /package/dist/assets/{alert-0YTlkh9P.js → alert-Bs8tbZo_.js} +0 -0
- /package/dist/assets/{bot-message-square-BzawfL5p.js → bot-message-square-B6Ribt4T.js} +0 -0
- /package/dist/assets/{chart-no-axes-column-F2DZENgf.js → chart-no-axes-column-lutwx354.js} +0 -0
- /package/dist/assets/{check-BnZGcuDh.js → check-CLyxVhzW.js} +0 -0
- /package/dist/assets/{chevron-right-_z3dkNFy.js → chevron-right-CerQ2vwn.js} +0 -0
- /package/dist/assets/{circle-check-CceJVe3L.js → circle-check-pDte1YCV.js} +0 -0
- /package/dist/assets/{circle-play-n0LbT9bZ.js → circle-play-BIB-Cffm.js} +0 -0
- /package/dist/assets/{circle-plus-DfyUnSPr.js → circle-plus-dmNAbVKB.js} +0 -0
- /package/dist/assets/{clipboard-paste-DVaOjTFK.js → clipboard-paste-BmDjmNT1.js} +0 -0
- /package/dist/assets/{code-xml-BMv1Dtd2.js → code-xml-BTXLGjZa.js} +0 -0
- /package/dist/assets/{copy-CAR4dOiD.js → copy-D9hWa8QN.js} +0 -0
- /package/dist/assets/{database-zap-B3efE3T2.js → database-zap-D0NXTAF_.js} +0 -0
- /package/dist/assets/{download-BG-iMGgV.js → download-DZkvg-PF.js} +0 -0
- /package/dist/assets/{ellipsis-CnEpKti0.js → ellipsis-DrLBOiKN.js} +0 -0
- /package/dist/assets/{ellipsis-vertical-CqcBoxmi.js → ellipsis-vertical-41ufYa9D.js} +0 -0
- /package/dist/assets/{eye-off-DgTL09j7.js → eye-off-L0XTXq09.js} +0 -0
- /package/dist/assets/{file-DVwc11C3.js → file-C9ICshU0.js} +0 -0
- /package/dist/assets/{file-plus-corner-BRwJx0yp.js → file-plus-corner-BxixWiXP.js} +0 -0
- /package/dist/assets/{katex-rvFxOCU-.js → katex-FSdXOW5Y.js} +0 -0
- /package/dist/assets/{kbd-CVbqSkT8.js → kbd-Rn7tWvNg.js} +0 -0
- /package/dist/assets/{links-BKV6zi_7.js → links-MkDbmF2p.js} +0 -0
- /package/dist/assets/{table-CeILsq6V.js → table-I8E-Bucv.js} +0 -0
- /package/dist/assets/{toDate-DDAiY7kz.js → toDate-QgjqxhRI.js} +0 -0
- /package/dist/assets/{useAsyncData-DVm0BCFt.js → useAsyncData-CI3ntihq.js} +0 -0
- /package/dist/assets/{x-yqLqiq5Q.js → x-Bz99Qj3l.js} +0 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
FileAudioIcon,
|
|
5
|
+
FileCodeIcon,
|
|
6
|
+
FileIcon,
|
|
7
|
+
FileJsonIcon,
|
|
8
|
+
FileSpreadsheetIcon,
|
|
9
|
+
FileTextIcon,
|
|
10
|
+
FileVideoIcon,
|
|
11
|
+
FolderArchiveIcon,
|
|
12
|
+
FolderIcon,
|
|
13
|
+
ImageIcon,
|
|
14
|
+
type LucideIcon,
|
|
15
|
+
} from "lucide-react";
|
|
16
|
+
import { cn } from "@/utils/cn";
|
|
17
|
+
|
|
18
|
+
export type FileIconType =
|
|
19
|
+
| "directory"
|
|
20
|
+
| "python"
|
|
21
|
+
| "code"
|
|
22
|
+
| "json"
|
|
23
|
+
| "text"
|
|
24
|
+
| "image"
|
|
25
|
+
| "audio"
|
|
26
|
+
| "video"
|
|
27
|
+
| "data"
|
|
28
|
+
| "pdf"
|
|
29
|
+
| "zip"
|
|
30
|
+
| "unknown";
|
|
31
|
+
|
|
32
|
+
const EXT_TO_TYPE: Record<string, FileIconType> = {
|
|
33
|
+
py: "python",
|
|
34
|
+
// Text / docs
|
|
35
|
+
txt: "text",
|
|
36
|
+
md: "text",
|
|
37
|
+
qmd: "text",
|
|
38
|
+
log: "text",
|
|
39
|
+
// Images
|
|
40
|
+
png: "image",
|
|
41
|
+
jpg: "image",
|
|
42
|
+
jpeg: "image",
|
|
43
|
+
gif: "image",
|
|
44
|
+
svg: "image",
|
|
45
|
+
webp: "image",
|
|
46
|
+
// Data / spreadsheets
|
|
47
|
+
csv: "data",
|
|
48
|
+
parquet: "data",
|
|
49
|
+
arrow: "data",
|
|
50
|
+
xlsx: "data",
|
|
51
|
+
// JSON
|
|
52
|
+
json: "json",
|
|
53
|
+
// Code
|
|
54
|
+
js: "code",
|
|
55
|
+
ts: "code",
|
|
56
|
+
tsx: "code",
|
|
57
|
+
html: "code",
|
|
58
|
+
css: "code",
|
|
59
|
+
toml: "code",
|
|
60
|
+
yaml: "code",
|
|
61
|
+
yml: "code",
|
|
62
|
+
wasm: "code",
|
|
63
|
+
// Audio
|
|
64
|
+
mp3: "audio",
|
|
65
|
+
m4a: "audio",
|
|
66
|
+
ogg: "audio",
|
|
67
|
+
wav: "audio",
|
|
68
|
+
// Video
|
|
69
|
+
mp4: "video",
|
|
70
|
+
m4v: "video",
|
|
71
|
+
mpeg: "video",
|
|
72
|
+
webm: "video",
|
|
73
|
+
mkv: "video",
|
|
74
|
+
// PDF
|
|
75
|
+
pdf: "pdf",
|
|
76
|
+
// Archives
|
|
77
|
+
zip: "zip",
|
|
78
|
+
tar: "zip",
|
|
79
|
+
gz: "zip",
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export function guessFileIconType(name: string): FileIconType {
|
|
83
|
+
const ext = name.split(".").pop()?.toLowerCase();
|
|
84
|
+
if (!ext) {
|
|
85
|
+
return "unknown";
|
|
86
|
+
}
|
|
87
|
+
return EXT_TO_TYPE[ext] ?? "unknown";
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export const FILE_ICON: Record<FileIconType, LucideIcon> = {
|
|
91
|
+
directory: FolderIcon,
|
|
92
|
+
python: FileCodeIcon,
|
|
93
|
+
code: FileCodeIcon,
|
|
94
|
+
json: FileJsonIcon,
|
|
95
|
+
text: FileTextIcon,
|
|
96
|
+
image: ImageIcon,
|
|
97
|
+
audio: FileAudioIcon,
|
|
98
|
+
video: FileVideoIcon,
|
|
99
|
+
data: FileSpreadsheetIcon,
|
|
100
|
+
pdf: FileTextIcon,
|
|
101
|
+
zip: FolderArchiveIcon,
|
|
102
|
+
unknown: FileIcon,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export const FILE_ICON_COLOR: Record<FileIconType, string> = {
|
|
106
|
+
directory: "text-amber-500",
|
|
107
|
+
python: "text-blue-500",
|
|
108
|
+
code: "text-blue-500",
|
|
109
|
+
json: "text-blue-500",
|
|
110
|
+
text: "text-muted-foreground",
|
|
111
|
+
image: "text-purple-500",
|
|
112
|
+
audio: "text-orange-500",
|
|
113
|
+
video: "text-orange-500",
|
|
114
|
+
data: "text-green-500",
|
|
115
|
+
pdf: "text-red-500",
|
|
116
|
+
zip: "text-muted-foreground",
|
|
117
|
+
unknown: "text-muted-foreground",
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Render a colored file-type icon for a given filename.
|
|
122
|
+
* Pass `className` to control size (defaults to `h-3.5 w-3.5`).
|
|
123
|
+
*/
|
|
124
|
+
export function renderFileIcon(
|
|
125
|
+
name: string,
|
|
126
|
+
className?: string,
|
|
127
|
+
): React.ReactNode {
|
|
128
|
+
const type = guessFileIconType(name);
|
|
129
|
+
const Icon = FILE_ICON[type];
|
|
130
|
+
const color = FILE_ICON_COLOR[type];
|
|
131
|
+
return <Icon className={cn("h-3.5 w-3.5 shrink-0", color, className)} />;
|
|
132
|
+
}
|
|
@@ -166,7 +166,7 @@ export const FileViewer: React.FC<Props> = ({ file, onOpenNotebook }) => {
|
|
|
166
166
|
</Tooltip>
|
|
167
167
|
<Tooltip content={renderShortcut("global.save")}>
|
|
168
168
|
<Button
|
|
169
|
-
variant=
|
|
169
|
+
variant="text"
|
|
170
170
|
size="xs"
|
|
171
171
|
onClick={handleSaveFile}
|
|
172
172
|
disabled={internalValue === data.contents}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ChevronRightIcon,
|
|
5
|
+
MoreVerticalIcon,
|
|
6
|
+
RefreshCwIcon,
|
|
7
|
+
} from "lucide-react";
|
|
8
|
+
import React, { useCallback, useState } from "react";
|
|
9
|
+
import { Button } from "@/components/ui/button";
|
|
10
|
+
import { Tooltip } from "@/components/ui/tooltip";
|
|
11
|
+
import { cn } from "@/utils/cn";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Animated chevron for tree expand/collapse.
|
|
15
|
+
* Rotates 90° when `isExpanded` is true.
|
|
16
|
+
*/
|
|
17
|
+
export const TreeChevron: React.FC<{
|
|
18
|
+
isExpanded: boolean;
|
|
19
|
+
className?: string;
|
|
20
|
+
}> = ({ isExpanded, className }) => (
|
|
21
|
+
<ChevronRightIcon
|
|
22
|
+
className={cn(
|
|
23
|
+
"shrink-0 transition-transform",
|
|
24
|
+
isExpanded && "rotate-90",
|
|
25
|
+
className,
|
|
26
|
+
)}
|
|
27
|
+
/>
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Refresh button that briefly spins its icon when clicked.
|
|
32
|
+
* Keeps spinning for at least 500ms, or until the onClick Promise resolves.
|
|
33
|
+
*/
|
|
34
|
+
export const RefreshIconButton: React.FC<{
|
|
35
|
+
onClick: (e: React.MouseEvent) => void | Promise<void>;
|
|
36
|
+
tooltip?: string;
|
|
37
|
+
className?: string;
|
|
38
|
+
iconClassName?: string;
|
|
39
|
+
}> = ({ onClick, tooltip = "Refresh", className, iconClassName }) => {
|
|
40
|
+
const [isSpinning, setIsSpinning] = useState(false);
|
|
41
|
+
|
|
42
|
+
const handleClick = useCallback(
|
|
43
|
+
async (e: React.MouseEvent) => {
|
|
44
|
+
setIsSpinning(true);
|
|
45
|
+
// Artificially spin for 500ms to show the user that the button is working.
|
|
46
|
+
const minDelay = new Promise<void>((r) => setTimeout(r, 500));
|
|
47
|
+
try {
|
|
48
|
+
await Promise.all([onClick(e), minDelay]);
|
|
49
|
+
} finally {
|
|
50
|
+
setIsSpinning(false);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
[onClick],
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const button = (
|
|
57
|
+
<Button
|
|
58
|
+
variant="text"
|
|
59
|
+
size="xs"
|
|
60
|
+
className={className}
|
|
61
|
+
onClick={handleClick}
|
|
62
|
+
>
|
|
63
|
+
<RefreshCwIcon
|
|
64
|
+
className={cn(
|
|
65
|
+
"h-4 w-4",
|
|
66
|
+
iconClassName,
|
|
67
|
+
isSpinning && "animate-[spin_0.5s]",
|
|
68
|
+
)}
|
|
69
|
+
/>
|
|
70
|
+
</Button>
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
return <Tooltip content={tooltip}>{button}</Tooltip>;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Three-dot menu trigger that fades in on row hover.
|
|
78
|
+
* Must be inside a `group` container.
|
|
79
|
+
* Forwards ref so it works with Radix `asChild`.
|
|
80
|
+
*/
|
|
81
|
+
export const MoreActionsButton = React.forwardRef<
|
|
82
|
+
HTMLButtonElement,
|
|
83
|
+
{
|
|
84
|
+
onClick?: (e: React.MouseEvent) => void;
|
|
85
|
+
className?: string;
|
|
86
|
+
iconClassName?: string;
|
|
87
|
+
} & Omit<React.ComponentPropsWithoutRef<typeof Button>, "variant" | "size">
|
|
88
|
+
>(({ className, iconClassName, ...props }, ref) => (
|
|
89
|
+
<Button
|
|
90
|
+
ref={ref}
|
|
91
|
+
variant="text"
|
|
92
|
+
tabIndex={-1}
|
|
93
|
+
size="xs"
|
|
94
|
+
className={cn(
|
|
95
|
+
"mb-0 opacity-0 group-hover:opacity-100 transition-opacity",
|
|
96
|
+
className,
|
|
97
|
+
)}
|
|
98
|
+
aria-label="More options"
|
|
99
|
+
{...props}
|
|
100
|
+
>
|
|
101
|
+
<MoreVerticalIcon className={cn("w-4 h-4", iconClassName)} />
|
|
102
|
+
</Button>
|
|
103
|
+
));
|
|
104
|
+
MoreActionsButton.displayName = "MoreActionsButton";
|
|
105
|
+
|
|
106
|
+
/** Standard class string for icons inside dropdown menu items. */
|
|
107
|
+
export const MENU_ITEM_ICON_CLASS = "h-3.5 w-3.5 mr-2";
|
|
@@ -1,105 +1,11 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
import {
|
|
3
|
-
DatabaseIcon,
|
|
4
|
-
FileAudioIcon,
|
|
5
|
-
FileCodeIcon,
|
|
6
|
-
FileIcon,
|
|
7
|
-
FileImageIcon,
|
|
8
|
-
FileJsonIcon,
|
|
9
|
-
FileTextIcon,
|
|
10
|
-
FileVideo2Icon,
|
|
11
|
-
FolderArchiveIcon,
|
|
12
|
-
FolderIcon,
|
|
13
|
-
type LucideIcon,
|
|
14
|
-
} from "lucide-react";
|
|
15
2
|
|
|
16
|
-
|
|
17
|
-
export type FileType =
|
|
18
|
-
| "directory"
|
|
19
|
-
| "python"
|
|
20
|
-
| "code"
|
|
21
|
-
| "json"
|
|
22
|
-
| "text"
|
|
23
|
-
| "image"
|
|
24
|
-
| "audio"
|
|
25
|
-
| "video"
|
|
26
|
-
| "data"
|
|
27
|
-
| "pdf"
|
|
28
|
-
| "zip"
|
|
29
|
-
| "unknown";
|
|
30
|
-
|
|
31
|
-
export function guessFileType(name: string): FileType {
|
|
32
|
-
const ext = name.split(".").pop();
|
|
33
|
-
if (ext === undefined) {
|
|
34
|
-
return "unknown";
|
|
35
|
-
}
|
|
36
|
-
switch (ext.toLowerCase()) {
|
|
37
|
-
case "py":
|
|
38
|
-
return "python";
|
|
39
|
-
case "txt":
|
|
40
|
-
case "md":
|
|
41
|
-
case "qmd":
|
|
42
|
-
return "text";
|
|
43
|
-
case "png":
|
|
44
|
-
case "jpg":
|
|
45
|
-
case "jpeg":
|
|
46
|
-
case "gif":
|
|
47
|
-
return "image";
|
|
48
|
-
case "csv":
|
|
49
|
-
return "data";
|
|
50
|
-
case "json":
|
|
51
|
-
return "json";
|
|
52
|
-
// Non-exhaustive list of code file extensions
|
|
53
|
-
case "js":
|
|
54
|
-
case "ts":
|
|
55
|
-
case "tsx":
|
|
56
|
-
case "html":
|
|
57
|
-
case "css":
|
|
58
|
-
case "toml":
|
|
59
|
-
case "yaml":
|
|
60
|
-
case "yml":
|
|
61
|
-
case "wasm":
|
|
62
|
-
return "code";
|
|
63
|
-
case "mp3":
|
|
64
|
-
case "m4a":
|
|
65
|
-
case "m4v":
|
|
66
|
-
case "ogg":
|
|
67
|
-
case "wav":
|
|
68
|
-
return "audio";
|
|
69
|
-
case "mp4":
|
|
70
|
-
case "webm":
|
|
71
|
-
case "mkv":
|
|
72
|
-
return "video";
|
|
73
|
-
case "pdf":
|
|
74
|
-
return "pdf";
|
|
75
|
-
case "zip":
|
|
76
|
-
case "tar":
|
|
77
|
-
case "gz":
|
|
78
|
-
return "zip";
|
|
79
|
-
default:
|
|
80
|
-
return "unknown";
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export const FILE_TYPE_ICONS: Record<FileType, LucideIcon> = {
|
|
85
|
-
directory: FolderIcon,
|
|
86
|
-
python: FileCodeIcon,
|
|
87
|
-
json: FileJsonIcon,
|
|
88
|
-
code: FileCodeIcon,
|
|
89
|
-
text: FileTextIcon,
|
|
90
|
-
image: FileImageIcon,
|
|
91
|
-
audio: FileAudioIcon,
|
|
92
|
-
video: FileVideo2Icon,
|
|
93
|
-
pdf: FileCodeIcon,
|
|
94
|
-
zip: FolderArchiveIcon,
|
|
95
|
-
data: DatabaseIcon,
|
|
96
|
-
unknown: FileIcon,
|
|
97
|
-
};
|
|
3
|
+
import type { FileIconType } from "@/components/editor/file-tree/file-icons";
|
|
98
4
|
|
|
99
5
|
const TAB = " ";
|
|
100
6
|
|
|
101
7
|
export const PYTHON_CODE_FOR_FILE_TYPE: Record<
|
|
102
|
-
|
|
8
|
+
FileIconType,
|
|
103
9
|
(path: string) => string
|
|
104
10
|
> = {
|
|
105
11
|
directory: (path) => `os.listdir("${path}")`,
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
import { PopoverAnchor } from "@radix-ui/react-popover";
|
|
4
4
|
import { FilePenIcon } from "lucide-react";
|
|
5
5
|
import { type JSX, useEffect, useRef, useState } from "react";
|
|
6
|
+
import {
|
|
7
|
+
FILE_ICON as FILE_TYPE_ICONS,
|
|
8
|
+
guessFileIconType as guessFileType,
|
|
9
|
+
} from "@/components/editor/file-tree/file-icons";
|
|
6
10
|
import type { FileInfo } from "@/core/network/types";
|
|
7
11
|
import { useAsyncData } from "@/hooks/useAsyncData";
|
|
8
12
|
import { Paths } from "@/utils/paths";
|
|
@@ -15,7 +19,6 @@ import {
|
|
|
15
19
|
CommandList,
|
|
16
20
|
} from "../../ui/command";
|
|
17
21
|
import { Popover, PopoverContent } from "../../ui/popover";
|
|
18
|
-
import { FILE_TYPE_ICONS, guessFileType } from "../file-tree/types";
|
|
19
22
|
|
|
20
23
|
import "./filename-input.css";
|
|
21
24
|
import { getFeatureFlag } from "@/core/config/feature-flag";
|
|
@@ -81,9 +81,9 @@ export const MarimoIcon = ({
|
|
|
81
81
|
width={width ?? size}
|
|
82
82
|
height={height ?? size}
|
|
83
83
|
viewBox={viewBox}
|
|
84
|
+
aria-hidden={true}
|
|
84
85
|
{...props}
|
|
85
86
|
>
|
|
86
|
-
<title>marimo icon</title>
|
|
87
87
|
<MarimoCirclePaths
|
|
88
88
|
fill={fill}
|
|
89
89
|
stroke={stroke ?? "currentColor"}
|
|
@@ -119,9 +119,9 @@ const MarimoMultiIcon = ({
|
|
|
119
119
|
width={width ?? size}
|
|
120
120
|
height={height ?? size}
|
|
121
121
|
viewBox={viewBox}
|
|
122
|
+
aria-hidden={true}
|
|
122
123
|
{...props}
|
|
123
124
|
>
|
|
124
|
-
<title>marimo multi icon</title>
|
|
125
125
|
<defs>
|
|
126
126
|
<mask id={maskId}>
|
|
127
127
|
<rect width="100%" height="100%" fill="white" />
|
|
@@ -23,6 +23,11 @@ import {
|
|
|
23
23
|
} from "react-arborist";
|
|
24
24
|
import { useLocale } from "react-aria";
|
|
25
25
|
import { MarkdownIcon } from "@/components/editor/cell/code/icons";
|
|
26
|
+
import {
|
|
27
|
+
FILE_ICON as FILE_TYPE_ICONS,
|
|
28
|
+
type FileIconType as FileType,
|
|
29
|
+
guessFileIconType as guessFileType,
|
|
30
|
+
} from "@/components/editor/file-tree/file-icons";
|
|
26
31
|
import { useImperativeModal } from "@/components/modal/ImperativeModal";
|
|
27
32
|
import { AlertDialogDestructiveAction } from "@/components/ui/alert-dialog";
|
|
28
33
|
import { Button } from "@/components/ui/button";
|
|
@@ -47,11 +52,6 @@ import { newNotebookURL } from "@/utils/urls";
|
|
|
47
52
|
import { ConfigButton } from "../app-config/app-config-button";
|
|
48
53
|
import { ErrorBoundary } from "../editor/boundary/ErrorBoundary";
|
|
49
54
|
import { ShutdownButton } from "../editor/controls/shutdown-button";
|
|
50
|
-
import {
|
|
51
|
-
FILE_TYPE_ICONS,
|
|
52
|
-
type FileType,
|
|
53
|
-
guessFileType,
|
|
54
|
-
} from "../editor/file-tree/types";
|
|
55
55
|
import {
|
|
56
56
|
Header,
|
|
57
57
|
OpenTutorialDropDown,
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import {
|
|
4
|
+
STORAGE_SNIPPETS,
|
|
5
|
+
type StorageSnippetContext,
|
|
6
|
+
} from "../storage-snippets";
|
|
7
|
+
|
|
8
|
+
const readSnippet = STORAGE_SNIPPETS.find((s) => s.id === "read-file")!;
|
|
9
|
+
const downloadSnippet = STORAGE_SNIPPETS.find((s) => s.id === "download-file")!;
|
|
10
|
+
|
|
11
|
+
function makeCtx(
|
|
12
|
+
overrides: Partial<StorageSnippetContext> = {},
|
|
13
|
+
): StorageSnippetContext {
|
|
14
|
+
return {
|
|
15
|
+
variableName: "store",
|
|
16
|
+
protocol: "s3",
|
|
17
|
+
entry: {
|
|
18
|
+
path: "data/file.csv",
|
|
19
|
+
kind: "object",
|
|
20
|
+
size: 1024,
|
|
21
|
+
lastModified: null,
|
|
22
|
+
},
|
|
23
|
+
backendType: "obstore",
|
|
24
|
+
...overrides,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe("read-file snippet", () => {
|
|
29
|
+
it("obstore backend", () => {
|
|
30
|
+
expect(readSnippet.getCode(makeCtx())).toMatchInlineSnapshot(`
|
|
31
|
+
"_data = store.get("data/file.csv").bytes()
|
|
32
|
+
_data"
|
|
33
|
+
`);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("fsspec backend", () => {
|
|
37
|
+
expect(
|
|
38
|
+
readSnippet.getCode(
|
|
39
|
+
makeCtx({ backendType: "fsspec", variableName: "fs" }),
|
|
40
|
+
),
|
|
41
|
+
).toMatchInlineSnapshot(`
|
|
42
|
+
"_data = fs.cat_file("data/file.csv")
|
|
43
|
+
_data"
|
|
44
|
+
`);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("returns null for directories", () => {
|
|
48
|
+
expect(
|
|
49
|
+
readSnippet.getCode(
|
|
50
|
+
makeCtx({
|
|
51
|
+
entry: {
|
|
52
|
+
path: "data/",
|
|
53
|
+
kind: "directory",
|
|
54
|
+
size: 0,
|
|
55
|
+
lastModified: null,
|
|
56
|
+
},
|
|
57
|
+
}),
|
|
58
|
+
),
|
|
59
|
+
).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("escapes double quotes in paths", () => {
|
|
63
|
+
expect(
|
|
64
|
+
readSnippet.getCode(
|
|
65
|
+
makeCtx({
|
|
66
|
+
entry: {
|
|
67
|
+
path: 'data/"file".csv',
|
|
68
|
+
kind: "object",
|
|
69
|
+
size: 100,
|
|
70
|
+
lastModified: null,
|
|
71
|
+
},
|
|
72
|
+
}),
|
|
73
|
+
),
|
|
74
|
+
).toMatchInlineSnapshot(`
|
|
75
|
+
"_data = store.get("data/\\"file\\".csv").bytes()
|
|
76
|
+
_data"
|
|
77
|
+
`);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("escapes backslashes in paths", () => {
|
|
81
|
+
expect(
|
|
82
|
+
readSnippet.getCode(
|
|
83
|
+
makeCtx({
|
|
84
|
+
entry: {
|
|
85
|
+
path: "data\\file.csv",
|
|
86
|
+
kind: "object",
|
|
87
|
+
size: 100,
|
|
88
|
+
lastModified: null,
|
|
89
|
+
},
|
|
90
|
+
}),
|
|
91
|
+
),
|
|
92
|
+
).toMatchInlineSnapshot(`
|
|
93
|
+
"_data = store.get("data\\\\file.csv").bytes()
|
|
94
|
+
_data"
|
|
95
|
+
`);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("escapes newlines and tabs in paths", () => {
|
|
99
|
+
expect(
|
|
100
|
+
readSnippet.getCode(
|
|
101
|
+
makeCtx({
|
|
102
|
+
entry: {
|
|
103
|
+
path: "data/file\nname\there.csv",
|
|
104
|
+
kind: "object",
|
|
105
|
+
size: 100,
|
|
106
|
+
lastModified: null,
|
|
107
|
+
},
|
|
108
|
+
}),
|
|
109
|
+
),
|
|
110
|
+
).toMatchInlineSnapshot(`
|
|
111
|
+
"_data = store.get("data/file\\nname\\there.csv").bytes()
|
|
112
|
+
_data"
|
|
113
|
+
`);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("escapes control characters in paths", () => {
|
|
117
|
+
expect(
|
|
118
|
+
readSnippet.getCode(
|
|
119
|
+
makeCtx({
|
|
120
|
+
entry: {
|
|
121
|
+
path: "data/\u0000\u001F.csv",
|
|
122
|
+
kind: "object",
|
|
123
|
+
size: 100,
|
|
124
|
+
lastModified: null,
|
|
125
|
+
},
|
|
126
|
+
}),
|
|
127
|
+
),
|
|
128
|
+
).toMatchInlineSnapshot(`
|
|
129
|
+
"_data = store.get("data/\\u0000\\u001f.csv").bytes()
|
|
130
|
+
_data"
|
|
131
|
+
`);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
describe("download-file snippet", () => {
|
|
136
|
+
it("obstore s3 backend", () => {
|
|
137
|
+
expect(downloadSnippet.getCode(makeCtx())).toMatchInlineSnapshot(`
|
|
138
|
+
"from datetime import timedelta
|
|
139
|
+
from obstore import sign
|
|
140
|
+
|
|
141
|
+
signed_url = sign(
|
|
142
|
+
store, "GET", "data/file.csv",
|
|
143
|
+
expires_in=timedelta(hours=1),
|
|
144
|
+
)
|
|
145
|
+
signed_url"
|
|
146
|
+
`);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it("obstore gcs backend", () => {
|
|
150
|
+
expect(
|
|
151
|
+
downloadSnippet.getCode(makeCtx({ protocol: "gcs" })),
|
|
152
|
+
).toMatchInlineSnapshot(`
|
|
153
|
+
"from datetime import timedelta
|
|
154
|
+
from obstore import sign
|
|
155
|
+
|
|
156
|
+
signed_url = sign(
|
|
157
|
+
store, "GET", "data/file.csv",
|
|
158
|
+
expires_in=timedelta(hours=1),
|
|
159
|
+
)
|
|
160
|
+
signed_url"
|
|
161
|
+
`);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it("obstore cloudflare backend", () => {
|
|
165
|
+
expect(
|
|
166
|
+
downloadSnippet.getCode(makeCtx({ protocol: "cloudflare" })),
|
|
167
|
+
).toMatchInlineSnapshot(`
|
|
168
|
+
"from datetime import timedelta
|
|
169
|
+
from obstore import sign
|
|
170
|
+
|
|
171
|
+
signed_url = sign(
|
|
172
|
+
store, "GET", "data/file.csv",
|
|
173
|
+
expires_in=timedelta(hours=1),
|
|
174
|
+
)
|
|
175
|
+
signed_url"
|
|
176
|
+
`);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it("returns null for http obstore (not signable)", () => {
|
|
180
|
+
expect(downloadSnippet.getCode(makeCtx({ protocol: "http" }))).toBeNull();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it("returns null for file obstore (not signable)", () => {
|
|
184
|
+
expect(downloadSnippet.getCode(makeCtx({ protocol: "file" }))).toBeNull();
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it("returns null for in-memory obstore (not signable)", () => {
|
|
188
|
+
expect(
|
|
189
|
+
downloadSnippet.getCode(makeCtx({ protocol: "in-memory" })),
|
|
190
|
+
).toBeNull();
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it("fsspec backend", () => {
|
|
194
|
+
expect(
|
|
195
|
+
downloadSnippet.getCode(
|
|
196
|
+
makeCtx({ backendType: "fsspec", variableName: "fs" }),
|
|
197
|
+
),
|
|
198
|
+
).toMatchInlineSnapshot(`"fs.get("data/file.csv", "file.csv")"`);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it("fsspec backend with nested path", () => {
|
|
202
|
+
expect(
|
|
203
|
+
downloadSnippet.getCode(
|
|
204
|
+
makeCtx({
|
|
205
|
+
backendType: "fsspec",
|
|
206
|
+
variableName: "fs",
|
|
207
|
+
entry: {
|
|
208
|
+
path: "nested/dir/report.parquet",
|
|
209
|
+
kind: "file",
|
|
210
|
+
size: 500,
|
|
211
|
+
lastModified: null,
|
|
212
|
+
},
|
|
213
|
+
}),
|
|
214
|
+
),
|
|
215
|
+
).toMatchInlineSnapshot(
|
|
216
|
+
`"fs.get("nested/dir/report.parquet", "report.parquet")"`,
|
|
217
|
+
);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it("returns null for directories", () => {
|
|
221
|
+
expect(
|
|
222
|
+
downloadSnippet.getCode(
|
|
223
|
+
makeCtx({
|
|
224
|
+
entry: {
|
|
225
|
+
path: "data/",
|
|
226
|
+
kind: "directory",
|
|
227
|
+
size: 0,
|
|
228
|
+
lastModified: null,
|
|
229
|
+
},
|
|
230
|
+
}),
|
|
231
|
+
),
|
|
232
|
+
).toBeNull();
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
describe("all snippets return null for directories", () => {
|
|
237
|
+
for (const snippet of STORAGE_SNIPPETS) {
|
|
238
|
+
it(`${snippet.id} returns null for directory entries`, () => {
|
|
239
|
+
expect(
|
|
240
|
+
snippet.getCode(
|
|
241
|
+
makeCtx({
|
|
242
|
+
entry: {
|
|
243
|
+
path: "some-dir/",
|
|
244
|
+
kind: "directory",
|
|
245
|
+
size: 0,
|
|
246
|
+
lastModified: null,
|
|
247
|
+
},
|
|
248
|
+
}),
|
|
249
|
+
),
|
|
250
|
+
).toBeNull();
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
});
|