@marimo-team/islands 0.16.5 → 0.17.1
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/{fullscreen-D1yTiBlu.js → Combination-De9yoNY5.js} +855 -795
- package/dist/{ConnectedDataExplorerComponent-D96i9G-X.js → ConnectedDataExplorerComponent-DuvpJOKp.js} +102 -123
- package/dist/{ImageComparisonComponent-D4Tv9QzJ.js → ImageComparisonComponent--etUl2pp.js} +2 -2
- package/dist/{_baseIsEqual-oN7pRNcM.js → _baseIsEqual-BFlyFUxC.js} +20 -20
- package/dist/{_basePickBy-CYvzhRjy.js → _basePickBy-gCCvtjgp.js} +3 -3
- package/dist/{_baseProperty-DGUdIBuu.js → _baseProperty-BuqBC0Ie.js} +5 -5
- package/dist/{_baseUniq-B5gfSl8S.js → _baseUniq-CKN9mEDq.js} +5 -5
- package/dist/any-language-editor-Du2Q_6IK.js +156 -0
- package/dist/apl-CUm2DGqh.js +4 -0
- package/dist/{arc-B1iVbHTB.js → arc-C_O2hc-b.js} +2 -2
- package/dist/architecture-O4VJ6CD3-PFw3eFBY.js +21 -0
- package/dist/{architectureDiagram-W76B3OCA-DkEhipkW.js → architectureDiagram-W76B3OCA-CrK99pJi.js} +41 -40
- package/dist/asciiarmor-lqJ78U01.js +4 -0
- package/dist/asn1-CjwpSTlW.js +4 -0
- package/dist/assets/__vite-browser-external-DHoMWs4M.js +1 -0
- package/dist/assets/worker-B6tH8gPO.js +54 -0
- package/dist/{blockDiagram-QIGZ2CNN-DZOqLMYa.js → blockDiagram-QIGZ2CNN-BJOEyO6w.js} +101 -111
- package/dist/brainfuck-ClvDI1dq.js +4 -0
- package/dist/{button-CEcjneWG.js → button-ADXOb_gX.js} +37 -40
- package/dist/{c4Diagram-FPNF74CW-DVaR7c9q.js → c4Diagram-FPNF74CW-7Pz_X9wF.js} +31 -54
- package/dist/{channel-Uh0KpgGW.js → channel-X-wRUxX6.js} +1 -1
- package/dist/{check-BK9zDfQk.js → check-COlaG7Ss.js} +1 -1
- package/dist/{chunk-3AY6CYHV-Dk2R2-S1.js → chunk-3AY6CYHV-BQH2fFpA.js} +37 -37
- package/dist/{chunk-4BX2VUAB-CqO6zUIz.js → chunk-4BX2VUAB-D-QtDCKM.js} +1 -1
- package/dist/{chunk-4KMFLZZN-CloTfTwP.js → chunk-4KMFLZZN-BirZvvJS.js} +220 -329
- package/dist/{chunk-55IACEB6-I0rmqTua.js → chunk-55IACEB6-DjtPYZKs.js} +1 -1
- package/dist/{chunk-6OXUPJBA-BuROSTmo.js → chunk-6OXUPJBA-CTnnqlzw.js} +7 -7
- package/dist/{chunk-7GE3RBXV-B1-tsIPP.js → chunk-7GE3RBXV-CT47hCrL.js} +1 -1
- package/dist/{chunk-ABZYJK2D-CLlso8tj.js → chunk-ABZYJK2D-B6ZsU6SR.js} +484 -1043
- package/dist/{chunk-BN7GFLIU-Db2-FjLn.js → chunk-BN7GFLIU-DYWEsrG4.js} +1 -1
- package/dist/{chunk-CVBHYZKI-BONeiloK.js → chunk-CVBHYZKI-BuzDGXz0.js} +3 -3
- package/dist/{chunk-CXMOBAN2-U9GJSP1d.js → chunk-CXMOBAN2-Bas2S5w1.js} +46 -54
- package/dist/chunk-EXTU4WIE-DXwNSukz.js +10 -0
- package/dist/{chunk-FMBD7UC4-DyV3BR_I.js → chunk-FMBD7UC4-CYKEpuPr.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-C9A1076P.js → chunk-JA3XYJ7Z-DcxfkcDC.js} +21 -25
- package/dist/{chunk-JEIROHC2-BGnFkSVq.js → chunk-JEIROHC2-C01ZIcIG.js} +1 -1
- package/dist/{chunk-K7UQS3LO-033LOsjK.js → chunk-K7UQS3LO-CmbT97MV.js} +7 -7
- package/dist/{chunk-KMC2YHZD-DT4Sq4Ld.js → chunk-KMC2YHZD-D64m-1E1.js} +1 -1
- package/dist/{chunk-QN33PNHL-gs44MZla.js → chunk-QN33PNHL-DjB0j8Dr.js} +2 -2
- package/dist/{chunk-QYVHNE3D-B8BO1AnT.js → chunk-QYVHNE3D-VA4W4oxG.js} +3 -4
- package/dist/{chunk-QZHKN3VN-CeN_GkU6.js → chunk-QZHKN3VN-KT0fl3Em.js} +1 -1
- package/dist/chunk-S3R3BYOJ-C5zmcMvn.js +380 -0
- package/dist/{chunk-T44TD3VJ-BwzD6YE0.js → chunk-T44TD3VJ-BMOgu-Hk.js} +1 -1
- package/dist/{chunk-TVAH2DTR-Bi6jpQJQ.js → chunk-TVAH2DTR-eKm8SKnH.js} +7 -8
- package/dist/{chunk-TZMSLE5B-D8klz2H_.js → chunk-TZMSLE5B-CQxFRiI2.js} +5 -6
- package/dist/{chunk-WFRQ32O7-CzSwSlN0.js → chunk-WFRQ32O7-Dg51o277.js} +1 -1
- package/dist/{chunk-WFWHJNB7-DN_cavM6.js → chunk-WFWHJNB7-DVLO98ge.js} +1 -1
- package/dist/{chunk-XRWGC2XP-Bb5eGNM2.js → chunk-XRWGC2XP-UNFKdWQh.js} +1 -1
- package/dist/{chunk-ZPAFE4SF-S5UYNb0V.js → chunk-ZPAFE4SF-DbCSwfLK.js} +22 -22
- package/dist/classDiagram-KNZD7YFC-HUFFxNdk.js +40 -0
- package/dist/classDiagram-v2-RKCZMP56-Dw7Acmuf.js +40 -0
- package/dist/{click-outside-container-DE4e7p1p.js → click-outside-container-2BH589Bq.js} +9 -14
- package/dist/{clike-Cg_DBrJ0.js → clike-Bc2PZzZQ.js} +1 -1
- package/dist/{clike-CxAz4p9E.js → clike-CytFO-kN.js} +1 -1
- package/dist/clojure-8GefCgPe.js +4 -0
- package/dist/{clone-Dk4FkKH0.js → clone-CCgVUJ6x.js} +1 -1
- package/dist/cmake-yAhT9H0F.js +4 -0
- package/dist/cobol-BmltueOY.js +4 -0
- package/dist/coffeescript-C7KEQBcH.js +4 -0
- package/dist/commonlisp-CNbiJRU-.js +4 -0
- package/dist/{constants-Cjd_3kwd.js → constants-BaCMVd12.js} +3 -3
- package/dist/{copy-C5RFg7ok.js → copy-GNcK40wy.js} +6 -2
- package/dist/{cose-bilkent-S5V4N54A-B3iOTGu5.js → cose-bilkent-S5V4N54A-BnvuJG6Y.js} +20 -20
- package/dist/crystal-OdjZZ8bc.js +4 -0
- package/dist/css-DhTxMmL_.js +5 -0
- package/dist/cypher-CgN8E3YI.js +4 -0
- package/dist/{cytoscape.esm-DTDV0Nbj.js → cytoscape.esm-BFEMljQI.js} +586 -661
- package/dist/d-g41sJcBC.js +4 -0
- package/dist/{dagre-5GWH7T2D-KM4Z11yT.js → dagre-5GWH7T2D-rn7tZYaQ.js} +41 -45
- package/dist/{dagre-B0u1urxE.js → dagre-Bghq6VKO.js} +58 -77
- package/dist/data-grid-overlay-editor-B4_Caieu.js +133 -0
- package/dist/{diagram-N5W7TBWH-CtO7az4G.js → diagram-N5W7TBWH-lbF94o-g.js} +46 -61
- package/dist/diagram-QEK2KX5R-CKBhSzsO.js +246 -0
- package/dist/{diagram-S2PKOQOG-CiXElLNQ.js → diagram-S2PKOQOG-161_1f53.js} +35 -34
- package/dist/diff-ViRYYhhg.js +4 -0
- package/dist/{dist-C3WYsf4K.js → dist-28HYzERB.js} +4 -10
- package/dist/{dist-CChOkSUg.js → dist-4dtbqf8A.js} +3 -3
- package/dist/{dist-CUnh_3Ii.js → dist-71jYYbWP.js} +2 -2
- package/dist/{dist-elblfNXO.js → dist-B8Pbw5ln.js} +2 -2
- package/dist/{dist-DPF5TTUg.js → dist-BAqp4Vtl.js} +126 -115
- package/dist/{dist-BEvIw5Nh.js → dist-BBhmkni2.js} +1 -1
- package/dist/{dist-C7ASiFxI.js → dist-BNRdMfJH.js} +273 -263
- package/dist/dist-BSyYM1Gi.js +15 -0
- package/dist/{dist-DzOpMdwb.js → dist-BYHiiJB-.js} +4 -4
- package/dist/{dist-DKFaZRVk.js → dist-B_wjJqqS.js} +2 -2
- package/dist/{dist-CutXTm8t.js → dist-BaPjLM6s.js} +1 -1
- package/dist/dist-BfJO8Bm9.js +12 -0
- package/dist/{dist-CGIZPq3J.js → dist-BqdQPWpQ.js} +2 -2
- package/dist/{dist--I6Htnlv.js → dist-C2IEc8og.js} +5 -5
- package/dist/{dist-CLvpViod.js → dist-C9-uHBqC.js} +2 -3
- package/dist/{dist-DBhzmFyH.js → dist-CJb8EiFO.js} +3 -3
- package/dist/dist-CLuF3AtO.js +6 -0
- package/dist/{dist-Dzk1C8l5.js → dist-CNAkUyxv.js} +11 -14
- package/dist/{dist-DNnYAdRE.js → dist-CNvMOZu9.js} +2 -2
- package/dist/{dist-CxD5E6Sh.js → dist-CPNnKuPh.js} +24 -22
- package/dist/{dist-C3QUag__.js → dist-CTIyD_KU.js} +3 -3
- package/dist/dist-CU04U4NL.js +10 -0
- package/dist/{dist-CZfRM7pE.js → dist-CWh5ZwcC.js} +2 -2
- package/dist/{dist-DW9er3Zq.js → dist-CWqB4bg8.js} +44 -23
- package/dist/{dist-CbRkrKrP.js → dist-CtOeHDJp.js} +5 -5
- package/dist/{dist-DL_ci7Yc.js → dist-Cw0F6l-7.js} +1 -1
- package/dist/{dist-BZBitvuL.js → dist-CwZcC4om.js} +1 -1
- package/dist/dist-DNUT6b47.js +6 -0
- package/dist/{dist-BBlFk9ki.js → dist-Da046MhT.js} +1 -1
- package/dist/{dist-Cib4sGDA.js → dist-DaTVdKJa.js} +2 -2
- package/dist/dist-DbAb2sY7.js +6 -0
- package/dist/dist-DiDFQ2Rk.js +6 -0
- package/dist/{dist-BQmQQqFH.js → dist-DlK420ke.js} +1 -1
- package/dist/{dist-o7fhJC7U.js → dist-Drf3cyIW.js} +3 -3
- package/dist/{dist-CdE2C2In.js → dist-DxESp2-T.js} +15 -20
- package/dist/{dist-JCAky9ND.js → dist-DzJem5xc.js} +17 -22
- package/dist/{dist-C5zMs_n5.js → dist-O0zVziwn.js} +3 -3
- package/dist/dist-SNAyAOJ-.js +6 -0
- package/dist/{dist-Bar1QnNM.js → dist-_4cudra1.js} +3 -3
- package/dist/dist-cbW5xJNV.js +6 -0
- package/dist/dist-h8eGLSbK.js +10 -0
- package/dist/{dist-BqgkUnEN.js → dist-xLN9qCAp.js} +3 -3
- package/dist/{dockerfile-Dum_1b-5.js → dockerfile-Cmlcqk35.js} +1 -1
- package/dist/dtd-RplB6hDg.js +4 -0
- package/dist/dylan-BX8KJufP.js +4 -0
- package/dist/ecl-CWtLaNMH.js +4 -0
- package/dist/eiffel-C-mlZPMn.js +4 -0
- package/dist/elm-CWp06vcb.js +4 -0
- package/dist/{erDiagram-AWTI2OKA-ZTIl9iQO.js → erDiagram-AWTI2OKA-BU7Qig7n.js} +32 -31
- package/dist/erlang-pfp22AZM.js +4 -0
- package/dist/error-banner-BAWlXn49.js +1012 -0
- package/dist/{esm-d0g2RsOH.js → esm-AtKNNGYO.js} +7 -9
- package/dist/esm-B2pocBPL.js +26 -0
- package/dist/{esm-DxFkg7a6.js → esm-Oo8OvZ6m.js} +1529 -1493
- package/dist/{esm-1_Mp6VD2.js → esm-YVnxJqkD.js} +340 -411
- package/dist/{factor-CdgiDGiu.js → factor-BZnBK3CG.js} +1 -1
- package/dist/factor-CEn53jua.js +5 -0
- package/dist/{flowDiagram-PVAE7QVJ-DsbofOzu.js → flowDiagram-PVAE7QVJ-JKJebWeY.js} +41 -40
- package/dist/{formats-ChrNdVdJ.js → formats-DOEuF6TR.js} +15 -19
- package/dist/forth-CL8vu_y8.js +4 -0
- package/dist/fortran-DsmXkYtE.js +4 -0
- package/dist/{ganttDiagram-OWAHRB6G-FnCH1Yj3.js → ganttDiagram-OWAHRB6G-BvWRfg05.js} +17 -16
- package/dist/gas-mYt9Rtlx.js +4 -0
- package/dist/gherkin-DHNCKBNj.js +4 -0
- package/dist/gitGraph-ZV4HHKMB-Cpd6k0O8.js +21 -0
- package/dist/{gitGraphDiagram-NY62KEGX-B0wvMNqU.js → gitGraphDiagram-NY62KEGX-VEJJBf5L.js} +38 -40
- package/dist/{glide-data-editor-D_kEsT07.js → glide-data-editor-Bne10icG.js} +1703 -1771
- package/dist/{graphlib-BGmr7CYF.js → graphlib-DRS8CrjA.js} +5 -5
- package/dist/groovy-DzRtOS5a.js +4 -0
- package/dist/haskell-Bl9iT_Mp.js +4 -0
- package/dist/haxe-DqA0ED6k.js +5 -0
- package/dist/{hotkeys-yFrUwyJK.js → hotkeys-DVxFjl2s.js} +16 -7
- package/dist/idl-WU2hil4i.js +4 -0
- package/dist/info-63CPKGFF-CG-xzUJo.js +21 -0
- package/dist/infoDiagram-STP46IZ2-zoRBGoup.js +45 -0
- package/dist/invariant-D3JoRb4I.js +6 -0
- package/dist/{isArrayLikeObject-DiDsNamC.js → isArrayLikeObject-DU5MCuQM.js} +3 -5
- package/dist/{isEmpty-BBG-u1GM.js → isEmpty-Do_v2sls.js} +2 -2
- package/dist/{isSymbol-BxF-_8BA.js → isSymbol-CtkA8Y0a.js} +1 -1
- package/dist/{javascript-Dfq1qI35.js → javascript-DGukg1sB.js} +2 -2
- package/dist/javascript-QY2BGJeV.js +5 -0
- package/dist/jinja2-Czleq7Sk.js +4 -0
- package/dist/{journeyDiagram-BIP6EPQ6-B3PotfAW.js → journeyDiagram-BIP6EPQ6-CsgEQgxh.js} +28 -28
- package/dist/julia-Dru3Qi0y.js +4 -0
- package/dist/{kanban-definition-6OIFK2YF-BTrQZ3LN.js → kanban-definition-6OIFK2YF-Bi8Ete2P.js} +42 -41
- package/dist/{katex-dN__NFdn.js → katex-C-g3rKKt.js} +1 -1
- package/dist/{katex-BE4xflfm.js → katex-DgfMWJY9.js} +149 -173
- package/dist/{label-BinTsX-u.js → label-BiVIU_wb.js} +252 -253
- package/dist/{line-C6-zz71o.js → line-B7-GoF1m.js} +3 -3
- package/dist/{linear-DyTdUIqX.js → linear-DeGGALuc.js} +4 -4
- package/dist/livescript-Dxqi_HLT.js +4 -0
- package/dist/{loader-Dijti3y4.js → loader-BBqwtZWj.js} +19 -26
- package/dist/lua-ByH1cUQZ.js +4 -0
- package/dist/main.js +17025 -17039
- package/dist/{marked.esm-3RjvXPoO.js → marked.esm-DkVwEwtO.js} +5 -5
- package/dist/mathematica-CWJIFuES.js +4 -0
- package/dist/mbox-qhPIGaUI.js +4 -0
- package/dist/{memoize-Dq87l1O_.js → memoize-D7eDkf3R.js} +1 -1
- package/dist/{merge-BPDCIm8P.js → merge-C_6cGM6o.js} +1 -1
- package/dist/{mermaid-MWiyXDcI.js → mermaid-BmtvsZ2m.js} +323 -339
- package/dist/{mermaid-parser.core-CSFx6MQ7.js → mermaid-parser.core-geyG_6o0.js} +8 -8
- package/dist/{mhchem-DZ68WS0G.js → mhchem-OhAaJ0fA.js} +1 -1
- package/dist/{min-BzhKOmZo.js → min-Dwa_NbP6.js} +7 -7
- package/dist/{mindmap-definition-Q6HEUPPD-9hhnrO1k.js → mindmap-definition-Q6HEUPPD-B-wmX1oG.js} +29 -28
- package/dist/mirc-yYcXhXBY.js +4 -0
- package/dist/mllike-BfT_Nl9x.js +6 -0
- package/dist/modelica-lVDtz1Rm.js +4 -0
- package/dist/mscgen-DvwdD1QJ.js +6 -0
- package/dist/mumps-BiY3GwKd.js +4 -0
- package/dist/{node-sql-parser-13oju30e.js → node-sql-parser-CoPWN4hn.js} +14343 -14351
- package/dist/{now-DVBcRCoE.js → now-DumxsrcX.js} +1 -1
- package/dist/{nsis-BW6_XagK.js → nsis-D4bLR_Y1.js} +1 -1
- package/dist/nsis-Dk18Sq_4.js +5 -0
- package/dist/ntriples-Cj-8VqKF.js +4 -0
- package/dist/{number-overlay-editor-D1YdiOrm.js → number-overlay-editor-D6r-48ka.js} +18 -24
- package/dist/octave-BgFAaYjU.js +4 -0
- package/dist/once-3OSMKEsL.js +74 -0
- package/dist/{ordinal-BXk5xAj2.js → ordinal-DpEbSVPc.js} +1 -1
- package/dist/oz-IsEG1I1m.js +4 -0
- package/dist/packet-HUATNLJX-Cafuo3IG.js +21 -0
- package/dist/pascal-BVf7FtIE.js +4 -0
- package/dist/perl-BM0-y4mZ.js +4 -0
- package/dist/pie-WTHONI2E-BE0pHBwB.js +21 -0
- package/dist/{pieDiagram-ADFJNKIX-CSBC0ZgF.js → pieDiagram-ADFJNKIX-C3GvPNUL.js} +40 -39
- package/dist/pig-CLBjzQmc.js +4 -0
- package/dist/powershell-B_qvE33J.js +4 -0
- package/dist/powershell-Dr7WZMDU.js +236 -0
- package/dist/{precisionRound-DbP73hkf.js → precisionRound-7YYJq2rW.js} +1 -1
- package/dist/properties-CUTpsH2y.js +4 -0
- package/dist/protobuf-DqCP8a-0.js +4 -0
- package/dist/pug-BvexKkw4.js +5 -0
- package/dist/{pug-Bmups_z0.js → pug-Dv3gE36O.js} +1 -1
- package/dist/puppet-CoIi0R3f.js +4 -0
- package/dist/purify.es-CrfFzTyi.js +536 -0
- package/dist/python-C-11-YMh.js +5 -0
- package/dist/{q-BzWcnVri.js → q-BzRpKgfd.js} +3 -2
- package/dist/q-CCVgEip7.js +4 -0
- package/dist/{quadrantDiagram-LMRXKWRM-h7nHf8xG.js → quadrantDiagram-LMRXKWRM-DPXwGNVa.js} +11 -10
- package/dist/r-CIdR0Sfs.js +4 -0
- package/dist/radar-NJJJXTRR-0adgjw0u.js +21 -0
- package/dist/{range-CgK0-PEw.js → range-CIbLpsrs.js} +3 -3
- package/dist/{react-plotly-BZakcxdv.js → react-plotly-DYyvxcRD.js} +4365 -4706
- package/dist/{requirementDiagram-4UW4RH46-BGEurQYq.js → requirementDiagram-4UW4RH46-Cs3Hqnm0.js} +24 -23
- package/dist/rpm-Dwvm039g.js +5 -0
- package/dist/ruby-DpTnO5gb.js +4 -0
- package/dist/{sankeyDiagram-GR3RE2ED-CxeJ_jfl.js → sankeyDiagram-GR3RE2ED-Be1d_Xf7.js} +7 -6
- package/dist/sas-CK9boxgv.js +4 -0
- package/dist/scheme-Y1aYL-Qq.js +4 -0
- package/dist/{sequenceDiagram-C3RYC4MD-CbFxwyr_.js → sequenceDiagram-C3RYC4MD-lbtovKTa.js} +24 -33
- package/dist/shell-D3eXGsHd.js +4 -0
- package/dist/sieve-BdwSFdWJ.js +4 -0
- package/dist/{simple-mode-Cgyya8F-.js → simple-mode-BMmwP_vI.js} +1 -1
- package/dist/{slides-component-BEyG25AH.js → slides-component-BoeQU7-s.js} +1012 -1033
- package/dist/smalltalk-BTYJquCm.js +4 -0
- package/dist/sparql-CYF0g4Cc.js +4 -0
- package/dist/{src-BNNJRxz3.js → src-BTqT1mA1.js} +6 -6
- package/dist/{stateDiagram-KXAO66HF-A61bMf29.js → stateDiagram-KXAO66HF-BmbR-Rol.js} +48 -49
- package/dist/stateDiagram-v2-UMBNRL4Z-DdJ7qVWc.js +39 -0
- package/dist/{step-IHYrujTc.js → step-2RJrMSSG.js} +1 -1
- package/dist/stex-CyWhoWHt.js +5 -0
- package/dist/style.css +1 -1
- package/dist/stylus-BBiKaI2h.js +4 -0
- package/dist/swift-COb15qFR.js +4 -0
- package/dist/tcl-Jik1LXu9.js +4 -0
- package/dist/textile-BFHPD3wr.js +4 -0
- package/dist/{time-D3tzCqJ6.js → time-BB30r1tK.js} +4 -4
- package/dist/{timeline-definition-XQNQX7LJ-BwdsB7CR.js → timeline-definition-XQNQX7LJ-1mv5caPW.js} +17 -17
- package/dist/{timer-D3Zlu9ow.js → timer-CcUhugb0.js} +2 -2
- package/dist/{toNumber-efKT08hh.js → toNumber-D3Ystr3y.js} +2 -2
- package/dist/{toString-BvCd3yJc.js → toString-CbuxCRDG.js} +2 -2
- package/dist/{toml-CIUkU1CP.js → toml-BqNUJWRI.js} +6 -2
- package/dist/toml-Brp9fBXs.js +4 -0
- package/dist/treemap-75Q7IDZK-CyBT8_Wh.js +21 -0
- package/dist/troff-CcZRW4vg.js +4 -0
- package/dist/ttcn-Bz_6ifRd.js +4 -0
- package/dist/ttcn-cfg-v-yi2rKc.js +4 -0
- package/dist/turtle-CDOsZYhB.js +4 -0
- package/dist/{types-1X1uZB4y.js → types-BPohCsA7.js} +198 -278
- package/dist/{useAsyncData-C4IqQK0g.js → useAsyncData-DHBqeb9a.js} +3 -2
- package/dist/{useDateFormatter-BCsBqetx.js → useDateFormatter-BkbjKw83.js} +9 -9
- package/dist/useIframeCapabilities-BEvvwlwt.js +46 -0
- package/dist/{useTheme-C2pgJzDH.js → useTheme-CnMbo-iq.js} +32 -29
- package/dist/vb-CL7fRwRw.js +4 -0
- package/dist/vbscript-CR2xfxpw.js +4 -0
- package/dist/{vega-component-Cv4J8CHz.js → vega-component-BfFcXZxw.js} +40 -39
- package/dist/{vega-loader.browser.module-Bi3ttvdj.js → vega-loader.browser.module-CFMtdrNw.js} +4 -5
- package/dist/velocity-CfuZoxPt.js +4 -0
- package/dist/verilog-CySTkzw_.js +4 -0
- package/dist/vhdl-Dvcd8KHW.js +4 -0
- package/dist/webidl-tbJt7sKk.js +4 -0
- package/dist/xquery-DJQVztyc.js +4 -0
- package/dist/{xychartDiagram-6GGTOJPD-BJRRi5HC.js → xychartDiagram-6GGTOJPD-njc-naaw.js} +24 -24
- package/dist/yacas-BbgBReEH.js +4 -0
- package/dist/z80-DPyb8VGz.js +4 -0
- package/dist/{zod-UPQf9SGn.js → zod-mAEs2ITo.js} +71 -81
- package/package.json +21 -17
- package/src/__mocks__/requests.ts +2 -0
- package/src/components/app-config/ai-config.tsx +1 -3
- package/src/components/app-config/common.tsx +14 -0
- package/src/components/app-config/data-form.tsx +282 -0
- package/src/components/app-config/user-config-form.tsx +36 -219
- package/src/components/chat/acp/__tests__/state.test.ts +75 -2
- package/src/components/chat/acp/agent-panel.tsx +143 -89
- package/src/components/chat/acp/blocks.tsx +77 -34
- package/src/components/chat/acp/state.ts +5 -1
- package/src/components/chat/acp/thread.tsx +12 -1
- package/src/components/chat/chat-panel.tsx +38 -5
- package/src/components/chat/chat-utils.ts +16 -5
- package/src/components/chat/markdown-renderer.css +1 -0
- package/src/components/chat/tool-call-accordion.tsx +7 -1
- package/src/components/data-table/__tests__/header-items.test.tsx +117 -0
- package/src/components/data-table/charts/__tests__/storage.test.ts +12 -6
- package/src/components/data-table/charts/charts.tsx +8 -2
- package/src/components/data-table/charts/storage.ts +1 -1
- package/src/components/data-table/column-header.tsx +4 -2
- package/src/components/data-table/column-wrapping/feature.ts +2 -0
- package/src/components/data-table/columns.tsx +12 -3
- package/src/components/data-table/data-table.tsx +7 -2
- package/src/components/data-table/header-items.tsx +63 -10
- package/src/components/data-table/renderers.tsx +3 -2
- package/src/components/dependency-graph/custom-node.tsx +11 -11
- package/src/components/dependency-graph/elements.ts +9 -4
- package/src/components/dependency-graph/panels.tsx +6 -4
- package/src/components/editor/Output.tsx +34 -25
- package/src/components/editor/actions/useCellActionButton.tsx +20 -4
- package/src/components/editor/ai/add-cell-with-ai.tsx +17 -3
- package/src/components/editor/ai/ai-completion-editor.tsx +203 -26
- package/src/components/editor/ai/completion-handlers.tsx +126 -23
- package/src/components/editor/cell/StagedAICell.tsx +81 -12
- package/src/components/editor/cell/code/cell-editor.tsx +6 -2
- package/src/components/editor/cell/useRunCells.ts +62 -30
- package/src/components/editor/chrome/panels/cache-panel.tsx +216 -0
- package/src/components/editor/chrome/panels/empty-state.tsx +3 -1
- package/src/components/editor/chrome/panels/packages-panel.tsx +1 -1
- package/src/components/editor/chrome/state.ts +1 -1
- package/src/components/editor/chrome/types.ts +66 -22
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +4 -0
- package/src/components/editor/chrome/wrapper/minimap.tsx +2 -0
- package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +108 -0
- package/src/components/editor/chrome/wrapper/sidebar.tsx +1 -1
- package/src/components/editor/code/readonly-diff.tsx +49 -0
- package/src/components/editor/columns/storage.ts +1 -1
- package/src/components/editor/errors/auto-fix.tsx +138 -32
- package/src/components/editor/errors/fix-mode.ts +20 -0
- package/src/components/editor/inputs/Inputs.styles.ts +1 -1
- package/src/components/editor/navigation/__tests__/clipboard.test.ts +0 -5
- package/src/components/editor/navigation/clipboard.ts +2 -1
- package/src/components/editor/notebook-cell.tsx +20 -7
- package/src/components/editor/output/CalloutOutput.tsx +1 -1
- package/src/components/editor/output/ConsoleOutput.tsx +27 -33
- package/src/components/editor/output/HtmlOutput.tsx +3 -2
- package/src/components/editor/output/JsonOutput.tsx +15 -1
- package/src/components/editor/output/MarimoTracebackOutput.tsx +69 -52
- package/src/components/editor/output/__tests__/HtmlOutput.test.tsx +134 -0
- package/src/components/editor/output/__tests__/json-output.test.ts +43 -0
- package/src/components/editor/output/__tests__/traceback.test.tsx +8 -1
- package/src/components/editor/output/useWrapText.ts +6 -1
- package/src/components/editor/package-alert.tsx +37 -32
- package/src/components/editor/renderers/vertical-layout/vertical-layout-wrapper.tsx +5 -2
- package/src/components/forms/__tests__/form-utils.test.ts +4 -2
- package/src/components/home/state.ts +3 -2
- package/src/components/icons/copy-icon.tsx +11 -5
- package/src/components/scratchpad/scratchpad-history.ts +6 -1
- package/src/components/shortcuts/renderShortcut.tsx +3 -1
- package/src/components/slides/slides-component.tsx +25 -21
- package/src/components/ui/button.tsx +2 -0
- package/src/components/ui/confirmation-button.tsx +85 -0
- package/src/components/ui/context-menu.tsx +14 -4
- package/src/components/ui/dropdown-menu.tsx +14 -4
- package/src/components/ui/fullscreen.tsx +115 -1
- package/src/components/ui/popover.tsx +11 -3
- package/src/components/ui/range-slider.tsx +1 -1
- package/src/components/ui/select.tsx +7 -3
- package/src/components/ui/slider.tsx +1 -1
- package/src/components/ui/switch.tsx +2 -0
- package/src/components/ui/tooltip.tsx +10 -3
- package/src/core/ai/__tests__/staged-cells.test.ts +189 -64
- package/src/core/ai/config.ts +6 -2
- package/src/core/ai/context/providers/__tests__/__snapshots__/cell-output.test.ts.snap +17 -0
- package/src/core/ai/context/providers/__tests__/cell-output.test.ts +194 -10
- package/src/core/ai/context/providers/__tests__/datasource.test.ts +9 -1
- package/src/core/ai/context/providers/cell-output.ts +170 -112
- package/src/core/ai/context/providers/datasource.ts +25 -1
- package/src/core/ai/context/providers/tables.ts +2 -2
- package/src/core/ai/staged-cells.ts +32 -16
- package/src/core/ai/state.ts +8 -4
- package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +556 -0
- package/src/core/ai/tools/__tests__/registry.test.ts +41 -8
- package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +450 -0
- package/src/core/ai/tools/__tests__/utils.test.ts +87 -0
- package/src/core/ai/tools/base.ts +109 -6
- package/src/core/ai/tools/edit-notebook-tool.ts +239 -0
- package/src/core/ai/tools/registry.ts +48 -15
- package/src/core/ai/tools/run-cells-tool.ts +233 -0
- package/src/core/ai/tools/sample-tool.ts +53 -15
- package/src/core/ai/tools/utils.ts +23 -0
- package/src/core/cache/requests.ts +5 -0
- package/src/core/cells/__tests__/cells.test.ts +19 -1
- package/src/core/cells/__tests__/session.test.ts +20 -3
- package/src/core/cells/cells.ts +13 -8
- package/src/core/cells/session.ts +1 -1
- package/src/core/codemirror/__tests__/__snapshots__/setup.test.ts.snap +2 -0
- package/src/core/codemirror/__tests__/replace-editor-content.test.ts +336 -0
- package/src/core/codemirror/ai/resources.ts +13 -2
- package/src/core/codemirror/copilot/state.ts +4 -2
- package/src/core/codemirror/find-replace/navigate.ts +2 -2
- package/src/core/codemirror/format.ts +2 -9
- package/src/core/codemirror/language/__tests__/extension.test.ts +10 -2
- package/src/core/codemirror/language/__tests__/sql.test.ts +24 -6
- package/src/core/codemirror/language/languages/markdown.ts +16 -153
- package/src/core/codemirror/language/languages/python.ts +13 -10
- package/src/core/codemirror/language/languages/sql/sql-mode.ts +6 -1
- package/src/core/codemirror/language/languages/sql/sql.ts +43 -306
- package/src/core/codemirror/language/panel/markdown.tsx +2 -1
- package/src/core/codemirror/language/panel/panel.tsx +2 -7
- package/src/core/codemirror/language/utils.ts +3 -8
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +21 -14
- package/src/core/codemirror/lsp/federated-lsp.ts +20 -9
- package/src/core/codemirror/lsp/notebook-lsp.ts +35 -29
- package/src/core/codemirror/lsp/transports.ts +7 -13
- package/src/core/codemirror/lsp/types.ts +0 -13
- package/src/core/codemirror/replace-editor-content.ts +87 -0
- package/src/core/config/__tests__/config-schema.test.ts +3 -0
- package/src/core/config/config-schema.ts +12 -1
- package/src/core/config/feature-flag.tsx +2 -4
- package/src/core/errors/__tests__/errors.test.ts +1 -0
- package/src/core/errors/errors.ts +20 -6
- package/src/core/hotkeys/hotkeys.ts +12 -0
- package/src/core/islands/bridge.ts +2 -0
- package/src/core/islands/main.ts +4 -0
- package/src/core/kernel/messages.ts +1 -0
- package/src/core/lsp/__tests__/transport.test.ts +233 -0
- package/src/core/lsp/transport.ts +139 -0
- package/src/core/network/requests-network.ts +14 -0
- package/src/core/network/requests-static.ts +2 -0
- package/src/core/network/requests-toasting.ts +2 -0
- package/src/core/network/types.ts +5 -0
- package/src/core/rtc/state.ts +6 -1
- package/src/core/saving/save-component.tsx +43 -36
- package/src/core/vscode/is-in-vscode.ts +9 -0
- package/src/core/wasm/bridge.ts +2 -0
- package/src/core/wasm/store.ts +1 -1
- package/src/core/websocket/useMarimoWebSocket.tsx +8 -0
- package/src/css/app/Cell.css +31 -0
- package/src/css/app/codemirror-completions.css +1 -1
- package/src/css/globals.css +5 -0
- package/src/custom.d.ts +2 -0
- package/src/hooks/useIframeCapabilities.ts +14 -0
- package/src/hooks/useLocalStorage.ts +1 -1
- package/src/plugins/core/RenderHTML.tsx +65 -5
- package/src/plugins/core/__test__/RenderHTML.test.ts +25 -23
- package/src/plugins/core/__test__/renderHTML-sanitization.test.tsx +131 -0
- package/src/plugins/core/__test__/sanitize.test.ts +465 -0
- package/src/plugins/core/registerReactComponent.tsx +19 -2
- package/src/plugins/core/sanitize.ts +76 -0
- package/src/plugins/impl/DataTablePlugin.tsx +20 -19
- package/src/plugins/impl/FileBrowserPlugin.tsx +1 -3
- package/src/plugins/impl/FileUploadPlugin.tsx +1 -3
- package/src/plugins/impl/__tests__/DateTimePickerPlugin.test.tsx +40 -1
- package/src/plugins/impl/__tests__/DropdownPlugin.test.tsx +6 -0
- package/src/plugins/impl/__tests__/MultiSelectPlugin.test.ts +8 -1
- package/src/plugins/impl/__tests__/NumberPlugin.test.tsx +3 -0
- package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
- package/src/plugins/impl/chat/chat-ui.tsx +17 -2
- package/src/plugins/impl/chat/types.ts +1 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +7 -2
- package/src/plugins/impl/plotly/__tests__/parse-from-template.test.ts +17 -0
- package/src/plugins/impl/plotly/parse-from-template.ts +2 -1
- package/src/utils/__tests__/arrays.test.ts +42 -0
- package/src/utils/__tests__/capabilities.test.ts +453 -0
- package/src/utils/__tests__/formatting.test.ts +107 -0
- package/src/utils/__tests__/json-parser.test.ts +13 -0
- package/src/utils/__tests__/local-storage.test.ts +1 -1
- package/src/utils/__tests__/storage.test.ts +21 -21
- package/src/utils/arrays.ts +25 -0
- package/src/utils/capabilities.ts +114 -0
- package/src/utils/copy.ts +6 -0
- package/src/utils/formatting.ts +51 -0
- package/src/utils/json/json-parser.ts +28 -3
- package/src/utils/numbers.ts +2 -2
- package/src/utils/{storage.ts → storage/jotai.ts} +16 -4
- package/src/utils/storage/storage.ts +57 -0
- package/src/utils/{localStorage.ts → storage/typed.ts} +22 -12
- package/dist/any-language-editor-CVFQlioK.js +0 -156
- package/dist/apl-ChlaBfxB.js +0 -4
- package/dist/architecture-O4VJ6CD3-BVeaxUcM.js +0 -21
- package/dist/asciiarmor-CcJmm3l_.js +0 -4
- package/dist/asn1-ThRYxoBE.js +0 -4
- package/dist/assets/__vite-browser-external-Dv_SHu1h.js +0 -1
- package/dist/assets/worker-DVOR9oZG.js +0 -54
- package/dist/brainfuck-CEM0JgDn.js +0 -4
- package/dist/chunk-EXTU4WIE-DECT9AAK.js +0 -14
- package/dist/chunk-S3R3BYOJ-DMQ1yeyq.js +0 -386
- package/dist/classDiagram-KNZD7YFC-BG53O6Jt.js +0 -39
- package/dist/classDiagram-v2-RKCZMP56-BmKILsGU.js +0 -39
- package/dist/clojure-B7RHyE9t.js +0 -4
- package/dist/cmake-TeTMP4I5.js +0 -4
- package/dist/cobol-DI-mxUER.js +0 -4
- package/dist/coffeescript-DHUFLqWp.js +0 -4
- package/dist/commonlisp-SLiUrh1m.js +0 -4
- package/dist/crystal-B4fY1ZfJ.js +0 -4
- package/dist/css-Bdoq3TzK.js +0 -5
- package/dist/cypher-CBU182fp.js +0 -4
- package/dist/d-D8myDZeH.js +0 -4
- package/dist/data-grid-overlay-editor-qNmJk2x0.js +0 -135
- package/dist/diagram-QEK2KX5R-fu8Noi3H.js +0 -245
- package/dist/diff-DJF_UB7H.js +0 -4
- package/dist/dist-52-_pKoy.js +0 -6
- package/dist/dist-6DOMStFn.js +0 -6
- package/dist/dist-B334aW7p.js +0 -10
- package/dist/dist-BOI9lUz-.js +0 -12
- package/dist/dist-C06uhBzF.js +0 -6
- package/dist/dist-CGkpguCB.js +0 -6
- package/dist/dist-CrApzUED.js +0 -6
- package/dist/dist-Dp2GLdCl.js +0 -14
- package/dist/dist-WHFsbMDr.js +0 -6
- package/dist/dist-hyKcTPG9.js +0 -10
- package/dist/dtd-DY8q65lC.js +0 -4
- package/dist/dylan-CBLcjWCi.js +0 -4
- package/dist/ecl-BSXPNfOw.js +0 -4
- package/dist/eiffel-BJf0PQX-.js +0 -4
- package/dist/elm-DWQwPCZS.js +0 -4
- package/dist/erlang-BWBaGZ5e.js +0 -4
- package/dist/error-banner-OQIGTqFR.js +0 -1012
- package/dist/esm-BO9n_s6u.js +0 -26
- package/dist/factor-DT1-MBPl.js +0 -5
- package/dist/forth-D9GDt3FB.js +0 -4
- package/dist/fortran-DHkRhDWw.js +0 -4
- package/dist/gas-7lQEOM0H.js +0 -4
- package/dist/gherkin-BLLyroYi.js +0 -4
- package/dist/gitGraph-ZV4HHKMB-z2v_cInC.js +0 -21
- package/dist/groovy-C-wabwj0.js +0 -4
- package/dist/haskell-DaxVQ_d1.js +0 -4
- package/dist/haxe-C2yLoC7h.js +0 -5
- package/dist/idl-DQBP8i7k.js +0 -4
- package/dist/info-63CPKGFF-GS4w6pCB.js +0 -21
- package/dist/infoDiagram-STP46IZ2-DE9YYPFg.js +0 -44
- package/dist/javascript-DRwFV9r5.js +0 -5
- package/dist/jinja2-CNoIpVmN.js +0 -4
- package/dist/julia-DXDf-GhP.js +0 -4
- package/dist/livescript-S2uhJQx7.js +0 -4
- package/dist/lua-Bvgs0y2G.js +0 -4
- package/dist/mathematica-D2zqfwIg.js +0 -4
- package/dist/mbox-SBcPaDuZ.js +0 -4
- package/dist/mirc-hkQc7sVF.js +0 -4
- package/dist/mllike-DRWPBlr9.js +0 -6
- package/dist/modelica-CO2ROGlP.js +0 -4
- package/dist/mscgen-BpX61bO6.js +0 -6
- package/dist/mumps-BCnFeIn6.js +0 -4
- package/dist/nsis-BaTOxlD1.js +0 -5
- package/dist/ntriples-zEo5BWjr.js +0 -4
- package/dist/octave-BE0RnCM9.js +0 -4
- package/dist/oz-C4_2Ttul.js +0 -4
- package/dist/packet-HUATNLJX-CjHqJIqk.js +0 -21
- package/dist/pascal-Q3jJucpw.js +0 -4
- package/dist/perl-DkXZIWHF.js +0 -4
- package/dist/pie-WTHONI2E-D67gLWtR.js +0 -21
- package/dist/pig-DCgEHdsu.js +0 -4
- package/dist/powershell-3rK_nRRJ.js +0 -236
- package/dist/powershell-Eo2-7MoM.js +0 -4
- package/dist/properties-C0IOX8WR.js +0 -4
- package/dist/protobuf--lGQUSRO.js +0 -4
- package/dist/pug-Cf8AQHMJ.js +0 -5
- package/dist/puppet-D7Z3dTJn.js +0 -4
- package/dist/python-FHIx_i8Y.js +0 -5
- package/dist/q-B7UA1feM.js +0 -4
- package/dist/r-Cc9R2A7N.js +0 -4
- package/dist/radar-NJJJXTRR-C-AZP_Te.js +0 -21
- package/dist/rpm-vhJNlrQ6.js +0 -5
- package/dist/ruby-CVluPY0M.js +0 -4
- package/dist/sas-A8DL8oy3.js +0 -4
- package/dist/scheme-6xHHcSXC.js +0 -4
- package/dist/shell-DHN-e5rf.js +0 -4
- package/dist/sieve-BuQwLY02.js +0 -4
- package/dist/smalltalk-BA4HPg2H.js +0 -4
- package/dist/sparql-Bf4yCuy3.js +0 -4
- package/dist/stateDiagram-v2-UMBNRL4Z-C_0FUzzk.js +0 -38
- package/dist/stex-D-I1cYeE.js +0 -5
- package/dist/stylus-BMeped2l.js +0 -4
- package/dist/swift-lwEdlZoC.js +0 -4
- package/dist/tcl-B03ipeqv.js +0 -4
- package/dist/textile-Cy55fYGC.js +0 -4
- package/dist/toml-BLgrVtfu.js +0 -4
- package/dist/treemap-75Q7IDZK-DTvwfpWt.js +0 -21
- package/dist/troff-g6EjN2O2.js +0 -4
- package/dist/ttcn-Dzvba8jK.js +0 -4
- package/dist/ttcn-cfg-CadG0p1K.js +0 -4
- package/dist/turtle-DkXAMWo9.js +0 -4
- package/dist/vb-C5dCiel8.js +0 -4
- package/dist/vbscript-I4bDEQln.js +0 -4
- package/dist/velocity-mt0fDwFH.js +0 -4
- package/dist/verilog-Dxq3KJkc.js +0 -4
- package/dist/vhdl-Km0QUlV-.js +0 -4
- package/dist/webidl-B3lJ2MRL.js +0 -4
- package/dist/xquery-CcIxNPEe.js +0 -4
- package/dist/yacas-oMa-f-tN.js +0 -4
- package/dist/z80-D03Nvn6l.js +0 -4
- package/src/core/codemirror/language/__tests__/ast.test.ts +0 -124
- package/src/core/codemirror/language/utils/ast.ts +0 -84
- package/src/core/codemirror/language/utils/quotes.ts +0 -18
- /package/dist/{_arrayReduce-CVwxyrBP.js → _arrayReduce-Cd9xQjbl.js} +0 -0
- /package/dist/{_baseSlice-OgpvpOOJ.js → _baseSlice-CE9WsQZm.js} +0 -0
- /package/dist/{_hasUnicode-BgIggCqE.js → _hasUnicode-DkEebvtD.js} +0 -0
- /package/dist/{apl-DZqo8Elt.js → apl-aGhy11IM.js} +0 -0
- /package/dist/{array-aAxy08hN.js → array-DYSXIreg.js} +0 -0
- /package/dist/{asciiarmor-DTzHAIeX.js → asciiarmor-DJKJ3Gkn.js} +0 -0
- /package/dist/{asn1-DrAXKsZH.js → asn1-C6f5IeNs.js} +0 -0
- /package/dist/{asterisk-oF4U3h48.js → asterisk-DB1poX9_.js} +0 -0
- /package/dist/{brainfuck-BYgLey30.js → brainfuck-Ch9vjun0.js} +0 -0
- /package/dist/{chunk-57QY23SG-0TxCfmy_.js → chunk-57QY23SG-BpXU7ph4.js} +0 -0
- /package/dist/{clojure-Bs2M3OUY.js → clojure-B_lpr3zt.js} +0 -0
- /package/dist/{cmake-DpI8vxJN.js → cmake-DaocNF4I.js} +0 -0
- /package/dist/{cobol-BQyrWo72.js → cobol-suTPtt7c.js} +0 -0
- /package/dist/{coffeescript-9ke9UHmw.js → coffeescript-CPLIvtqJ.js} +0 -0
- /package/dist/{colors-Cr_mZ2aH.js → colors-BXlG8Lmz.js} +0 -0
- /package/dist/{common-keywords-BzgeAvH1.js → common-keywords-Bhll7O3b.js} +0 -0
- /package/dist/{commonlisp-DghUdrUH.js → commonlisp-BqM3qFK7.js} +0 -0
- /package/dist/{crystal-DEf_SInh.js → crystal-AsSFu4ke.js} +0 -0
- /package/dist/{css-BzTU9lNO.js → css-Df7Sdeyh.js} +0 -0
- /package/dist/{cypher-a2v0c11S.js → cypher-CaVKL6Gu.js} +0 -0
- /package/dist/{d-SAswny-M.js → d-DCGWK7NQ.js} +0 -0
- /package/dist/{defaultLocale-BAgEOGks.js → defaultLocale-CYgZlqDF.js} +0 -0
- /package/dist/{defaultLocale-471SYAPk.js → defaultLocale-Cto8YOmX.js} +0 -0
- /package/dist/{diff-OJ-xLXcG.js → diff-CsxOM4Tr.js} +0 -0
- /package/dist/{dist-CK8Gj3GX.js → dist-C76MUPD3.js} +0 -0
- /package/dist/{dtd-BsUf-rer.js → dtd-Dwr0Jmks.js} +0 -0
- /package/dist/{duckdb-keywords-B0NOra5o.js → duckdb-keywords-7wAWf848.js} +0 -0
- /package/dist/{dylan-C0ZYngjn.js → dylan-A7-ZBSey.js} +0 -0
- /package/dist/{ebnf-DF1xx0b_.js → ebnf-9_SaGDUz.js} +0 -0
- /package/dist/{ecl-Bsuvoouq.js → ecl-BzJVIQDc.js} +0 -0
- /package/dist/{eiffel-DgfSpLi-.js → eiffel-CO9eC_Op.js} +0 -0
- /package/dist/{elm-GNxDj-5E.js → elm-CVAWj8SB.js} +0 -0
- /package/dist/{emotion-is-prop-valid.esm-BHMWayAG.js → emotion-is-prop-valid.esm-C3Yi5GQt.js} +0 -0
- /package/dist/{erlang-Ds3uY1kL.js → erlang-DWbZP546.js} +0 -0
- /package/dist/{fcl-CqBgSioc.js → fcl-CM9t2iay.js} +0 -0
- /package/dist/{forth-JCaLysGk.js → forth-BTYqUuu3.js} +0 -0
- /package/dist/{fortran-Dc2AoKAl.js → fortran-DgAjHcCq.js} +0 -0
- /package/dist/{gas-Q4Uz82YW.js → gas-BjDSWPZd.js} +0 -0
- /package/dist/{gherkin-Dpxe49sQ.js → gherkin-ClRqqpKv.js} +0 -0
- /package/dist/{groovy-D8mTRCu6.js → groovy-BzNjnc8x.js} +0 -0
- /package/dist/{haskell-2_8cC4wY.js → haskell-DLdk34Jq.js} +0 -0
- /package/dist/{haxe-Bl9zkZlz.js → haxe-l6gaY_IS.js} +0 -0
- /package/dist/{http-DKCqY6yS.js → http-6Qg7z_h2.js} +0 -0
- /package/dist/{idl-Dn-HNfGW.js → idl-hlWT4D26.js} +0 -0
- /package/dist/{init-D6eDd7H0.js → init-tZ42Torz.js} +0 -0
- /package/dist/{jinja2-JjFiAGKk.js → jinja2-DI5k_Er3.js} +0 -0
- /package/dist/{julia-R5wne8eu.js → julia-BvDZDiIT.js} +0 -0
- /package/dist/{livescript-DSwokrYj.js → livescript-2YMQfkfI.js} +0 -0
- /package/dist/{lua-CgXfrp2-.js → lua-DIUrQRfA.js} +0 -0
- /package/dist/{main-Czi9-LVy.js → main-BMTpe7M0.js} +0 -0
- /package/dist/{math-C7wLpe9K.js → math-qsHyz2Eo.js} +0 -0
- /package/dist/{mathematica-BVli92MR.js → mathematica-Dqmg_BwL.js} +0 -0
- /package/dist/{mbox-CMFlocdS.js → mbox-Cng-P-F1.js} +0 -0
- /package/dist/{mirc-BkW04Zpc.js → mirc-CNDqOVhQ.js} +0 -0
- /package/dist/{mllike-DEjvHvNV.js → mllike-C1n2UDyX.js} +0 -0
- /package/dist/{modelica-CxDn-oje.js → modelica-QqQC2pFj.js} +0 -0
- /package/dist/{mscgen-D78wmE-w.js → mscgen-C3fl8uhp.js} +0 -0
- /package/dist/{mumps-Bi0IvPOV.js → mumps-BeCUbMej.js} +0 -0
- /package/dist/{nginx-DErPZFhX.js → nginx-ejv7DsBz.js} +0 -0
- /package/dist/{ntriples-Btyp6wRL.js → ntriples-CUgUpcma.js} +0 -0
- /package/dist/{octave-CZA6-2F8.js → octave-BD652tGl.js} +0 -0
- /package/dist/{oz-Bm6LSNfE.js → oz-DrRsFa0K.js} +0 -0
- /package/dist/{pascal-B4J6a9BH.js → pascal-hpcx9sVn.js} +0 -0
- /package/dist/{path-VDkDgx1I.js → path-Bbv2tLY1.js} +0 -0
- /package/dist/{perl-CzVqxS08.js → perl-DW8XHeFc.js} +0 -0
- /package/dist/{pig-Clh03cnn.js → pig-Cv7Nxbfo.js} +0 -0
- /package/dist/{prop-types-0wNc-99T.js → prop-types-Bd16OEUP.js} +0 -0
- /package/dist/{properties-D7ch1Wyb.js → properties-D-qJDXAM.js} +0 -0
- /package/dist/{protobuf-DrkdrMPK.js → protobuf-B48QZbd3.js} +0 -0
- /package/dist/{puppet-BtZG8zdO.js → puppet-15JDyiY2.js} +0 -0
- /package/dist/{python-B6FKOVIv.js → python-DWkQA94h.js} +0 -0
- /package/dist/{r-Dnvo5-96.js → r-dcNRe_Q8.js} +0 -0
- /package/dist/{range-PcytnUSJ.js → range-CQvYp_qE.js} +0 -0
- /package/dist/{rpm-B1DrgfnX.js → rpm-Djl3Dsf1.js} +0 -0
- /package/dist/{ruby-CelfUg17.js → ruby-Dd2CZTip.js} +0 -0
- /package/dist/{sas-DfSQFMWG.js → sas-DYF5_Iqu.js} +0 -0
- /package/dist/{scheme-BplhaWuO.js → scheme-YtWcji1H.js} +0 -0
- /package/dist/{shell-DqU5OS2c.js → shell-C3uC3Y0Z.js} +0 -0
- /package/dist/{sieve-BE4_IyGa.js → sieve-DHB17sQG.js} +0 -0
- /package/dist/{smalltalk-B_WPL8Nx.js → smalltalk-Y5v1Np3H.js} +0 -0
- /package/dist/{solr-DlJFg7H5.js → solr-DvRJLlRD.js} +0 -0
- /package/dist/{sparql-7XIlcOgW.js → sparql-BEt3GJwM.js} +0 -0
- /package/dist/{spreadsheet-BdZSVwVp.js → spreadsheet-Dp4B9_rc.js} +0 -0
- /package/dist/{sql-CCrq7lfJ.js → sql-DBsUs8nQ.js} +0 -0
- /package/dist/{stex-BiFc8QAu.js → stex-C6-x52ei.js} +0 -0
- /package/dist/{stylus-DlSH9xpH.js → stylus-DroA8via.js} +0 -0
- /package/dist/{swift-e3tMTZgJ.js → swift-DR0x1ESK.js} +0 -0
- /package/dist/{tcl-DfZMC20G.js → tcl-BeuTFc_c.js} +0 -0
- /package/dist/{textile-DaSeca5U.js → textile-C0ikhHN3.js} +0 -0
- /package/dist/{tiddlywiki-dfoiz8pS.js → tiddlywiki-C_2Nvsgu.js} +0 -0
- /package/dist/{tiki-yJbQzhma.js → tiki-CKQlhmQQ.js} +0 -0
- /package/dist/{treemap-BpgMKHv-.js → treemap-BYLUKIzA.js} +0 -0
- /package/dist/{troff-FN_FrCXR.js → troff-DkK0f2ZH.js} +0 -0
- /package/dist/{tslib.es6-DofFyd9S.js → tslib.es6-3ZL768sZ.js} +0 -0
- /package/dist/{ttcn-7_i4HlyB.js → ttcn-Bf8vrg-_.js} +0 -0
- /package/dist/{ttcn-cfg-B46AlBUV.js → ttcn-cfg-DjCKzd95.js} +0 -0
- /package/dist/{turtle-QQfeFveR.js → turtle-SSc84S9m.js} +0 -0
- /package/dist/{vb-DToPVnLa.js → vb-CQ6DC3cL.js} +0 -0
- /package/dist/{vbscript-CtsNaTz4.js → vbscript-Dw0gFssg.js} +0 -0
- /package/dist/{velocity-CAoNe6ns.js → velocity-BvJQyBmj.js} +0 -0
- /package/dist/{verilog-DrDOMiJq.js → verilog-CKGAvQjj.js} +0 -0
- /package/dist/{vhdl-DnO0OEPh.js → vhdl-B40_x6fM.js} +0 -0
- /package/dist/{webidl-Or6d1ZfA.js → webidl-Bi9hczCv.js} +0 -0
- /package/dist/{xquery-CEp_Mcpr.js → xquery-DwWUXvP3.js} +0 -0
- /package/dist/{yacas-DgnYrSlp.js → yacas-ClUs0mmH.js} +0 -0
- /package/dist/{z80-DlG_kyeB.js → z80-DPC4UGzR.js} +0 -0
|
@@ -5,7 +5,7 @@ import { useChat } from "@ai-sdk/react";
|
|
|
5
5
|
import { storePrompt } from "@marimo-team/codemirror-ai";
|
|
6
6
|
import type { ReactCodeMirrorRef } from "@uiw/react-codemirror";
|
|
7
7
|
import { DefaultChatTransport, type ToolUIPart } from "ai";
|
|
8
|
-
import { useAtom, useAtomValue, useSetAtom } from "jotai";
|
|
8
|
+
import { useAtom, useAtomValue, useSetAtom, useStore } from "jotai";
|
|
9
9
|
import {
|
|
10
10
|
AtSignIcon,
|
|
11
11
|
BotMessageSquareIcon,
|
|
@@ -30,13 +30,19 @@ import {
|
|
|
30
30
|
import { replaceMessagesInChat } from "@/core/ai/chat-utils";
|
|
31
31
|
import { useModelChange } from "@/core/ai/config";
|
|
32
32
|
import { AiModelId, type ProviderId } from "@/core/ai/ids/ids";
|
|
33
|
+
import { useStagedAICellsActions } from "@/core/ai/staged-cells";
|
|
33
34
|
import {
|
|
34
35
|
activeChatAtom,
|
|
35
36
|
type Chat,
|
|
36
37
|
type ChatId,
|
|
37
38
|
chatStateAtom,
|
|
38
39
|
} from "@/core/ai/state";
|
|
39
|
-
import {
|
|
40
|
+
import type { ToolNotebookContext } from "@/core/ai/tools/base";
|
|
41
|
+
import {
|
|
42
|
+
type CopilotMode,
|
|
43
|
+
FRONTEND_TOOL_REGISTRY,
|
|
44
|
+
} from "@/core/ai/tools/registry";
|
|
45
|
+
import { useCellActions } from "@/core/cells/cells";
|
|
40
46
|
import { aiAtom, aiEnabledAtom } from "@/core/config/config";
|
|
41
47
|
import { DEFAULT_AI_MODEL } from "@/core/config/config-schema";
|
|
42
48
|
import { FeatureFlagged } from "@/core/config/feature-flag";
|
|
@@ -45,7 +51,6 @@ import { useRuntimeManager } from "@/core/runtime/config";
|
|
|
45
51
|
import { ErrorBanner } from "@/plugins/impl/common/error-banner";
|
|
46
52
|
import { cn } from "@/utils/cn";
|
|
47
53
|
import { Logger } from "@/utils/Logger";
|
|
48
|
-
|
|
49
54
|
import { AIModelDropdown } from "../ai/ai-model-dropdown";
|
|
50
55
|
import { useOpenSettingsToTab } from "../app-config/state";
|
|
51
56
|
import { PromptInput } from "../editor/ai/add-cell-with-ai";
|
|
@@ -301,7 +306,11 @@ const ChatInputFooter: React.FC<ChatInputFooterProps> = memo(
|
|
|
301
306
|
|
|
302
307
|
const { saveModeChange } = useModelChange();
|
|
303
308
|
|
|
304
|
-
const modeOptions
|
|
309
|
+
const modeOptions: {
|
|
310
|
+
value: CopilotMode;
|
|
311
|
+
label: string;
|
|
312
|
+
subtitle: string;
|
|
313
|
+
}[] = [
|
|
305
314
|
{
|
|
306
315
|
value: "ask",
|
|
307
316
|
label: "Ask",
|
|
@@ -313,6 +322,11 @@ const ChatInputFooter: React.FC<ChatInputFooterProps> = memo(
|
|
|
313
322
|
label: "Manual",
|
|
314
323
|
subtitle: "Pure chat, no tool usage",
|
|
315
324
|
},
|
|
325
|
+
{
|
|
326
|
+
value: "agent",
|
|
327
|
+
label: "Agent (beta)",
|
|
328
|
+
subtitle: "Use AI with access to read and write tools",
|
|
329
|
+
},
|
|
316
330
|
];
|
|
317
331
|
|
|
318
332
|
const isAttachmentSupported =
|
|
@@ -511,9 +525,20 @@ const ChatPanelBody = () => {
|
|
|
511
525
|
const fileInputRef = useRef<HTMLInputElement>(null);
|
|
512
526
|
const messagesEndRef = useRef<HTMLDivElement>(null);
|
|
513
527
|
const runtimeManager = useRuntimeManager();
|
|
514
|
-
const { invokeAiTool } = useRequestClient();
|
|
528
|
+
const { invokeAiTool, sendRun } = useRequestClient();
|
|
515
529
|
|
|
516
530
|
const activeChatId = activeChat?.id;
|
|
531
|
+
const store = useStore();
|
|
532
|
+
|
|
533
|
+
const { addStagedCell } = useStagedAICellsActions();
|
|
534
|
+
const { createNewCell, prepareForRun } = useCellActions();
|
|
535
|
+
const toolContext: ToolNotebookContext = {
|
|
536
|
+
addStagedCell,
|
|
537
|
+
createNewCell,
|
|
538
|
+
prepareForRun,
|
|
539
|
+
sendRun,
|
|
540
|
+
store,
|
|
541
|
+
};
|
|
517
542
|
|
|
518
543
|
const {
|
|
519
544
|
messages,
|
|
@@ -555,6 +580,13 @@ const ChatPanelBody = () => {
|
|
|
555
580
|
});
|
|
556
581
|
},
|
|
557
582
|
onToolCall: async ({ toolCall }) => {
|
|
583
|
+
// Dynamic tool calls will throw an error for toolName
|
|
584
|
+
// https://ai-sdk.dev/docs/ai-sdk-ui/chatbot-tool-usage#client-side-page
|
|
585
|
+
if (toolCall.dynamic) {
|
|
586
|
+
Logger.debug("Skipping dynamic tool call", toolCall);
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
589
|
+
|
|
558
590
|
await handleToolCall({
|
|
559
591
|
invokeAiTool,
|
|
560
592
|
addToolResult,
|
|
@@ -563,6 +595,7 @@ const ChatPanelBody = () => {
|
|
|
563
595
|
toolCallId: toolCall.toolCallId,
|
|
564
596
|
input: toolCall.input as Record<string, never>,
|
|
565
597
|
},
|
|
598
|
+
toolContext,
|
|
566
599
|
});
|
|
567
600
|
},
|
|
568
601
|
onError: (error) => {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import type { components } from "@marimo-team/marimo-api";
|
|
4
4
|
import type { FileUIPart, ToolUIPart, UIMessage } from "ai";
|
|
5
|
+
import type { ToolNotebookContext } from "@/core/ai/tools/base";
|
|
5
6
|
import { FRONTEND_TOOL_REGISTRY } from "@/core/ai/tools/registry";
|
|
6
7
|
import type {
|
|
7
8
|
InvokeAiToolRequest,
|
|
@@ -106,8 +107,9 @@ interface AddToolResult {
|
|
|
106
107
|
|
|
107
108
|
export async function handleToolCall({
|
|
108
109
|
invokeAiTool,
|
|
109
|
-
addToolResult,
|
|
110
|
+
addToolResult, // Important that we don't await addToolResult to prevent potential deadlocks
|
|
110
111
|
toolCall,
|
|
112
|
+
toolContext,
|
|
111
113
|
}: {
|
|
112
114
|
invokeAiTool: (request: InvokeAiToolRequest) => Promise<InvokeAiToolResponse>;
|
|
113
115
|
addToolResult: (result: AddToolResult) => Promise<void>;
|
|
@@ -116,6 +118,7 @@ export async function handleToolCall({
|
|
|
116
118
|
toolCallId: string;
|
|
117
119
|
input: Record<string, never>;
|
|
118
120
|
};
|
|
121
|
+
toolContext: ToolNotebookContext;
|
|
119
122
|
}) {
|
|
120
123
|
try {
|
|
121
124
|
if (FRONTEND_TOOL_REGISTRY.has(toolCall.toolName)) {
|
|
@@ -123,11 +126,12 @@ export async function handleToolCall({
|
|
|
123
126
|
const response = await FRONTEND_TOOL_REGISTRY.invoke(
|
|
124
127
|
toolCall.toolName,
|
|
125
128
|
toolCall.input,
|
|
129
|
+
toolContext,
|
|
126
130
|
);
|
|
127
131
|
addToolResult({
|
|
128
132
|
tool: toolCall.toolName,
|
|
129
133
|
toolCallId: toolCall.toolCallId,
|
|
130
|
-
output: response,
|
|
134
|
+
output: response.result || response.error,
|
|
131
135
|
});
|
|
132
136
|
} else {
|
|
133
137
|
// Invoke the backend/mcp tool
|
|
@@ -153,7 +157,7 @@ export async function handleToolCall({
|
|
|
153
157
|
|
|
154
158
|
/**
|
|
155
159
|
* Checks if we should send a message automatically based on the messages.
|
|
156
|
-
* We only want to send a message if
|
|
160
|
+
* We only want to send a message if all tool calls are completed and there is no reply yet.
|
|
157
161
|
*/
|
|
158
162
|
export function hasPendingToolCalls(messages: UIMessage[]): boolean {
|
|
159
163
|
if (messages.length === 0) {
|
|
@@ -177,7 +181,12 @@ export function hasPendingToolCalls(messages: UIMessage[]): boolean {
|
|
|
177
181
|
part.type.startsWith("tool-"),
|
|
178
182
|
) as ToolUIPart[];
|
|
179
183
|
|
|
180
|
-
|
|
184
|
+
// Guard against no tool parts
|
|
185
|
+
if (toolParts.length === 0) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const allToolCallsCompleted = toolParts.every(
|
|
181
190
|
(part) => part.state === "output-available",
|
|
182
191
|
);
|
|
183
192
|
|
|
@@ -186,6 +195,8 @@ export function hasPendingToolCalls(messages: UIMessage[]): boolean {
|
|
|
186
195
|
const hasTextContent =
|
|
187
196
|
lastPart.type === "text" && lastPart.text?.trim().length > 0;
|
|
188
197
|
|
|
198
|
+
Logger.warn("All tool calls completed: %s", allToolCallsCompleted);
|
|
199
|
+
|
|
189
200
|
// Only auto-send if we have completed tool calls and there is no reply yet
|
|
190
|
-
return
|
|
201
|
+
return allToolCallsCompleted && !hasTextContent;
|
|
191
202
|
}
|
|
@@ -119,6 +119,8 @@ const ToolArgsRenderer: React.FC<{ input: unknown }> = ({ input }) => {
|
|
|
119
119
|
return null;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
const isEmptyInput = isEmpty(input);
|
|
123
|
+
|
|
122
124
|
const isObject =
|
|
123
125
|
typeof input === "object" &&
|
|
124
126
|
Object.keys(input as Record<string, unknown>).length > 0;
|
|
@@ -129,7 +131,11 @@ const ToolArgsRenderer: React.FC<{ input: unknown }> = ({ input }) => {
|
|
|
129
131
|
Tool Request
|
|
130
132
|
</h3>
|
|
131
133
|
<pre className="bg-[var(--slate-2)] p-2 text-muted-foreground border border-[var(--slate-4)] rounded text-xs overflow-auto scrollbar-thin max-h-64">
|
|
132
|
-
{
|
|
134
|
+
{isEmptyInput
|
|
135
|
+
? "{}"
|
|
136
|
+
: isObject
|
|
137
|
+
? JSON.stringify(input, null, 2)
|
|
138
|
+
: String(input)}
|
|
133
139
|
</pre>
|
|
134
140
|
</div>
|
|
135
141
|
);
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import type { SortingState } from "@tanstack/react-table";
|
|
4
|
+
import { describe, expect, it, vi } from "vitest";
|
|
5
|
+
|
|
6
|
+
describe("multi-column sorting logic", () => {
|
|
7
|
+
// Extract the core sorting logic to test in isolation
|
|
8
|
+
const handleSort = (
|
|
9
|
+
columnId: string,
|
|
10
|
+
desc: boolean,
|
|
11
|
+
sortingState: SortingState,
|
|
12
|
+
setSorting: (state: SortingState) => void,
|
|
13
|
+
clearSorting: () => void,
|
|
14
|
+
) => {
|
|
15
|
+
const currentSort = sortingState.find((s) => s.id === columnId);
|
|
16
|
+
|
|
17
|
+
if (currentSort && currentSort.desc === desc) {
|
|
18
|
+
// Clicking the same sort again - remove it
|
|
19
|
+
clearSorting();
|
|
20
|
+
} else {
|
|
21
|
+
// New sort or different direction - move to end of stack
|
|
22
|
+
const otherSorts = sortingState.filter((s) => s.id !== columnId);
|
|
23
|
+
const newSort = { id: columnId, desc };
|
|
24
|
+
setSorting([...otherSorts, newSort]);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
it("implements stack-based sorting: moves re-clicked column to end", () => {
|
|
29
|
+
const sortingState: SortingState = [
|
|
30
|
+
{ id: "name", desc: false },
|
|
31
|
+
{ id: "age", desc: false },
|
|
32
|
+
];
|
|
33
|
+
const setSorting = vi.fn();
|
|
34
|
+
const clearSorting = vi.fn();
|
|
35
|
+
|
|
36
|
+
// Click Desc on age - should move age to end with desc=true
|
|
37
|
+
handleSort("age", true, sortingState, setSorting, clearSorting);
|
|
38
|
+
|
|
39
|
+
expect(setSorting).toHaveBeenCalledWith([
|
|
40
|
+
{ id: "name", desc: false },
|
|
41
|
+
{ id: "age", desc: true },
|
|
42
|
+
]);
|
|
43
|
+
expect(clearSorting).not.toHaveBeenCalled();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("removes sort when clicking same direction twice", () => {
|
|
47
|
+
const sortingState: SortingState = [{ id: "age", desc: false }];
|
|
48
|
+
const setSorting = vi.fn();
|
|
49
|
+
const clearSorting = vi.fn();
|
|
50
|
+
|
|
51
|
+
// Click Asc on age again - should remove the sort
|
|
52
|
+
handleSort("age", false, sortingState, setSorting, clearSorting);
|
|
53
|
+
|
|
54
|
+
expect(clearSorting).toHaveBeenCalled();
|
|
55
|
+
expect(setSorting).not.toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("adds new column to end of stack", () => {
|
|
59
|
+
const sortingState: SortingState = [{ id: "name", desc: false }];
|
|
60
|
+
const setSorting = vi.fn();
|
|
61
|
+
const clearSorting = vi.fn();
|
|
62
|
+
|
|
63
|
+
// Click Asc on age - should add age to end
|
|
64
|
+
handleSort("age", false, sortingState, setSorting, clearSorting);
|
|
65
|
+
|
|
66
|
+
expect(setSorting).toHaveBeenCalledWith([
|
|
67
|
+
{ id: "name", desc: false },
|
|
68
|
+
{ id: "age", desc: false },
|
|
69
|
+
]);
|
|
70
|
+
expect(clearSorting).not.toHaveBeenCalled();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("toggles sort direction when clicking opposite", () => {
|
|
74
|
+
const sortingState: SortingState = [{ id: "age", desc: false }];
|
|
75
|
+
const setSorting = vi.fn();
|
|
76
|
+
const clearSorting = vi.fn();
|
|
77
|
+
|
|
78
|
+
// Click Desc on age - should toggle to descending
|
|
79
|
+
handleSort("age", true, sortingState, setSorting, clearSorting);
|
|
80
|
+
|
|
81
|
+
expect(setSorting).toHaveBeenCalledWith([{ id: "age", desc: true }]);
|
|
82
|
+
expect(clearSorting).not.toHaveBeenCalled();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("correctly calculates priority numbers", () => {
|
|
86
|
+
const sortingState: SortingState = [
|
|
87
|
+
{ id: "name", desc: false },
|
|
88
|
+
{ id: "age", desc: true },
|
|
89
|
+
{ id: "dept", desc: false },
|
|
90
|
+
];
|
|
91
|
+
|
|
92
|
+
// Priority is index + 1
|
|
93
|
+
const nameSort = sortingState.find((s) => s.id === "name");
|
|
94
|
+
const namePriority = nameSort ? sortingState.indexOf(nameSort) + 1 : null;
|
|
95
|
+
expect(namePriority).toBe(1);
|
|
96
|
+
|
|
97
|
+
const deptSort = sortingState.find((s) => s.id === "dept");
|
|
98
|
+
const deptPriority = deptSort ? sortingState.indexOf(deptSort) + 1 : null;
|
|
99
|
+
expect(deptPriority).toBe(3);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("handles removing column from middle of stack", () => {
|
|
103
|
+
const sortingState: SortingState = [
|
|
104
|
+
{ id: "name", desc: false },
|
|
105
|
+
{ id: "age", desc: true },
|
|
106
|
+
{ id: "dept", desc: false },
|
|
107
|
+
];
|
|
108
|
+
const setSorting = vi.fn();
|
|
109
|
+
const clearSorting = vi.fn();
|
|
110
|
+
|
|
111
|
+
// Click Desc on age again - should remove it
|
|
112
|
+
handleSort("age", true, sortingState, setSorting, clearSorting);
|
|
113
|
+
|
|
114
|
+
expect(clearSorting).toHaveBeenCalled();
|
|
115
|
+
// After removal, dept should move from priority 3 to priority 2
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -2,8 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
import { getDefaultStore } from "jotai";
|
|
4
4
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
// Mock the storage module to use our mock storage
|
|
7
|
+
vi.mock("@/utils/storage/storage", () => ({
|
|
8
|
+
availableStorage: {
|
|
9
|
+
getItem: vi.fn(),
|
|
10
|
+
setItem: vi.fn(),
|
|
11
|
+
removeItem: vi.fn(),
|
|
12
|
+
},
|
|
13
|
+
}));
|
|
14
|
+
|
|
6
15
|
import type { CellId } from "@/core/cells/ids";
|
|
16
|
+
import { availableStorage } from "@/utils/storage/storage";
|
|
7
17
|
import { ChartSchema } from "../schemas";
|
|
8
18
|
import type { TabName } from "../storage";
|
|
9
19
|
import { KEY, tabsStorageAtom } from "../storage";
|
|
@@ -12,7 +22,6 @@ import { ChartType } from "../types";
|
|
|
12
22
|
describe("Chart Transforms Storage", () => {
|
|
13
23
|
beforeEach(() => {
|
|
14
24
|
vi.clearAllMocks();
|
|
15
|
-
SetupMocks.localStorage();
|
|
16
25
|
// Reset the store before each test
|
|
17
26
|
const store = getDefaultStore();
|
|
18
27
|
store.set(tabsStorageAtom, new Map());
|
|
@@ -87,14 +96,11 @@ describe("Chart Transforms Storage", () => {
|
|
|
87
96
|
|
|
88
97
|
describe("LocalStorage integration", () => {
|
|
89
98
|
it("should call localStorage.setItem when setting data", () => {
|
|
90
|
-
// Reset the mock to ensure clean state
|
|
91
|
-
asMock(window.localStorage.setItem).mockReset();
|
|
92
|
-
|
|
93
99
|
const store = getDefaultStore();
|
|
94
100
|
const newMap = new Map();
|
|
95
101
|
store.set(tabsStorageAtom, newMap);
|
|
96
102
|
|
|
97
|
-
expect(
|
|
103
|
+
expect(availableStorage.setItem).toHaveBeenCalledWith(
|
|
98
104
|
KEY,
|
|
99
105
|
JSON.stringify([]),
|
|
100
106
|
);
|
|
@@ -48,6 +48,7 @@ const CHART_HEIGHT = 290;
|
|
|
48
48
|
|
|
49
49
|
export interface TablePanelProps {
|
|
50
50
|
cellId: CellId | null;
|
|
51
|
+
data: unknown[];
|
|
51
52
|
dataTable: JSX.Element;
|
|
52
53
|
displayHeader: boolean;
|
|
53
54
|
getDataUrl?: GetDataUrl;
|
|
@@ -56,6 +57,7 @@ export interface TablePanelProps {
|
|
|
56
57
|
|
|
57
58
|
export const TablePanel: React.FC<TablePanelProps> = ({
|
|
58
59
|
cellId,
|
|
60
|
+
data,
|
|
59
61
|
dataTable,
|
|
60
62
|
getDataUrl,
|
|
61
63
|
fieldTypes,
|
|
@@ -211,6 +213,7 @@ export const TablePanel: React.FC<TablePanelProps> = ({
|
|
|
211
213
|
return (
|
|
212
214
|
<TabsContent key={idx} value={tab.tabName} className="h-[400px] mt-1">
|
|
213
215
|
<ChartPanel
|
|
216
|
+
tableData={data}
|
|
214
217
|
chartConfig={tab.config}
|
|
215
218
|
chartType={tab.chartType}
|
|
216
219
|
saveChart={saveChart}
|
|
@@ -228,6 +231,7 @@ export const TablePanel: React.FC<TablePanelProps> = ({
|
|
|
228
231
|
const CHART_PLACEHOLDER_CODE = "X and Y columns are not set";
|
|
229
232
|
|
|
230
233
|
export const ChartPanel: React.FC<{
|
|
234
|
+
tableData: unknown[];
|
|
231
235
|
chartConfig: ChartSchemaType | null;
|
|
232
236
|
chartType: ChartType;
|
|
233
237
|
saveChart: (formValues: ChartSchemaType) => void;
|
|
@@ -235,6 +239,7 @@ export const ChartPanel: React.FC<{
|
|
|
235
239
|
getDataUrl?: GetDataUrl;
|
|
236
240
|
fieldTypes?: FieldTypesWithExternalType | null;
|
|
237
241
|
}> = ({
|
|
242
|
+
tableData,
|
|
238
243
|
chartConfig,
|
|
239
244
|
chartType,
|
|
240
245
|
saveChart,
|
|
@@ -255,7 +260,7 @@ export const ChartPanel: React.FC<{
|
|
|
255
260
|
const { ref: chartContainerRef } = useResizeObserver();
|
|
256
261
|
|
|
257
262
|
const { data, isPending, error } = useAsyncData(async () => {
|
|
258
|
-
if (!getDataUrl) {
|
|
263
|
+
if (!getDataUrl || tableData.length === 0) {
|
|
259
264
|
return [];
|
|
260
265
|
}
|
|
261
266
|
|
|
@@ -276,7 +281,8 @@ export const ChartPanel: React.FC<{
|
|
|
276
281
|
},
|
|
277
282
|
);
|
|
278
283
|
return chartData;
|
|
279
|
-
|
|
284
|
+
// Re-run when the data table changes
|
|
285
|
+
}, [tableData]);
|
|
280
286
|
|
|
281
287
|
const formValues = form.watch();
|
|
282
288
|
|
|
@@ -5,7 +5,7 @@ import { capitalize } from "lodash-es";
|
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import type { CellId } from "@/core/cells/ids";
|
|
7
7
|
import { Logger } from "@/utils/Logger";
|
|
8
|
-
import { NotebookScopedLocalStorage } from "@/utils/
|
|
8
|
+
import { NotebookScopedLocalStorage } from "@/utils/storage/typed";
|
|
9
9
|
import type { TypedString } from "@/utils/typed";
|
|
10
10
|
import { ChartSchema, type ChartSchemaType } from "./schemas";
|
|
11
11
|
import type { ChartType } from "./types";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
2
|
"use no memo";
|
|
3
3
|
|
|
4
|
-
import type { Column } from "@tanstack/react-table";
|
|
4
|
+
import type { Column, Table } from "@tanstack/react-table";
|
|
5
5
|
import { capitalize } from "lodash-es";
|
|
6
6
|
import { FilterIcon, MinusIcon, TextIcon, XIcon } from "lucide-react";
|
|
7
7
|
import { useMemo, useRef, useState } from "react";
|
|
@@ -68,6 +68,7 @@ interface DataTableColumnHeaderProps<TData, TValue>
|
|
|
68
68
|
column: Column<TData, TValue>;
|
|
69
69
|
header: React.ReactNode;
|
|
70
70
|
calculateTopKRows?: CalculateTopKRows;
|
|
71
|
+
table?: Table<TData>;
|
|
71
72
|
}
|
|
72
73
|
|
|
73
74
|
export const DataTableColumnHeader = <TData, TValue>({
|
|
@@ -75,6 +76,7 @@ export const DataTableColumnHeader = <TData, TValue>({
|
|
|
75
76
|
header,
|
|
76
77
|
className,
|
|
77
78
|
calculateTopKRows,
|
|
79
|
+
table,
|
|
78
80
|
}: DataTableColumnHeaderProps<TData, TValue>) => {
|
|
79
81
|
const [isFilterValueOpen, setIsFilterValueOpen] = useState(false);
|
|
80
82
|
const { locale } = useLocale();
|
|
@@ -117,7 +119,7 @@ export const DataTableColumnHeader = <TData, TValue>({
|
|
|
117
119
|
</DropdownMenuTrigger>
|
|
118
120
|
<DropdownMenuContent align="start">
|
|
119
121
|
{renderDataType(column)}
|
|
120
|
-
{renderSorts(column)}
|
|
122
|
+
{renderSorts(column, table)}
|
|
121
123
|
{renderCopyColumn(column)}
|
|
122
124
|
{renderColumnPinning(column)}
|
|
123
125
|
{renderColumnWrapping(column)}
|
|
@@ -13,6 +13,8 @@ import type {
|
|
|
13
13
|
ColumnWrappingTableState,
|
|
14
14
|
} from "./types";
|
|
15
15
|
|
|
16
|
+
export const COLUMN_WRAPPING_STYLES = "whitespace-pre-wrap min-w-[200px]";
|
|
17
|
+
|
|
16
18
|
export const ColumnWrappingFeature: TableFeature = {
|
|
17
19
|
getInitialState: (state): ColumnWrappingTableState => {
|
|
18
20
|
return {
|
|
@@ -21,6 +21,7 @@ import { Tooltip } from "../ui/tooltip";
|
|
|
21
21
|
import { DataTableColumnHeader } from "./column-header";
|
|
22
22
|
import type { ColumnChartSpecModel } from "./column-summary/chart-spec-model";
|
|
23
23
|
import { TableColumnSummary } from "./column-summary/column-summary";
|
|
24
|
+
import { COLUMN_WRAPPING_STYLES } from "./column-wrapping/feature";
|
|
24
25
|
import { DatePopover } from "./date-popover";
|
|
25
26
|
import type { FilterType } from "./filters";
|
|
26
27
|
import { getMimeValues, MimeCell } from "./mime-cell";
|
|
@@ -165,7 +166,7 @@ export function generateColumns<T>({
|
|
|
165
166
|
return row[key as keyof T];
|
|
166
167
|
},
|
|
167
168
|
|
|
168
|
-
header: ({ column }) => {
|
|
169
|
+
header: ({ column, table }) => {
|
|
169
170
|
const stats = chartSpecModel?.getColumnStats(key);
|
|
170
171
|
const dtype = column.columnDef.meta?.dtype;
|
|
171
172
|
const headerTitle = headerTooltip?.[key];
|
|
@@ -208,6 +209,7 @@ export function generateColumns<T>({
|
|
|
208
209
|
header={headerWithTooltip}
|
|
209
210
|
column={column}
|
|
210
211
|
calculateTopKRows={calculateTopKRows}
|
|
212
|
+
table={table}
|
|
211
213
|
/>
|
|
212
214
|
);
|
|
213
215
|
|
|
@@ -314,6 +316,7 @@ const PopoutColumn = ({
|
|
|
314
316
|
rawStringValue,
|
|
315
317
|
contentClassName,
|
|
316
318
|
buttonText,
|
|
319
|
+
wrapped,
|
|
317
320
|
children,
|
|
318
321
|
}: {
|
|
319
322
|
cellStyles?: string;
|
|
@@ -321,6 +324,7 @@ const PopoutColumn = ({
|
|
|
321
324
|
rawStringValue: string;
|
|
322
325
|
contentClassName?: string;
|
|
323
326
|
buttonText?: string;
|
|
327
|
+
wrapped?: boolean;
|
|
324
328
|
children: React.ReactNode;
|
|
325
329
|
}) => {
|
|
326
330
|
return (
|
|
@@ -335,7 +339,10 @@ const PopoutColumn = ({
|
|
|
335
339
|
}}
|
|
336
340
|
>
|
|
337
341
|
<span
|
|
338
|
-
className=
|
|
342
|
+
className={cn(
|
|
343
|
+
"cursor-pointer hover:text-link",
|
|
344
|
+
wrapped && COLUMN_WRAPPING_STYLES,
|
|
345
|
+
)}
|
|
339
346
|
title={rawStringValue}
|
|
340
347
|
>
|
|
341
348
|
{rawStringValue}
|
|
@@ -407,7 +414,7 @@ function getCellStyleClass(
|
|
|
407
414
|
"truncate",
|
|
408
415
|
justify === "center" && "text-center",
|
|
409
416
|
justify === "right" && "text-right",
|
|
410
|
-
wrapped &&
|
|
417
|
+
wrapped && `${COLUMN_WRAPPING_STYLES} break-words`,
|
|
411
418
|
);
|
|
412
419
|
}
|
|
413
420
|
|
|
@@ -516,6 +523,7 @@ export function renderCellValue<TData, TValue>({
|
|
|
516
523
|
rawStringValue={stringValue}
|
|
517
524
|
contentClassName="max-h-64 overflow-auto whitespace-pre-wrap break-words text-sm"
|
|
518
525
|
buttonText="X"
|
|
526
|
+
wrapped={column.getColumnWrapping?.() === "wrap"}
|
|
519
527
|
>
|
|
520
528
|
<UrlDetector parts={parts} />
|
|
521
529
|
</PopoutColumn>
|
|
@@ -557,6 +565,7 @@ export function renderCellValue<TData, TValue>({
|
|
|
557
565
|
cellStyles={cellStyles}
|
|
558
566
|
selectCell={selectCell}
|
|
559
567
|
rawStringValue={rawStringValue}
|
|
568
|
+
wrapped={column.getColumnWrapping?.() === "wrap"}
|
|
560
569
|
>
|
|
561
570
|
<JsonOutput data={value} format="tree" className="max-h-64" />
|
|
562
571
|
</PopoutColumn>
|
|
@@ -215,8 +215,13 @@ const DataTableInternal = <TData,>({
|
|
|
215
215
|
manualPagination: manualPagination,
|
|
216
216
|
getPaginationRowModel: getPaginationRowModel(),
|
|
217
217
|
// sorting
|
|
218
|
-
...(setSorting
|
|
218
|
+
...(setSorting
|
|
219
|
+
? {
|
|
220
|
+
onSortingChange: setSorting,
|
|
221
|
+
}
|
|
222
|
+
: {}),
|
|
219
223
|
manualSorting: manualSorting,
|
|
224
|
+
enableMultiSort: true,
|
|
220
225
|
getSortedRowModel: getSortedRowModel(),
|
|
221
226
|
// filtering
|
|
222
227
|
manualFiltering: true,
|
|
@@ -302,7 +307,7 @@ const DataTableInternal = <TData,>({
|
|
|
302
307
|
)}
|
|
303
308
|
<Table className="relative" ref={tableRef}>
|
|
304
309
|
{showLoadingBar && (
|
|
305
|
-
<
|
|
310
|
+
<thead className="absolute top-0 left-0 h-[3px] w-1/2 bg-primary animate-slide" />
|
|
306
311
|
)}
|
|
307
312
|
{renderTableHeader(table, Boolean(maxHeight))}
|
|
308
313
|
<CellSelectionProvider>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { PinLeftIcon, PinRightIcon } from "@radix-ui/react-icons";
|
|
4
|
-
import type { Column } from "@tanstack/react-table";
|
|
4
|
+
import type { Column, SortDirection, Table } from "@tanstack/react-table";
|
|
5
5
|
import {
|
|
6
6
|
AlignJustifyIcon,
|
|
7
7
|
ArrowDownWideNarrowIcon,
|
|
@@ -163,27 +163,80 @@ export function renderCopyColumn<TData, TValue>(column: Column<TData, TValue>) {
|
|
|
163
163
|
const AscIcon = ArrowUpNarrowWideIcon;
|
|
164
164
|
const DescIcon = ArrowDownWideNarrowIcon;
|
|
165
165
|
|
|
166
|
-
export function renderSorts<TData, TValue>(
|
|
166
|
+
export function renderSorts<TData, TValue>(
|
|
167
|
+
column: Column<TData, TValue>,
|
|
168
|
+
table?: Table<TData>,
|
|
169
|
+
) {
|
|
167
170
|
if (!column.getCanSort()) {
|
|
168
171
|
return null;
|
|
169
172
|
}
|
|
170
173
|
|
|
174
|
+
const sortDirection = column.getIsSorted();
|
|
175
|
+
const sortingIndex = column.getSortIndex();
|
|
176
|
+
|
|
177
|
+
const sortingState = table?.getState().sorting;
|
|
178
|
+
const hasMultiSort = sortingState?.length && sortingState.length > 1;
|
|
179
|
+
|
|
180
|
+
const renderSortIndex = () => {
|
|
181
|
+
return (
|
|
182
|
+
<span className="ml-auto text-xs font-medium">{sortingIndex + 1}</span>
|
|
183
|
+
);
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const renderClearSort = () => {
|
|
187
|
+
if (!sortDirection) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (!hasMultiSort) {
|
|
192
|
+
// render clear sort for this column
|
|
193
|
+
return (
|
|
194
|
+
<DropdownMenuItem onClick={() => column.clearSorting()}>
|
|
195
|
+
<ChevronsUpDown className="mo-dropdown-icon" />
|
|
196
|
+
Clear sort
|
|
197
|
+
</DropdownMenuItem>
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// render clear sort for all columns
|
|
202
|
+
return (
|
|
203
|
+
<DropdownMenuItem onClick={() => table?.resetSorting()}>
|
|
204
|
+
<ChevronsUpDown className="mo-dropdown-icon" />
|
|
205
|
+
Clear all sorts
|
|
206
|
+
</DropdownMenuItem>
|
|
207
|
+
);
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const toggleSort = (direction: SortDirection) => {
|
|
211
|
+
// Clear sort if clicking the same direction
|
|
212
|
+
if (sortDirection === direction) {
|
|
213
|
+
column.clearSorting();
|
|
214
|
+
} else {
|
|
215
|
+
// Toggle sort direction
|
|
216
|
+
const descending = direction === "desc";
|
|
217
|
+
column.toggleSorting(descending, true);
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
|
|
171
221
|
return (
|
|
172
222
|
<>
|
|
173
|
-
<DropdownMenuItem
|
|
223
|
+
<DropdownMenuItem
|
|
224
|
+
onClick={() => toggleSort("asc")}
|
|
225
|
+
className={sortDirection === "asc" ? "bg-accent" : ""}
|
|
226
|
+
>
|
|
174
227
|
<AscIcon className="mo-dropdown-icon" />
|
|
175
228
|
Asc
|
|
229
|
+
{sortDirection === "asc" && renderSortIndex()}
|
|
176
230
|
</DropdownMenuItem>
|
|
177
|
-
<DropdownMenuItem
|
|
231
|
+
<DropdownMenuItem
|
|
232
|
+
onClick={() => toggleSort("desc")}
|
|
233
|
+
className={sortDirection === "desc" ? "bg-accent" : ""}
|
|
234
|
+
>
|
|
178
235
|
<DescIcon className="mo-dropdown-icon" />
|
|
179
236
|
Desc
|
|
237
|
+
{sortDirection === "desc" && renderSortIndex()}
|
|
180
238
|
</DropdownMenuItem>
|
|
181
|
-
{
|
|
182
|
-
<DropdownMenuItem onClick={() => column.clearSorting()}>
|
|
183
|
-
<ChevronsUpDown className="mo-dropdown-icon" />
|
|
184
|
-
Clear sort
|
|
185
|
-
</DropdownMenuItem>
|
|
186
|
-
)}
|
|
239
|
+
{renderClearSort()}
|
|
187
240
|
<DropdownMenuSeparator />
|
|
188
241
|
</>
|
|
189
242
|
);
|