@marimo-team/frontend 0.20.5-dev4 → 0.20.5-dev41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{CellStatus-DRjSVmK4.js → CellStatus-rawm41sF.js} +1 -1
- package/dist/assets/{Combination-tjZP3FH6.js → Combination-lAuBMOg4.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-BmYLGaEV.js → ConnectedDataExplorerComponent-BmrDShEI.js} +1 -1
- package/dist/assets/{DeferredRequestRegistry-CMZsNx4R.js → DeferredRequestRegistry-TekxUirp.js} +1 -1
- package/dist/assets/{ErrorBoundary-dVj6GVNE.js → ErrorBoundary-BfF3Lb5I.js} +1 -1
- package/dist/assets/{ImperativeModal-CRNJOvqT.js → ImperativeModal-BvRpI5NU.js} +1 -1
- package/dist/assets/{JsonOutput-GlMQ3aLA.js → JsonOutput-D8vxudTc.js} +11 -11
- package/dist/assets/{LazyAnyLanguageCodeMirror-BdX_Y5NA.js → LazyAnyLanguageCodeMirror-BpSKccWW.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-B0ZtYqUC.js → MarimoErrorOutput-ThxhEC9x.js} +1 -1
- package/dist/assets/{RenderHTML-qh-NzTWO.js → RenderHTML-Ci0Pb1aU.js} +1 -1
- package/dist/assets/{add-cell-with-ai--4VOMvH8.js → add-cell-with-ai-BO7kWP2P.js} +28 -26
- package/dist/assets/add-connection-dialog-C0_z2T_b.js +138 -0
- package/dist/assets/{agent-panel-BX_iKZeN.js → agent-panel-C-OkUkue.js} +15 -15
- package/dist/assets/ai-model-dropdown-DJoBltN-.js +5 -0
- package/dist/assets/{alert-dialog-DsNfSYaw.js → alert-dialog-CfirwkMl.js} +1 -1
- package/dist/assets/{any-language-editor-Drlg63ge.js → any-language-editor-C_73jLC-.js} +1 -1
- package/dist/assets/{app-config-button-bnipxY5L.js → app-config-button-Cw2wXNR2.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-KOgWVxSC.js → architectureDiagram-VXUJARFQ-PitjPG8V.js} +1 -1
- package/dist/assets/{assertNever-Dw9aFN4h.js → assertNever-Dg4AnA3p.js} +1 -1
- package/dist/assets/{azure-Ddr1pZpW.js → azure-V83ZU8Sp.js} +1 -1
- package/dist/assets/{blockDiagram-VD42YOAC-DjazSe-Z.js → blockDiagram-VD42YOAC-BIJ4EhZR.js} +1 -1
- package/dist/assets/{button-BmOH9agK.js → button-BwamPDJi.js} +1 -1
- package/dist/assets/{c4Diagram-YG6GDRKO-CkwpyaIV.js → c4Diagram-YG6GDRKO-DM49Cvfe.js} +1 -1
- package/dist/assets/{cache-panel-DRhH4wqG.js → cache-panel-B4TWdLE9.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-B1x4zkBp.js → cell-editor-DFeqwbDq.js} +6 -6
- package/dist/assets/{cell-link-B59Kn5nL.js → cell-link-TWNu2IkO.js} +1 -1
- package/dist/assets/{cells-CCtxWKxf.js → cells-DJj8ja0V.js} +4 -4
- package/dist/assets/channel-DNdp-eCE.js +1 -0
- package/dist/assets/{chat-display-Co6iGNSx.js → chat-display-COL62Kpv.js} +1 -1
- package/dist/assets/{chat-panel-70sjqZuy.js → chat-panel-CxYclPR7.js} +1 -1
- package/dist/assets/{chunk-5FQGJX7Z-BJDu6jwt.js → chunk-5FQGJX7Z-Cyze_Wbx.js} +3 -3
- package/dist/assets/{chunk-ABZYJK2D-B4uBM2QW.js → chunk-ABZYJK2D-CIP2m5SK.js} +3 -3
- package/dist/assets/{chunk-ATLVNIR6-Du2yaFpm.js → chunk-ATLVNIR6-dCnEfemD.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-CyuK4uRN.js → chunk-B4BG7PRW-sXSaKV4v.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-BwWd5dH1.js → chunk-DI55MBZ5-DjV-ScSc.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-KqUhNQvn.js → chunk-EXTU4WIE-PLvknOI8.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-C-v9pa_-.js → chunk-JA3XYJ7Z-BM9i2UKq.js} +1 -1
- package/dist/assets/{chunk-JZLCHNYA-DNCs8LM0.js → chunk-JZLCHNYA-m6YUUy9x.js} +1 -1
- package/dist/assets/{chunk-N4CR4FBY-CT58_cui.js → chunk-N4CR4FBY-C1lKPnWl.js} +2 -2
- package/dist/assets/{chunk-QN33PNHL-BboxAxJa.js → chunk-QN33PNHL-Czx-c7tW.js} +1 -1
- package/dist/assets/{chunk-QXUST7PY-BlINr7uS.js → chunk-QXUST7PY-CcYtOR78.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-DI9xzpBm.js → chunk-S3R3BYOJ-JNQMgAH6.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-C4sxb3v-.js → chunk-TZMSLE5B-C9T1sILA.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-BqtRsi1m.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-CVoqYiM8.js +1 -0
- package/dist/assets/{code-block-37QAKDTI-Cl0NTdrS.js → code-block-37QAKDTI-BeUkwW5f.js} +1 -1
- package/dist/assets/{column-preview-BhU5Ow0e.js → column-preview-CPJFpq_q.js} +1 -1
- package/dist/assets/command-DQqPawJf.js +1 -0
- package/dist/assets/command-palette-BM1QAZTW.js +1 -0
- package/dist/assets/{common-CKAiz8xx.js → common-Df9UcCs1.js} +1 -1
- package/dist/assets/components-CwZhf0Ag.js +1 -0
- package/dist/assets/{components-BZCdnYSp.js → components-D8LTuNe_.js} +1 -1
- package/dist/assets/{config-D9X9QKiL.js → config-BH98g9qk.js} +1 -1
- package/dist/assets/context-CRmPPhx9.js +1 -0
- package/dist/assets/context-aware-panel-Bs4Vepkp.js +3 -0
- package/dist/assets/{copy-DMCkK2TI.js → copy-ICN7wGy0.js} +1 -1
- package/dist/assets/{copy-icon-6RnnFDPt.js → copy-icon-DNppAsmd.js} +1 -1
- package/dist/assets/{createReducer-BcTiTw8T.js → createReducer-BrKCfm9t.js} +1 -1
- package/dist/assets/{dagre-6UL2VRFP-BrBSRtN5.js → dagre-6UL2VRFP-D-I1QR9s.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-NBBEPhQq.js → data-grid-overlay-editor-DXzdnLZF.js} +1 -1
- package/dist/assets/{datasource-B2Fl6iYU.js → datasource-MEu_GjcC.js} +1 -1
- package/dist/assets/{dates-CzBDvj6R.js → dates-BFWtdOCb.js} +1 -1
- package/dist/assets/{dependency-graph-panel-Dk4iQGft.js → dependency-graph-panel-DddysMUS.js} +1 -1
- package/dist/assets/{diagram-PSM6KHXK-DPC85L-O.js → diagram-PSM6KHXK-DcjdxOTC.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-CRPLkmdi.js → diagram-QEK2KX5R-Dx1WtjkT.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-Bsc6mZUW.js → diagram-S2PKOQOG-CXJzGs3_.js} +1 -1
- package/dist/assets/{dialog-BXzvlof-.js → dialog-ChkDhlMQ.js} +1 -1
- package/dist/assets/{dist-i0ilBbwP.js → dist-0PMxXIr6.js} +1 -1
- package/dist/assets/{dist-DGPCoel5.js → dist-6HEOc3hy.js} +1 -1
- package/dist/assets/{dist-CEQIJ2pn.js → dist-B7Qj0ClH.js} +1 -1
- package/dist/assets/{dist-C30-xTdI.js → dist-BIYYQefO.js} +1 -1
- package/dist/assets/{dist-Dg61kQNR.js → dist-BQ7MrVoG.js} +1 -1
- package/dist/assets/{dist-CU-Ty5ht.js → dist-BUr9VSV4.js} +1 -1
- package/dist/assets/{dist-BjtLy-VA.js → dist-Bagw3W9X.js} +1 -1
- package/dist/assets/dist-BbkZJt99.js +1 -0
- package/dist/assets/{dist-BTEPE6IB.js → dist-BosZYCjH.js} +1 -1
- package/dist/assets/{dist-Q0--6AMp.js → dist-BrDOLuMx.js} +1 -1
- package/dist/assets/dist-BvqRyXNf.js +1 -0
- package/dist/assets/{dist-DFv45CtW.js → dist-C1g0ZQqM.js} +1 -1
- package/dist/assets/dist-C88PeA-j.js +1 -0
- package/dist/assets/{dist-DQgu-tmt.js → dist-C8DU7LS7.js} +1 -1
- package/dist/assets/dist-CT29HpLU.js +1 -0
- package/dist/assets/dist-CaN3pnGY.js +1 -0
- package/dist/assets/dist-CdZrtzmM.js +1 -0
- package/dist/assets/{dist-Dq_iQ08e.js → dist-Cf47zp7b.js} +1 -1
- package/dist/assets/dist-CiBv1uBX.js +1 -0
- package/dist/assets/dist-Cn-s3n4_.js +1 -0
- package/dist/assets/{dist-DVh79TGS.js → dist-CrFxmtyb.js} +1 -1
- package/dist/assets/{dist-y6DTGoUH.js → dist-CsQrBXB1.js} +1 -1
- package/dist/assets/{dist-BjnzbwCx.js → dist-D-tCQoCo.js} +1 -1
- package/dist/assets/{dist-51xFOPFs.js → dist-D3OoaVQX.js} +1 -1
- package/dist/assets/dist-DHmVMXm2.js +1 -0
- package/dist/assets/dist-DHn8amAr.js +1 -0
- package/dist/assets/dist-DK2oA8K0.js +1 -0
- package/dist/assets/{dist-Bq1BhBMA.js → dist-DKPpxz2S.js} +1 -1
- package/dist/assets/{dist-DwtQnQ8D.js → dist-DPW-YadP.js} +1 -1
- package/dist/assets/{dist-Bbmd3uCi.js → dist-D_4TSZPK.js} +1 -1
- package/dist/assets/dist-Ddx3eonB.js +1 -0
- package/dist/assets/dist-DnPN36vC.js +1 -0
- package/dist/assets/dist-Doi_61Lm.js +1 -0
- package/dist/assets/{dist-Dy5EHuDu.js → dist-Dq1aTs7B.js} +1 -1
- package/dist/assets/dist-Dr9qtoId.js +13 -0
- package/dist/assets/dist-EtvDr9lo.js +1 -0
- package/dist/assets/dist-JYMkroTn.js +1 -0
- package/dist/assets/{dist-DfBASypd.js → dist-Jp_4M-Ei.js} +1 -1
- package/dist/assets/dist-QoV0fohO.js +1 -0
- package/dist/assets/dist-SDO5K7hA.js +3 -0
- package/dist/assets/dist-TtVOJU5I.js +1 -0
- package/dist/assets/dist-doJt8agZ.js +1 -0
- package/dist/assets/{dist-CIuh_TIk.js → dist-etSPFHi_.js} +1 -1
- package/dist/assets/{dist-CqnPIH_S.js → dist-f-ru44Xm.js} +1 -1
- package/dist/assets/{dist-CIU0Lack.js → dist-qkIhd7iG.js} +1 -1
- package/dist/assets/{dist-odxAaH5Z.js → dist-t1vdhOX_.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-Bs1zlxdM.js} +1 -1
- package/dist/assets/download-C06P9lnP.js +9 -0
- package/dist/assets/{dropdown-menu-CKhrfxsx.js → dropdown-menu-Bc2d7Nej.js} +1 -1
- package/dist/assets/edit-page-Bld_fe39.js +13 -0
- package/dist/assets/{erDiagram-Q2GNP2WA-B7kZxL-n.js → erDiagram-Q2GNP2WA-BQUYpiEQ.js} +1 -1
- package/dist/assets/{error-banner-R2OkQKR0.js → error-banner-C2nW22mN.js} +1 -1
- package/dist/assets/{error-panel-CtyexAW6.js → error-panel-B_vII0VN.js} +1 -1
- package/dist/assets/{es-1hBRXVlM.js → es-EPBuIa5m.js} +1 -1
- package/dist/assets/{esm-BQUzYly2.js → esm-Hlfcqnf0.js} +1 -1
- package/dist/assets/{esm-BTyesPLl.js → esm-MvMf2P5n.js} +1 -1
- package/dist/assets/{field-DGtw6Lae.js → field-D-izY3ud.js} +1 -1
- package/dist/assets/file-explorer-panel-BIzyNOVs.js +17 -0
- package/dist/assets/{file-video-camera-Fa5c_iPb.js → file-headphone-daOQzJg0.js} +1 -1
- package/dist/assets/file-icons-C-oatBuk.js +1 -0
- package/dist/assets/{floating-outline-BWK_nLJy.js → floating-outline-BPmtgKWs.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-DR-64sse.js → flowDiagram-NV44I4VS-xMIxed1s.js} +1 -1
- package/dist/assets/{focus-ShrwcKIv.js → focus-j9zawi1p.js} +1 -1
- package/dist/assets/{form-B7_NRa34.js → form-DrpSpDea.js} +1 -1
- package/dist/assets/{formats-C3K3rlAZ.js → formats-CkafgGfe.js} +1 -1
- package/dist/assets/{formatting-8bP-RDnl.js → formatting-By3b5Lx8.js} +1 -1
- package/dist/assets/{gallery-page-DRBZRnaN.js → gallery-page-BrljeBFe.js} +1 -1
- package/dist/assets/{ganttDiagram-JELNMOA3-BWuQMrGd.js → ganttDiagram-JELNMOA3-Be16Pv8U.js} +1 -1
- package/dist/assets/{gitGraphDiagram-V2S2FVAM-Mr5-PYgM.js → gitGraphDiagram-V2S2FVAM-DQ4scp6S.js} +1 -1
- package/dist/assets/{glide-data-editor-BurnHmgR.js → glide-data-editor-8kdd_nPE.js} +4 -4
- package/dist/assets/{globals-BlB0Ba6E.js → globals-D2ulvntX.js} +1 -1
- package/dist/assets/home-page-O_c6IiAp.js +4 -0
- package/dist/assets/{hooks-BY6oGAlX.js → hooks-Z1j4FmRH.js} +1 -1
- package/dist/assets/html-to-image-D-FY7miL.js +2 -0
- package/dist/assets/image-CBwHq93J.js +1 -0
- package/dist/assets/index-BMdbqayP.js +38 -0
- package/dist/assets/{index-Dzwe9vKA.css → index-fYvRsNGP.css} +1 -1
- package/dist/assets/{infoDiagram-HS3SLOUP-Bs8aKpuZ.js → infoDiagram-HS3SLOUP-DzsICEl9.js} +1 -1
- package/dist/assets/input-GLbHj4DF.js +1 -0
- package/dist/assets/{journeyDiagram-XKPGCS4Q-aCZRxOHn.js → journeyDiagram-XKPGCS4Q-Dt4UItaM.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-BlOJJ-5B.js → kanban-definition-3W4ZIXB7-Do_8fQeU.js} +1 -1
- package/dist/assets/katex-BalO4WMU.js +1 -0
- package/dist/assets/{kiosk-mode-BBqwMND1.js → kiosk-mode-BuLLP9k3.js} +1 -1
- package/dist/assets/{label-DmqkEXI4.js → label-CDwJXweF.js} +1 -1
- package/dist/assets/layout-DQhzfSJn.js +5 -0
- package/dist/assets/{linear-2A1iDmqT.js → linear-c4WCYuol.js} +1 -1
- package/dist/assets/{links-syPBpTLO.js → links-C9QsxOBC.js} +1 -1
- package/dist/assets/{logs-panel-BHFI-jG1.js → logs-panel-BKhNdCxG.js} +1 -1
- package/dist/assets/{maps-8VTEe-0T.js → maps-CTMzJkSk.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-D02U2W2X.js} +4 -4
- package/dist/assets/{menu-items-Bs2e3wuf.js → menu-items-CRjHRaiu.js} +1 -1
- package/dist/assets/mermaid-4DMBBIKO-C2MO8Ayk.js +1 -0
- package/dist/assets/{mermaid-Cq8ttjss.js → mermaid-DJfb-vZs.js} +3 -3
- package/dist/assets/{mermaid-parser.core-DbGD2gKa.js → mermaid-parser.core-C-MdXFgl.js} +1 -1
- package/dist/assets/{mhchem-BJZpIgRF.js → mhchem-DqNBdKjC.js} +1 -1
- package/dist/assets/{mindmap-definition-VGOIOE7T-Dt6ZRws3.js → mindmap-definition-VGOIOE7T-YOE4okXd.js} +1 -1
- package/dist/assets/{multi-map-kCmlVJ-5.js → multi-map-BubyGH4K.js} +1 -1
- package/dist/assets/{name-cell-input-BRHlWy2Y.js → name-cell-input-DOyCua0o.js} +1 -1
- package/dist/assets/{number-overlay-editor-BDnI-mwa.js → number-overlay-editor-zZDGu9D2.js} +1 -1
- package/dist/assets/{numbers-44Cj1Me-.js → numbers-Eb1pfDec.js} +1 -1
- package/dist/assets/{outline-panel-uyRmU3NX.js → outline-panel-CgQ2GmbX.js} +1 -1
- package/dist/assets/{packages-panel-D8d46YWc.js → packages-panel-n8Ssm9M8.js} +1 -1
- package/dist/assets/{panels-Do1_ry1k.js → panels-B4wExe_l.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-3GEmpmfg.js → pieDiagram-ADFJNKIX-CjRyNR5b.js} +1 -1
- package/dist/assets/{popover-Cvl9xY6R.js → popover-XNIX-rv1.js} +1 -1
- package/dist/assets/{precisionRound-BOmLQIKI.js → precisionRound-CCOoIlcP.js} +1 -1
- package/dist/assets/{process-output-4yip1nZE.js → process-output-BwkCApeo.js} +1 -1
- package/dist/assets/purify.es-BBn8CPhf.js +2 -0
- package/dist/assets/{quadrantDiagram-AYHSOK5B-Dela17qb.js → quadrantDiagram-AYHSOK5B-ZvWY20UO.js} +1 -1
- package/dist/assets/{react-vega-C6zUovDg.js → react-vega-DzWik59S.js} +1 -1
- package/dist/assets/react-vega-plcnUXVG.js +1 -0
- package/dist/assets/{readonly-python-code-DmjbJYSq.js → readonly-python-code-BFyASvPB.js} +1 -1
- package/dist/assets/{renderShortcut-BJEd-iA7.js → renderShortcut-BjTUrvc5.js} +1 -1
- package/dist/assets/{request-registry-CN4oD1xn.js → request-registry-LM8kl4Xv.js} +1 -1
- package/dist/assets/{requirementDiagram-UZGBJVZJ-CjimGyZ2.js → requirementDiagram-UZGBJVZJ-4LJ2QyR9.js} +1 -1
- package/dist/assets/{run-page-BGijCqbR.js → run-page-BYEyHIaG.js} +1 -1
- package/dist/assets/{runs-BMpRKQKC.js → runs-B4QSIylk.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-CBE98yUR.js → sankeyDiagram-TZEHDZUN-7OqUpHYR.js} +1 -1
- package/dist/assets/{scratchpad-panel-ByOWj9u_.js → scratchpad-panel-w9Tu3fpH.js} +1 -1
- package/dist/assets/{secrets-panel-C2n4dedt.js → secrets-panel-DAnccD-S.js} +1 -1
- package/dist/assets/{select-DygbgNTD.js → select-DMX8tcVe.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-DSgG0Zyn.js → sequenceDiagram-WL72ISMW-C4sGREOt.js} +1 -1
- package/dist/assets/{session-DnMOyddG.js → session-iz9BPeTp.js} +1 -1
- package/dist/assets/session-panel-k6_Gni4X.js +1 -0
- package/dist/assets/{share-sD4fbzpH.js → share-BWMZuJWY.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-mGo3M47p.js} +1 -1
- package/dist/assets/{spec-Be-iRLAY.js → spec-BQ0QuStT.js} +1 -1
- package/dist/assets/{state-Xu6bDsJl.js → state-CGR3DB1q.js} +1 -1
- package/dist/assets/{state-D2jTOQOG.js → state-CsNC_7dZ.js} +1 -1
- package/dist/assets/{state-B_fNn_z_.js → state-Dj88xOmZ.js} +1 -1
- package/dist/assets/{stateDiagram-FKZM4ZOC-By2PSLiJ.js → stateDiagram-FKZM4ZOC-4PvEH0nH.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-CpKgwrjU.js +1 -0
- package/dist/assets/stex-BBWVYm-R.js +1 -0
- package/dist/assets/{switch-tdkZNn4k.js → switch-BMqCO9bm.js} +1 -1
- package/dist/assets/{terminal-CGmjeYqa.js → terminal-qMuurRSM.js} +1 -1
- package/dist/assets/{time-BLCpKsnL.js → time-BuGE4zW4.js} +1 -1
- package/dist/assets/{timeline-definition-IT6M3QCI-rq80_nVa.js → timeline-definition-IT6M3QCI-D9wk3zrs.js} +1 -1
- package/dist/assets/{toggle-BhEcsHTu.js → toggle-BYx0fN9n.js} +1 -1
- package/dist/assets/{tooltip-DOQlecCr.js → tooltip-CKZGcDDd.js} +1 -1
- package/dist/assets/{tooltip-D_HRHf_c.js → tooltip-CQeE9o7x.js} +1 -1
- package/dist/assets/{tracing-BZx6nEPl.js → tracing-DTCuFbVV.js} +1 -1
- package/dist/assets/tracing-panel-B1EJu6-W.js +2 -0
- package/dist/assets/{tree-D0AxVJ_I.js → tree-82qhH45u.js} +1 -1
- package/dist/assets/{useAddCell-BRlAqdmq.js → useAddCell-BdUpg_Ta.js} +1 -1
- package/dist/assets/useBoolean-2eWc7NX-.js +1 -0
- package/dist/assets/useCellActionButton-CJ_LAoma.js +1 -0
- package/dist/assets/{useDateFormatter-CmtFqjqu.js → useDateFormatter-DOoVZUts.js} +1 -1
- package/dist/assets/{useDeleteCell-BAfiIxKf.js → useDeleteCell-C1uMlYZu.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-jTu3L200.js → useDependencyPanelTab-nuk9kUr_.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-CyTwCrsi.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-Bh8YMrlo.js +1 -0
- package/dist/assets/{useNumberFormatter-DMA_kIIZ.js → useNumberFormatter-BXZcbTzH.js} +1 -1
- package/dist/assets/usePress-G817DpBk.js +7 -0
- package/dist/assets/{useSplitCell-CB32IpFa.js → useSplitCell-D7EHwIIE.js} +1 -1
- package/dist/assets/{useTheme-CwdqVOYu.js → useTheme-Co8bbxoC.js} +1 -1
- package/dist/assets/{utils-CORJ8yYa.js → utils-C1ZciZbF.js} +1 -1
- package/dist/assets/{vega-component-BLW2fY7v.js → vega-component-CoUjMYqz.js} +1 -1
- package/dist/assets/{vega-loader.browser-CZV6_g2i.js → vega-loader.browser-BJ9oKrvH.js} +1 -1
- package/dist/assets/{write-secret-modal-DuxmGjDn.js → write-secret-modal-DOyKonZB.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-Bnjm0Q9u.js → xychartDiagram-PRI3JC2R-CTDFOoiw.js} +1 -1
- package/dist/index.html +131 -130
- 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/data-table/pagination.tsx +36 -30
- 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/components.tsx +0 -38
- package/src/components/storage/storage-file-viewer.tsx +1 -1
- package/src/components/storage/storage-inspector.tsx +28 -45
- 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/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-BSS73m03.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-HnyO4-L2.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-26-lDVMB.js +0 -13
- package/dist/assets/file-code-D9wtWSiR.js +0 -1
- package/dist/assets/file-explorer-panel-Bv8lRdKl.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-B8ImLAg8.js +0 -38
- package/dist/assets/input-BPldEXfy.js +0 -1
- package/dist/assets/katex-YDobqqVd.js +0 -1
- package/dist/assets/layout-DVAA7kHH.js +0 -5
- package/dist/assets/mermaid-4DMBBIKO-C0QemhGt.js +0 -1
- package/dist/assets/purify.es-CPplrWRQ.js +0 -2
- package/dist/assets/react-vega-1nuO-sn0.js +0 -1
- package/dist/assets/session-panel-B_8ny7jh.js +0 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-ct96_mle.js +0 -1
- package/dist/assets/stex-pjf-hOob.js +0 -1
- package/dist/assets/tracing-panel-Dz9mRjXj.js +0 -2
- 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-XGX8NzaB.js +0 -1
- package/dist/assets/usePress-DsLftN-x.js +0 -7
- /package/dist/assets/{Deferred-D2igisxY.js → Deferred-BMfCOLaw.js} +0 -0
- /package/dist/assets/{SSRProvider-DC7ElCZZ.js → SSRProvider-CwqN9FWV.js} +0 -0
- /package/dist/assets/{alert-0YTlkh9P.js → alert-Bs8tbZo_.js} +0 -0
- /package/dist/assets/{badge-CNBv2dAU.js → badge-BUFDGZ04.js} +0 -0
- /package/dist/assets/{blob-CObhN-9g.js → blob-DgooIGjS.js} +0 -0
- /package/dist/assets/{defaultLocale-DK1MWd7f.js → defaultLocale-CGfP-Ye3.js} +0 -0
- /package/dist/assets/{defaultLocale-OkOxlkkM.js → defaultLocale-CuYNS33t.js} +0 -0
- /package/dist/assets/{emotion-is-prop-valid.esm-D7FeWASw.js → emotion-is-prop-valid.esm-lG8j6oqk.js} +0 -0
- /package/dist/assets/{en-US-DBqDb4Nb.js → en-US-k6sS5Nab.js} +0 -0
- /package/dist/assets/{errors-Bfogio62.js → errors-0IrrdfSG.js} +0 -0
- /package/dist/assets/{extends-aq1t6BkR.js → extends-B9D0JO9U.js} +0 -0
- /package/dist/assets/{github-BrsjF9dp.js → github-BY6XM4ej.js} +0 -0
- /package/dist/assets/{isValid-D3F4nmET.js → isValid-CUXKlcrM.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/{link-Cpo6yhBB.js → link-BmtFffTv.js} +0 -0
- /package/dist/assets/{links-BKV6zi_7.js → links-MkDbmF2p.js} +0 -0
- /package/dist/assets/{objectWithoutPropertiesLoose-Dxmp_Bd_.js → objectWithoutPropertiesLoose-CboCOq4o.js} +0 -0
- /package/dist/assets/{ordinal-BEKpVWu-.js → ordinal-DMIExrUm.js} +0 -0
- /package/dist/assets/{paths-bMgYkaP2.js → paths-D2lG83Oh.js} +0 -0
- /package/dist/assets/{play-D4Tdvkms.js → play-CkqWG85-.js} +0 -0
- /package/dist/assets/{plus-B-s-VRHt.js → plus-C9B_qWUi.js} +0 -0
- /package/dist/assets/{preload-helper-TXkS1QI3.js → preload-helper-BW0IMuFq.js} +0 -0
- /package/dist/assets/{prop-types-DRf51_gT.js → prop-types-C638SUfx.js} +0 -0
- /package/dist/assets/{range-DNqFcYmr.js → range-ClqUI25v.js} +0 -0
- /package/dist/assets/{refresh-ccw-BOzRCrXK.js → refresh-ccw-B3lGEyQm.js} +0 -0
- /package/dist/assets/{refresh-cw-DeCFDX1B.js → refresh-cw-fLeDriQe.js} +0 -0
- /package/dist/assets/{rotate-ccw-BG5BZyzw.js → rotate-ccw-DgH8qERb.js} +0 -0
- /package/dist/assets/{save-I_RGv5p0.js → save-C91FTnFa.js} +0 -0
- /package/dist/assets/{settings-DD8FJvQ_.js → settings-DRfuuLRT.js} +0 -0
- /package/dist/assets/{spinner-DCSoZZhh.js → spinner-Dt4SmUsI.js} +0 -0
- /package/dist/assets/{square-oV8Csj8Y.js → square-DZpWT_hp.js} +0 -0
- /package/dist/assets/{square-function-4zY5Dv0P.js → square-function-DEp1ozoA.js} +0 -0
- /package/dist/assets/{stex-FMMSUPAS.js → stex-0ac7Aukl.js} +0 -0
- /package/dist/assets/{trash-2-DtQaB9NM.js → trash-2-CrA4LwJ2.js} +0 -0
- /package/dist/assets/{trash-Basz0Kvc.js → trash-ZGxZ3QGq.js} +0 -0
- /package/dist/assets/{triangle-alert-n1-FF7zs.js → triangle-alert-CzmxsxFO.js} +0 -0
- /package/dist/assets/{types-BhvWC48z.js → types-CswNghXe.js} +0 -0
- /package/dist/assets/{use-toast-BhMe50aT.js → use-toast-Hc8CXlvz.js} +0 -0
- /package/dist/assets/{useAsyncData-DVm0BCFt.js → useAsyncData-CI3ntihq.js} +0 -0
- /package/dist/assets/{useDebounce-BUC67G8E.js → useDebounce-S9zaMzrr.js} +0 -0
- /package/dist/assets/{uuid-ImXS-885.js → uuid-ClFZlR7U.js} +0 -0
- /package/dist/assets/{workflow-CU6kAL_h.js → workflow-DgZ_19fF.js} +0 -0
- /package/dist/assets/{youtube-fKFch587.js → youtube-DfMgNU9-.js} +0 -0
|
@@ -6,8 +6,6 @@ import {
|
|
|
6
6
|
ArrowLeftIcon,
|
|
7
7
|
BetweenHorizontalStartIcon,
|
|
8
8
|
BracesIcon,
|
|
9
|
-
ChevronDownIcon,
|
|
10
|
-
ChevronRightIcon,
|
|
11
9
|
CopyIcon,
|
|
12
10
|
CopyMinusIcon,
|
|
13
11
|
DownloadIcon,
|
|
@@ -17,9 +15,7 @@ import {
|
|
|
17
15
|
FilePlus2Icon,
|
|
18
16
|
FolderPlusIcon,
|
|
19
17
|
ListTreeIcon,
|
|
20
|
-
MoreVerticalIcon,
|
|
21
18
|
PlaySquareIcon,
|
|
22
|
-
RefreshCcwIcon,
|
|
23
19
|
Trash2Icon,
|
|
24
20
|
UploadIcon,
|
|
25
21
|
ViewIcon,
|
|
@@ -32,6 +28,18 @@ import {
|
|
|
32
28
|
type TreeApi,
|
|
33
29
|
} from "react-arborist";
|
|
34
30
|
import useEvent from "react-use-event-hook";
|
|
31
|
+
import {
|
|
32
|
+
FILE_ICON,
|
|
33
|
+
FILE_ICON_COLOR,
|
|
34
|
+
type FileIconType,
|
|
35
|
+
guessFileIconType,
|
|
36
|
+
} from "@/components/editor/file-tree/file-icons";
|
|
37
|
+
import {
|
|
38
|
+
MENU_ITEM_ICON_CLASS,
|
|
39
|
+
MoreActionsButton,
|
|
40
|
+
RefreshIconButton,
|
|
41
|
+
TreeChevron,
|
|
42
|
+
} from "@/components/editor/file-tree/tree-actions";
|
|
35
43
|
import { MarimoIcon, MarimoPlusIcon } from "@/components/icons/marimo-icons";
|
|
36
44
|
import { Spinner } from "@/components/icons/spinner";
|
|
37
45
|
import { useImperativeModal } from "@/components/modal/ImperativeModal";
|
|
@@ -65,12 +73,7 @@ import { useTreeDndManager } from "./dnd-wrapper";
|
|
|
65
73
|
import { FileViewer } from "./file-viewer";
|
|
66
74
|
import type { RequestingTree } from "./requesting-tree";
|
|
67
75
|
import { openStateAtom, treeAtom } from "./state";
|
|
68
|
-
import {
|
|
69
|
-
FILE_TYPE_ICONS,
|
|
70
|
-
type FileType,
|
|
71
|
-
guessFileType,
|
|
72
|
-
PYTHON_CODE_FOR_FILE_TYPE,
|
|
73
|
-
} from "./types";
|
|
76
|
+
import { PYTHON_CODE_FOR_FILE_TYPE } from "./types";
|
|
74
77
|
import { useFileExplorerUpload } from "./upload";
|
|
75
78
|
|
|
76
79
|
const hiddenFilesState = atomWithStorage(
|
|
@@ -102,7 +105,10 @@ export const FileExplorer: React.FC<{
|
|
|
102
105
|
const { isPending, error } = useAsyncData(() => tree.initialize(setData), []);
|
|
103
106
|
|
|
104
107
|
const handleRefresh = useEvent(() => {
|
|
105
|
-
|
|
108
|
+
// Return the promise so callers can await refresh completion
|
|
109
|
+
return tree.refreshAll(
|
|
110
|
+
Object.keys(openState).filter((id) => openState[id]),
|
|
111
|
+
);
|
|
106
112
|
});
|
|
107
113
|
|
|
108
114
|
const handleHiddenFilesToggle = useEvent(() => {
|
|
@@ -322,16 +328,10 @@ const Toolbar = ({
|
|
|
322
328
|
</button>
|
|
323
329
|
</Tooltip>
|
|
324
330
|
<input {...getInputProps({})} type="file" />
|
|
325
|
-
<
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
variant="text"
|
|
330
|
-
size="xs"
|
|
331
|
-
>
|
|
332
|
-
<RefreshCcwIcon size={16} />
|
|
333
|
-
</Button>
|
|
334
|
-
</Tooltip>
|
|
331
|
+
<RefreshIconButton
|
|
332
|
+
data-testid="file-explorer-refresh-button"
|
|
333
|
+
onClick={onRefresh}
|
|
334
|
+
/>
|
|
335
335
|
<Tooltip content="Toggle hidden files">
|
|
336
336
|
<Button
|
|
337
337
|
data-testid="file-explorer-hidden-files-button"
|
|
@@ -421,11 +421,11 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
421
421
|
useRequestClient();
|
|
422
422
|
const disableFileDownloads = useAtomValue(disableFileDownloadsAtom);
|
|
423
423
|
|
|
424
|
-
const fileType:
|
|
424
|
+
const fileType: FileIconType = node.data.isDirectory
|
|
425
425
|
? "directory"
|
|
426
|
-
:
|
|
426
|
+
: guessFileIconType(node.data.name);
|
|
427
427
|
|
|
428
|
-
const Icon =
|
|
428
|
+
const Icon = FILE_ICON[fileType];
|
|
429
429
|
const { openConfirm, openPrompt } = useImperativeModal();
|
|
430
430
|
const { createNewCell } = useCellActions();
|
|
431
431
|
const lastFocusedCellId = useLastFocusedCellId();
|
|
@@ -534,11 +534,7 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
534
534
|
});
|
|
535
535
|
|
|
536
536
|
const renderActions = () => {
|
|
537
|
-
const
|
|
538
|
-
size: 14,
|
|
539
|
-
strokeWidth: 1.5,
|
|
540
|
-
className: "mr-2",
|
|
541
|
-
};
|
|
537
|
+
const ic = MENU_ITEM_ICON_CLASS;
|
|
542
538
|
return (
|
|
543
539
|
<DropdownMenuContent
|
|
544
540
|
align="end"
|
|
@@ -548,7 +544,7 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
548
544
|
>
|
|
549
545
|
{!node.data.isDirectory && (
|
|
550
546
|
<DropdownMenuItem onSelect={() => node.select()}>
|
|
551
|
-
<ViewIcon {
|
|
547
|
+
<ViewIcon className={ic} />
|
|
552
548
|
Open file
|
|
553
549
|
</DropdownMenuItem>
|
|
554
550
|
)}
|
|
@@ -558,34 +554,34 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
558
554
|
openFile({ path: node.data.path });
|
|
559
555
|
}}
|
|
560
556
|
>
|
|
561
|
-
<ExternalLinkIcon {
|
|
557
|
+
<ExternalLinkIcon className={ic} />
|
|
562
558
|
Open file in external editor
|
|
563
559
|
</DropdownMenuItem>
|
|
564
560
|
)}
|
|
565
561
|
{node.data.isDirectory && (
|
|
566
562
|
<>
|
|
567
563
|
<DropdownMenuItem onSelect={() => handleCreateNotebook()}>
|
|
568
|
-
<MarimoPlusIcon {
|
|
564
|
+
<MarimoPlusIcon className={ic} />
|
|
569
565
|
Create notebook
|
|
570
566
|
</DropdownMenuItem>
|
|
571
567
|
<DropdownMenuItem onSelect={() => handleCreateFile()}>
|
|
572
|
-
<FilePlus2Icon {
|
|
568
|
+
<FilePlus2Icon className={ic} />
|
|
573
569
|
Create file
|
|
574
570
|
</DropdownMenuItem>
|
|
575
571
|
<DropdownMenuItem onSelect={() => handleCreateFolder()}>
|
|
576
|
-
<FolderPlusIcon {
|
|
572
|
+
<FolderPlusIcon className={ic} />
|
|
577
573
|
Create folder
|
|
578
574
|
</DropdownMenuItem>
|
|
579
575
|
<DropdownMenuSeparator />
|
|
580
576
|
</>
|
|
581
577
|
)}
|
|
582
578
|
<DropdownMenuItem onSelect={() => node.edit()}>
|
|
583
|
-
<Edit3Icon {
|
|
579
|
+
<Edit3Icon className={ic} />
|
|
584
580
|
Rename
|
|
585
581
|
</DropdownMenuItem>
|
|
586
582
|
{!node.data.isDirectory && (
|
|
587
583
|
<DropdownMenuItem onSelect={handleDuplicate}>
|
|
588
|
-
<CopyIcon {
|
|
584
|
+
<CopyIcon className={ic} />
|
|
589
585
|
Duplicate
|
|
590
586
|
</DropdownMenuItem>
|
|
591
587
|
)}
|
|
@@ -595,7 +591,7 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
595
591
|
toast({ title: "Copied to clipboard" });
|
|
596
592
|
}}
|
|
597
593
|
>
|
|
598
|
-
<ListTreeIcon {
|
|
594
|
+
<ListTreeIcon className={ic} />
|
|
599
595
|
Copy path
|
|
600
596
|
</DropdownMenuItem>
|
|
601
597
|
{tree && (
|
|
@@ -607,7 +603,7 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
607
603
|
toast({ title: "Copied to clipboard" });
|
|
608
604
|
}}
|
|
609
605
|
>
|
|
610
|
-
<ListTreeIcon {
|
|
606
|
+
<ListTreeIcon className={ic} />
|
|
611
607
|
Copy relative path
|
|
612
608
|
</DropdownMenuItem>
|
|
613
609
|
)}
|
|
@@ -620,7 +616,7 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
620
616
|
handleInsertCode(pythonCode);
|
|
621
617
|
}}
|
|
622
618
|
>
|
|
623
|
-
<BetweenHorizontalStartIcon {
|
|
619
|
+
<BetweenHorizontalStartIcon className={ic} />
|
|
624
620
|
Insert snippet for reading file
|
|
625
621
|
</DropdownMenuItem>
|
|
626
622
|
<DropdownMenuItem
|
|
@@ -635,7 +631,7 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
635
631
|
await copyToClipboard(pythonCode);
|
|
636
632
|
}}
|
|
637
633
|
>
|
|
638
|
-
<BracesIcon {
|
|
634
|
+
<BracesIcon className={ic} />
|
|
639
635
|
Copy snippet for reading file
|
|
640
636
|
</DropdownMenuItem>
|
|
641
637
|
{/* Not shown in WASM */}
|
|
@@ -643,7 +639,7 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
643
639
|
<>
|
|
644
640
|
<DropdownMenuSeparator />
|
|
645
641
|
<DropdownMenuItem onSelect={handleOpenMarimoFile}>
|
|
646
|
-
<PlaySquareIcon {
|
|
642
|
+
<PlaySquareIcon className={ic} />
|
|
647
643
|
Open notebook
|
|
648
644
|
</DropdownMenuItem>
|
|
649
645
|
</>
|
|
@@ -658,14 +654,14 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
658
654
|
downloadBlob(new Blob([contents]), node.data.name);
|
|
659
655
|
}}
|
|
660
656
|
>
|
|
661
|
-
<DownloadIcon {
|
|
657
|
+
<DownloadIcon className={ic} />
|
|
662
658
|
Download
|
|
663
659
|
</DropdownMenuItem>
|
|
664
660
|
<DropdownMenuSeparator />
|
|
665
661
|
</>
|
|
666
662
|
)}
|
|
667
663
|
<DropdownMenuItem onSelect={handleDeleteFile} variant="danger">
|
|
668
|
-
<Trash2Icon {
|
|
664
|
+
<Trash2Icon className={ic} />
|
|
669
665
|
Delete
|
|
670
666
|
</DropdownMenuItem>
|
|
671
667
|
</DropdownMenuContent>
|
|
@@ -699,7 +695,10 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
699
695
|
{node.data.isMarimoFile ? (
|
|
700
696
|
<MarimoIcon className="w-5 h-5 shrink-0 mr-2" strokeWidth={1.5} />
|
|
701
697
|
) : (
|
|
702
|
-
<Icon
|
|
698
|
+
<Icon
|
|
699
|
+
className={cn("w-5 h-5 shrink-0 mr-2", FILE_ICON_COLOR[fileType])}
|
|
700
|
+
strokeWidth={1.5}
|
|
701
|
+
/>
|
|
703
702
|
)}
|
|
704
703
|
{node.isEditing ? (
|
|
705
704
|
<Edit node={node} />
|
|
@@ -712,19 +711,10 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
712
711
|
tabIndex={-1}
|
|
713
712
|
onClick={(e) => e.stopPropagation()}
|
|
714
713
|
>
|
|
715
|
-
<
|
|
714
|
+
<MoreActionsButton
|
|
716
715
|
data-testid="file-explorer-more-button"
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
size="xs"
|
|
720
|
-
className="mb-0"
|
|
721
|
-
aria-label="More options"
|
|
722
|
-
>
|
|
723
|
-
<MoreVerticalIcon
|
|
724
|
-
strokeWidth={2}
|
|
725
|
-
className="w-5 h-5 hidden group-hover:block"
|
|
726
|
-
/>
|
|
727
|
-
</Button>
|
|
716
|
+
iconClassName="w-5 h-5"
|
|
717
|
+
/>
|
|
728
718
|
</DropdownMenuTrigger>
|
|
729
719
|
{renderActions()}
|
|
730
720
|
</DropdownMenu>
|
|
@@ -735,14 +725,10 @@ const Node = ({ node, style, dragHandle }: NodeRendererProps<FileInfo>) => {
|
|
|
735
725
|
|
|
736
726
|
const FolderArrow = ({ node }: { node: NodeApi<FileInfo> }) => {
|
|
737
727
|
if (!node.data.isDirectory) {
|
|
738
|
-
return <span className="w-
|
|
728
|
+
return <span className="w-4 h-4 shrink-0" />;
|
|
739
729
|
}
|
|
740
730
|
|
|
741
|
-
return node.isOpen
|
|
742
|
-
<ChevronDownIcon className="w-5 h-5 shrink-0" />
|
|
743
|
-
) : (
|
|
744
|
-
<ChevronRightIcon className="w-5 h-5 shrink-0" />
|
|
745
|
-
);
|
|
731
|
+
return <TreeChevron isExpanded={node.isOpen} className="w-4 h-4" />;
|
|
746
732
|
};
|
|
747
733
|
|
|
748
734
|
function openMarimoNotebook(
|
|
@@ -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,
|