@marimo-team/frontend 0.23.7-dev0 → 0.23.7-dev10
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-CO_unhk0.js → CellStatus-CN4mKUXv.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-k8s9vETJ.js → ConnectedDataExplorerComponent-DeBM0cl9.js} +1 -1
- package/dist/assets/JsonOutput-B0sjIMBK.js +49 -0
- package/dist/assets/LazyAnyLanguageCodeMirror-pAFdCqyC.js +2 -0
- package/dist/assets/{MarimoErrorOutput-1q6qtvxi.js → MarimoErrorOutput-ClA7EZGX.js} +1 -1
- package/dist/assets/{RenderHTML-DkEHxB1r.js → RenderHTML-CruxVneu.js} +1 -1
- package/dist/assets/{add-cell-with-ai-D5JeNTNV.js → add-cell-with-ai-C7f_bUyB.js} +3 -3
- package/dist/assets/{add-connection-dialog-_nMyst1l.js → add-connection-dialog-DSOgwTlO.js} +1 -1
- package/dist/assets/{agent-panel-CBj2Q42_.js → agent-panel-CeDyKw1_.js} +1 -1
- package/dist/assets/{ai-model-dropdown-B-9yxYM4.js → ai-model-dropdown-kQdQhWyz.js} +1 -1
- package/dist/assets/{any-language-editor-C9DM60EN.js → any-language-editor-CwwS-naY.js} +1 -1
- package/dist/assets/apl-CaYjM5u2.js +1 -0
- package/dist/assets/{app-config-button-BOc_z0uX.js → app-config-button-dnmk7p6n.js} +1 -1
- package/dist/assets/{arc-ONRhTAm2.js → arc-D1owqr0z.js} +1 -1
- package/dist/assets/{architecture-7HQA4BMR-B8Ryu75w.js → architecture-7HQA4BMR-BzXB-NJy.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-JNogHSZh.js → architectureDiagram-VXUJARFQ-D6wy26r_.js} +1 -1
- package/dist/assets/asciiarmor-D2cJUKTq.js +1 -0
- package/dist/assets/asn1-CZDBKivQ.js +1 -0
- package/dist/assets/{blockDiagram-VD42YOAC-Dy-_c6-H.js → blockDiagram-VD42YOAC-CGtjuPGT.js} +1 -1
- package/dist/assets/brainfuck-D5O26WTe.js +1 -0
- package/dist/assets/{c4Diagram-YG6GDRKO-DHRUX7S-.js → c4Diagram-YG6GDRKO-BSjPyzdq.js} +1 -1
- package/dist/assets/{cache-panel-B_zs00Q_.js → cache-panel-DDJqyuAl.js} +1 -1
- package/dist/assets/{cell-editor-C1BpIU12.js → cell-editor-DOImf428.js} +3 -3
- package/dist/assets/{cell-link-CC2MiW7a.js → cell-link-DqiCeeeS.js} +1 -1
- package/dist/assets/{cells-DAxz8J5R.js → cells-BBDzmUIS.js} +5 -5
- package/dist/assets/channel-D2-MhlpJ.js +1 -0
- package/dist/assets/{chat-display-BiUNr6dU.js → chat-display-Ct3Me0kL.js} +1 -1
- package/dist/assets/{chat-panel-BHsaaTzR.js → chat-panel-CXvtUFUU.js} +1 -1
- package/dist/assets/{chat-ui-CTYG4pnL.js → chat-ui-UFERs8Gx.js} +1 -1
- package/dist/assets/{chunk-4BX2VUAB-mPGRpph5.js → chunk-4BX2VUAB-Co_nHYv2.js} +1 -1
- package/dist/assets/chunk-55IACEB6-CSG9iNvo.js +1 -0
- package/dist/assets/{chunk-5FQGJX7Z-e_arGD4o.js → chunk-5FQGJX7Z-BReOK4Lg.js} +2 -2
- package/dist/assets/{chunk-ABZYJK2D-BInZW7OW.js → chunk-ABZYJK2D-CvNlx3OC.js} +3 -3
- package/dist/assets/{chunk-ATLVNIR6-_9Zaw7IP.js → chunk-ATLVNIR6-EZIDpjkm.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-Bg43tpY1.js → chunk-B4BG7PRW-B3yrge9N.js} +1 -1
- package/dist/assets/{chunk-CVBHYZKI-Brsoob-W.js → chunk-CVBHYZKI-lxEaq00s.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-DX01Gov5.js → chunk-DI55MBZ5-NrI5veM7.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-Cwo9-IiR.js → chunk-EXTU4WIE-DcGAJuBg.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-Bt9icXTy.js → chunk-FMBD7UC4-CD1D2uhs.js} +1 -1
- package/dist/assets/{chunk-HN2XXSSU-BBxJMYrA.js → chunk-HN2XXSSU-DNIvfs-V.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-C6cvGHie.js → chunk-JA3XYJ7Z-B-G51Lop.js} +1 -1
- package/dist/assets/{chunk-JZLCHNYA-BM-e2D_8.js → chunk-JZLCHNYA-B1QJXpkc.js} +1 -1
- package/dist/assets/{chunk-MI3HLSF2-D6we5Ftb.js → chunk-MI3HLSF2-SpVCtnNg.js} +1 -1
- package/dist/assets/{chunk-N4CR4FBY-BREYOeLP.js → chunk-N4CR4FBY-DaT7rK9q.js} +2 -2
- package/dist/assets/{chunk-QN33PNHL-DwGffwWu.js → chunk-QN33PNHL-eWaiYkN_.js} +1 -1
- package/dist/assets/{chunk-QXUST7PY-Q2jlSUop.js → chunk-QXUST7PY-yCShGuH_.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-CeNfSWg4.js → chunk-QZHKN3VN-Bf2ysi2t.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-DGKPoF4U.js → chunk-S3R3BYOJ-BuT2smkb.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-Bfbjtd_W.js → chunk-TZMSLE5B-tzDl0-3S.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-CSdm65qE.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-B2-GAMOQ.js +1 -0
- package/dist/assets/{clike-O99jWPIc.js → clike-TwxwxEw_.js} +1 -1
- package/dist/assets/clojure-B8dfjAV6.js +1 -0
- package/dist/assets/cmake-D3vlGJdL.js +1 -0
- package/dist/assets/cobol-S-4I_F1W.js +1 -0
- package/dist/assets/{code-block-37QAKDTI-CtU_48GW.js → code-block-37QAKDTI-BZ77cXM8.js} +1 -1
- package/dist/assets/coffeescript-DG-Oj54u.js +1 -0
- package/dist/assets/{column-preview-DBPye87P.js → column-preview-Xuel1zsI.js} +1 -1
- package/dist/assets/{command-palette-C3fn0qCr.js → command-palette-CSa-ZC8t.js} +1 -1
- package/dist/assets/{common-Qy2P7rii.js → common-Dk5VdfJt.js} +1 -1
- package/dist/assets/commonlisp-CWlOS49U.js +1 -0
- package/dist/assets/{components-CZy03693.js → components-CTKNCmC_.js} +1 -1
- package/dist/assets/{components-D9aJNSr-.js → components-DsoH1pO3.js} +1 -1
- package/dist/assets/{cose-bilkent-S5V4N54A-DWjOkKYE.js → cose-bilkent-S5V4N54A-CEx_UMjg.js} +1 -1
- package/dist/assets/crystal-CD-LQ3E-.js +1 -0
- package/dist/assets/{css-Ctj1grpW.js → css-sdrF9ahV.js} +1 -1
- package/dist/assets/cypher-oiVTIRlU.js +1 -0
- package/dist/assets/d-KaoGirPa.js +1 -0
- package/dist/assets/{dagre-6UL2VRFP-DWD6iJku.js → dagre-6UL2VRFP-Ca6G800E.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-DvZ8PZ2g.js → data-grid-overlay-editor-D-UNM6-P.js} +1 -1
- package/dist/assets/{datasource-C1JWjcmE.js → datasource-CmTCEk66.js} +1 -1
- package/dist/assets/{dependency-graph-panel-DOHj-hNc.js → dependency-graph-panel-0u1-ZaOT.js} +1 -1
- package/dist/assets/{diagram-PSM6KHXK-B_Cc0ttH.js → diagram-PSM6KHXK-B6oP3YWR.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-DhI0d2dH.js → diagram-QEK2KX5R-BjsoVcta.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-cc2LNQee.js → diagram-S2PKOQOG-CmzTe5KJ.js} +1 -1
- package/dist/assets/diff-Df1QxxZl.js +1 -0
- package/dist/assets/dist-2Z1sSg1x.js +1 -0
- package/dist/assets/{dist-CbOE2rpr.js → dist-7iwSqhl8.js} +1 -1
- package/dist/assets/dist-B6zNcPeA.js +1 -0
- package/dist/assets/{dist-Dq4wQg6C.js → dist-BiTPETny.js} +1 -1
- package/dist/assets/{dist-e6kaTCKJ.js → dist-BojrNCCU.js} +1 -1
- package/dist/assets/{dist-BvZKHNvJ.js → dist-CHMkheIP.js} +1 -1
- package/dist/assets/{dist-DMSWEOfO.js → dist-D1lU2Qzi.js} +1 -1
- package/dist/assets/{dist-Cn0rcGlX.js → dist-D8QLIJ8u.js} +1 -1
- package/dist/assets/dist-DOBJtV_h.js +1 -0
- package/dist/assets/dist-DUpLnFKL.js +1 -0
- package/dist/assets/{dist-R7_s36kw.js → dist-DZaaRVnC.js} +1 -1
- package/dist/assets/{dist-C204e66A.js → dist-DZq-MBWk.js} +1 -1
- package/dist/assets/{dist-Dn_fCOGr.js → dist-Iv0YPPAU.js} +1 -1
- package/dist/assets/{dist-D4HwuQrf.js → dist-YUbAFc_i.js} +1 -1
- package/dist/assets/{dist-BVBYIAbx.js → dist-bOUvGRGG.js} +1 -1
- package/dist/assets/{dockerfile-DERk1oNL.js → dockerfile-CImncS5w.js} +1 -1
- package/dist/assets/{documentation-panel-BM7hNnyp.js → documentation-panel-CcE7aGO9.js} +1 -1
- package/dist/assets/{download-CXTuIv7r.js → download-QGh9oR1D.js} +1 -1
- package/dist/assets/dtd-Aj5m459l.js +1 -0
- package/dist/assets/dylan-CdSB1nh8.js +1 -0
- package/dist/assets/ecl-CvwsCfi6.js +1 -0
- package/dist/assets/{edit-page-Ct5Ke1wi.js → edit-page-CMzqgK6j.js} +3 -3
- package/dist/assets/eiffel-Bws25dAs.js +1 -0
- package/dist/assets/elm--WkcLZ1a.js +1 -0
- package/dist/assets/{erDiagram-Q2GNP2WA-CPtVWZYn.js → erDiagram-Q2GNP2WA-CK4Kc1gP.js} +1 -1
- package/dist/assets/erlang-Ct30wW1o.js +1 -0
- package/dist/assets/{error-banner-C6aBa98y.js → error-banner-C10O4l3y.js} +1 -1
- package/dist/assets/{error-panel-BN-anQD3.js → error-panel-ChlzbfWg.js} +1 -1
- package/dist/assets/{esm-BRNC35J6.js → esm-DN_A77ya.js} +1 -1
- package/dist/assets/{factor-BbYo7zsD.js → factor-B3fhZG6W.js} +1 -1
- package/dist/assets/factor-DbSpQa-0.js +1 -0
- package/dist/assets/file-explorer-panel-8dWLD2PY.js +26 -0
- package/dist/assets/{file-icons-5G4ZC70N.js → file-icons-Cs4oXsAy.js} +1 -1
- package/dist/assets/file-name-input-g7pBBCjk.js +3 -0
- package/dist/assets/fileToBase64-Dpv4aII5.js +1 -0
- package/dist/assets/{floating-outline-DHE0ukvC.js → floating-outline-CFUSr2du.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-LeaIbfPS.js → flowDiagram-NV44I4VS-hhUTWDGs.js} +1 -1
- package/dist/assets/{focus-Crs_4nnQ.js → focus-J47a1GCq.js} +1 -1
- package/dist/assets/{form-DRJZl2zK.js → form-CdFqEqTA.js} +1 -1
- package/dist/assets/forth-BP0pXyoR.js +1 -0
- package/dist/assets/fortran-DpX_2iww.js +1 -0
- package/dist/assets/{gallery-page-C4kMatxN.js → gallery-page-TIWZFnOT.js} +1 -1
- package/dist/assets/{ganttDiagram-JELNMOA3-Bj-STLOZ.js → ganttDiagram-JELNMOA3-Dpb7hBaR.js} +1 -1
- package/dist/assets/gas-CiUR6fHB.js +1 -0
- package/dist/assets/gherkin-C9v48C48.js +1 -0
- package/dist/assets/{gitGraph-G5XIXVHT-CiMGDHpk.js → gitGraph-G5XIXVHT-Xz2NQxVt.js} +1 -1
- package/dist/assets/{gitGraphDiagram-V2S2FVAM-B9HDL4DZ.js → gitGraphDiagram-V2S2FVAM-DHCl4EFT.js} +1 -1
- package/dist/assets/{glide-data-editor-DqqLCmqF.js → glide-data-editor-ChlIFl33.js} +4 -4
- package/dist/assets/groovy-psUnKwK-.js +1 -0
- package/dist/assets/haskell-DZHQAKUV.js +1 -0
- package/dist/assets/haxe-AOvPCF-w.js +1 -0
- package/dist/assets/{home-page-BM_BZnw7.js → home-page-HhJfA35e.js} +1 -1
- package/dist/assets/{hooks-CUEvgvEQ.js → hooks-BpoZRNxw.js} +1 -1
- package/dist/assets/{html-to-image-v-_444d3.js → html-to-image-CAiN3VHj.js} +1 -1
- package/dist/assets/idl-CSA8C1ck.js +1 -0
- package/dist/assets/index-BbBhLC0d.css +2 -0
- package/dist/assets/index-fXenSTRv.js +42 -0
- package/dist/assets/{info-VBDWY6EO-yA01qfll.js → info-VBDWY6EO-BpskktdI.js} +1 -1
- package/dist/assets/infoDiagram-HS3SLOUP-C51uJjUn.js +2 -0
- package/dist/assets/javascript-XMYUq5-t.js +1 -0
- package/dist/assets/{journeyDiagram-XKPGCS4Q-D29tj64e.js → journeyDiagram-XKPGCS4Q-CD6bTQpr.js} +1 -1
- package/dist/assets/julia-oON8zLDW.js +1 -0
- package/dist/assets/{kanban-definition-3W4ZIXB7-DStZ4tGj.js → kanban-definition-3W4ZIXB7-D3rGxlSj.js} +1 -1
- package/dist/assets/katex-DPCeZ37j.js +1 -0
- package/dist/assets/{kiosk-mode-DKb6W1WN.js → kiosk-mode-Cr9yyT7A.js} +1 -1
- package/dist/assets/{layout-Bp1vAdBy.js → layout-D5myrs5s.js} +3 -3
- package/dist/assets/{line-j0cbFv7-.js → line-BA7eTS55.js} +1 -1
- package/dist/assets/{linear-Cof2JLCQ.js → linear-Dmb_KwjK.js} +1 -1
- package/dist/assets/livescript--BxQO5G_.js +1 -0
- package/dist/assets/{logs-panel-BWCDk8Zy.js → logs-panel-B2tW94um.js} +1 -1
- package/dist/assets/{loro_wasm_bg-DWJCS9pK.js → loro_wasm_bg-CklgjGbG.js} +1 -1
- package/dist/assets/lua-CUyaVUOv.js +1 -0
- package/dist/assets/{markdown-renderer-CbuqHMPu.js → markdown-renderer-CVd_mMPt.js} +3 -3
- package/dist/assets/mathematica-ONd8izyd.js +1 -0
- package/dist/assets/mbox-kjl3g9N-.js +1 -0
- package/dist/assets/mermaid-4DMBBIKO-BeB_2G2B.js +1 -0
- package/dist/assets/{mermaid-BfdNvRSd.js → mermaid-ByDNZESx.js} +7 -7
- package/dist/assets/{mermaid-parser.core-BQULBKwL.js → mermaid-parser.core-CzmbMcI0.js} +2 -2
- package/dist/assets/{mhchem-BNLsaqjJ.js → mhchem-B4Y0i8Fp.js} +1 -1
- package/dist/assets/{mindmap-definition-VGOIOE7T-Cy9nt356.js → mindmap-definition-VGOIOE7T-CmLdKdIH.js} +1 -1
- package/dist/assets/mirc-BZ6TyuOO.js +1 -0
- package/dist/assets/mllike-Dxt2U6MQ.js +1 -0
- package/dist/assets/modelica-B9sdhdtj.js +1 -0
- package/dist/assets/mscgen-5e5Z5trn.js +1 -0
- package/dist/assets/mumps-BUfWDrRe.js +1 -0
- package/dist/assets/{name-cell-input-DoYtA-nF.js → name-cell-input-DDQOQSsh.js} +1 -1
- package/dist/assets/nsis-Dq7T79DJ.js +1 -0
- package/dist/assets/{nsis-Cr8jf68z.js → nsis-QuE155sg.js} +1 -1
- package/dist/assets/ntriples-Dqzi7kwu.js +1 -0
- package/dist/assets/{number-overlay-editor-8-GuvfJX.js → number-overlay-editor-C8YnP6Ac.js} +1 -1
- package/dist/assets/octave-v4IgjFm5.js +1 -0
- package/dist/assets/{ordinal-K0JYqmCT.js → ordinal-C9PZ4yw5.js} +1 -1
- package/dist/assets/{outline-panel-C5bTOsj4.js → outline-panel-BuTQis3o.js} +1 -1
- package/dist/assets/oz-BtUsXhbc.js +1 -0
- package/dist/assets/{packages-panel-CHVjLKJK.js → packages-panel-CVu8Cpkz.js} +1 -1
- package/dist/assets/{packet-DYOGHKS2-D9yUvksZ.js → packet-DYOGHKS2-BqwwD9JS.js} +1 -1
- package/dist/assets/{panels-GT2UyjFN.js → panels-COAp5_gz.js} +1 -1
- package/dist/assets/pascal-DV7k6vJ0.js +1 -0
- package/dist/assets/perl-Bz7YaP_R.js +1 -0
- package/dist/assets/{pie-VRWISCQL-Cz1iTD2y.js → pie-VRWISCQL-BqNfdcWg.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-CqhovvcK.js → pieDiagram-ADFJNKIX-MH-0tvkn.js} +1 -1
- package/dist/assets/pig-BQWmcOEQ.js +1 -0
- package/dist/assets/powershell-CmIFs71i.js +1 -0
- package/dist/assets/{process-output-CKd9tbdL.js → process-output-DSqjZYr-.js} +1 -1
- package/dist/assets/properties-D7F2Eomu.js +1 -0
- package/dist/assets/protobuf-BMELuvny.js +1 -0
- package/dist/assets/pug-C2KbP_v3.js +1 -0
- package/dist/assets/{pug-CKg66ZCy.js → pug-NA-6TsNe.js} +1 -1
- package/dist/assets/puppet-C7MviiPj.js +1 -0
- package/dist/assets/python-BUl8uFIl.js +1 -0
- package/dist/assets/q-B5bIbNKB.js +1 -0
- package/dist/assets/{quadrantDiagram-AYHSOK5B-BNyiC3hL.js → quadrantDiagram-AYHSOK5B-BSw-Ouba.js} +1 -1
- package/dist/assets/r-B0lU_x8o.js +1 -0
- package/dist/assets/{radar-ZZBFDIW7-y2-V58qq.js → radar-ZZBFDIW7-CYyEWqrT.js} +1 -1
- package/dist/assets/{radio-group-BI3wOhfc.js → radio-group-CpHTexlq.js} +1 -1
- package/dist/assets/{react-vega-SibldZnp.js → react-vega-B30MPQ4_.js} +1 -1
- package/dist/assets/{react-vega-C1LnPwEN.js → react-vega-CXAF6OHL.js} +1 -1
- package/dist/assets/{readonly-python-code-CaKJ84fy.js → readonly-python-code-DOXF2p8K.js} +1 -1
- package/dist/assets/{requirementDiagram-UZGBJVZJ-U4CoEx7e.js → requirementDiagram-UZGBJVZJ-BtGFP-o9.js} +1 -1
- package/dist/assets/{reveal-component-DC85rv-5.js → reveal-component-CJYRD8Yf.js} +1 -1
- package/dist/assets/rpm-BqQ3VFpY.js +1 -0
- package/dist/assets/ruby-AFh8QoqR.js +1 -0
- package/dist/assets/{run-page-CldmTgnu.js → run-page-CTQJzZGR.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-BXgCc5j4.js → sankeyDiagram-TZEHDZUN-yIdYlc6x.js} +1 -1
- package/dist/assets/sas-CeRTI9sn.js +1 -0
- package/dist/assets/scheme-D0VcE_o1.js +1 -0
- package/dist/assets/{scratchpad-panel-C6QArhRa.js → scratchpad-panel-SgUSM06x.js} +1 -1
- package/dist/assets/{secrets-panel-DaR50P_m.js → secrets-panel-B8CbRNMo.js} +1 -1
- package/dist/assets/semaphore-QJCD9q3h.js +1 -0
- package/dist/assets/{sequenceDiagram-WL72ISMW-CB8apKmu.js → sequenceDiagram-WL72ISMW-DQwYuLw4.js} +1 -1
- package/dist/assets/{session-panel-bu72cztx.js → session-panel-DHfR6tDv.js} +1 -1
- package/dist/assets/shell-BBh9RTgS.js +1 -0
- package/dist/assets/sieve-BSX0MHaT.js +1 -0
- package/dist/assets/smalltalk-PvrpLgKW.js +1 -0
- package/dist/assets/{snippets-panel-BvuRa1mc.js → snippets-panel-CGs_ME5h.js} +1 -1
- package/dist/assets/sparql-CXsmb8zq.js +1 -0
- package/dist/assets/{src-nKy6a3tt.js → src-Cf4NnJCp.js} +1 -1
- package/dist/assets/state-B_kYpAQh.js +3 -0
- package/dist/assets/{state-DgRSUIT8.js → state-DzJiyfWW.js} +1 -1
- package/dist/assets/{stateDiagram-FKZM4ZOC-3YqeHe0_.js → stateDiagram-FKZM4ZOC-CseMlyhB.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-Bpp9WfFj.js +1 -0
- package/dist/assets/{step-BE8c2ivx.js → step-CVy5FnKg.js} +1 -1
- package/dist/assets/stylus-B60bUBy2.js +1 -0
- package/dist/assets/swift-BwnHGvoR.js +1 -0
- package/dist/assets/tcl-Bj8phnhq.js +1 -0
- package/dist/assets/{terminal-zehb39z5.js → terminal-bb566dQu.js} +1 -1
- package/dist/assets/{textarea-GPxmW3rS.js → textarea-bAp21zYj.js} +1 -1
- package/dist/assets/textile-WPCmEeGb.js +1 -0
- package/dist/assets/{time-C12vLLcl.js → time-RwUekUwP.js} +1 -1
- package/dist/assets/{timeline-definition-IT6M3QCI-DZQqxPSn.js → timeline-definition-IT6M3QCI-Cac1cr1H.js} +1 -1
- package/dist/assets/toml-Cdfp0vaG.js +1 -0
- package/dist/assets/{tracing-CVQn241p.js → tracing-HakOQiQR.js} +1 -1
- package/dist/assets/{tracing-panel-TnogJs00.js → tracing-panel-eas_Nc-b.js} +2 -2
- package/dist/assets/{treemap-GDKQZRPO-C139r55s.js → treemap-GDKQZRPO-Bimjb3pR.js} +1 -1
- package/dist/assets/troff-D4suUzlg.js +1 -0
- package/dist/assets/ttcn-CvD_6RGm.js +1 -0
- package/dist/assets/ttcn-cfg-BX59kgnW.js +1 -0
- package/dist/assets/turtle-midFOTTV.js +1 -0
- package/dist/assets/{useCellActionButton-C8PCItmw.js → useCellActionButton-CHLJURZ7.js} +1 -1
- package/dist/assets/{useDeleteCell-DMZGFMOB.js → useDeleteCell-GFhvGBJ7.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-Jnl7B-vS.js → useDependencyPanelTab-DHd7_0b9.js} +1 -1
- package/dist/assets/{useNotebookActions-U6kQhg4l.js → useNotebookActions-CrtC0jVZ.js} +1 -1
- package/dist/assets/{useRunCells-BMgfN_OV.js → useRunCells-RJeImyCn.js} +1 -1
- package/dist/assets/{useSplitCell-B5YK7yVe.js → useSplitCell-BRZ3fmLD.js} +1 -1
- package/dist/assets/vb-CSNH0UHQ.js +1 -0
- package/dist/assets/vbscript-DTgXfl5y.js +1 -0
- package/dist/assets/vega-component-Bq0lrkG7.js +1 -0
- package/dist/assets/velocity-CKgzALh9.js +1 -0
- package/dist/assets/verilog-NDqaS3bW.js +1 -0
- package/dist/assets/vhdl-BibQgFNM.js +1 -0
- package/dist/assets/webidl-BjqVurO-.js +1 -0
- package/dist/assets/xquery-DQLXMdMd.js +1 -0
- package/dist/assets/{xychartDiagram-PRI3JC2R-CmNNcgCM.js → xychartDiagram-PRI3JC2R-DwmHTbm4.js} +1 -1
- package/dist/assets/yacas-DlkZlCdY.js +1 -0
- package/dist/assets/z80-YKwwCjvZ.js +1 -0
- package/dist/index.html +31 -30
- package/package.json +1 -1
- package/src/components/data-table/TableTopBar.tsx +5 -1
- package/src/components/data-table/data-table.tsx +5 -0
- package/src/components/data-table/download-policy/atoms.ts +10 -0
- package/src/components/data-table/export-actions.tsx +120 -76
- package/src/components/editor/file-tree/requesting-tree.tsx +27 -25
- package/src/components/editor/file-tree/upload.tsx +23 -24
- package/src/core/codemirror/markdown/__tests__/commands.test.ts +3 -3
- package/src/core/codemirror/markdown/commands.ts +1 -2
- package/src/core/network/requests-network.ts +21 -3
- package/src/core/network/types.ts +12 -1
- package/src/core/wasm/bridge.ts +14 -1
- package/src/plugins/core/__test__/sanitize.test.ts +8 -0
- package/src/plugins/impl/DataTablePlugin.tsx +12 -0
- package/src/plugins/impl/TabsPlugin.tsx +35 -7
- package/src/plugins/impl/__tests__/TabsPlugin.test.tsx +154 -0
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +6 -0
- package/src/plugins/impl/vega/resolve-data.ts +8 -1
- package/src/plugins/layout/__test__/MermaidPlugin.test.ts +50 -0
- package/src/plugins/layout/mermaid/MermaidPlugin.tsx +11 -1
- package/src/plugins/layout/mermaid/mermaid.tsx +7 -3
- package/src/utils/__tests__/semaphore.test.ts +218 -0
- package/src/utils/fileToBase64.ts +8 -7
- package/src/utils/semaphore.ts +88 -0
- package/dist/assets/JsonOutput-ugBhs7bt.js +0 -49
- package/dist/assets/LazyAnyLanguageCodeMirror-BF3xpDgO.js +0 -2
- package/dist/assets/apl-m-AMVo9Q.js +0 -1
- package/dist/assets/asciiarmor-BCgPMx-s.js +0 -1
- package/dist/assets/asn1-f2_lxsgc.js +0 -1
- package/dist/assets/brainfuck-ZYebo2B9.js +0 -1
- package/dist/assets/channel-CWEEnT6g.js +0 -1
- package/dist/assets/chunk-55IACEB6-DD051KDZ.js +0 -1
- package/dist/assets/classDiagram-2ON5EDUG-CBbpzZPu.js +0 -1
- package/dist/assets/classDiagram-v2-WZHVMYZB-B0cWCuuo.js +0 -1
- package/dist/assets/clojure-NE6UT6b9.js +0 -1
- package/dist/assets/cmake-7TIUAxVu.js +0 -1
- package/dist/assets/cobol-BdI6-uBH.js +0 -1
- package/dist/assets/coffeescript-CLx5m4GS.js +0 -1
- package/dist/assets/commonlisp-8d9AwdCm.js +0 -1
- package/dist/assets/crystal-Bn-cOTHZ.js +0 -1
- package/dist/assets/cypher-DnT9gfY3.js +0 -1
- package/dist/assets/d-DCjbmG72.js +0 -1
- package/dist/assets/diff-DtVdhdPz.js +0 -1
- package/dist/assets/dist-BkhaSQrg.js +0 -1
- package/dist/assets/dist-_KQbcsP1.js +0 -1
- package/dist/assets/dist-bvHsEZ9m.js +0 -1
- package/dist/assets/dist-jLyLmWUE.js +0 -1
- package/dist/assets/dtd-CHKGQo-k.js +0 -1
- package/dist/assets/dylan-DKXsKw9e.js +0 -1
- package/dist/assets/ecl-BJuToLkm.js +0 -1
- package/dist/assets/eiffel-Bs0gRCeB.js +0 -1
- package/dist/assets/elm-BXUbhN4m.js +0 -1
- package/dist/assets/erlang-B9b7RAaI.js +0 -1
- package/dist/assets/factor-C2NWkG3V.js +0 -1
- package/dist/assets/file-explorer-panel-D1O0vw5C.js +0 -26
- package/dist/assets/file-name-input-C70pv8AE.js +0 -3
- package/dist/assets/fileToBase64-Bzn96tYq.js +0 -1
- package/dist/assets/forth-DAh7UX6C.js +0 -1
- package/dist/assets/fortran-Dy64-0b5.js +0 -1
- package/dist/assets/gas-DC-7PUFB.js +0 -1
- package/dist/assets/gherkin-ByiMyVl5.js +0 -1
- package/dist/assets/groovy-DaM0RAwa.js +0 -1
- package/dist/assets/haskell-BwRtIbXW.js +0 -1
- package/dist/assets/haxe-DFGSCjmC.js +0 -1
- package/dist/assets/idl-Ip8qszMi.js +0 -1
- package/dist/assets/index-BMxMikGP.js +0 -42
- package/dist/assets/index-DH5UUBE4.css +0 -2
- package/dist/assets/infoDiagram-HS3SLOUP-BDcw9LMK.js +0 -2
- package/dist/assets/javascript-DmUu6wxV.js +0 -1
- package/dist/assets/julia-C8K-9kxt.js +0 -1
- package/dist/assets/katex-S9z-JFdU.js +0 -1
- package/dist/assets/livescript-B3MfBDE2.js +0 -1
- package/dist/assets/lua-B2YpVx0h.js +0 -1
- package/dist/assets/mathematica-D9tSC-hw.js +0 -1
- package/dist/assets/mbox-CjoMCyMH.js +0 -1
- package/dist/assets/mermaid-4DMBBIKO-gHC2PS1m.js +0 -1
- package/dist/assets/mirc-DvJdMBLZ.js +0 -1
- package/dist/assets/mllike-5ykSeapn.js +0 -1
- package/dist/assets/modelica-laYOX8Zo.js +0 -1
- package/dist/assets/mscgen-z_sYErek.js +0 -1
- package/dist/assets/mumps-BwcCoPkA.js +0 -1
- package/dist/assets/nsis-CpSPdWjV.js +0 -1
- package/dist/assets/ntriples-D2ki9JZ6.js +0 -1
- package/dist/assets/octave-D817mWs9.js +0 -1
- package/dist/assets/oz-3GS03IG4.js +0 -1
- package/dist/assets/pascal-C08wXab2.js +0 -1
- package/dist/assets/perl-Ija-iETI.js +0 -1
- package/dist/assets/pig-BlBD3yVJ.js +0 -1
- package/dist/assets/powershell-CjOQ_PjD.js +0 -1
- package/dist/assets/properties-5yVGVBrw.js +0 -1
- package/dist/assets/protobuf-hlm5v2rk.js +0 -1
- package/dist/assets/pug-DifRb20b.js +0 -1
- package/dist/assets/puppet-BpFPuj45.js +0 -1
- package/dist/assets/python-B_AEFhuO.js +0 -1
- package/dist/assets/q-BzDxfEQq.js +0 -1
- package/dist/assets/r-BJ9VYyYa.js +0 -1
- package/dist/assets/rpm-Ez4HwV9T.js +0 -1
- package/dist/assets/ruby-BcHOM0EI.js +0 -1
- package/dist/assets/sas-Qmf5gHIU.js +0 -1
- package/dist/assets/scheme-Ctib9V77.js +0 -1
- package/dist/assets/shell-BtgVCAhn.js +0 -1
- package/dist/assets/sieve-CMsTkuH0.js +0 -1
- package/dist/assets/smalltalk-BKSCdMTS.js +0 -1
- package/dist/assets/sparql-TK6HapG4.js +0 -1
- package/dist/assets/state-CjlRDG08.js +0 -3
- package/dist/assets/stateDiagram-v2-4FDKWEC3-Dfvjjqh4.js +0 -1
- package/dist/assets/stylus-C8FKVvgQ.js +0 -1
- package/dist/assets/swift-D7BZKS_y.js +0 -1
- package/dist/assets/tcl-DFrjfFmM.js +0 -1
- package/dist/assets/textile-Bj913nF7.js +0 -1
- package/dist/assets/toml-B6qgmS36.js +0 -1
- package/dist/assets/troff-CysSpyUG.js +0 -1
- package/dist/assets/ttcn-DG1k5i1B.js +0 -1
- package/dist/assets/ttcn-cfg-p1jV7x_I.js +0 -1
- package/dist/assets/turtle-DSkxUncB.js +0 -1
- package/dist/assets/vb-BIvYC4My.js +0 -1
- package/dist/assets/vbscript-Coxg2EVQ.js +0 -1
- package/dist/assets/vega-component-DOyQwlmD.js +0 -1
- package/dist/assets/velocity-Cy90c7hC.js +0 -1
- package/dist/assets/verilog-CTtn3HA0.js +0 -1
- package/dist/assets/vhdl-D3r3mwOF.js +0 -1
- package/dist/assets/webidl-CHPMhkWI.js +0 -1
- package/dist/assets/xquery-d-YlNlXH.js +0 -1
- package/dist/assets/yacas-BfZ0gs5_.js +0 -1
- package/dist/assets/z80-cYJ4lyZA.js +0 -1
- /package/dist/assets/{ImageComparisonComponent-2VO41-VE.js → ImageComparisonComponent-MKB-qBjQ.js} +0 -0
- /package/dist/assets/{Inputs-BdyX096j.js → Inputs-NeZ9OMUu.js} +0 -0
- /package/dist/assets/{Plot-IawheWsD.js → Plot-KSPp-GdN.js} +0 -0
- /package/dist/assets/{apl-T0uH_RjM.js → apl-DHQPYmx2.js} +0 -0
- /package/dist/assets/{array-BCwZq3ts.js → array-Cf4PUXPA.js} +0 -0
- /package/dist/assets/{asciiarmor-D3ol7c2G.js → asciiarmor-fnQAw8T8.js} +0 -0
- /package/dist/assets/{asn1-DA-fXXsk.js → asn1-5lb7I37s.js} +0 -0
- /package/dist/assets/{asterisk-Cy-53Fu-.js → asterisk-XerxOHb_.js} +0 -0
- /package/dist/assets/{azure-ZuB1zQ8Q.js → azure-C2Di2emT.js} +0 -0
- /package/dist/assets/{blob-D-eV0cU3.js → blob-Daju1h1M.js} +0 -0
- /package/dist/assets/{brainfuck-exn1QR7H.js → brainfuck-D30bRgvC.js} +0 -0
- /package/dist/assets/{card-BsOjr9wU.js → card-ICvk7-qa.js} +0 -0
- /package/dist/assets/{chunk-4F5CHEZ2-BBsStyPF.js → chunk-4F5CHEZ2-CRKjiogH.js} +0 -0
- /package/dist/assets/{chunk-B2363JML-CPCjJ6tH.js → chunk-B2363JML-DvPUNzRx.js} +0 -0
- /package/dist/assets/{chunk-DR5Q36YT-DpSMafKt.js → chunk-DR5Q36YT-DrxpR6Mz.js} +0 -0
- /package/dist/assets/{chunk-FRFDVMJY-D6StbPqE.js → chunk-FRFDVMJY-DpWfc7R9.js} +0 -0
- /package/dist/assets/{chunk-PL6DKKU2-x3Qoia3Y.js → chunk-PL6DKKU2-D7_8iK_E.js} +0 -0
- /package/dist/assets/{chunk-SJTYNZTY-BNaCydHS.js → chunk-SJTYNZTY-DwmVeUIB.js} +0 -0
- /package/dist/assets/{chunk-TQ3KTPDO-DfYTN8Ct.js → chunk-TQ3KTPDO-BdfwTgi0.js} +0 -0
- /package/dist/assets/{chunk-UMXZTB3W-DsE6dCbX.js → chunk-UMXZTB3W-BZR4zVXt.js} +0 -0
- /package/dist/assets/{clear-button-DBrTU3uL.js → clear-button-DJUQ_tmP.js} +0 -0
- /package/dist/assets/{click-outside-container-BXzp0MYr.js → click-outside-container-Npdlddni.js} +0 -0
- /package/dist/assets/{clike-BK27e5qn.js → clike-jZeb2kFn.js} +0 -0
- /package/dist/assets/{clojure-Df1U5nhC.js → clojure-C0pkR8m2.js} +0 -0
- /package/dist/assets/{cmake-DrCf0yvp.js → cmake-DlvFtk_M.js} +0 -0
- /package/dist/assets/{cobol-BWxHqof4.js → cobol-C_yb45mr.js} +0 -0
- /package/dist/assets/{coffeescript-nKvg8y_U.js → coffeescript-DBK0AeMT.js} +0 -0
- /package/dist/assets/{colors-CI3VyX7X.js → colors-DUsH-HF1.js} +0 -0
- /package/dist/assets/{common-keywords-CU-S2Vqm.js → common-keywords-D2VmoaPb.js} +0 -0
- /package/dist/assets/{commonlisp-Dm562cBV.js → commonlisp-Bo8hOdn-.js} +0 -0
- /package/dist/assets/{crystal-CrCmK2Cb.js → crystal-DYrQEMVi.js} +0 -0
- /package/dist/assets/{css-jpfGFPDE.js → css-zh47N2UC.js} +0 -0
- /package/dist/assets/{cypher-RQ5M28al.js → cypher-BWPAHm69.js} +0 -0
- /package/dist/assets/{cytoscape.esm-BbAjzIsa.js → cytoscape.esm-B7Zr-PlQ.js} +0 -0
- /package/dist/assets/{d-CNQ_nPqU.js → d-CMuL95tt.js} +0 -0
- /package/dist/assets/{diff-DOODcY7A.js → diff-oor_HZ51.js} +0 -0
- /package/dist/assets/{dist-CsEqrZxx.js → dist-1sgFrolC.js} +0 -0
- /package/dist/assets/{dist-DBBYmRY4.js → dist-B847wb8t.js} +0 -0
- /package/dist/assets/{dist-_qPWf6sD.js → dist-BDZFwK9_.js} +0 -0
- /package/dist/assets/{dist-ooLAQ9IK.js → dist-BjkXqMhR.js} +0 -0
- /package/dist/assets/{dist-DggusHaA.js → dist-Bu99ARwH.js} +0 -0
- /package/dist/assets/{dist-HW7R98td.js → dist-Bxj5sO2I.js} +0 -0
- /package/dist/assets/{dist-D6wwIjcW.js → dist-CBX4gLSR.js} +0 -0
- /package/dist/assets/{dist-CEUFTp7U.js → dist-CPepgudT.js} +0 -0
- /package/dist/assets/{dist-CGDn0y-i.js → dist-CQG39nVX.js} +0 -0
- /package/dist/assets/{dist-Cmcbyg5X.js → dist-CSOCJn9h.js} +0 -0
- /package/dist/assets/{dist-DxxvVPQH.js → dist-CpSELpRR.js} +0 -0
- /package/dist/assets/{dist-B96NwXcp.js → dist-DLY3MFt_.js} +0 -0
- /package/dist/assets/{dist-DS5RCKZO.js → dist-D_yqofzt.js} +0 -0
- /package/dist/assets/{dist-rzeRelEY.js → dist-DaXyrkOa.js} +0 -0
- /package/dist/assets/{dist-9g-_Ln9y.js → dist-DdITFgCr.js} +0 -0
- /package/dist/assets/{dist-DCqWIRLq.js → dist-DsbE_iBm.js} +0 -0
- /package/dist/assets/{dist-_XomGjg6.js → dist-GYoBJCzF.js} +0 -0
- /package/dist/assets/{dist-Dw9UX7x1.js → dist-q4pwbvzW.js} +0 -0
- /package/dist/assets/{dtd-CRYKjxdR.js → dtd-Fe_Eikw6.js} +0 -0
- /package/dist/assets/{duckdb-keywords-CR9f4wu5.js → duckdb-keywords-qEANwaB-.js} +0 -0
- /package/dist/assets/{dylan-Bg0sO2y3.js → dylan-DjUZAjRK.js} +0 -0
- /package/dist/assets/{ebnf-BdwTqLUx.js → ebnf-BbpZiR1i.js} +0 -0
- /package/dist/assets/{ecl-DaBeV7OZ.js → ecl-qgyT1LqI.js} +0 -0
- /package/dist/assets/{eiffel-BtJc6fqQ.js → eiffel-Dgulx8rf.js} +0 -0
- /package/dist/assets/{elm-D9Rly7Qq.js → elm-BvFY4GJb.js} +0 -0
- /package/dist/assets/{empty-state-CsVQSqKA.js → empty-state-vCWg-_A9.js} +0 -0
- /package/dist/assets/{erlang-FZMRuv-7.js → erlang-Ba0XOLlj.js} +0 -0
- /package/dist/assets/{errors-TZBmrJmc.js → errors-CPlNr33a.js} +0 -0
- /package/dist/assets/{esm-D_nSG7uo.js → esm-C9WujutX.js} +0 -0
- /package/dist/assets/{fcl-BFWIADMy.js → fcl-CvYyfPhf.js} +0 -0
- /package/dist/assets/{formatting-TmuwpwTs.js → formatting-Chn6WhRe.js} +0 -0
- /package/dist/assets/{forth-C6jh4lHA.js → forth-gbBFxz8f.js} +0 -0
- /package/dist/assets/{fortran-DuxTe5qi.js → fortran-CXijpPbh.js} +0 -0
- /package/dist/assets/{gas-D7RWbiQ0.js → gas-CnHGSLCd.js} +0 -0
- /package/dist/assets/{gherkin-DV4l4nlf.js → gherkin-DfEZpSxY.js} +0 -0
- /package/dist/assets/{groovy-Ij7mXzwd.js → groovy-9JiNA9gq.js} +0 -0
- /package/dist/assets/{haskell-BT_ZNgUJ.js → haskell-CKr_RZFK.js} +0 -0
- /package/dist/assets/{haxe-DYYwGmM8.js → haxe-DsAAHfaR.js} +0 -0
- /package/dist/assets/{http-CgzOAOXj.js → http-BJwmEMko.js} +0 -0
- /package/dist/assets/{idl-CjBvIccU.js → idl-Djz72z1a.js} +0 -0
- /package/dist/assets/{init-DE_uL9Ns.js → init-DRQmrFIb.js} +0 -0
- /package/dist/assets/{javascript-DQz7szA1.js → javascript-CsBr0q2-.js} +0 -0
- /package/dist/assets/{julia-U0NSUEwm.js → julia-BCYfl68O.js} +0 -0
- /package/dist/assets/{katex-M9SX-Gs-.js → katex-BywUFgaS.js} +0 -0
- /package/dist/assets/{links-iy4RlM-h.js → links-BhX7oUFH.js} +0 -0
- /package/dist/assets/{livescript-D7jeebX7.js → livescript-BEw7FNJP.js} +0 -0
- /package/dist/assets/{loro_wasm_bg-Bu4Ofw1K.js → loro_wasm_bg-BArxhAm3.js} +0 -0
- /package/dist/assets/{lua-CT4vrRvN.js → lua-DqxHXOsz.js} +0 -0
- /package/dist/assets/{marimo-icons-BSB-Z_W3.js → marimo-icons-Dk6YhPWV.js} +0 -0
- /package/dist/assets/{math-Bf0RgaKx.js → math-BJjKGmt3.js} +0 -0
- /package/dist/assets/{mathematica-DmzlinOc.js → mathematica-Do-octY0.js} +0 -0
- /package/dist/assets/{mbox-DYDL20A1.js → mbox-VgrgGytk.js} +0 -0
- /package/dist/assets/{mirc-6LiBC6Dw.js → mirc-DkD5mNIp.js} +0 -0
- /package/dist/assets/{mllike-orSu1SHG.js → mllike-C8Ah4kKN.js} +0 -0
- /package/dist/assets/{modelica-BsibU-7c.js → modelica-2q7w6nLE.js} +0 -0
- /package/dist/assets/{mscgen-vX4NsSXf.js → mscgen-BRqvO7u4.js} +0 -0
- /package/dist/assets/{multi-icon-DQxqgfM2.js → multi-icon-BvuxcR2m.js} +0 -0
- /package/dist/assets/{mumps-DIZYQE11.js → mumps-CjtiTT1a.js} +0 -0
- /package/dist/assets/{nginx-CFpObAqg.js → nginx-JMUOT8EG.js} +0 -0
- /package/dist/assets/{node-sql-parser-B8vXamqL.js → node-sql-parser-TdBo37ty.js} +0 -0
- /package/dist/assets/{ntriples-CwlUIE0o.js → ntriples-4lauqsM6.js} +0 -0
- /package/dist/assets/{octave-BWtN_wao.js → octave-A2kFK0nR.js} +0 -0
- /package/dist/assets/{oz-CJMVKlqL.js → oz-CvXDMSbl.js} +0 -0
- /package/dist/assets/{panel-context-B3J07LRC.js → panel-context-D-qi_oxP.js} +0 -0
- /package/dist/assets/{pascal-C9rPtth-.js → pascal-6Jinj26u.js} +0 -0
- /package/dist/assets/{path-LDcaQ64B.js → path-D7fidI_g.js} +0 -0
- /package/dist/assets/{perl-CF7pKLbl.js → perl-CXauYQdN.js} +0 -0
- /package/dist/assets/{pig-Bu0nn8JT.js → pig-Dl0QLQI6.js} +0 -0
- /package/dist/assets/{powershell-Bzwpi8yQ.js → powershell-6bdy_rHW.js} +0 -0
- /package/dist/assets/{properties-Cfh_Lj0j.js → properties-p1rx3aF7.js} +0 -0
- /package/dist/assets/{protobuf-Vz3fs9Hb.js → protobuf-BZ6p9Xh_.js} +0 -0
- /package/dist/assets/{puppet-JwSHf4DX.js → puppet-CjdIRV7D.js} +0 -0
- /package/dist/assets/{python-BRHQZrcc.js → python-uzyJYIWU.js} +0 -0
- /package/dist/assets/{q-DWFQ7YI_.js → q-CfD3i9uI.js} +0 -0
- /package/dist/assets/{r-DHkTNFL2.js → r-JyJdYHQB.js} +0 -0
- /package/dist/assets/{request-registry-BwzANGxx.js → request-registry-5ELz5pd2.js} +0 -0
- /package/dist/assets/{requests-BqcqF00P.js → requests-QKoDeQkn.js} +0 -0
- /package/dist/assets/{rpm-zbaZz_dk.js → rpm-DuGPfDyX.js} +0 -0
- /package/dist/assets/{ruby-COvM5Bj_.js → ruby-CA1TzLxZ.js} +0 -0
- /package/dist/assets/{runs-5odJFrfi.js → runs-DRld30N_.js} +0 -0
- /package/dist/assets/{sas-Be8P6y_s.js → sas-BJPWZC7M.js} +0 -0
- /package/dist/assets/{scheme-B9Zors0b.js → scheme-IRagAY3r.js} +0 -0
- /package/dist/assets/{share-DIVpiHPe.js → share-CqnSBwZy.js} +0 -0
- /package/dist/assets/{shell-CaaQwZ-W.js → shell-BVpF3W_J.js} +0 -0
- /package/dist/assets/{sieve-CdflT_3W.js → sieve-BSfPMeZl.js} +0 -0
- /package/dist/assets/{simple-mode-BJAT_N3M.js → simple-mode-BmS_AmGQ.js} +0 -0
- /package/dist/assets/{smalltalk-CRO88y3z.js → smalltalk-CkHVehky.js} +0 -0
- /package/dist/assets/{solr-BkyoAXqg.js → solr-BHjX6hxO.js} +0 -0
- /package/dist/assets/{sparql-DEker8ZS.js → sparql-CmKKjr-f.js} +0 -0
- /package/dist/assets/{spreadsheet-7FZkhkVo.js → spreadsheet-ColK3G9J.js} +0 -0
- /package/dist/assets/{sql-BNnXxKXA.js → sql-BfkgiLSh.js} +0 -0
- /package/dist/assets/{src-CmKhyEBC.js → src-HwYBNPfa.js} +0 -0
- /package/dist/assets/{state-Z-H4o98V.js → state-BV_qjCwT.js} +0 -0
- /package/dist/assets/{stylus-DAJwnVOa.js → stylus-D28PuRsm.js} +0 -0
- /package/dist/assets/{swift-D5F-FU3-.js → swift-D-jfpPuv.js} +0 -0
- /package/dist/assets/{swiper-component-B-P7FNP9.js → swiper-component-CBSZ9l9W.js} +0 -0
- /package/dist/assets/{tcl-DirNbhYm.js → tcl-BrQdCDVA.js} +0 -0
- /package/dist/assets/{textile-DhHo4rKl.js → textile-DXBc8HMq.js} +0 -0
- /package/dist/assets/{tiddlywiki-DE5lnTl3.js → tiddlywiki-DzM1IR9M.js} +0 -0
- /package/dist/assets/{tiki-Dt9oCY2i.js → tiki-DI4TiGi6.js} +0 -0
- /package/dist/assets/{timer-CIInKAPS.js → timer-ffBO1paY.js} +0 -0
- /package/dist/assets/{toml-CrP9HWVu.js → toml-ClSouHPE.js} +0 -0
- /package/dist/assets/{treemap-BKxvGXqJ.js → treemap-CZF0Enj1.js} +0 -0
- /package/dist/assets/{troff-BWD1WiE0.js → troff-BGDyQn9x.js} +0 -0
- /package/dist/assets/{ttcn-CQzcRj0D.js → ttcn-De1OdISX.js} +0 -0
- /package/dist/assets/{ttcn-cfg-jzTcqwRW.js → ttcn-cfg-CQMSrhCz.js} +0 -0
- /package/dist/assets/{turtle-BAqH2D2z.js → turtle-DNhfxysg.js} +0 -0
- /package/dist/assets/{types-z6Sk3JCV.js → types-Bhw3Hco_.js} +0 -0
- /package/dist/assets/{useInterval-CG264TRB.js → useInterval-CvFz96h2.js} +0 -0
- /package/dist/assets/{vb-CrUpzy4g.js → vb-BX7-Md9G.js} +0 -0
- /package/dist/assets/{vbscript-DEuHZ0Y0.js → vbscript-DNMzJOTU.js} +0 -0
- /package/dist/assets/{velocity-D99sTvXl.js → velocity-viirwPm7.js} +0 -0
- /package/dist/assets/{verilog-XWBMMjwd.js → verilog-CZguTLBV.js} +0 -0
- /package/dist/assets/{vhdl-BAGmVXDV.js → vhdl-CAEhCBOl.js} +0 -0
- /package/dist/assets/{web-vitals-BaJPM15X.js → web-vitals-CBsQ2DM_.js} +0 -0
- /package/dist/assets/{webidl-xagG_7hd.js → webidl-BNJg_7gX.js} +0 -0
- /package/dist/assets/{write-secret-modal-BFLUPDlo.js → write-secret-modal-D8Sww7eA.js} +0 -0
- /package/dist/assets/{ws-CtTwmdal.js → ws-BZQmQxZ7.js} +0 -0
- /package/dist/assets/{xquery-B8Mguhly.js → xquery-CGV_r322.js} +0 -0
- /package/dist/assets/{yacas-XW2NxGKw.js → yacas-uRzw7z7m.js} +0 -0
- /package/dist/assets/{z80-DhICfTcL.js → z80-CBK8t-9T.js} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
+
import { useAtomValue } from "jotai";
|
|
3
4
|
import {
|
|
4
5
|
BracesIcon,
|
|
5
6
|
BrickWallIcon,
|
|
@@ -9,10 +10,11 @@ import {
|
|
|
9
10
|
} from "lucide-react";
|
|
10
11
|
import React from "react";
|
|
11
12
|
import { useLocale } from "react-aria";
|
|
13
|
+
import { downloadSizeLimitAtom } from "./download-policy/atoms";
|
|
12
14
|
import { logNever } from "@/utils/assertNever";
|
|
13
15
|
import { cn } from "@/utils/cn";
|
|
14
16
|
import { copyToClipboard } from "@/utils/copy";
|
|
15
|
-
import { downloadByURL } from "@/utils/download";
|
|
17
|
+
import { downloadByURL, withLoadingToast } from "@/utils/download";
|
|
16
18
|
import { prettyError } from "@/utils/errors";
|
|
17
19
|
import { Filenames } from "@/utils/filenames";
|
|
18
20
|
import {
|
|
@@ -33,17 +35,6 @@ import {
|
|
|
33
35
|
import { Tooltip } from "../ui/tooltip";
|
|
34
36
|
import { toast } from "../ui/use-toast";
|
|
35
37
|
|
|
36
|
-
type DownloadFormat = "csv" | "json" | "parquet";
|
|
37
|
-
|
|
38
|
-
export interface ExportActionProps {
|
|
39
|
-
downloadAs: (req: { format: DownloadFormat }) => Promise<{
|
|
40
|
-
url: string;
|
|
41
|
-
filename: string;
|
|
42
|
-
error?: string | null;
|
|
43
|
-
missing_packages?: string[] | null;
|
|
44
|
-
}>;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
38
|
const FILE_TYPES = {
|
|
48
39
|
CSV: {
|
|
49
40
|
label: "CSV",
|
|
@@ -84,18 +75,45 @@ const copyOptions = [
|
|
|
84
75
|
FILE_TYPES.CSV,
|
|
85
76
|
FILE_TYPES.MARKDOWN,
|
|
86
77
|
];
|
|
78
|
+
|
|
79
|
+
type DownloadFormat = (typeof downloadOptions)[number]["format"];
|
|
80
|
+
type CopyFormat = (typeof copyOptions)[number]["format"];
|
|
81
|
+
|
|
82
|
+
export interface ExportActionProps {
|
|
83
|
+
downloadAs: (req: { format: DownloadFormat }) => Promise<{
|
|
84
|
+
url: string;
|
|
85
|
+
filename: string;
|
|
86
|
+
error?: string | null;
|
|
87
|
+
missing_packages?: string[] | null;
|
|
88
|
+
}>;
|
|
89
|
+
// JSON-serialized size of the currently-rendered data. Used together with
|
|
90
|
+
// downloadSizeLimitAtom to disable the Export button when a host (e.g.,
|
|
91
|
+
// marimo-lsp inside VS Code) declares a download size cap. Null/undefined
|
|
92
|
+
// means "no info" and the gate stays disabled (fail-open).
|
|
93
|
+
sizeBytes?: number | null;
|
|
94
|
+
}
|
|
95
|
+
|
|
87
96
|
const labelForDownloadFormat = (format: DownloadFormat): string =>
|
|
88
97
|
downloadOptions.find((opt) => opt.format === format)?.label ?? format;
|
|
98
|
+
const labelForCopyFormat = (format: CopyFormat): string =>
|
|
99
|
+
copyOptions.find((opt) => opt.format === format)?.label ?? format;
|
|
89
100
|
|
|
90
101
|
export const ExportMenu: React.FC<ExportActionProps> = (props) => {
|
|
91
102
|
const { locale } = useLocale();
|
|
92
103
|
const [open, setOpen] = React.useState(false);
|
|
104
|
+
const policy = useAtomValue(downloadSizeLimitAtom);
|
|
105
|
+
const disabled = !!(
|
|
106
|
+
policy &&
|
|
107
|
+
props.sizeBytes != null &&
|
|
108
|
+
props.sizeBytes > policy.limitBytes
|
|
109
|
+
);
|
|
93
110
|
|
|
94
111
|
const button = (
|
|
95
112
|
<Button
|
|
96
113
|
data-testid="export-button"
|
|
97
114
|
size="xs"
|
|
98
115
|
variant="text"
|
|
116
|
+
disabled={disabled}
|
|
99
117
|
className={cn(
|
|
100
118
|
"print:hidden text-xs gap-1",
|
|
101
119
|
open ? "text-primary" : "text-muted-foreground",
|
|
@@ -109,7 +127,10 @@ export const ExportMenu: React.FC<ExportActionProps> = (props) => {
|
|
|
109
127
|
const resolveDownloadUrl = async (
|
|
110
128
|
format: DownloadFormat,
|
|
111
129
|
onRetry: () => void,
|
|
112
|
-
): Promise<{
|
|
130
|
+
): Promise<{
|
|
131
|
+
url: string;
|
|
132
|
+
filename: string;
|
|
133
|
+
} | null> => {
|
|
113
134
|
let response: Awaited<ReturnType<typeof props.downloadAs>>;
|
|
114
135
|
try {
|
|
115
136
|
response = await props.downloadAs({ format });
|
|
@@ -139,81 +160,104 @@ export const ExportMenu: React.FC<ExportActionProps> = (props) => {
|
|
|
139
160
|
return null;
|
|
140
161
|
}
|
|
141
162
|
|
|
142
|
-
return {
|
|
163
|
+
return {
|
|
164
|
+
url: response.url,
|
|
165
|
+
filename: response.filename,
|
|
166
|
+
};
|
|
143
167
|
};
|
|
144
168
|
|
|
145
169
|
const handleDownload = async (format: DownloadFormat) => {
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
170
|
+
const label = labelForDownloadFormat(format);
|
|
171
|
+
const ok = await withLoadingToast(
|
|
172
|
+
`Preparing ${label} export...`,
|
|
173
|
+
async () => {
|
|
174
|
+
const result = await resolveDownloadUrl(format, () => {
|
|
175
|
+
void handleDownload(format);
|
|
176
|
+
});
|
|
177
|
+
if (!result) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
const rawName = (result.filename ?? "").trim();
|
|
181
|
+
const baseName = Filenames.withoutExtension(rawName) || "download";
|
|
182
|
+
const downloadName = `${baseName}.${format}`;
|
|
183
|
+
// Append ?download=1 so the server returns Content-Disposition: attachment.
|
|
184
|
+
// This forces a save even when <a download> is ignored — e.g., inside
|
|
185
|
+
// sandboxed iframes that lack `allow-downloads`. Skip for data: URLs
|
|
186
|
+
// (used in pyodide/wasm) since query params would corrupt the payload.
|
|
187
|
+
let downloadUrl = result.url;
|
|
188
|
+
if (!downloadUrl.startsWith("data:")) {
|
|
189
|
+
const separator = downloadUrl.includes("?") ? "&" : "?";
|
|
190
|
+
const params = new URLSearchParams({
|
|
191
|
+
download: "1",
|
|
192
|
+
filename: downloadName,
|
|
193
|
+
});
|
|
194
|
+
downloadUrl = `${downloadUrl}${separator}${params.toString()}`;
|
|
195
|
+
}
|
|
196
|
+
downloadByURL(downloadUrl, downloadName);
|
|
197
|
+
return true;
|
|
198
|
+
},
|
|
199
|
+
);
|
|
200
|
+
if (ok) {
|
|
201
|
+
toast({ title: `${label} download started` });
|
|
151
202
|
}
|
|
152
|
-
const rawName = (result.filename ?? "").trim();
|
|
153
|
-
const baseName = Filenames.withoutExtension(rawName) || "download";
|
|
154
|
-
const downloadName = `${baseName}.${format}`;
|
|
155
|
-
// Append ?download=1 so the server returns Content-Disposition: attachment.
|
|
156
|
-
// This forces a save even when <a download> is ignored — e.g., inside
|
|
157
|
-
// sandboxed iframes that lack `allow-downloads`. Skip for data: URLs
|
|
158
|
-
// (used in pyodide/wasm) since query params would corrupt the payload.
|
|
159
|
-
let downloadUrl = result.url;
|
|
160
|
-
if (!downloadUrl.startsWith("data:")) {
|
|
161
|
-
const separator = downloadUrl.includes("?") ? "&" : "?";
|
|
162
|
-
const params = new URLSearchParams({
|
|
163
|
-
download: "1",
|
|
164
|
-
filename: downloadName,
|
|
165
|
-
});
|
|
166
|
-
downloadUrl = `${downloadUrl}${separator}${params.toString()}`;
|
|
167
|
-
}
|
|
168
|
-
downloadByURL(downloadUrl, downloadName);
|
|
169
203
|
};
|
|
170
204
|
|
|
171
|
-
const handleClipboardCopy = async (
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
205
|
+
const handleClipboardCopy = async (format: CopyFormat) => {
|
|
206
|
+
await withLoadingToast(
|
|
207
|
+
`Preparing ${labelForCopyFormat(format)} for clipboard...`,
|
|
208
|
+
async () => {
|
|
209
|
+
const sourceFormat: DownloadFormat = format === "csv" ? "csv" : "json";
|
|
210
|
+
const result = await resolveDownloadUrl(sourceFormat, () => {
|
|
211
|
+
void handleClipboardCopy(format);
|
|
212
|
+
});
|
|
213
|
+
if (!result) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
181
216
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
217
|
+
let text: string;
|
|
218
|
+
switch (format) {
|
|
219
|
+
case "tsv": {
|
|
220
|
+
const json = await fetchJson(result.url);
|
|
221
|
+
text = jsonToTSV(json, locale);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
case "json": {
|
|
225
|
+
const json = await fetchJson(result.url);
|
|
226
|
+
text = JSON.stringify(json, null, 2);
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
case "csv":
|
|
230
|
+
text = await fetchText(result.url);
|
|
231
|
+
break;
|
|
232
|
+
case "markdown": {
|
|
233
|
+
const json = await fetchJson(result.url);
|
|
234
|
+
text = jsonToMarkdown(json);
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
default:
|
|
238
|
+
logNever(format);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
206
241
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
242
|
+
await copyToClipboard(text);
|
|
243
|
+
toast({
|
|
244
|
+
title: "Copied to clipboard",
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
);
|
|
211
248
|
};
|
|
212
249
|
|
|
213
250
|
return (
|
|
214
251
|
<DropdownMenu modal={false} open={open} onOpenChange={setOpen}>
|
|
215
|
-
<Tooltip
|
|
216
|
-
|
|
252
|
+
<Tooltip
|
|
253
|
+
content={disabled ? policy?.unavailableMessage : "Export"}
|
|
254
|
+
open={open ? false : undefined}
|
|
255
|
+
>
|
|
256
|
+
<DropdownMenuTrigger asChild={true} disabled={disabled}>
|
|
257
|
+
<span tabIndex={disabled ? 0 : -1} className="inline-flex">
|
|
258
|
+
{button}
|
|
259
|
+
</span>
|
|
260
|
+
</DropdownMenuTrigger>
|
|
217
261
|
</Tooltip>
|
|
218
262
|
<DropdownMenuContent side="bottom" className="print:hidden">
|
|
219
263
|
<DropdownMenuLabel className="text-xs text-muted-foreground">
|
|
@@ -11,6 +11,9 @@ import { prettyError } from "@/utils/errors";
|
|
|
11
11
|
import { Functions } from "@/utils/functions";
|
|
12
12
|
import { type FilePath, PathBuilder } from "@/utils/paths";
|
|
13
13
|
import { resolvePaths } from "@/utils/pathUtils";
|
|
14
|
+
import { mapWithConcurrency } from "@/utils/semaphore";
|
|
15
|
+
|
|
16
|
+
const FILE_OP_CONCURRENCY = 5;
|
|
14
17
|
|
|
15
18
|
/**
|
|
16
19
|
* Normalized result of a file mutation: the server response when successful,
|
|
@@ -159,28 +162,26 @@ export class RequestingTree {
|
|
|
159
162
|
? (this.delegate.find(parentId)?.data.path ?? parentId)
|
|
160
163
|
: this.rootPath;
|
|
161
164
|
|
|
162
|
-
await
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}
|
|
165
|
+
await mapWithConcurrency(fromIds, FILE_OP_CONCURRENCY, async (id) => {
|
|
166
|
+
const node = this.delegate.find(id);
|
|
167
|
+
if (!node) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const originalPath = node.data.path;
|
|
171
|
+
const newPath = this.path.join(
|
|
172
|
+
parentPath,
|
|
173
|
+
this.path.basename(originalPath as FilePath),
|
|
174
|
+
);
|
|
175
|
+
const result = await this.callbacks
|
|
176
|
+
.renameFileOrFolder({ path: originalPath, newPath })
|
|
177
|
+
.then(handleFileResponse);
|
|
178
|
+
if (!result) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
179
181
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
);
|
|
182
|
+
this.delegate.move({ id, parentId, index: 0 });
|
|
183
|
+
this.delegate.update({ id, changes: { path: newPath } });
|
|
184
|
+
});
|
|
184
185
|
|
|
185
186
|
this.onChange(this.delegate.data);
|
|
186
187
|
|
|
@@ -262,11 +263,12 @@ export class RequestingTree {
|
|
|
262
263
|
this.rootPath,
|
|
263
264
|
...ids.map((id) => this.delegate.find(id)?.data.path),
|
|
264
265
|
].filter(Boolean);
|
|
265
|
-
// Request
|
|
266
|
-
const data = await
|
|
267
|
-
openFolders
|
|
266
|
+
// Request open folders with bounded concurrency; swallow per-folder errors.
|
|
267
|
+
const data = await mapWithConcurrency(
|
|
268
|
+
openFolders,
|
|
269
|
+
FILE_OP_CONCURRENCY,
|
|
270
|
+
(path) =>
|
|
268
271
|
this.callbacks.listFiles({ path: path }).catch(() => ({ files: [] })),
|
|
269
|
-
),
|
|
270
272
|
);
|
|
271
273
|
|
|
272
274
|
for (const [idx, openFolder] of openFolders.entries()) {
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
import { type DropzoneOptions, useDropzone } from "react-dropzone";
|
|
4
4
|
import { toast } from "@/components/ui/use-toast";
|
|
5
5
|
import { useRequestClient } from "@/core/network/requests";
|
|
6
|
-
import { serializeBlob } from "@/utils/blob";
|
|
7
6
|
import { withLoadingToast } from "@/utils/download";
|
|
8
7
|
import { Logger } from "@/utils/Logger";
|
|
9
8
|
import { type FilePath, PathBuilder } from "@/utils/paths";
|
|
9
|
+
import { mapWithConcurrency } from "@/utils/semaphore";
|
|
10
10
|
import { refreshRoot } from "./state";
|
|
11
11
|
|
|
12
12
|
const MAX_SIZE = 1024 * 1024 * 100; // 100MB
|
|
13
|
+
const UPLOAD_CONCURRENCY = 5;
|
|
13
14
|
|
|
14
15
|
export function useFileExplorerUpload(options: DropzoneOptions = {}) {
|
|
15
16
|
const { sendCreateFileOrFolder } = useRequestClient();
|
|
@@ -59,30 +60,28 @@ export function useFileExplorerUpload(options: DropzoneOptions = {}) {
|
|
|
59
60
|
loadingTitle,
|
|
60
61
|
async (progress) => {
|
|
61
62
|
progress.addTotal(acceptedFiles.length);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
63
|
+
await mapWithConcurrency(
|
|
64
|
+
acceptedFiles,
|
|
65
|
+
UPLOAD_CONCURRENCY,
|
|
66
|
+
async (file) => {
|
|
67
|
+
// We strip the leading slash since File.path can return
|
|
68
|
+
// `/path/to/file`.
|
|
69
|
+
const filePath = stripLeadingSlash(getPath(file));
|
|
70
|
+
let directoryPath = "" as FilePath;
|
|
71
|
+
if (filePath) {
|
|
72
|
+
directoryPath =
|
|
73
|
+
PathBuilder.guessDeliminator(filePath).dirname(filePath);
|
|
74
|
+
}
|
|
71
75
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
name: file.name,
|
|
82
|
-
contents: base64,
|
|
83
|
-
});
|
|
84
|
-
progress.increment(1);
|
|
85
|
-
}
|
|
76
|
+
await sendCreateFileOrFolder({
|
|
77
|
+
path: directoryPath,
|
|
78
|
+
type: "file",
|
|
79
|
+
name: file.name,
|
|
80
|
+
file,
|
|
81
|
+
});
|
|
82
|
+
progress.increment(1);
|
|
83
|
+
},
|
|
84
|
+
);
|
|
86
85
|
await refreshRoot();
|
|
87
86
|
},
|
|
88
87
|
onFinish,
|
|
@@ -246,7 +246,7 @@ describe("insertImage", () => {
|
|
|
246
246
|
path: "public",
|
|
247
247
|
type: "file",
|
|
248
248
|
name: "hello.png",
|
|
249
|
-
|
|
249
|
+
file: expect.any(File),
|
|
250
250
|
});
|
|
251
251
|
|
|
252
252
|
expect(view.state.doc.toString()).toMatchInlineSnapshot(
|
|
@@ -291,7 +291,7 @@ describe("insertImage", () => {
|
|
|
291
291
|
path: "nested/public", // store in public folder of notebook directory
|
|
292
292
|
type: "file",
|
|
293
293
|
name: "hello.png",
|
|
294
|
-
|
|
294
|
+
file: expect.any(File),
|
|
295
295
|
});
|
|
296
296
|
|
|
297
297
|
expect(view.state.doc.toString()).toMatchInlineSnapshot(
|
|
@@ -337,7 +337,7 @@ describe("insertImage", () => {
|
|
|
337
337
|
path: "/Users/user/Development/project/public",
|
|
338
338
|
type: "file",
|
|
339
339
|
name: "hello.png",
|
|
340
|
-
|
|
340
|
+
file: expect.any(File),
|
|
341
341
|
});
|
|
342
342
|
|
|
343
343
|
// Should convert absolute path to relative path
|
|
@@ -313,7 +313,6 @@ export async function insertImage(view: EditorView, file: File) {
|
|
|
313
313
|
// If the file is base64 encoded, we can save it locally to prevent large file strings
|
|
314
314
|
try {
|
|
315
315
|
if (dataUrl.startsWith("data:")) {
|
|
316
|
-
const base64 = dataUrl.split(",")[1];
|
|
317
316
|
let inputFilename = prompt(
|
|
318
317
|
"We can save your image as a file. Enter a filename.",
|
|
319
318
|
file.name,
|
|
@@ -348,7 +347,7 @@ export async function insertImage(view: EditorView, file: File) {
|
|
|
348
347
|
path: publicFolderPath as FilePath,
|
|
349
348
|
type: "file",
|
|
350
349
|
name: inputFilename,
|
|
351
|
-
|
|
350
|
+
file,
|
|
352
351
|
});
|
|
353
352
|
|
|
354
353
|
if (createFileRes.success) {
|
|
@@ -6,6 +6,19 @@ import { API, createClientWithRuntimeManager } from "./api";
|
|
|
6
6
|
import { waitForConnectionOpen } from "./connection";
|
|
7
7
|
import type { EditRequests, RunRequests } from "./types";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Options for POSTing FormData via openapi-fetch. openapi-fetch types
|
|
11
|
+
* request bodies from the JSON schema, so we bypass the body type and
|
|
12
|
+
* override the serializer to pass the FormData through unchanged; the
|
|
13
|
+
* browser then sets the multipart Content-Type with boundary.
|
|
14
|
+
*/
|
|
15
|
+
function multipartInit(formData: FormData) {
|
|
16
|
+
return {
|
|
17
|
+
body: formData as never,
|
|
18
|
+
bodySerializer: (body: unknown) => body as never,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
9
22
|
const { handleResponse, handleResponseReturnNull } = API;
|
|
10
23
|
|
|
11
24
|
export function createNetworkRequests(): EditRequests & RunRequests {
|
|
@@ -298,10 +311,15 @@ export function createNetworkRequests(): EditRequests & RunRequests {
|
|
|
298
311
|
},
|
|
299
312
|
sendCreateFileOrFolder: async (request) => {
|
|
300
313
|
await waitForConnectionOpen();
|
|
314
|
+
const formData = new FormData();
|
|
315
|
+
formData.append("path", request.path);
|
|
316
|
+
formData.append("type", request.type);
|
|
317
|
+
formData.append("name", request.name);
|
|
318
|
+
if (request.file) {
|
|
319
|
+
formData.append("file", request.file, request.name);
|
|
320
|
+
}
|
|
301
321
|
return getClient()
|
|
302
|
-
.POST("/api/files/create",
|
|
303
|
-
body: request,
|
|
304
|
-
})
|
|
322
|
+
.POST("/api/files/create", multipartInit(formData))
|
|
305
323
|
.then(handleResponse);
|
|
306
324
|
},
|
|
307
325
|
sendDeleteFileOrFolder: async (request) => {
|
|
@@ -80,6 +80,17 @@ export type SaveUserConfigurationRequest =
|
|
|
80
80
|
export interface SetCellConfigRequest {
|
|
81
81
|
configs: Record<CellId, Partial<CellConfig>>;
|
|
82
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Client-side shape for creating a file/directory/notebook. The HTTP
|
|
85
|
+
* transport sends this as multipart/form-data; the WASM bridge base64-encodes
|
|
86
|
+
* `file` internally and crosses the JS<->Py boundary as JSON.
|
|
87
|
+
*/
|
|
88
|
+
export interface FileCreateInput {
|
|
89
|
+
path: string;
|
|
90
|
+
type: "file" | "directory" | "notebook";
|
|
91
|
+
name: string;
|
|
92
|
+
file?: Blob;
|
|
93
|
+
}
|
|
83
94
|
export type UpdateUIElementRequest = schemas["UpdateUIElementRequest"];
|
|
84
95
|
export type ModelRequest = schemas["ModelRequest"];
|
|
85
96
|
export type NotebookDocumentTransactionRequest =
|
|
@@ -165,7 +176,7 @@ export interface EditRequests {
|
|
|
165
176
|
sendListFiles: (request: FileListRequest) => Promise<FileListResponse>;
|
|
166
177
|
sendSearchFiles: (request: FileSearchRequest) => Promise<FileSearchResponse>;
|
|
167
178
|
sendCreateFileOrFolder: (
|
|
168
|
-
request:
|
|
179
|
+
request: FileCreateInput,
|
|
169
180
|
) => Promise<FileCreateResponse>;
|
|
170
181
|
sendDeleteFileOrFolder: (
|
|
171
182
|
request: FileDeleteRequest,
|
package/src/core/wasm/bridge.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import { toast } from "@/components/ui/use-toast";
|
|
5
5
|
import { userConfigAtom } from "@/core/config/config";
|
|
6
|
+
import { serializeBlob } from "@/utils/blob";
|
|
6
7
|
import { Deferred } from "@/utils/Deferred";
|
|
7
8
|
import { throwNotImplemented } from "@/utils/functions";
|
|
8
9
|
import { Logger } from "@/utils/Logger";
|
|
@@ -431,9 +432,21 @@ export class PyodideBridge implements RunRequests, EditRequests {
|
|
|
431
432
|
sendCreateFileOrFolder: EditRequests["sendCreateFileOrFolder"] = async (
|
|
432
433
|
request,
|
|
433
434
|
) => {
|
|
435
|
+
// The WASM RPC boundary can only carry JSON, so we base64-encode the
|
|
436
|
+
// file bytes here. The HTTP transport uses multipart/form-data instead.
|
|
437
|
+
let contents: string | null = null;
|
|
438
|
+
if (request.file) {
|
|
439
|
+
const dataUrl = await serializeBlob(request.file);
|
|
440
|
+
contents = dataUrl.split(",")[1] ?? "";
|
|
441
|
+
}
|
|
434
442
|
const response = await this.rpc.proxy.request.bridge({
|
|
435
443
|
functionName: "create_file_or_directory",
|
|
436
|
-
payload:
|
|
444
|
+
payload: {
|
|
445
|
+
path: request.path,
|
|
446
|
+
type: request.type,
|
|
447
|
+
name: request.name,
|
|
448
|
+
contents,
|
|
449
|
+
},
|
|
437
450
|
});
|
|
438
451
|
return response as FileCreateResponse;
|
|
439
452
|
};
|
|
@@ -145,6 +145,14 @@ describe("sanitizeHtml", () => {
|
|
|
145
145
|
);
|
|
146
146
|
});
|
|
147
147
|
|
|
148
|
+
test("preserves marimo-mermaid with theme attributes", () => {
|
|
149
|
+
const html =
|
|
150
|
+
"<marimo-mermaid data-diagram='"graph TD\\nA --> B"' data-theme='"base"' data-theme_variables='{"primaryColor": "#E8EEF5", "lineColor": "#475569"}'></marimo-mermaid>";
|
|
151
|
+
expect(sanitizeHtml(html)).toMatchInlineSnapshot(
|
|
152
|
+
`"<marimo-mermaid data-diagram=""graph TD\\nA --> B"" data-theme=""base"" data-theme_variables="{"primaryColor": "#E8EEF5", "lineColor": "#475569"}"></marimo-mermaid>"`,
|
|
153
|
+
);
|
|
154
|
+
});
|
|
155
|
+
|
|
148
156
|
test("keeps style tags with FORCE_BODY", () => {
|
|
149
157
|
const html = "<style>body { color: red; }</style><p>Text</p>";
|
|
150
158
|
expect(sanitizeHtml(html)).toMatchInlineSnapshot(
|
|
@@ -194,6 +194,7 @@ interface Data<T> {
|
|
|
194
194
|
wrappedColumns?: string[];
|
|
195
195
|
headerTooltip?: Record<string, string>;
|
|
196
196
|
totalColumns: number;
|
|
197
|
+
sizeBytes?: number | null;
|
|
197
198
|
maxColumns: number | "all";
|
|
198
199
|
hasStableRowId: boolean;
|
|
199
200
|
lazy: boolean;
|
|
@@ -220,6 +221,7 @@ type DataTableFunctions = {
|
|
|
220
221
|
cell_styles?: CellStyleState | null;
|
|
221
222
|
cell_hover_texts?: Record<string, Record<string, string | null>> | null;
|
|
222
223
|
raw_data?: TableData<T> | null;
|
|
224
|
+
size_bytes?: number | null;
|
|
223
225
|
}>;
|
|
224
226
|
get_data_url?: GetDataUrl;
|
|
225
227
|
get_row_ids?: GetRowIds;
|
|
@@ -270,6 +272,7 @@ export const DataTablePlugin = createPlugin<S>("marimo-table")
|
|
|
270
272
|
headerTooltip: z.record(z.string(), z.string()).optional(),
|
|
271
273
|
fieldTypes: columnToFieldTypesSchema.nullish(),
|
|
272
274
|
totalColumns: z.number(),
|
|
275
|
+
sizeBytes: z.number().nullish(),
|
|
273
276
|
maxColumns: z.union([z.number(), z.literal("all")]).default("all"),
|
|
274
277
|
hasStableRowId: z.boolean().default(false),
|
|
275
278
|
maxHeight: z.number().optional(),
|
|
@@ -327,6 +330,7 @@ export const DataTablePlugin = createPlugin<S>("marimo-table")
|
|
|
327
330
|
.nullable(),
|
|
328
331
|
cell_hover_texts: cellHoverTextSchema.nullable(),
|
|
329
332
|
raw_data: z.union([z.string(), z.array(z.looseObject({}))]).nullish(),
|
|
333
|
+
size_bytes: z.number().nullish(),
|
|
330
334
|
}),
|
|
331
335
|
),
|
|
332
336
|
get_row_ids: rpc.input(z.object({}).passthrough()).output(
|
|
@@ -532,6 +536,7 @@ export const LoadingDataTableComponent = memo(
|
|
|
532
536
|
rows: T[];
|
|
533
537
|
rawRows?: T[];
|
|
534
538
|
totalRows: number | TooManyRows;
|
|
539
|
+
sizeBytes?: number | null;
|
|
535
540
|
cellStyles: CellStyleState | undefined | null;
|
|
536
541
|
cellHoverTexts?: Record<string, Record<string, string | null>> | null;
|
|
537
542
|
}>(async () => {
|
|
@@ -548,6 +553,7 @@ export const LoadingDataTableComponent = memo(
|
|
|
548
553
|
let tableData = props.data;
|
|
549
554
|
let rawTableData: TableData<T> | undefined | null = props.rawData;
|
|
550
555
|
let totalRows = props.totalRows;
|
|
556
|
+
let sizeBytes = props.sizeBytes ?? null;
|
|
551
557
|
let cellStyles = props.cellStyles;
|
|
552
558
|
let cellHoverTexts = props.cellHoverTexts;
|
|
553
559
|
|
|
@@ -591,6 +597,7 @@ export const LoadingDataTableComponent = memo(
|
|
|
591
597
|
tableData = searchResults.data;
|
|
592
598
|
rawTableData = searchResults.raw_data;
|
|
593
599
|
totalRows = searchResults.total_rows;
|
|
600
|
+
sizeBytes = searchResults.size_bytes ?? null;
|
|
594
601
|
cellStyles = searchResults.cell_styles || {};
|
|
595
602
|
cellHoverTexts = searchResults.cell_hover_texts || {};
|
|
596
603
|
}
|
|
@@ -603,6 +610,7 @@ export const LoadingDataTableComponent = memo(
|
|
|
603
610
|
rows: tableData,
|
|
604
611
|
rawRows: rawData,
|
|
605
612
|
totalRows: totalRows,
|
|
613
|
+
sizeBytes,
|
|
606
614
|
cellStyles,
|
|
607
615
|
cellHoverTexts,
|
|
608
616
|
};
|
|
@@ -614,6 +622,7 @@ export const LoadingDataTableComponent = memo(
|
|
|
614
622
|
useDeepCompareMemoize(props.fieldTypes),
|
|
615
623
|
props.data,
|
|
616
624
|
props.totalRows,
|
|
625
|
+
props.sizeBytes,
|
|
617
626
|
props.lazy,
|
|
618
627
|
props.cellHoverTexts,
|
|
619
628
|
props.cellStyles,
|
|
@@ -728,6 +737,7 @@ export const LoadingDataTableComponent = memo(
|
|
|
728
737
|
setFilters={setFilters}
|
|
729
738
|
reloading={isFetching && !isPending}
|
|
730
739
|
totalRows={data?.totalRows ?? props.totalRows}
|
|
740
|
+
sizeBytes={data?.sizeBytes ?? props.sizeBytes ?? null}
|
|
731
741
|
paginationState={paginationState}
|
|
732
742
|
setPaginationState={setPaginationState}
|
|
733
743
|
cellStyles={data?.cellStyles ?? props.cellStyles}
|
|
@@ -774,6 +784,7 @@ const DataTableComponent = ({
|
|
|
774
784
|
data,
|
|
775
785
|
rawData,
|
|
776
786
|
totalRows,
|
|
787
|
+
sizeBytes,
|
|
777
788
|
maxColumns,
|
|
778
789
|
pagination,
|
|
779
790
|
selection,
|
|
@@ -1053,6 +1064,7 @@ const DataTableComponent = ({
|
|
|
1053
1064
|
maxHeight={maxHeight}
|
|
1054
1065
|
sorting={sorting}
|
|
1055
1066
|
totalRows={totalRows}
|
|
1067
|
+
sizeBytes={sizeBytes}
|
|
1056
1068
|
totalColumns={totalColumns}
|
|
1057
1069
|
manualSorting={true}
|
|
1058
1070
|
setSorting={setSorting}
|