@marimo-team/islands 0.19.10-dev4 → 0.19.10-dev41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ConnectedDataExplorerComponent-BAeQ8DWw.js → ConnectedDataExplorerComponent-CkXO-pKy.js} +6 -6
- package/dist/Plot-C9vQQj4X.js +172249 -0
- package/dist/{any-language-editor-D0UQItkS.js → any-language-editor-t_VsTNa-.js} +16 -16
- package/dist/apl-C1bki_dE.js +4 -0
- package/dist/{arc-CEWBr4jc.js → arc-9nABupDE.js} +2 -2
- package/dist/{architectureDiagram-VXUJARFQ-DPPYVq8H.js → architectureDiagram-VXUJARFQ-DmJQhcJb.js} +6 -6
- package/dist/asciiarmor-BdlkCCRr.js +4 -0
- package/dist/asn1-CvE30hox.js +4 -0
- package/dist/{blockDiagram-VD42YOAC-BA5N05Y9.js → blockDiagram-VD42YOAC-CRofISJs.js} +10 -10
- package/dist/brainfuck-BalwWy1a.js +4 -0
- package/dist/{c4Diagram-YG6GDRKO-DJLzuGJJ.js → c4Diagram-YG6GDRKO-Deqoag4I.js} +4 -4
- package/dist/{channel-Dob5kWXR.js → channel-CMsnebrL.js} +1 -1
- package/dist/{chunk-4BX2VUAB-DZQibjKA.js → chunk-4BX2VUAB-WmXmzRBr.js} +1 -1
- package/dist/{chunk-55IACEB6-C3BASkh4.js → chunk-55IACEB6-irYMvHJu.js} +1 -1
- package/dist/{chunk-5FQGJX7Z-BEb20Lzt.js → chunk-5FQGJX7Z-pOElJy8t.js} +2 -2
- package/dist/{chunk-ABZYJK2D-BXTC53mt.js → chunk-ABZYJK2D-BGWvKte3.js} +2 -2
- package/dist/{chunk-ATLVNIR6-BJDjUR_c.js → chunk-ATLVNIR6-BYZB6C5T.js} +2 -2
- package/dist/{chunk-B4BG7PRW-DzmUUpfH.js → chunk-B4BG7PRW-CwYUp6Uj.js} +7 -7
- package/dist/{chunk-CVBHYZKI-Dhc_e3rA.js → chunk-CVBHYZKI-Bb2XMuXJ.js} +1 -1
- package/dist/{chunk-DI55MBZ5-gTd3J8Tu.js → chunk-DI55MBZ5-Gyro6dvN.js} +6 -6
- package/dist/{chunk-EXTU4WIE-DyoOs5QX.js → chunk-EXTU4WIE-BlA7aWEw.js} +2 -2
- package/dist/{chunk-FMBD7UC4-geNUIndh.js → chunk-FMBD7UC4-C0DZU_4q.js} +1 -1
- package/dist/{chunk-HN2XXSSU-CqPwpolw.js → chunk-HN2XXSSU-BsB4dtgF.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-BGnAIbOP.js → chunk-JA3XYJ7Z-Cm-pccR-.js} +3 -3
- package/dist/{chunk-JZLCHNYA-CIRgweVQ.js → chunk-JZLCHNYA-CoLqqXMe.js} +6 -6
- package/dist/{chunk-MI3HLSF2-DOJkNER1.js → chunk-MI3HLSF2-DeDZS-tQ.js} +1 -1
- package/dist/{chunk-N4CR4FBY-DKSvXAIS.js → chunk-N4CR4FBY-ByLbY9L-.js} +7 -7
- package/dist/{chunk-QN33PNHL-B6zC8BTi.js → chunk-QN33PNHL-eodIiY9F.js} +2 -2
- package/dist/{chunk-QXUST7PY-C7750n_u.js → chunk-QXUST7PY-CuJlDW6A.js} +10 -10
- package/dist/{chunk-QZHKN3VN-BF_oGUlG.js → chunk-QZHKN3VN-Diy_Cdek.js} +1 -1
- package/dist/{chunk-S3R3BYOJ-CBkH6JZZ.js → chunk-S3R3BYOJ-CwDGYMVf.js} +3 -3
- package/dist/{chunk-TZMSLE5B-DObGL7xi.js → chunk-TZMSLE5B-DFDr5FCr.js} +2 -2
- package/dist/classDiagram-2ON5EDUG-BDBX9etk.js +30 -0
- package/dist/classDiagram-v2-WZHVMYZB-Bzj_L_BF.js +30 -0
- package/dist/{clike-B1zispTy.js → clike-B90WKs4D.js} +1 -1
- package/dist/clojure-CUC2I1hM.js +4 -0
- package/dist/cmake-8PcMxXnB.js +4 -0
- package/dist/cobol-DkkkDz5v.js +4 -0
- package/dist/{code-block-37QAKDTI-u5kgjqmr.js → code-block-37QAKDTI-zh5AeoJo.js} +1 -1
- package/dist/coffeescript-CCupxOZf.js +4 -0
- package/dist/commonlisp-DhUfGX6b.js +4 -0
- package/dist/{cose-bilkent-S5V4N54A-CO4ORQHF.js → cose-bilkent-S5V4N54A-BK1nIR2J.js} +1 -1
- package/dist/crystal-DSaw6rFQ.js +4 -0
- package/dist/css-D4QDewkG.js +4 -0
- package/dist/cypher-CrYVqw_F.js +4 -0
- package/dist/d-Cr3H3pPx.js +4 -0
- package/dist/{dagre-6UL2VRFP-C2C2XxsB.js → dagre-6UL2VRFP-r2rSdJYL.js} +9 -9
- package/dist/{data-grid-overlay-editor-BXqtz1ia.js → data-grid-overlay-editor-BVFT970w.js} +2 -2
- package/dist/{diagram-PSM6KHXK-DHBY-94p.js → diagram-PSM6KHXK-BpxVUe9U.js} +10 -10
- package/dist/{diagram-QEK2KX5R-CgMshOwn.js → diagram-QEK2KX5R-q3dHUcp6.js} +5 -5
- package/dist/{diagram-S2PKOQOG-F1KPva3Y.js → diagram-S2PKOQOG-MDBKrxSC.js} +5 -5
- package/dist/diff-ODiZJGls.js +4 -0
- package/dist/dist-4YNZxwMI.js +8 -0
- package/dist/dist-7nR3r2kG.js +5 -0
- package/dist/{dist-CBA36Nuy.js → dist-B2-r9y-0.js} +109 -109
- package/dist/dist-B2gkyT3r.js +5 -0
- package/dist/{dist--JwRU9u5.js → dist-B4tYJP_i.js} +2 -2
- package/dist/{dist-DA1J6LvO.js → dist-B5ATpkxy.js} +2 -2
- package/dist/dist-B8G3I6vJ.js +8 -0
- package/dist/{dist-DKnxaCRl.js → dist-B94MxrQS.js} +2 -2
- package/dist/dist-BJ96Ykfp.js +8 -0
- package/dist/dist-BKLIWGw4.js +5 -0
- package/dist/{dist-l0KayR2-.js → dist-BLwfpZD-.js} +2 -2
- package/dist/{dist-C_Kw_Kc0.js → dist-BYmtF1W6.js} +2 -2
- package/dist/{dist-Cpj5BHNP.js → dist-BbBnU4tG.js} +1 -1
- package/dist/dist-Bf3ou00A.js +6 -0
- package/dist/{dist-CITQGRtG.js → dist-BfactX3G.js} +4 -4
- package/dist/{dist-CsN7lsea.js → dist-BoAHOW2l.js} +2 -2
- package/dist/{dist-BcXuIt-h.js → dist-Bsv_ARko.js} +4 -4
- package/dist/dist-BvkKXuPm.js +5 -0
- package/dist/{dist-DsqQCNKw.js → dist-C2-m5aEk.js} +119 -119
- package/dist/dist-C6NJ3n6r.js +5 -0
- package/dist/{dist-DIVeCGlI.js → dist-CC9VUnXd.js} +1 -1
- package/dist/{dist-BKGWAN8J.js → dist-CE43BRmt.js} +1 -1
- package/dist/{dist-COp5dkis.js → dist-CJrHMxlI.js} +31 -31
- package/dist/{dist-BbQ-5HAA.js → dist-CPTE45iS.js} +1 -1
- package/dist/{dist-9trj4p6n.js → dist-CcOGT46m.js} +27 -27
- package/dist/dist-CecLPYY5.js +5 -0
- package/dist/{dist-BSMZYwqW.js → dist-Cgf353Ki.js} +1 -1
- package/dist/dist-Ch0SwRzK.js +5 -0
- package/dist/{dist-C6p7UKkB.js → dist-CkEUrAus.js} +2 -2
- package/dist/{dist-MFzhAmKV.js → dist-CmZYrgd_.js} +1 -1
- package/dist/{dist-b7Sc3Tj8.js → dist-Crk9ejOy.js} +4 -4
- package/dist/dist-D6eWHiFh.js +6 -0
- package/dist/dist-DCQ710Bv.js +5 -0
- package/dist/{dist-r6N_0WG-.js → dist-DOil6y-3.js} +4 -4
- package/dist/{dist-CPd_adhw.js → dist-Dc1SFk5I.js} +2 -2
- package/dist/dist-Dit9tk8a.js +1242 -0
- package/dist/{dist-B7NoEgR4.js → dist-DqJdzAYM.js} +2 -2
- package/dist/dist-P_pkS5f-.js +8 -0
- package/dist/{dist--Em7gfgX.js → dist-T4g7Sr6e.js} +3 -3
- package/dist/{dist-BhBtK2sL.js → dist-glA_fIK_.js} +2 -2
- package/dist/{dist-9J8_3DZN.js → dist-iiugPhCC.js} +1 -1
- package/dist/{dist-D7jHtwN8.js → dist-r8ecBV-v.js} +135 -65
- package/dist/{dist-BlRm4v0e.js → dist-yVJ4xE5n.js} +5 -5
- package/dist/{dockerfile-BBT_Ira6.js → dockerfile-D1Q_4uCN.js} +1 -1
- package/dist/dtd-C-t2Rk7F.js +4 -0
- package/dist/dylan-B4ctBLGp.js +4 -0
- package/dist/ecl-DqWfymni.js +4 -0
- package/dist/eiffel-DjBKKAr7.js +4 -0
- package/dist/elm--fxeC0FV.js +4 -0
- package/dist/{erDiagram-Q2GNP2WA-18gGng8V.js → erDiagram-Q2GNP2WA-CX1XdqVD.js} +13 -13
- package/dist/erlang-CaKXCX6H.js +4 -0
- package/dist/{esm-CgRNPmz8.js → esm-BAS2d2Ad.js} +1503 -1536
- package/dist/{factor-DdqWbSyy.js → factor--4HHM8Rw.js} +1 -1
- package/dist/factor-DlLO5EFS.js +4 -0
- package/dist/{flowDiagram-NV44I4VS-iHFiHYe0.js → flowDiagram-NV44I4VS-BCj-ONTw.js} +15 -15
- package/dist/forth-rOO6LVj_.js +4 -0
- package/dist/fortran-CUg15VGR.js +4 -0
- package/dist/{ganttDiagram-JELNMOA3-D7GixxiF.js → ganttDiagram-JELNMOA3-D1l5ewiQ.js} +8 -8
- package/dist/gas-BMRJspiW.js +4 -0
- package/dist/gherkin-DRxzijZU.js +4 -0
- package/dist/{gitGraphDiagram-NY62KEGX-CJFHytRK.js → gitGraphDiagram-NY62KEGX-KdZh0iiW.js} +5 -5
- package/dist/{glide-data-editor-BYwb17Bf.js → glide-data-editor-2RvcPqmc.js} +75 -76
- package/dist/groovy-BmrQ8pUP.js +4 -0
- package/dist/haskell-BuaYfKOz.js +4 -0
- package/dist/haxe-DcH9eA0a.js +5 -0
- package/dist/idl-DGlcm4Ls.js +4 -0
- package/dist/{infoDiagram-WHAUD3N6-B5Lkh3A9.js → infoDiagram-WHAUD3N6-PSH7lQ0D.js} +3 -3
- package/dist/javascript-CeTk7rzr.js +4 -0
- package/dist/{journeyDiagram-XKPGCS4Q-CV_9R9iP.js → journeyDiagram-XKPGCS4Q-BrTAxQ1J.js} +5 -5
- package/dist/julia-BoP_q1gm.js +4 -0
- package/dist/{kanban-definition-3W4ZIXB7-Dp21D5Ym.js → kanban-definition-3W4ZIXB7-BoYCDp_9.js} +10 -10
- package/dist/{katex-CX2BKujk.js → katex-DaGuLbVh.js} +1 -1
- package/dist/{line-LK_5q2B9.js → line-Bc27KE1D.js} +3 -3
- package/dist/{linear-vWf1Qj0e.js → linear-Bnc6E9kA.js} +4 -4
- package/dist/livescript-B7IMN-ba.js +4 -0
- package/dist/{loader-B0KEFFi-.js → loader-C0-eIoas.js} +1 -1
- package/dist/lua-q1InavKb.js +4 -0
- package/dist/main.js +525 -488
- package/dist/mathematica-DvR8-_EI.js +4 -0
- package/dist/mbox-7h5MNBS_.js +4 -0
- package/dist/{mermaid-4DMBBIKO-BhDCqnO1.js → mermaid-4DMBBIKO-BmJdHPwx.js} +1 -1
- package/dist/{mermaid-B__BZSXU.js → mermaid-C2cSe5YL.js} +40 -40
- package/dist/{mhchem-w1tkUnWr.js → mhchem-B_tiMbKF.js} +1 -1
- package/dist/{mindmap-definition-VGOIOE7T-B_5mfdYp.js → mindmap-definition-VGOIOE7T-CmRjsKEt.js} +12 -12
- package/dist/mirc-D-XM8A5c.js +4 -0
- package/dist/mllike-BQGkkbmf.js +6 -0
- package/dist/modelica-D_yRj_WU.js +4 -0
- package/dist/mscgen-B-rltAjp.js +6 -0
- package/dist/mumps-2kh8TU2b.js +4 -0
- package/dist/{nsis-CunMjZ_n.js → nsis-B6EN9LWI.js} +1 -1
- package/dist/nsis-CtusEqwb.js +4 -0
- package/dist/ntriples-BdAXw6zV.js +4 -0
- package/dist/{number-overlay-editor-D-4WQAGX.js → number-overlay-editor-DKVJgXpp.js} +1 -1
- package/dist/octave-CsNFmVp5.js +4 -0
- package/dist/{ordinal-IlASfRja.js → ordinal-DLLbwLkP.js} +1 -1
- package/dist/oz-odIXCrKd.js +4 -0
- package/dist/pascal-B9Mfk3Fo.js +4 -0
- package/dist/perl-C48inLcz.js +4 -0
- package/dist/{pieDiagram-ADFJNKIX-B-DGEopK.js → pieDiagram-ADFJNKIX-CtxQlnsU.js} +10 -10
- package/dist/pig-uwRtAssU.js +4 -0
- package/dist/powershell-CXqlca-i.js +4 -0
- package/dist/{precisionRound-CGLoV26P.js → precisionRound-Duzbr5ur.js} +1 -1
- package/dist/properties-D6Zu1rpK.js +4 -0
- package/dist/protobuf-BlNNWZaR.js +4 -0
- package/dist/pug-DytcK7bv.js +4 -0
- package/dist/{pug-Dr-sA_9V.js → pug-xrm7jQ2R.js} +1 -1
- package/dist/puppet-lJ8Ok3iY.js +4 -0
- package/dist/python-cMaF7kUp.js +4 -0
- package/dist/q-Dgt2HYQh.js +4 -0
- package/dist/{quadrantDiagram-AYHSOK5B-M_yRSIZn.js → quadrantDiagram-AYHSOK5B-DllnB2Hl.js} +4 -4
- package/dist/r-Bm4S4awf.js +4 -0
- package/dist/react-vega-1ub36dPZ.js +9 -0
- package/dist/{react-vega-DLFvGrpJ.js → react-vega-CCNu2JE0.js} +18 -18
- package/dist/{requirementDiagram-UZGBJVZJ-9Wt82hOZ.js → requirementDiagram-UZGBJVZJ-D36MI1k0.js} +12 -12
- package/dist/rpm-_8LbzMVc.js +5 -0
- package/dist/ruby-Cr8IJ5VZ.js +4 -0
- package/dist/{sankeyDiagram-TZEHDZUN-x_aTXZeN.js → sankeyDiagram-TZEHDZUN-D1mygNPC.js} +4 -4
- package/dist/sas-CFcSfo2_.js +4 -0
- package/dist/scheme-N4XRoKgc.js +4 -0
- package/dist/{sequenceDiagram-WL72ISMW-CXXmJqiQ.js → sequenceDiagram-WL72ISMW-CWdn91Rf.js} +6 -6
- package/dist/shell-B4L7f_ds.js +4 -0
- package/dist/sieve-UI6J3Gm0.js +4 -0
- package/dist/smalltalk-BuaPZAZU.js +4 -0
- package/dist/sparql-1rKrq463.js +4 -0
- package/dist/{src-szye8OCw.js → src-jICM_d2B.js} +1 -1
- package/dist/{stateDiagram-FKZM4ZOC-CiSKS_Mx.js → stateDiagram-FKZM4ZOC-CPxroWXd.js} +15 -15
- package/dist/{stateDiagram-v2-4FDKWEC3-A43Itnjp.js → stateDiagram-v2-4FDKWEC3-BpM9Q54b.js} +13 -13
- package/dist/{step-1PmBKr2y.js → step-BqVgkWtk.js} +1 -1
- package/dist/style.css +1 -1
- package/dist/stylus-DvSovJEP.js +4 -0
- package/dist/swift-D-_E7Yyb.js +4 -0
- package/dist/tcl-Di5sAVHN.js +4 -0
- package/dist/textile-Benwt66z.js +4 -0
- package/dist/{time-DC4qQGmA.js → time-CrYsYnQU.js} +4 -4
- package/dist/{timeline-definition-IT6M3QCI-DR26eWb4.js → timeline-definition-IT6M3QCI-CVnRHx_t.js} +3 -3
- package/dist/toml-CeOvPOkY.js +4 -0
- package/dist/troff-DJN9hfgu.js +4 -0
- package/dist/ttcn-DQW2Psjf.js +4 -0
- package/dist/ttcn-cfg-zFG_MNpg.js +4 -0
- package/dist/turtle-DHRyNlSc.js +4 -0
- package/dist/{types-Bb-6p8hv.js → types-Ckva8JJq.js} +203 -156
- package/dist/{useDeepCompareMemoize-BhZZsis0.js → useDeepCompareMemoize-ChviuF5n.js} +1 -1
- package/dist/vb-CXWH9DD-.js +4 -0
- package/dist/vbscript-qr8qVck5.js +4 -0
- package/dist/{vega-component-DCxUyPnb.js → vega-component-CnG0vAjf.js} +7 -7
- package/dist/{vega-loader.browser-BJ1uJidF.js → vega-loader.browser-DqHiiBeQ.js} +3 -3
- package/dist/velocity-C_9pUJRx.js +4 -0
- package/dist/verilog-DxBstgBa.js +4 -0
- package/dist/vhdl-odUxAbE6.js +4 -0
- package/dist/webidl-Dfn5Rku4.js +4 -0
- package/dist/xquery-CrJs6SXr.js +4 -0
- package/dist/{xychartDiagram-PRI3JC2R-BcVxCRox.js → xychartDiagram-PRI3JC2R-BltwMWKC.js} +11 -11
- package/dist/yacas-B-uDDLZe.js +4 -0
- package/dist/z80-51gxgAXE.js +4 -0
- package/package.json +12 -13
- package/src/components/data-table/TableActions.tsx +8 -1
- package/src/components/data-table/__tests__/columns.test.tsx +47 -0
- package/src/components/data-table/column-header.tsx +3 -0
- package/src/components/data-table/columns.tsx +17 -2
- package/src/components/data-table/data-table.tsx +2 -0
- package/src/components/data-table/download-actions.tsx +6 -1
- package/src/components/dependency-graph/dependency-graph-tree.tsx +10 -1
- package/src/components/dependency-graph/dependency-graph.tsx +1 -0
- package/src/components/dependency-graph/elements.ts +20 -9
- package/src/components/dependency-graph/panels.tsx +27 -11
- package/src/components/dependency-graph/types.ts +1 -0
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +4 -1
- package/src/components/editor/package-alert.tsx +4 -4
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +3 -5
- package/src/core/codemirror/misc/__tests__/paste.test.ts +18 -0
- package/src/core/codemirror/misc/paste.ts +14 -10
- package/src/core/wasm/__tests__/store.test.ts +33 -0
- package/src/core/wasm/bridge.ts +2 -1
- package/src/core/wasm/store.ts +13 -1
- package/src/plugins/impl/DataTablePlugin.tsx +4 -0
- package/src/plugins/impl/chat/ChatPlugin.tsx +2 -0
- package/src/plugins/impl/chat/chat-ui.tsx +10 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +4 -0
- package/src/plugins/impl/plotly/Plot.tsx +173 -0
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +41 -10
- package/src/plugins/impl/plotly/__tests__/parse-from-template.test.ts +1 -0
- package/src/plugins/impl/plotly/__tests__/usePlotlyLayout.test.ts +2 -1
- package/src/plugins/impl/plotly/parse-from-template.ts +1 -0
- package/src/plugins/impl/plotly/usePlotlyLayout.ts +2 -1
- package/src/theme/ThemeProvider.tsx +2 -0
- package/dist/apl-BuwKwesW.js +0 -4
- package/dist/asciiarmor-zAEd_wtn.js +0 -4
- package/dist/asn1-DWEA66J4.js +0 -4
- package/dist/brainfuck-mIPR6Ong.js +0 -4
- package/dist/classDiagram-2ON5EDUG-B9pkKjjc.js +0 -30
- package/dist/classDiagram-v2-WZHVMYZB-CRhhA0tV.js +0 -30
- package/dist/clojure-DkhhNHNQ.js +0 -4
- package/dist/cmake-1obPvqtc.js +0 -4
- package/dist/cobol-oWNTiXPE.js +0 -4
- package/dist/coffeescript-LtYUvf6r.js +0 -4
- package/dist/commonlisp-C_06qBYF.js +0 -4
- package/dist/crystal-CDJkbx14.js +0 -4
- package/dist/css-Bi_Nk0uN.js +0 -4
- package/dist/cypher-TrG0NvZ0.js +0 -4
- package/dist/d-CFKOrZsi.js +0 -4
- package/dist/diff-CfnSF48q.js +0 -4
- package/dist/dist-2OSzSqy2.js +0 -5
- package/dist/dist-B1H2TQGB.js +0 -8
- package/dist/dist-BNvasp6N.js +0 -5
- package/dist/dist-CFi_P6cs.js +0 -5
- package/dist/dist-CG4LWTPv.js +0 -8
- package/dist/dist-CHWVQZ6Z.js +0 -6
- package/dist/dist-C_8-swED.js +0 -5
- package/dist/dist-DIhtur5b.js +0 -5
- package/dist/dist-DoQ7RS4e.js +0 -5
- package/dist/dist-DsMd-F9h.js +0 -5
- package/dist/dist-DurmUshd.js +0 -8
- package/dist/dist-PZgrh2z6.js +0 -6
- package/dist/dist-g1p2PEVs.js +0 -1242
- package/dist/dist-wudNDAiO.js +0 -5
- package/dist/dist-zVskjQcA.js +0 -8
- package/dist/dtd-Ctw8_JkU.js +0 -4
- package/dist/dylan-f7rMBKDP.js +0 -4
- package/dist/ecl-C2h3oBMY.js +0 -4
- package/dist/eiffel-Ce81wv20.js +0 -4
- package/dist/elm-BVV8QQcc.js +0 -4
- package/dist/erlang-DjB35ZUh.js +0 -4
- package/dist/factor-CIcp3U2B.js +0 -4
- package/dist/forth-CVgjsHhD.js +0 -4
- package/dist/fortran-CcTXj0d_.js +0 -4
- package/dist/gas-JWpamkLf.js +0 -4
- package/dist/gherkin-BveSCSJV.js +0 -4
- package/dist/groovy-Np3AZt00.js +0 -4
- package/dist/haskell-CVfmFALm.js +0 -4
- package/dist/haxe-C10xkMLg.js +0 -5
- package/dist/idl-CKBSGnKC.js +0 -4
- package/dist/javascript-Cur-15Bn.js +0 -4
- package/dist/julia-BZZH2Gnx.js +0 -4
- package/dist/livescript-D_rTTm_U.js +0 -4
- package/dist/lua-Mf_Of7eV.js +0 -4
- package/dist/mathematica-DCYjugDb.js +0 -4
- package/dist/mbox-KBWrT8JD.js +0 -4
- package/dist/mirc-JwEQJ8Fb.js +0 -4
- package/dist/mllike-C7TxLvh6.js +0 -6
- package/dist/modelica-uvNgvUyw.js +0 -4
- package/dist/mscgen-CGnokp5x.js +0 -6
- package/dist/mumps-Dl9QdOZz.js +0 -4
- package/dist/nsis-BbDhbgPN.js +0 -4
- package/dist/ntriples-ChL1mlp7.js +0 -4
- package/dist/octave-B9ZGG6zv.js +0 -4
- package/dist/oz-XHEu31wr.js +0 -4
- package/dist/pascal-BxtYw-iH.js +0 -4
- package/dist/perl-Br5BgHPb.js +0 -4
- package/dist/pig-BByO2hBz.js +0 -4
- package/dist/powershell-Cd4Zaef3.js +0 -4
- package/dist/prop-types-C9QZf2SY.js +0 -51
- package/dist/properties-B-BOCIOl.js +0 -4
- package/dist/protobuf-CaLimlho.js +0 -4
- package/dist/pug-bonARSG6.js +0 -4
- package/dist/puppet-BSlT-3sc.js +0 -4
- package/dist/python-BIJhGYYP.js +0 -4
- package/dist/q-D9TX8A0B.js +0 -4
- package/dist/r-BXelX7Rl.js +0 -4
- package/dist/react-plotly-BuRa9xtI.js +0 -169447
- package/dist/react-vega-3WcLHYC7.js +0 -9
- package/dist/rpm-BxAh9B1A.js +0 -5
- package/dist/ruby-BCZLQyhc.js +0 -4
- package/dist/sas-Bo7lsyNX.js +0 -4
- package/dist/scheme-Brhptkt-.js +0 -4
- package/dist/shell-fWWb8_qx.js +0 -4
- package/dist/sieve-Ba8_hMLn.js +0 -4
- package/dist/smalltalk-7sHxwMDT.js +0 -4
- package/dist/sparql-BBFrPJ7z.js +0 -4
- package/dist/stylus-CIB0KT46.js +0 -4
- package/dist/swift-CZinekXz.js +0 -4
- package/dist/tcl-DCHZJVq_.js +0 -4
- package/dist/textile-ThTMxgkN.js +0 -4
- package/dist/toml-DK17wlJ7.js +0 -4
- package/dist/troff-CuUAOgMy.js +0 -4
- package/dist/ttcn-DS2tj6rW.js +0 -4
- package/dist/ttcn-cfg-CdZGarnc.js +0 -4
- package/dist/turtle-Bkz-FLZ7.js +0 -4
- package/dist/vb-ITdOmxvR.js +0 -4
- package/dist/vbscript-B7oeGyfL.js +0 -4
- package/dist/velocity-D__EkuSd.js +0 -4
- package/dist/verilog-CPH50gr9.js +0 -4
- package/dist/vhdl-CQAwKCk_.js +0 -4
- package/dist/webidl-BnEptfVX.js +0 -4
- package/dist/xquery-D7eTv-CR.js +0 -4
- package/dist/yacas-0x1rX89s.js +0 -4
- package/dist/z80-B25SJVDf.js +0 -4
- /package/dist/{ImageComparisonComponent-DkEXPki_.js → ImageComparisonComponent-CRbA-1eg.js} +0 -0
- /package/dist/{apl-D9gTcP3Q.js → apl-Oc3bL26_.js} +0 -0
- /package/dist/{array-D7wW5QoO.js → array-CEIRxyh3.js} +0 -0
- /package/dist/{asciiarmor-mLyg-Z5h.js → asciiarmor-DTbPh2VI.js} +0 -0
- /package/dist/{asn1-AE7eHomk.js → asn1-CGhwu1Ri.js} +0 -0
- /package/dist/{brainfuck-Bdd6NcL6.js → brainfuck-CA0L8lRq.js} +0 -0
- /package/dist/{click-outside-container-DNfggvIW.js → click-outside-container-C_k38vlR.js} +0 -0
- /package/dist/{clike-D_s3fKg5.js → clike-CEtUBPHD.js} +0 -0
- /package/dist/{clojure-zTYBCd80.js → clojure-BszjvdGo.js} +0 -0
- /package/dist/{cmake-BnJV90fC.js → cmake-B2Gvps8b.js} +0 -0
- /package/dist/{cobol-CH0OZO8A.js → cobol-DuMch8nn.js} +0 -0
- /package/dist/{coffeescript-CLhc1U6Q.js → coffeescript-L9aKXVsJ.js} +0 -0
- /package/dist/{colors-6DRQ0kEF.js → colors-DR_aHfmQ.js} +0 -0
- /package/dist/{commonlisp-8K2-IkUD.js → commonlisp-CrtdssxB.js} +0 -0
- /package/dist/{crystal-8to4H-ep.js → crystal-vvNY0LpY.js} +0 -0
- /package/dist/{css-BVo-JOy5.js → css-B1GdzqT1.js} +0 -0
- /package/dist/{cypher-BTFaDDd_.js → cypher-BtZvV7bW.js} +0 -0
- /package/dist/{d-c9bddW2W.js → d-B0UN3V-Z.js} +0 -0
- /package/dist/{defaultLocale-Bxoo2-30.js → defaultLocale-B_A76Zpk.js} +0 -0
- /package/dist/{defaultLocale-qS7DaAmi.js → defaultLocale-DjFHq3Xk.js} +0 -0
- /package/dist/{diff-PA28xMKg.js → diff-DOpgjj1W.js} +0 -0
- /package/dist/{dist-BBYTEAvO.js → dist-DF_77D2B.js} +0 -0
- /package/dist/{dtd-DRlC7Bx8.js → dtd-Ctnjxrle.js} +0 -0
- /package/dist/{dylan-d5ufc25E.js → dylan-DFXkoaZy.js} +0 -0
- /package/dist/{ecl-Ci3afVKc.js → ecl-C1NExZip.js} +0 -0
- /package/dist/{eiffel-G6DmeEi3.js → eiffel-uXVGgleg.js} +0 -0
- /package/dist/{elm-ByYWHu8b.js → elm-CBOFnnib.js} +0 -0
- /package/dist/{erlang-C7_LcVDw.js → erlang-DMnrT8XK.js} +0 -0
- /package/dist/{esm-CAd2HmbR.js → esm-0_ieXYNc.js} +0 -0
- /package/dist/{forth-BgUerAyz.js → forth-DDpxS4nw.js} +0 -0
- /package/dist/{fortran-BCXxm4xF.js → fortran-B6uYqQMz.js} +0 -0
- /package/dist/{gas-CKTQRKLl.js → gas-BKnWzuFz.js} +0 -0
- /package/dist/{gherkin-ByVP9cY_.js → gherkin-pBt0wT4X.js} +0 -0
- /package/dist/{groovy-BPbrw0GZ.js → groovy-DKsn4ppB.js} +0 -0
- /package/dist/{haskell-B8fq1DW4.js → haskell-BJVBJQcy.js} +0 -0
- /package/dist/{haxe-B7SHQmJo.js → haxe-rLN5UZU5.js} +0 -0
- /package/dist/{idl-CeJBDjsl.js → idl-B4mwMAo-.js} +0 -0
- /package/dist/{init-BfRhston.js → init-TaqZJsBY.js} +0 -0
- /package/dist/{javascript-dCv9_Kn8.js → javascript-Hf2NLNC0.js} +0 -0
- /package/dist/{julia-CD5lO88_.js → julia-GGpx21YN.js} +0 -0
- /package/dist/{katex-Db0k5oV_.js → katex-Ba7xZPrx.js} +0 -0
- /package/dist/{livescript-Cc8RvFBv.js → livescript-CSvXMspZ.js} +0 -0
- /package/dist/{lua-4nedfnvd.js → lua-CVMR5LMW.js} +0 -0
- /package/dist/{math-BbMyrONz.js → math-CTnb-N1W.js} +0 -0
- /package/dist/{mathematica-BIufdZr2.js → mathematica-JENNt-p4.js} +0 -0
- /package/dist/{mbox-DQkYSHKe.js → mbox-mzifoc8E.js} +0 -0
- /package/dist/{mirc-CI-RWqUR.js → mirc-BXoiItvN.js} +0 -0
- /package/dist/{mllike-DQzbf1xo.js → mllike-H-KR9OuH.js} +0 -0
- /package/dist/{modelica-BnF_cDWj.js → modelica-B6Hm3mMl.js} +0 -0
- /package/dist/{mscgen-MirFrDhW.js → mscgen-D8TF_Hei.js} +0 -0
- /package/dist/{mumps-eNRTuWOD.js → mumps-CD-kNPt4.js} +0 -0
- /package/dist/{ntriples-BLneip4i.js → ntriples-DgnpxU40.js} +0 -0
- /package/dist/{octave-C0eG-pKq.js → octave-CkobqyVm.js} +0 -0
- /package/dist/{oz-BPMLow2T.js → oz-ChDLd9tS.js} +0 -0
- /package/dist/{pascal-5eb9v5Dl.js → pascal-CvlkwK7E.js} +0 -0
- /package/dist/{path-C_x2ySFi.js → path-7gr7eZmp.js} +0 -0
- /package/dist/{perl-DOu6rCkF.js → perl-BNEFTNbM.js} +0 -0
- /package/dist/{pig-CRW0kne3.js → pig-Cd1DMS7P.js} +0 -0
- /package/dist/{powershell-CWgJhiiJ.js → powershell-CPxA0zpc.js} +0 -0
- /package/dist/{properties-CHxpmfXW.js → properties-BaFBm-Xa.js} +0 -0
- /package/dist/{protobuf-DGUXb_-T.js → protobuf-BQV_-X0H.js} +0 -0
- /package/dist/{puppet-C7uSiW6_.js → puppet-LXLST0mx.js} +0 -0
- /package/dist/{python-DAbhVcUr.js → python-DLjLzX4k.js} +0 -0
- /package/dist/{q-DKjWHias.js → q-DswTX1Y9.js} +0 -0
- /package/dist/{r-KD2KhyeL.js → r-CO7NpMwE.js} +0 -0
- /package/dist/{range-BYuZFTbA.js → range-DwpxnYuB.js} +0 -0
- /package/dist/{rpm-GFtnpQ6M.js → rpm-BlmEDT6r.js} +0 -0
- /package/dist/{ruby-CBAewzLY.js → ruby-BTPKgeZZ.js} +0 -0
- /package/dist/{sas-CCi_AaZi.js → sas-DTDTiNO8.js} +0 -0
- /package/dist/{scheme-CGGGD6kR.js → scheme-UzAAg4GJ.js} +0 -0
- /package/dist/{shell-b7vZ8ucI.js → shell-DQ0hQCsB.js} +0 -0
- /package/dist/{sieve-ClXOUV85.js → sieve-BVyYIx9u.js} +0 -0
- /package/dist/{simple-mode-Uad4lEG7.js → simple-mode-Dryu-fC9.js} +0 -0
- /package/dist/{slides-component-Dp-y50K9.js → slides-component-DfwLApNr.js} +0 -0
- /package/dist/{smalltalk-_PFt9_gp.js → smalltalk-DAdMAHTu.js} +0 -0
- /package/dist/{sparql-BCF6qcHt.js → sparql-Bi7quYgw.js} +0 -0
- /package/dist/{stylus-DMFZWz-G.js → stylus-jhpzcQ6Y.js} +0 -0
- /package/dist/{swift-De2YpSxT.js → swift-BrO8qThZ.js} +0 -0
- /package/dist/{tcl-jV8Xs_1k.js → tcl-s5QI5gv3.js} +0 -0
- /package/dist/{textile-D_zo778l.js → textile-ClhvJrxM.js} +0 -0
- /package/dist/{timer-pEiW44EO.js → timer-DV8t68ti.js} +0 -0
- /package/dist/{toml-_M0gsKn5.js → toml-TFa3EJQE.js} +0 -0
- /package/dist/{treemap-BzS5cW_6.js → treemap-CQJ0bIDy.js} +0 -0
- /package/dist/{troff-B06gyD33.js → troff-SqLg0heF.js} +0 -0
- /package/dist/{ttcn-DoQoQNUM.js → ttcn-Cfrap7HJ.js} +0 -0
- /package/dist/{ttcn-cfg-l_6PksD2.js → ttcn-cfg-Dopc-iwE.js} +0 -0
- /package/dist/{turtle-zEnD4bpn.js → turtle-Dt52DvVH.js} +0 -0
- /package/dist/{useAsyncData-Dyq3DyOF.js → useAsyncData-dr8GazGv.js} +0 -0
- /package/dist/{vb-fUsnAuzb.js → vb-D1pAvfDe.js} +0 -0
- /package/dist/{vbscript-CVlD7uZQ.js → vbscript-DZ7RBxn5.js} +0 -0
- /package/dist/{velocity-CHkEIdMC.js → velocity-Csau7eZy.js} +0 -0
- /package/dist/{verilog-B3ctZTB4.js → verilog-gXlZACs5.js} +0 -0
- /package/dist/{vhdl-rXdBgR5O.js → vhdl-NaUWbI1B.js} +0 -0
- /package/dist/{webidl-Cv9aQfcc.js → webidl-BJmPjW01.js} +0 -0
- /package/dist/{xquery-Du0w47aa.js → xquery-CJIPsC0g.js} +0 -0
- /package/dist/{yacas-Eq4p_g3L.js → yacas-8f2Vjiiz.js} +0 -0
- /package/dist/{z80-Dz4HTTRf.js → z80-s5Xk2hCP.js} +0 -0
|
@@ -140,6 +140,24 @@ def _(
|
|
|
140
140
|
expect(extractCells(input)).toEqual(["x = a + b + c"]);
|
|
141
141
|
});
|
|
142
142
|
|
|
143
|
+
it("preserves return statements inside nested functions", () => {
|
|
144
|
+
const input = `
|
|
145
|
+
@app.cell
|
|
146
|
+
def _(mo, px):
|
|
147
|
+
def make_fig():
|
|
148
|
+
data = {'category': ['foo', 'bar'], 'value': [10, 20]}
|
|
149
|
+
fig = px.bar(data, x='category', y='value')
|
|
150
|
+
return fig
|
|
151
|
+
|
|
152
|
+
fig = make_fig()
|
|
153
|
+
mo.ui.plotly(fig)
|
|
154
|
+
return
|
|
155
|
+
`;
|
|
156
|
+
expect(extractCells(input)).toEqual([
|
|
157
|
+
"def make_fig():\n data = {'category': ['foo', 'bar'], 'value': [10, 20]}\n fig = px.bar(data, x='category', y='value')\n return fig\n\nfig = make_fig()\nmo.ui.plotly(fig)",
|
|
158
|
+
]);
|
|
159
|
+
});
|
|
160
|
+
|
|
143
161
|
it("handles cells with config", () => {
|
|
144
162
|
const input = `
|
|
145
163
|
@app.cell(hide_code=True, column=2)
|
|
@@ -42,6 +42,7 @@ export function extractCells(text: string): string[] {
|
|
|
42
42
|
let inMultilineArgs = false;
|
|
43
43
|
let inMultilineReturn = false;
|
|
44
44
|
let parenCount = 0;
|
|
45
|
+
let cellBaseIndent: number | null = null;
|
|
45
46
|
|
|
46
47
|
// Pre-compile regex patterns
|
|
47
48
|
const leadingParenRegex = /\(/g;
|
|
@@ -55,19 +56,16 @@ export function extractCells(text: string): string[] {
|
|
|
55
56
|
);
|
|
56
57
|
}
|
|
57
58
|
|
|
59
|
+
function getIndent(line: string): number {
|
|
60
|
+
const match = line.match(/^\s*/);
|
|
61
|
+
return match ? match[0].length : 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
58
64
|
function finalizeCellIfNeeded() {
|
|
59
65
|
if (currentCell.length === 0) {
|
|
60
66
|
return;
|
|
61
67
|
}
|
|
62
68
|
|
|
63
|
-
// Remove trailing returns
|
|
64
|
-
while (
|
|
65
|
-
currentCell.length > 0 &&
|
|
66
|
-
currentCell[currentCell.length - 1].trim().startsWith("return")
|
|
67
|
-
) {
|
|
68
|
-
currentCell.pop();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
69
|
// Only add non-empty cells
|
|
72
70
|
if (currentCell.some((l) => l.trim() !== "")) {
|
|
73
71
|
cells.push(dedent(currentCell.join("\n")));
|
|
@@ -88,6 +86,7 @@ export function extractCells(text: string): string[] {
|
|
|
88
86
|
finalizeCellIfNeeded();
|
|
89
87
|
inCell = true;
|
|
90
88
|
skipLines = 1; // Skip the def line
|
|
89
|
+
cellBaseIndent = null;
|
|
91
90
|
continue;
|
|
92
91
|
}
|
|
93
92
|
|
|
@@ -125,8 +124,13 @@ export function extractCells(text: string): string[] {
|
|
|
125
124
|
continue;
|
|
126
125
|
}
|
|
127
126
|
|
|
128
|
-
//
|
|
129
|
-
if (trimmed
|
|
127
|
+
// Detect base indentation of cell body from first content line
|
|
128
|
+
if (cellBaseIndent === null && trimmed) {
|
|
129
|
+
cellBaseIndent = getIndent(line);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Handle return statements — only strip cell-level returns
|
|
133
|
+
if (trimmed.startsWith("return") && getIndent(line) === cellBaseIndent) {
|
|
130
134
|
if (trimmed.includes("(") && !trimmed.endsWith(")")) {
|
|
131
135
|
inMultilineReturn = true;
|
|
132
136
|
parenCount = countParens(trimmed);
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { codeAtom } from "../../saving/file-state";
|
|
4
|
+
import { store } from "../../state/jotai";
|
|
3
5
|
import {
|
|
4
6
|
CompositeFileStore,
|
|
5
7
|
domElementFileStore,
|
|
6
8
|
localStorageFileStore,
|
|
9
|
+
mountConfigFileStore,
|
|
10
|
+
notebookFileStore,
|
|
7
11
|
} from "../store";
|
|
8
12
|
|
|
9
13
|
describe("localStorageFileStore", () => {
|
|
@@ -53,3 +57,32 @@ describe("CompositeFileStore", () => {
|
|
|
53
57
|
expect(saved).toHaveBeenCalledTimes(3);
|
|
54
58
|
});
|
|
55
59
|
});
|
|
60
|
+
|
|
61
|
+
describe("mountConfigFileStore", () => {
|
|
62
|
+
it("returns null when no code is set", () => {
|
|
63
|
+
store.set(codeAtom, undefined);
|
|
64
|
+
expect(mountConfigFileStore.readFile()).toBeNull();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("returns code when set", () => {
|
|
68
|
+
store.set(codeAtom, "print('hello')");
|
|
69
|
+
expect(mountConfigFileStore.readFile()).toBe("print('hello')");
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("does not save files", () => {
|
|
73
|
+
store.set(codeAtom, "original");
|
|
74
|
+
mountConfigFileStore.saveFile("new content");
|
|
75
|
+
expect(mountConfigFileStore.readFile()).toBe("original");
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
describe("notebookFileStore priority", () => {
|
|
80
|
+
it("prefers mount config over marimo-code and URL", () => {
|
|
81
|
+
store.set(codeAtom, "mount config code");
|
|
82
|
+
const element = document.createElement("marimo-code");
|
|
83
|
+
element.textContent = "marimo-code element";
|
|
84
|
+
document.body.replaceChildren(element);
|
|
85
|
+
|
|
86
|
+
expect(notebookFileStore.readFile()).toBe("mount config code");
|
|
87
|
+
});
|
|
88
|
+
});
|
package/src/core/wasm/bridge.ts
CHANGED
|
@@ -29,6 +29,7 @@ import type {
|
|
|
29
29
|
SaveUserConfigurationRequest,
|
|
30
30
|
Snippets,
|
|
31
31
|
} from "../network/types";
|
|
32
|
+
import { filenameAtom } from "../saving/file-state";
|
|
32
33
|
import { store } from "../state/jotai";
|
|
33
34
|
import { BasicTransport } from "../websocket/transports/basic";
|
|
34
35
|
import type { IConnectionTransport } from "../websocket/transports/transport";
|
|
@@ -146,7 +147,7 @@ export class PyodideBridge implements RunRequests, EditRequests {
|
|
|
146
147
|
|
|
147
148
|
const code = await notebookFileStore.readFile();
|
|
148
149
|
const fallbackCode = await fallbackFileStore.readFile();
|
|
149
|
-
const filename = PyodideRouter.getFilename();
|
|
150
|
+
const filename = store.get(filenameAtom) ?? PyodideRouter.getFilename();
|
|
150
151
|
const userConfig = store.get(userConfigAtom);
|
|
151
152
|
|
|
152
153
|
const queryParameters: Record<string, string | string[]> = {};
|
package/src/core/wasm/store.ts
CHANGED
|
@@ -4,6 +4,8 @@ import {
|
|
|
4
4
|
compressToEncodedURIComponent,
|
|
5
5
|
decompressFromEncodedURIComponent,
|
|
6
6
|
} from "lz-string";
|
|
7
|
+
import { codeAtom } from "@/core/saving/file-state";
|
|
8
|
+
import { store } from "@/core/state/jotai";
|
|
7
9
|
import { TypedLocalStorage } from "@/utils/storage/typed";
|
|
8
10
|
import { PyodideRouter } from "./router";
|
|
9
11
|
|
|
@@ -67,6 +69,15 @@ const remoteDefaultFileStore: FileStore = {
|
|
|
67
69
|
},
|
|
68
70
|
};
|
|
69
71
|
|
|
72
|
+
export const mountConfigFileStore: FileStore = {
|
|
73
|
+
saveFile(_contents: string) {
|
|
74
|
+
// Read-only: mount config code is set via codeAtom
|
|
75
|
+
},
|
|
76
|
+
readFile() {
|
|
77
|
+
return store.get(codeAtom) ?? null;
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
|
|
70
81
|
const emptyFileStore: FileStore = {
|
|
71
82
|
saveFile(contents: string) {
|
|
72
83
|
// Do nothing
|
|
@@ -112,7 +123,8 @@ export class CompositeFileStore implements FileStore {
|
|
|
112
123
|
}
|
|
113
124
|
|
|
114
125
|
export const notebookFileStore = new CompositeFileStore([
|
|
115
|
-
// Prefer <marimo-code>, then URL
|
|
126
|
+
// Prefer mount config, then <marimo-code>, then URL
|
|
127
|
+
mountConfigFileStore,
|
|
116
128
|
domElementFileStore,
|
|
117
129
|
urlFileStore,
|
|
118
130
|
]);
|
|
@@ -195,6 +195,7 @@ interface Data<T> {
|
|
|
195
195
|
hasStableRowId: boolean;
|
|
196
196
|
lazy: boolean;
|
|
197
197
|
cellHoverTexts?: Record<string, Record<string, string | null>> | null;
|
|
198
|
+
downloadFileName?: string;
|
|
198
199
|
}
|
|
199
200
|
|
|
200
201
|
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
|
|
@@ -278,6 +279,7 @@ export const DataTablePlugin = createPlugin<S>("marimo-table")
|
|
|
278
279
|
// If lazy, this will preload the first page of data
|
|
279
280
|
// without user confirmation.
|
|
280
281
|
preload: z.boolean().default(false),
|
|
282
|
+
downloadFileName: z.string().optional(),
|
|
281
283
|
}),
|
|
282
284
|
)
|
|
283
285
|
.withFunctions<DataTableFunctions>({
|
|
@@ -752,6 +754,7 @@ const DataTableComponent = ({
|
|
|
752
754
|
cellStyles,
|
|
753
755
|
hoverTemplate,
|
|
754
756
|
cellHoverTexts,
|
|
757
|
+
downloadFileName,
|
|
755
758
|
toggleDisplayHeader,
|
|
756
759
|
calculate_top_k_rows,
|
|
757
760
|
preview_column,
|
|
@@ -981,6 +984,7 @@ const DataTableComponent = ({
|
|
|
981
984
|
hoverTemplate={hoverTemplate}
|
|
982
985
|
cellHoverTexts={cellHoverTexts}
|
|
983
986
|
downloadAs={showDownload ? downloadAs : undefined}
|
|
987
|
+
downloadFileName={downloadFileName}
|
|
984
988
|
enableSearch={enableSearch}
|
|
985
989
|
searchQuery={searchQuery}
|
|
986
990
|
onSearchQueryChange={setSearchQuery}
|
|
@@ -47,6 +47,7 @@ export const ChatPlugin = createPlugin<{ messages: UIMessage[] }>(
|
|
|
47
47
|
maxHeight: z.number().optional(),
|
|
48
48
|
config: configSchema,
|
|
49
49
|
allowAttachments: z.union([z.boolean(), z.string().array()]),
|
|
50
|
+
disabled: z.boolean().default(false),
|
|
50
51
|
}),
|
|
51
52
|
)
|
|
52
53
|
.withFunctions<PluginFunctions>({
|
|
@@ -76,6 +77,7 @@ export const ChatPlugin = createPlugin<{ messages: UIMessage[] }>(
|
|
|
76
77
|
showConfigurationControls={props.data.showConfigurationControls}
|
|
77
78
|
maxHeight={props.data.maxHeight}
|
|
78
79
|
allowAttachments={props.data.allowAttachments}
|
|
80
|
+
disabled={props.data.disabled}
|
|
79
81
|
config={props.data.config}
|
|
80
82
|
get_chat_history={props.functions.get_chat_history}
|
|
81
83
|
delete_chat_history={props.functions.delete_chat_history}
|
|
@@ -67,6 +67,7 @@ interface Props extends PluginFunctions {
|
|
|
67
67
|
showConfigurationControls: boolean;
|
|
68
68
|
maxHeight: number | undefined;
|
|
69
69
|
allowAttachments: boolean | string[];
|
|
70
|
+
disabled: boolean;
|
|
70
71
|
value: UIMessage[];
|
|
71
72
|
setValue: (messages: UIMessage[]) => void;
|
|
72
73
|
host: HTMLElement;
|
|
@@ -450,6 +451,9 @@ export const Chatbot: React.FC<Props> = (props) => {
|
|
|
450
451
|
<form
|
|
451
452
|
onSubmit={async (evt) => {
|
|
452
453
|
evt.preventDefault();
|
|
454
|
+
if (props.disabled) {
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
453
457
|
|
|
454
458
|
const fileParts = files
|
|
455
459
|
? await convertToFileUIPart(files)
|
|
@@ -462,7 +466,12 @@ export const Chatbot: React.FC<Props> = (props) => {
|
|
|
462
466
|
resetInput();
|
|
463
467
|
}}
|
|
464
468
|
ref={formRef}
|
|
465
|
-
|
|
469
|
+
// biome-ignore lint/a11y/useSemanticElements: inert is used to disable the entire form
|
|
470
|
+
inert={props.disabled || undefined}
|
|
471
|
+
className={cn(
|
|
472
|
+
"flex w-full border-t border-(--slate-6) px-2 py-1 items-center",
|
|
473
|
+
props.disabled && "opacity-50 cursor-not-allowed",
|
|
474
|
+
)}
|
|
466
475
|
>
|
|
467
476
|
{props.showConfigurationControls && (
|
|
468
477
|
<ConfigPopup config={config} onChange={setConfig} />
|
|
@@ -48,6 +48,7 @@ type TableData<T> = T[] | CsvURL;
|
|
|
48
48
|
interface Data {
|
|
49
49
|
label?: string | null;
|
|
50
50
|
columns: ColumnDataTypes;
|
|
51
|
+
dataframeName?: string;
|
|
51
52
|
pageSize: number;
|
|
52
53
|
showDownload: boolean;
|
|
53
54
|
lazy: boolean;
|
|
@@ -93,6 +94,7 @@ export const DataFramePlugin = createPlugin<S>("marimo-dataframe")
|
|
|
93
94
|
label: z.string().nullish(),
|
|
94
95
|
pageSize: z.number().default(5),
|
|
95
96
|
showDownload: z.boolean().default(true),
|
|
97
|
+
dataframeName: z.string().optional(),
|
|
96
98
|
columns: z
|
|
97
99
|
.array(z.tuple([z.string().or(z.number()), z.string(), z.string()]))
|
|
98
100
|
.transform((value) => {
|
|
@@ -176,6 +178,7 @@ const EMPTY: Transformations = {
|
|
|
176
178
|
export const DataFrameComponent = memo(
|
|
177
179
|
({
|
|
178
180
|
columns,
|
|
181
|
+
dataframeName,
|
|
179
182
|
pageSize,
|
|
180
183
|
showDownload,
|
|
181
184
|
lazy,
|
|
@@ -326,6 +329,7 @@ export const DataFrameComponent = memo(
|
|
|
326
329
|
fieldTypes={field_types}
|
|
327
330
|
rowHeaders={row_headers || Arrays.EMPTY}
|
|
328
331
|
showDownload={showDownload}
|
|
332
|
+
downloadFileName={dataframeName}
|
|
329
333
|
download_as={download_as}
|
|
330
334
|
enableSearch={false}
|
|
331
335
|
showFilters={false}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import type * as PlotlyTypes from "plotly.js";
|
|
4
|
+
// Import the pre-built dist bundle, not the source entry point.
|
|
5
|
+
// The source entry point requires Node.js polyfills (e.g. `buffer/`)
|
|
6
|
+
// that are unavailable in the browser/bundler environment.
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
8
|
+
// @ts-expect-error — no type declarations for dist path, we use PlotlyTypes above
|
|
9
|
+
import Plotly from "plotly.js/dist/plotly";
|
|
10
|
+
import { useEffect, useRef } from "react";
|
|
11
|
+
|
|
12
|
+
// Plotly attaches `on` and `removeListener` to the DOM element at runtime.
|
|
13
|
+
// The @types/plotly.js PlotlyHTMLElement type includes `on` and `removeAllListeners`
|
|
14
|
+
// but not the per-handler `removeListener`. We extend the type to include it.
|
|
15
|
+
interface PlotlyElement extends PlotlyTypes.PlotlyHTMLElement {
|
|
16
|
+
removeListener(event: string, handler: (...args: never[]) => void): void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface Figure {
|
|
20
|
+
data: PlotlyTypes.Data[];
|
|
21
|
+
layout: Partial<PlotlyTypes.Layout>;
|
|
22
|
+
frames: PlotlyTypes.Frame[] | null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface PlotProps {
|
|
26
|
+
data: PlotlyTypes.Data[];
|
|
27
|
+
layout: Partial<PlotlyTypes.Layout>;
|
|
28
|
+
frames?: PlotlyTypes.Frame[];
|
|
29
|
+
config?: Partial<PlotlyTypes.Config>;
|
|
30
|
+
className?: string;
|
|
31
|
+
style?: React.CSSProperties;
|
|
32
|
+
useResizeHandler?: boolean;
|
|
33
|
+
divId?: string;
|
|
34
|
+
onRelayout?: (event: PlotlyTypes.PlotRelayoutEvent) => void;
|
|
35
|
+
onRelayouting?: (event: PlotlyTypes.PlotRelayoutEvent) => void;
|
|
36
|
+
onSelected?: (event: PlotlyTypes.PlotSelectionEvent) => void;
|
|
37
|
+
onDeselect?: () => void;
|
|
38
|
+
onClick?: (event: PlotlyTypes.PlotMouseEvent) => void;
|
|
39
|
+
onSunburstClick?: (event: PlotlyTypes.PlotMouseEvent) => void;
|
|
40
|
+
onTreemapClick?: (event: PlotlyTypes.PlotMouseEvent) => void;
|
|
41
|
+
onError?: (err: Error) => void;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Plotly event name convention:
|
|
45
|
+
// - events are attached as `'plotly_' + name.toLowerCase()`
|
|
46
|
+
// - react props are `'on' + name`
|
|
47
|
+
const EVENT_NAMES = [
|
|
48
|
+
"Relayout",
|
|
49
|
+
"Relayouting",
|
|
50
|
+
"Selected",
|
|
51
|
+
"Deselect",
|
|
52
|
+
"Click",
|
|
53
|
+
"SunburstClick",
|
|
54
|
+
"TreemapClick",
|
|
55
|
+
] as const;
|
|
56
|
+
|
|
57
|
+
type EventName = (typeof EVENT_NAMES)[number];
|
|
58
|
+
|
|
59
|
+
function propName(event: EventName): keyof PlotProps {
|
|
60
|
+
return `on${event}` as keyof PlotProps;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function plotlyEventName(event: EventName): string {
|
|
64
|
+
return `plotly_${event.toLowerCase()}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export const Plot = (props: PlotProps) => {
|
|
68
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
69
|
+
|
|
70
|
+
const {
|
|
71
|
+
data,
|
|
72
|
+
layout,
|
|
73
|
+
config,
|
|
74
|
+
frames,
|
|
75
|
+
className,
|
|
76
|
+
style,
|
|
77
|
+
useResizeHandler,
|
|
78
|
+
divId,
|
|
79
|
+
onError,
|
|
80
|
+
} = props;
|
|
81
|
+
|
|
82
|
+
// Render / update the plot
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
const el = containerRef.current;
|
|
85
|
+
if (!el) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
Plotly.react(el, data, layout, config)
|
|
90
|
+
.then(() => {
|
|
91
|
+
if (frames && frames.length > 0) {
|
|
92
|
+
return Plotly.addFrames(el as unknown as PlotlyTypes.Root, frames);
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
.catch((error: Error) => {
|
|
96
|
+
onError?.(error);
|
|
97
|
+
});
|
|
98
|
+
}, [data, layout, config, frames, onError]);
|
|
99
|
+
|
|
100
|
+
// Sync event handlers
|
|
101
|
+
useEffect(
|
|
102
|
+
() => {
|
|
103
|
+
const el = containerRef.current;
|
|
104
|
+
if (!el) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const plotlyEl = el as unknown as PlotlyElement;
|
|
109
|
+
|
|
110
|
+
// eslint-disable-next-line @typescript-eslint/ban-types -- Plotly's event API uses generic function references
|
|
111
|
+
const attached: {
|
|
112
|
+
plotlyName: string;
|
|
113
|
+
handler: (...args: never[]) => void;
|
|
114
|
+
}[] = [];
|
|
115
|
+
|
|
116
|
+
for (const name of EVENT_NAMES) {
|
|
117
|
+
const handler = props[propName(name)];
|
|
118
|
+
if (typeof handler === "function") {
|
|
119
|
+
const plotlyName = plotlyEventName(name);
|
|
120
|
+
plotlyEl.on(plotlyName as never, handler as never);
|
|
121
|
+
attached.push({
|
|
122
|
+
plotlyName,
|
|
123
|
+
handler: handler as (...args: never[]) => void,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return () => {
|
|
129
|
+
for (const { plotlyName, handler } of attached) {
|
|
130
|
+
plotlyEl.removeListener(plotlyName, handler as never);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
// Re-sync whenever any event handler prop changes
|
|
134
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
135
|
+
},
|
|
136
|
+
EVENT_NAMES.map((name) => props[propName(name)]),
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
// Window resize handler
|
|
140
|
+
useEffect(() => {
|
|
141
|
+
if (!useResizeHandler) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const el = containerRef.current;
|
|
146
|
+
if (!el) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const handler = () => {
|
|
151
|
+
Plotly.Plots.resize(el as unknown as PlotlyTypes.Root);
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
window.addEventListener("resize", handler);
|
|
155
|
+
return () => {
|
|
156
|
+
window.removeEventListener("resize", handler);
|
|
157
|
+
};
|
|
158
|
+
}, [useResizeHandler]);
|
|
159
|
+
|
|
160
|
+
// Cleanup on unmount
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
const el = containerRef.current;
|
|
163
|
+
return () => {
|
|
164
|
+
if (el) {
|
|
165
|
+
Plotly.purge(el as unknown as PlotlyTypes.Root);
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
}, []);
|
|
169
|
+
|
|
170
|
+
return (
|
|
171
|
+
<div id={divId} className={className} style={style} ref={containerRef} />
|
|
172
|
+
);
|
|
173
|
+
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import type
|
|
3
|
+
import type * as Plotly from "plotly.js";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import type { IPlugin, IPluginProps, Setter } from "@/plugins/types";
|
|
6
6
|
import { Logger } from "@/utils/Logger";
|
|
7
|
+
import type { Figure } from "./Plot";
|
|
7
8
|
|
|
8
9
|
import "./plotly.css";
|
|
9
10
|
import "./mapbox.css";
|
|
@@ -70,13 +71,8 @@ interface PlotlyPluginProps extends Data {
|
|
|
70
71
|
host: HTMLElement;
|
|
71
72
|
}
|
|
72
73
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
import("react-plotly.js").then((module) => {
|
|
76
|
-
return module.default as unknown as {
|
|
77
|
-
default: React.ComponentType<PlotParams>;
|
|
78
|
-
};
|
|
79
|
-
}),
|
|
74
|
+
const LazyPlot = lazy(() =>
|
|
75
|
+
import("./Plot").then((mod) => ({ default: mod.Plot })),
|
|
80
76
|
);
|
|
81
77
|
|
|
82
78
|
const SUNBURST_DATA_KEYS: (keyof Plotly.SunburstPlotDatum)[] = [
|
|
@@ -176,7 +172,6 @@ export const PlotlyComponent = memo(
|
|
|
176
172
|
};
|
|
177
173
|
});
|
|
178
174
|
})}
|
|
179
|
-
// @ts-expect-error We patched this prop here so it doesn't exist in the types
|
|
180
175
|
onTreemapClick={useEvent((evt: Readonly<Plotly.PlotMouseEvent>) => {
|
|
181
176
|
if (!evt) {
|
|
182
177
|
return;
|
|
@@ -198,6 +193,24 @@ export const PlotlyComponent = memo(
|
|
|
198
193
|
}));
|
|
199
194
|
})}
|
|
200
195
|
config={plotlyConfig}
|
|
196
|
+
onClick={useEvent((evt: Readonly<Plotly.PlotMouseEvent>) => {
|
|
197
|
+
if (!evt) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
// Only handle clicks for chart types where box/lasso selection
|
|
201
|
+
// (onSelected) doesn't work, such as heatmaps.
|
|
202
|
+
const isHeatmap = evt.points.some(
|
|
203
|
+
(point) => point.data?.type === "heatmap",
|
|
204
|
+
);
|
|
205
|
+
if (!isHeatmap) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
setValue((prev) => ({
|
|
209
|
+
...prev,
|
|
210
|
+
points: extractPoints(evt.points),
|
|
211
|
+
indices: evt.points.map((point) => point.pointIndex),
|
|
212
|
+
}));
|
|
213
|
+
})}
|
|
201
214
|
onSelected={useEvent((evt: Readonly<Plotly.PlotSelectionEvent>) => {
|
|
202
215
|
if (!evt) {
|
|
203
216
|
return;
|
|
@@ -215,7 +228,7 @@ export const PlotlyComponent = memo(
|
|
|
215
228
|
className="w-full"
|
|
216
229
|
useResizeHandler={true}
|
|
217
230
|
frames={figure.frames ?? undefined}
|
|
218
|
-
onError={useEvent((err) => {
|
|
231
|
+
onError={useEvent((err: Error) => {
|
|
219
232
|
Logger.error("PlotlyPlugin: ", err);
|
|
220
233
|
})}
|
|
221
234
|
/>
|
|
@@ -229,6 +242,17 @@ PlotlyComponent.displayName = "PlotlyComponent";
|
|
|
229
242
|
* instead of the ones that Plotly uses internally,
|
|
230
243
|
* by using the hovertemplate.
|
|
231
244
|
*/
|
|
245
|
+
const STANDARD_POINT_KEYS: string[] = [
|
|
246
|
+
"x",
|
|
247
|
+
"y",
|
|
248
|
+
"z",
|
|
249
|
+
"lat",
|
|
250
|
+
"lon",
|
|
251
|
+
"curveNumber",
|
|
252
|
+
"pointNumber",
|
|
253
|
+
"pointIndex",
|
|
254
|
+
];
|
|
255
|
+
|
|
232
256
|
function extractPoints(
|
|
233
257
|
points: Plotly.PlotDatum[],
|
|
234
258
|
): Record<AxisName, AxisDatum>[] {
|
|
@@ -243,6 +267,13 @@ function extractPoints(
|
|
|
243
267
|
const hovertemplate = Array.isArray(point.data.hovertemplate)
|
|
244
268
|
? point.data.hovertemplate[0]
|
|
245
269
|
: point.data.hovertemplate;
|
|
270
|
+
|
|
271
|
+
// For chart types with standard point keys (e.g. heatmaps),
|
|
272
|
+
// or when there's no hovertemplate, pick keys directly from the point.
|
|
273
|
+
if (!hovertemplate || point.data?.type === "heatmap") {
|
|
274
|
+
return pick(point, STANDARD_POINT_KEYS);
|
|
275
|
+
}
|
|
276
|
+
|
|
246
277
|
// Update or create a parser
|
|
247
278
|
parser = parser
|
|
248
279
|
? parser.update(hovertemplate)
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import type
|
|
3
|
+
import type * as Plotly from "plotly.js";
|
|
4
4
|
import { describe, expect, it } from "vitest";
|
|
5
|
+
import type { Figure } from "../Plot";
|
|
5
6
|
import {
|
|
6
7
|
computeLayoutOnFigureChange,
|
|
7
8
|
computeLayoutUpdate,
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import { usePrevious } from "@uidotdev/usehooks";
|
|
4
4
|
import { isEqual, pick } from "lodash-es";
|
|
5
|
+
import type * as Plotly from "plotly.js";
|
|
5
6
|
import { useEffect, useState } from "react";
|
|
6
|
-
import type { Figure } from "react-plotly.js";
|
|
7
7
|
import { Objects } from "@/utils/objects";
|
|
8
|
+
import type { Figure } from "./Plot";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Keys that are preserved across figure updates when set by user interaction.
|
|
@@ -10,8 +10,10 @@ export const ThemeProvider: React.FC<PropsWithChildren> = memo(
|
|
|
10
10
|
const { theme } = useTheme();
|
|
11
11
|
useLayoutEffect(() => {
|
|
12
12
|
document.body.classList.add(theme, `${theme}-theme`);
|
|
13
|
+
document.body.dataset.theme = theme;
|
|
13
14
|
return () => {
|
|
14
15
|
document.body.classList.remove(theme, `${theme}-theme`);
|
|
16
|
+
delete document.body.dataset.theme;
|
|
15
17
|
};
|
|
16
18
|
}, [theme]);
|
|
17
19
|
|
package/dist/apl-BuwKwesW.js
DELETED
package/dist/asn1-DWEA66J4.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import "./purify.es-Brw-U87Q.js";
|
|
2
|
-
import "./chunk-S3R3BYOJ-CBkH6JZZ.js";
|
|
3
|
-
import { r as __name } from "./src-szye8OCw.js";
|
|
4
|
-
import "./chunk-ABZYJK2D-BXTC53mt.js";
|
|
5
|
-
import "./chunk-HN2XXSSU-CqPwpolw.js";
|
|
6
|
-
import "./chunk-CVBHYZKI-Dhc_e3rA.js";
|
|
7
|
-
import "./chunk-ATLVNIR6-BJDjUR_c.js";
|
|
8
|
-
import "./dist-BYznkC5E.js";
|
|
9
|
-
import "./chunk-JA3XYJ7Z-BGnAIbOP.js";
|
|
10
|
-
import "./chunk-JZLCHNYA-CIRgweVQ.js";
|
|
11
|
-
import "./chunk-QXUST7PY-C7750n_u.js";
|
|
12
|
-
import "./chunk-N4CR4FBY-DKSvXAIS.js";
|
|
13
|
-
import "./chunk-FMBD7UC4-geNUIndh.js";
|
|
14
|
-
import "./chunk-55IACEB6-C3BASkh4.js";
|
|
15
|
-
import "./chunk-QN33PNHL-B6zC8BTi.js";
|
|
16
|
-
import { i as styles_default, n as classDiagram_default, r as classRenderer_v3_unified_default, t as ClassDB } from "./chunk-B4BG7PRW-DzmUUpfH.js";
|
|
17
|
-
var diagram = {
|
|
18
|
-
parser: classDiagram_default,
|
|
19
|
-
get db() {
|
|
20
|
-
return new ClassDB();
|
|
21
|
-
},
|
|
22
|
-
renderer: classRenderer_v3_unified_default,
|
|
23
|
-
styles: styles_default,
|
|
24
|
-
init: /* @__PURE__ */ __name((e) => {
|
|
25
|
-
e.class || (e.class = {}), e.class.arrowMarkerAbsolute = e.arrowMarkerAbsolute;
|
|
26
|
-
}, "init")
|
|
27
|
-
};
|
|
28
|
-
export {
|
|
29
|
-
diagram
|
|
30
|
-
};
|