@marimo-team/islands 0.17.0 → 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-blsKUrtN.js → Combination-De9yoNY5.js} +132 -69
- package/dist/{ConnectedDataExplorerComponent-DJEUH6Bb.js → ConnectedDataExplorerComponent-DuvpJOKp.js} +45 -44
- package/dist/{ImageComparisonComponent-D4Tv9QzJ.js → ImageComparisonComponent--etUl2pp.js} +2 -2
- package/dist/{_baseIsEqual-CN4oFUZ4.js → _baseIsEqual-BFlyFUxC.js} +1 -1
- package/dist/{_basePickBy-CzSvE_-f.js → _basePickBy-gCCvtjgp.js} +3 -3
- package/dist/{_baseProperty-DbbUiyUD.js → _baseProperty-BuqBC0Ie.js} +5 -5
- package/dist/{_baseUniq-DwoC-LVO.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-CoBORy6u.js → architectureDiagram-W76B3OCA-CrK99pJi.js} +38 -37
- 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-vPn7gxWj.js → worker-B6tH8gPO.js} +3 -3
- package/dist/{blockDiagram-QIGZ2CNN-0yzoLIar.js → blockDiagram-QIGZ2CNN-BJOEyO6w.js} +47 -46
- package/dist/brainfuck-ClvDI1dq.js +4 -0
- package/dist/{button-DcnBVpVa.js → button-ADXOb_gX.js} +27 -27
- package/dist/{c4Diagram-FPNF74CW-CKsIA_DD.js → c4Diagram-FPNF74CW-7Pz_X9wF.js} +12 -11
- package/dist/{channel-3LVvQZcD.js → channel-X-wRUxX6.js} +1 -1
- package/dist/{check-D7ifz5op.js → check-COlaG7Ss.js} +1 -1
- package/dist/{chunk-3AY6CYHV-B2C-aVc3.js → chunk-3AY6CYHV-BQH2fFpA.js} +10 -10
- package/dist/{chunk-4BX2VUAB-DEd4VI9L.js → chunk-4BX2VUAB-D-QtDCKM.js} +1 -1
- package/dist/{chunk-4KMFLZZN-DnvP3O4K.js → chunk-4KMFLZZN-BirZvvJS.js} +13 -13
- package/dist/{chunk-55IACEB6-BcCzwOOl.js → chunk-55IACEB6-DjtPYZKs.js} +1 -1
- package/dist/{chunk-6OXUPJBA-eNAAfJ3Q.js → chunk-6OXUPJBA-CTnnqlzw.js} +7 -7
- package/dist/{chunk-7GE3RBXV-CSAeQvLz.js → chunk-7GE3RBXV-CT47hCrL.js} +1 -1
- package/dist/{chunk-ABZYJK2D-CZcb_1iM.js → chunk-ABZYJK2D-B6ZsU6SR.js} +484 -1039
- package/dist/{chunk-BN7GFLIU-pBc5O5Rh.js → chunk-BN7GFLIU-DYWEsrG4.js} +1 -1
- package/dist/{chunk-CVBHYZKI-CivHZg9P.js → chunk-CVBHYZKI-BuzDGXz0.js} +1 -1
- package/dist/{chunk-CXMOBAN2-Dd0E6qb0.js → chunk-CXMOBAN2-Bas2S5w1.js} +6 -6
- package/dist/{chunk-EXTU4WIE-GQ2ZWfJo.js → chunk-EXTU4WIE-DXwNSukz.js} +2 -2
- package/dist/{chunk-FMBD7UC4-C6YcisV6.js → chunk-FMBD7UC4-CYKEpuPr.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-DYeQaT57.js → chunk-JA3XYJ7Z-DcxfkcDC.js} +4 -4
- package/dist/{chunk-JEIROHC2-B-EZMP4V.js → chunk-JEIROHC2-C01ZIcIG.js} +1 -1
- package/dist/{chunk-K7UQS3LO-DENzlS-M.js → chunk-K7UQS3LO-CmbT97MV.js} +7 -7
- package/dist/{chunk-KMC2YHZD-SckhHdEh.js → chunk-KMC2YHZD-D64m-1E1.js} +1 -1
- package/dist/{chunk-QN33PNHL-Cjq5b604.js → chunk-QN33PNHL-DjB0j8Dr.js} +2 -2
- package/dist/{chunk-QYVHNE3D-CNUuivie.js → chunk-QYVHNE3D-VA4W4oxG.js} +2 -2
- package/dist/{chunk-QZHKN3VN-DugEU_bA.js → chunk-QZHKN3VN-KT0fl3Em.js} +1 -1
- package/dist/{chunk-S3R3BYOJ-itCT6Vif.js → chunk-S3R3BYOJ-C5zmcMvn.js} +6 -6
- package/dist/{chunk-T44TD3VJ-BLdfTX8J.js → chunk-T44TD3VJ-BMOgu-Hk.js} +1 -1
- package/dist/{chunk-TVAH2DTR-BOnwF9d8.js → chunk-TVAH2DTR-eKm8SKnH.js} +6 -6
- package/dist/{chunk-TZMSLE5B-DGs66AlL.js → chunk-TZMSLE5B-CQxFRiI2.js} +3 -3
- package/dist/{chunk-WFRQ32O7-CPsipkmJ.js → chunk-WFRQ32O7-Dg51o277.js} +1 -1
- package/dist/{chunk-WFWHJNB7-Cmed18Pk.js → chunk-WFWHJNB7-DVLO98ge.js} +1 -1
- package/dist/{chunk-XRWGC2XP-DH5GDaY8.js → chunk-XRWGC2XP-UNFKdWQh.js} +1 -1
- package/dist/{chunk-ZPAFE4SF-DPDwaqZm.js → chunk-ZPAFE4SF-DbCSwfLK.js} +1 -1
- package/dist/classDiagram-KNZD7YFC-HUFFxNdk.js +40 -0
- package/dist/classDiagram-v2-RKCZMP56-Dw7Acmuf.js +40 -0
- package/dist/{click-outside-container-CL_FkgGY.js → click-outside-container-2BH589Bq.js} +2 -2
- package/dist/{clike-DYfRWWXk.js → clike-CytFO-kN.js} +1 -1
- package/dist/clojure-8GefCgPe.js +4 -0
- package/dist/{clone-Msbhmn2a.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-BCOEQoEQ.js → constants-BaCMVd12.js} +3 -3
- package/dist/{copy-BkZ8PkBM.js → copy-GNcK40wy.js} +2 -2
- package/dist/{cose-bilkent-S5V4N54A-BZnbwyVD.js → cose-bilkent-S5V4N54A-BnvuJG6Y.js} +3 -3
- package/dist/crystal-OdjZZ8bc.js +4 -0
- package/dist/css-DhTxMmL_.js +5 -0
- package/dist/cypher-CgN8E3YI.js +4 -0
- package/dist/d-g41sJcBC.js +4 -0
- package/dist/{dagre-5GWH7T2D-BGaiSZZO.js → dagre-5GWH7T2D-rn7tZYaQ.js} +37 -36
- package/dist/{dagre-pyfDIOWJ.js → dagre-Bghq6VKO.js} +13 -13
- package/dist/{data-grid-overlay-editor-867aBz0Y.js → data-grid-overlay-editor-B4_Caieu.js} +4 -4
- package/dist/{diagram-N5W7TBWH-CzLE0jZB.js → diagram-N5W7TBWH-lbF94o-g.js} +41 -40
- package/dist/{diagram-QEK2KX5R-AGS60xEZ.js → diagram-QEK2KX5R-CKBhSzsO.js} +35 -34
- package/dist/{diagram-S2PKOQOG-BxRoG6yW.js → diagram-S2PKOQOG-161_1f53.js} +35 -34
- package/dist/diff-ViRYYhhg.js +4 -0
- package/dist/{dist-PGgOcwbF.js → dist-28HYzERB.js} +2 -2
- package/dist/{dist-CfQHSIQC.js → dist-4dtbqf8A.js} +3 -3
- package/dist/{dist-CYhQCVru.js → dist-71jYYbWP.js} +2 -2
- package/dist/{dist-Cacac5HV.js → dist-B8Pbw5ln.js} +2 -2
- package/dist/{dist-z_iuDES7.js → dist-BAqp4Vtl.js} +1 -1
- package/dist/{dist-RwqAqkpG.js → dist-BBhmkni2.js} +1 -1
- package/dist/{dist-DMxl6Qbu.js → dist-BNRdMfJH.js} +2 -2
- package/dist/{dist-Doiq_KIP.js → dist-BSyYM1Gi.js} +6 -6
- package/dist/{dist-NUdHX0XE.js → dist-BYHiiJB-.js} +2 -2
- package/dist/{dist-B0YD1aXi.js → dist-B_wjJqqS.js} +2 -2
- package/dist/{dist-DBhEu3-F.js → dist-BaPjLM6s.js} +1 -1
- package/dist/dist-BfJO8Bm9.js +12 -0
- package/dist/{dist-BFkr6kAQ.js → dist-BqdQPWpQ.js} +2 -2
- package/dist/{dist-DlHkZUnY.js → dist-C2IEc8og.js} +5 -5
- package/dist/{dist-DS6nuHYK.js → dist-C9-uHBqC.js} +1 -1
- package/dist/{dist-B1Dv8Sdk.js → dist-CJb8EiFO.js} +3 -3
- package/dist/dist-CLuF3AtO.js +6 -0
- package/dist/{dist-CId4IPXu.js → dist-CNAkUyxv.js} +1 -1
- package/dist/{dist-RdxOJbBw.js → dist-CNvMOZu9.js} +2 -2
- package/dist/{dist-C7zhQ7K0.js → dist-CPNnKuPh.js} +1 -1
- package/dist/{dist-ivwkJchV.js → dist-CTIyD_KU.js} +3 -3
- package/dist/dist-CU04U4NL.js +10 -0
- package/dist/{dist-D-3fICwh.js → dist-CWh5ZwcC.js} +2 -2
- package/dist/{dist-d5NxvX2s.js → dist-CWqB4bg8.js} +3 -3
- package/dist/{dist-biZ846D9.js → dist-CtOeHDJp.js} +5 -5
- package/dist/{dist-BL2DSY0P.js → dist-Cw0F6l-7.js} +1 -1
- package/dist/{dist-wHVprCkn.js → dist-CwZcC4om.js} +1 -1
- package/dist/dist-DNUT6b47.js +6 -0
- package/dist/{dist-CZq5-ZyD.js → dist-Da046MhT.js} +1 -1
- package/dist/{dist-reo2kYlN.js → dist-DaTVdKJa.js} +2 -2
- package/dist/dist-DbAb2sY7.js +6 -0
- package/dist/dist-DiDFQ2Rk.js +6 -0
- package/dist/{dist-BpzZrRd6.js → dist-DlK420ke.js} +1 -1
- package/dist/{dist-CvyfRaIr.js → dist-Drf3cyIW.js} +3 -3
- package/dist/{dist-2Ne-33Xy.js → dist-DxESp2-T.js} +3 -3
- package/dist/{dist-CkvGMBAS.js → dist-DzJem5xc.js} +1 -1
- package/dist/{dist-y8uoXYaE.js → dist-O0zVziwn.js} +3 -3
- package/dist/dist-SNAyAOJ-.js +6 -0
- package/dist/{dist-BhVFggab.js → dist-_4cudra1.js} +3 -3
- package/dist/dist-cbW5xJNV.js +6 -0
- package/dist/dist-h8eGLSbK.js +10 -0
- package/dist/{dist-CBhnQKQ4.js → dist-xLN9qCAp.js} +3 -3
- package/dist/{dockerfile-sZMPcXVY.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-CTxzb-U8.js → erDiagram-AWTI2OKA-BU7Qig7n.js} +30 -29
- package/dist/erlang-pfp22AZM.js +4 -0
- package/dist/error-banner-BAWlXn49.js +1012 -0
- package/dist/{esm-CAWW9sum.js → esm-AtKNNGYO.js} +1 -1
- package/dist/esm-B2pocBPL.js +26 -0
- package/dist/{esm-BdiY4QsX.js → esm-Oo8OvZ6m.js} +110 -110
- package/dist/{esm-YY5zh7KV.js → esm-YVnxJqkD.js} +20 -20
- package/dist/{factor-CRFTmP_a.js → factor-BZnBK3CG.js} +1 -1
- package/dist/factor-CEn53jua.js +5 -0
- package/dist/{flowDiagram-PVAE7QVJ-Dck2hiJe.js → flowDiagram-PVAE7QVJ-JKJebWeY.js} +39 -38
- package/dist/{formats-BnqXUb1V.js → formats-DOEuF6TR.js} +8 -8
- package/dist/forth-CL8vu_y8.js +4 -0
- package/dist/fortran-DsmXkYtE.js +4 -0
- package/dist/{ganttDiagram-OWAHRB6G-AWzfzpup.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-GyNboWSV.js → gitGraphDiagram-NY62KEGX-VEJJBf5L.js} +35 -34
- package/dist/{glide-data-editor-DHuN8kQ8.js → glide-data-editor-Bne10icG.js} +87 -85
- package/dist/{graphlib-hb3zmtVD.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-Ct2T3e9O.js → hotkeys-DVxFjl2s.js} +12 -0
- 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/{isEmpty--odfYjh1.js → isEmpty-Do_v2sls.js} +2 -2
- package/dist/{isSymbol-Cb1f2HgO.js → isSymbol-CtkA8Y0a.js} +1 -1
- package/dist/javascript-QY2BGJeV.js +5 -0
- package/dist/jinja2-Czleq7Sk.js +4 -0
- package/dist/{journeyDiagram-BIP6EPQ6-TmXYCUbT.js → journeyDiagram-BIP6EPQ6-CsgEQgxh.js} +10 -9
- package/dist/julia-Dru3Qi0y.js +4 -0
- package/dist/{kanban-definition-6OIFK2YF-B6ozleHo.js → kanban-definition-6OIFK2YF-Bi8Ete2P.js} +42 -41
- package/dist/{katex-mPzRsXEy.js → katex-C-g3rKKt.js} +1 -1
- package/dist/{label-VVRKZmrP.js → label-BiVIU_wb.js} +245 -243
- package/dist/{line-C6-zz71o.js → line-B7-GoF1m.js} +3 -3
- package/dist/{linear-iebAbJVD.js → linear-DeGGALuc.js} +4 -4
- package/dist/livescript-Dxqi_HLT.js +4 -0
- package/dist/{loader-CM0VALo9.js → loader-BBqwtZWj.js} +3 -3
- package/dist/lua-ByH1cUQZ.js +4 -0
- package/dist/main.js +11785 -11529
- package/dist/mathematica-CWJIFuES.js +4 -0
- package/dist/mbox-qhPIGaUI.js +4 -0
- package/dist/{memoize-DYoRBSLn.js → memoize-D7eDkf3R.js} +1 -1
- package/dist/{merge-BjuR6j_w.js → merge-C_6cGM6o.js} +1 -1
- package/dist/{mermaid-YPPMBmhk.js → mermaid-BmtvsZ2m.js} +323 -321
- package/dist/{mermaid-parser.core-BLkyTSZj.js → mermaid-parser.core-geyG_6o0.js} +8 -8
- package/dist/{mhchem-Dw7wvXtr.js → mhchem-OhAaJ0fA.js} +1 -1
- package/dist/{min-B_i2ahn4.js → min-Dwa_NbP6.js} +7 -7
- package/dist/{mindmap-definition-Q6HEUPPD-F6-JnXwq.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/{now-CwRqw0nS.js → now-DumxsrcX.js} +1 -1
- package/dist/{nsis-BWJEeUyS.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-CeyruAX4.js → number-overlay-editor-D6r-48ka.js} +2 -2
- 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-C5dSQVCn.js → pieDiagram-ADFJNKIX-C3GvPNUL.js} +40 -39
- package/dist/pig-CLBjzQmc.js +4 -0
- package/dist/powershell-B_qvE33J.js +4 -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-PJh82u1M.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-CCVgEip7.js +4 -0
- package/dist/{quadrantDiagram-LMRXKWRM-DlahxNiy.js → quadrantDiagram-LMRXKWRM-DPXwGNVa.js} +8 -7
- package/dist/r-CIdR0Sfs.js +4 -0
- package/dist/radar-NJJJXTRR-0adgjw0u.js +21 -0
- package/dist/{range-DxfkexCE.js → range-CIbLpsrs.js} +3 -3
- package/dist/{react-plotly-D_IAfR8f.js → react-plotly-DYyvxcRD.js} +1 -1
- package/dist/{requirementDiagram-4UW4RH46-DTkinyvU.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-CsLnEnnq.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-BdEOR6SC.js → sequenceDiagram-C3RYC4MD-lbtovKTa.js} +14 -13
- package/dist/shell-D3eXGsHd.js +4 -0
- package/dist/sieve-BdwSFdWJ.js +4 -0
- package/dist/{slides-component-2bbal1YJ.js → slides-component-BoeQU7-s.js} +999 -998
- package/dist/smalltalk-BTYJquCm.js +4 -0
- package/dist/sparql-CYF0g4Cc.js +4 -0
- package/dist/{src-DZkaBUmt.js → src-BTqT1mA1.js} +1 -1
- package/dist/{stateDiagram-KXAO66HF-DQLH2jhP.js → stateDiagram-KXAO66HF-BmbR-Rol.js} +40 -39
- 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-CFkXkVrt.js → time-BB30r1tK.js} +4 -4
- package/dist/{timeline-definition-XQNQX7LJ-bToVq14i.js → timeline-definition-XQNQX7LJ-1mv5caPW.js} +16 -15
- package/dist/{toNumber-EFF1Z9T1.js → toNumber-D3Ystr3y.js} +2 -2
- package/dist/{toString-C2mCkasT.js → toString-CbuxCRDG.js} +2 -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-CRXV0KD5.js → types-BPohCsA7.js} +141 -210
- package/dist/{useAsyncData-uMVTsDI9.js → useAsyncData-DHBqeb9a.js} +3 -2
- package/dist/{useDateFormatter-Dcz7jstn.js → useDateFormatter-BkbjKw83.js} +9 -9
- package/dist/useIframeCapabilities-BEvvwlwt.js +46 -0
- package/dist/{useTheme-NbEx-ZNV.js → useTheme-CnMbo-iq.js} +23 -23
- package/dist/vb-CL7fRwRw.js +4 -0
- package/dist/vbscript-CR2xfxpw.js +4 -0
- package/dist/{vega-component-hegVmfuS.js → vega-component-BfFcXZxw.js} +40 -39
- package/dist/{vega-loader.browser.module-DcW8jnKp.js → vega-loader.browser.module-CFMtdrNw.js} +3 -3
- 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-C7Bhm_yt.js → xychartDiagram-6GGTOJPD-njc-naaw.js} +23 -22
- package/dist/yacas-BbgBReEH.js +4 -0
- package/dist/z80-DPyb8VGz.js +4 -0
- package/package.json +10 -6
- 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 -223
- 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 +5 -1
- package/src/components/chat/markdown-renderer.css +1 -0
- package/src/components/chat/tool-call-accordion.tsx +7 -1
- 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-wrapping/feature.ts +2 -0
- package/src/components/data-table/columns.tsx +10 -2
- package/src/components/data-table/renderers.tsx +3 -2
- package/src/components/editor/Output.tsx +28 -24
- 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 +79 -32
- package/src/components/editor/ai/completion-handlers.tsx +26 -7
- package/src/components/editor/cell/StagedAICell.tsx +81 -12
- package/src/components/editor/cell/code/cell-editor.tsx +2 -3
- package/src/components/editor/cell/useRunCells.ts +62 -30
- package/src/components/editor/chrome/panels/cache-panel.tsx +2 -2
- 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/wrapper/app-chrome.tsx +2 -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/fix-mode.ts +6 -1
- package/src/components/editor/inputs/Inputs.styles.ts +1 -1
- package/src/components/editor/output/CalloutOutput.tsx +1 -1
- package/src/components/editor/output/HtmlOutput.tsx +3 -2
- package/src/components/editor/output/JsonOutput.tsx +6 -1
- package/src/components/editor/output/MarimoTracebackOutput.tsx +59 -45
- package/src/components/editor/output/__tests__/HtmlOutput.test.tsx +134 -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 +34 -32
- package/src/components/editor/renderers/vertical-layout/vertical-layout-wrapper.tsx +5 -2
- package/src/components/home/state.ts +3 -2
- package/src/components/scratchpad/scratchpad-history.ts +6 -1
- package/src/components/slides/slides-component.tsx +25 -21
- package/src/components/ui/confirmation-button.tsx +1 -1
- 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/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/cell-output.ts +170 -112
- 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 +2 -1
- package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +556 -0
- package/src/core/ai/tools/__tests__/registry.test.ts +12 -4
- 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 +31 -8
- package/src/core/ai/tools/edit-notebook-tool.ts +239 -0
- package/src/core/ai/tools/registry.ts +13 -6
- package/src/core/ai/tools/run-cells-tool.ts +233 -0
- package/src/core/ai/tools/sample-tool.ts +10 -8
- package/src/core/ai/tools/utils.ts +23 -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 +12 -7
- package/src/core/cells/session.ts +1 -1
- package/src/core/codemirror/ai/resources.ts +13 -2
- package/src/core/codemirror/copilot/state.ts +4 -2
- package/src/core/codemirror/language/__tests__/extension.test.ts +10 -2
- package/src/core/codemirror/language/languages/markdown.ts +16 -153
- package/src/core/codemirror/language/languages/python.ts +12 -7
- package/src/core/codemirror/language/languages/sql/sql-mode.ts +6 -1
- package/src/core/codemirror/language/languages/sql/sql.ts +20 -293
- package/src/core/codemirror/language/panel/markdown.tsx +2 -1
- package/src/core/codemirror/language/panel/panel.tsx +1 -1
- package/src/core/codemirror/lsp/federated-lsp.ts +1 -1
- package/src/core/codemirror/lsp/transports.ts +7 -13
- package/src/core/config/config-schema.ts +4 -1
- package/src/core/hotkeys/hotkeys.ts +12 -0
- package/src/core/lsp/__tests__/transport.test.ts +233 -0
- package/src/core/lsp/transport.ts +139 -0
- package/src/core/rtc/state.ts +6 -1
- package/src/core/vscode/is-in-vscode.ts +9 -0
- package/src/core/wasm/store.ts +1 -1
- package/src/css/app/Cell.css +31 -0
- package/src/css/globals.css +5 -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 +14 -1
- package/src/plugins/core/sanitize.ts +76 -0
- package/src/plugins/impl/DataTablePlugin.tsx +1 -0
- package/src/plugins/impl/FileBrowserPlugin.tsx +1 -3
- package/src/plugins/impl/FileUploadPlugin.tsx +1 -3
- package/src/plugins/impl/__tests__/DateTimePickerPlugin.test.tsx +8 -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/plotly/parse-from-template.ts +1 -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 +13 -13
- 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/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-CEXn1vFs.js +0 -156
- package/dist/apl-DuVfHsPc.js +0 -4
- package/dist/architecture-O4VJ6CD3-lp-opOaL.js +0 -21
- package/dist/asciiarmor-qIVWsi4F.js +0 -4
- package/dist/asn1-BjPqARr7.js +0 -4
- package/dist/assets/__vite-browser-external-lX-sn9m2.js +0 -1
- package/dist/brainfuck-DPGTVfkE.js +0 -4
- package/dist/classDiagram-KNZD7YFC-azuS_99k.js +0 -39
- package/dist/classDiagram-v2-RKCZMP56-CQpyQQOR.js +0 -39
- package/dist/clojure-ATksAecl.js +0 -4
- package/dist/cmake-CWylaz2C.js +0 -4
- package/dist/cobol-BiLLCZIQ.js +0 -4
- package/dist/coffeescript-Ca4jipi8.js +0 -4
- package/dist/commonlisp-BwFjyEC7.js +0 -4
- package/dist/crystal-BhUsQHbh.js +0 -4
- package/dist/css-Cf4wlIyV.js +0 -5
- package/dist/cypher-Dj8Hzgxa.js +0 -4
- package/dist/d-DZI7tbTy.js +0 -4
- package/dist/diff-WQISUHG5.js +0 -4
- package/dist/dist-BawZu0ix.js +0 -10
- package/dist/dist-BiOF7987.js +0 -6
- package/dist/dist-Cs3McXEj.js +0 -6
- package/dist/dist-D3aaithT.js +0 -6
- package/dist/dist-DELcMSpJ.js +0 -6
- package/dist/dist-Dgts3WXd.js +0 -6
- package/dist/dist-DtpUiDG_.js +0 -6
- package/dist/dist-ZjnJq_jD.js +0 -10
- package/dist/dist-mof3iuBu.js +0 -12
- package/dist/dtd-B2M8dhfC.js +0 -4
- package/dist/dylan-CU3Vt8SC.js +0 -4
- package/dist/ecl-B8ESAVq4.js +0 -4
- package/dist/eiffel-DDfMIKeA.js +0 -4
- package/dist/elm-Bj6rj8jf.js +0 -4
- package/dist/erlang-BxyshZUq.js +0 -4
- package/dist/error-banner-npbEfanI.js +0 -1012
- package/dist/esm-svAVli9f.js +0 -26
- package/dist/factor-CYk6XT8r.js +0 -5
- package/dist/forth-fcoJkd-f.js +0 -4
- package/dist/fortran-IxZHu4wc.js +0 -4
- package/dist/gas-B8rmKcim.js +0 -4
- package/dist/gherkin-BTm-jIdJ.js +0 -4
- package/dist/gitGraph-ZV4HHKMB-DFg_OLQb.js +0 -21
- package/dist/groovy-01kRHFMD.js +0 -4
- package/dist/haskell-B3PhE05w.js +0 -4
- package/dist/haxe-DEoAm8oA.js +0 -5
- package/dist/idl-DsDJU9cV.js +0 -4
- package/dist/info-63CPKGFF-D3DZmDBa.js +0 -21
- package/dist/infoDiagram-STP46IZ2-ec08vi_U.js +0 -44
- package/dist/javascript-gwczVhuU.js +0 -5
- package/dist/jinja2-AkZRdFk3.js +0 -4
- package/dist/julia-_s6qe3bf.js +0 -4
- package/dist/livescript-CwPHQdv5.js +0 -4
- package/dist/lua-s7nRxkCP.js +0 -4
- package/dist/mathematica-Ci36yd1q.js +0 -4
- package/dist/mbox-DbOYMNCO.js +0 -4
- package/dist/mirc-VmNe8AwF.js +0 -4
- package/dist/mllike-BdD7SJEa.js +0 -6
- package/dist/modelica-BA4VqzC3.js +0 -4
- package/dist/mscgen-DF-5WHJm.js +0 -6
- package/dist/mumps-c_Uia_QN.js +0 -4
- package/dist/nsis-BAANGODV.js +0 -5
- package/dist/ntriples-Bslqh2Ki.js +0 -4
- package/dist/octave-DYn5ltia.js +0 -4
- package/dist/oz-B_N-StZq.js +0 -4
- package/dist/packet-HUATNLJX-CkqjFdAv.js +0 -21
- package/dist/pascal-DU4CtAUu.js +0 -4
- package/dist/perl-Bae6k32u.js +0 -4
- package/dist/pie-WTHONI2E-D0rWwX5P.js +0 -21
- package/dist/pig-DSIxUEgX.js +0 -4
- package/dist/powershell-31lcPgIF.js +0 -4
- package/dist/properties-lmYbntDG.js +0 -4
- package/dist/protobuf-BTYoCEpV.js +0 -4
- package/dist/pug-DMFM7zzO.js +0 -5
- package/dist/puppet-B0ub07d-.js +0 -4
- package/dist/python-C4jT87Nt.js +0 -5
- package/dist/q-YbPYlqRI.js +0 -4
- package/dist/r-OfNu6HAI.js +0 -4
- package/dist/radar-NJJJXTRR-Bxqv4O5a.js +0 -21
- package/dist/rpm-D_3b5peD.js +0 -5
- package/dist/ruby-CehsJy_T.js +0 -4
- package/dist/sas-DwQHzPoF.js +0 -4
- package/dist/scheme-B6ArxiQu.js +0 -4
- package/dist/shell-AHmQgDfc.js +0 -4
- package/dist/sieve-CgodKOcx.js +0 -4
- package/dist/smalltalk-BeFzDkbo.js +0 -4
- package/dist/sparql-BWxq-Lnx.js +0 -4
- package/dist/stateDiagram-v2-UMBNRL4Z-D9v8fKjF.js +0 -38
- package/dist/stex-Dvaq0qsm.js +0 -5
- package/dist/stylus-Ge0ofWlZ.js +0 -4
- package/dist/swift-CjQfbVxV.js +0 -4
- package/dist/tcl-CAGDF11K.js +0 -4
- package/dist/textile-CrXreJtf.js +0 -4
- package/dist/toml-AdLXKwEi.js +0 -4
- package/dist/treemap-75Q7IDZK-Da9Jv6a_.js +0 -21
- package/dist/troff-C-LaM2ex.js +0 -4
- package/dist/ttcn-DTclUi6T.js +0 -4
- package/dist/ttcn-cfg-BtBPbmLX.js +0 -4
- package/dist/turtle-BODDDg5O.js +0 -4
- package/dist/vb-Cb1HQHii.js +0 -4
- package/dist/vbscript-CpXOP4wZ.js +0 -4
- package/dist/velocity-Dz0rBQIk.js +0 -4
- package/dist/verilog-6Di9aLKw.js +0 -4
- package/dist/vhdl-BRNesXYc.js +0 -4
- package/dist/webidl-BpRNYIYn.js +0 -4
- package/dist/xquery-DXWcJ7b6.js +0 -4
- package/dist/yacas-DbSARPz4.js +0 -4
- package/dist/z80-DzslPj_l.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-CEHentF4.js → apl-aGhy11IM.js} +0 -0
- /package/dist/{array-aAxy08hN.js → array-DYSXIreg.js} +0 -0
- /package/dist/{asciiarmor-DURYiCS0.js → asciiarmor-DJKJ3Gkn.js} +0 -0
- /package/dist/{asn1-ETAiEoXY.js → asn1-C6f5IeNs.js} +0 -0
- /package/dist/{asterisk-DTpbbXPb.js → asterisk-DB1poX9_.js} +0 -0
- /package/dist/{brainfuck-BWQep-SA.js → brainfuck-Ch9vjun0.js} +0 -0
- /package/dist/{chunk-57QY23SG-0TxCfmy_.js → chunk-57QY23SG-BpXU7ph4.js} +0 -0
- /package/dist/{clike-bzZTreP4.js → clike-Bc2PZzZQ.js} +0 -0
- /package/dist/{clojure-BzFapDkA.js → clojure-B_lpr3zt.js} +0 -0
- /package/dist/{cmake-DvlbIC8x.js → cmake-DaocNF4I.js} +0 -0
- /package/dist/{cobol-BrEI4cPR.js → cobol-suTPtt7c.js} +0 -0
- /package/dist/{coffeescript-B6cvu8mO.js → coffeescript-CPLIvtqJ.js} +0 -0
- /package/dist/{colors-Cr_mZ2aH.js → colors-BXlG8Lmz.js} +0 -0
- /package/dist/{common-keywords-WqQm7W8t.js → common-keywords-Bhll7O3b.js} +0 -0
- /package/dist/{commonlisp-BIT8PQqi.js → commonlisp-BqM3qFK7.js} +0 -0
- /package/dist/{crystal-B_UcPArT.js → crystal-AsSFu4ke.js} +0 -0
- /package/dist/{css-dHbnt_zl.js → css-Df7Sdeyh.js} +0 -0
- /package/dist/{cypher-Dh3FOpL7.js → cypher-CaVKL6Gu.js} +0 -0
- /package/dist/{cytoscape.esm-BTpRoPd2.js → cytoscape.esm-BFEMljQI.js} +0 -0
- /package/dist/{d-CQD1IHee.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-CpF_IDx0.js → diff-CsxOM4Tr.js} +0 -0
- /package/dist/{dist-CK8Gj3GX.js → dist-C76MUPD3.js} +0 -0
- /package/dist/{dtd-DYoNpy6c.js → dtd-Dwr0Jmks.js} +0 -0
- /package/dist/{duckdb-keywords-CdIsl9L0.js → duckdb-keywords-7wAWf848.js} +0 -0
- /package/dist/{dylan-Bc_2G1E-.js → dylan-A7-ZBSey.js} +0 -0
- /package/dist/{ebnf-jGVT_YpN.js → ebnf-9_SaGDUz.js} +0 -0
- /package/dist/{ecl-UIU-P-Ar.js → ecl-BzJVIQDc.js} +0 -0
- /package/dist/{eiffel-C90Oyuix.js → eiffel-CO9eC_Op.js} +0 -0
- /package/dist/{elm-B9fWSySj.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-Ccff0UAn.js → erlang-DWbZP546.js} +0 -0
- /package/dist/{fcl-CGR8NxAg.js → fcl-CM9t2iay.js} +0 -0
- /package/dist/{forth-U1ROGcBY.js → forth-BTYqUuu3.js} +0 -0
- /package/dist/{fortran-3nOkjDmc.js → fortran-DgAjHcCq.js} +0 -0
- /package/dist/{gas-B_4H5FzV.js → gas-BjDSWPZd.js} +0 -0
- /package/dist/{gherkin-B0eru5Uz.js → gherkin-ClRqqpKv.js} +0 -0
- /package/dist/{groovy-dqjtZUVf.js → groovy-BzNjnc8x.js} +0 -0
- /package/dist/{haskell-DFzCCQzo.js → haskell-DLdk34Jq.js} +0 -0
- /package/dist/{haxe-Da8Pj5RT.js → haxe-l6gaY_IS.js} +0 -0
- /package/dist/{http-1HACL_9s.js → http-6Qg7z_h2.js} +0 -0
- /package/dist/{idl-D3NXs5iM.js → idl-hlWT4D26.js} +0 -0
- /package/dist/{init-D6eDd7H0.js → init-tZ42Torz.js} +0 -0
- /package/dist/{isArrayLikeObject-BlvK28do.js → isArrayLikeObject-DU5MCuQM.js} +0 -0
- /package/dist/{javascript-BfCTmOnk.js → javascript-DGukg1sB.js} +0 -0
- /package/dist/{jinja2-gBHAxUdF.js → jinja2-DI5k_Er3.js} +0 -0
- /package/dist/{julia-bG-6nJ-_.js → julia-BvDZDiIT.js} +0 -0
- /package/dist/{katex-mkWmhPUh.js → katex-DgfMWJY9.js} +0 -0
- /package/dist/{livescript-BlsRC8UJ.js → livescript-2YMQfkfI.js} +0 -0
- /package/dist/{lua-BbDC0_5w.js → lua-DIUrQRfA.js} +0 -0
- /package/dist/{main-Czi9-LVy.js → main-BMTpe7M0.js} +0 -0
- /package/dist/{marked.esm-DJM8la36.js → marked.esm-DkVwEwtO.js} +0 -0
- /package/dist/{math-C7wLpe9K.js → math-qsHyz2Eo.js} +0 -0
- /package/dist/{mathematica-YZTe3-PF.js → mathematica-Dqmg_BwL.js} +0 -0
- /package/dist/{mbox-CY5idp08.js → mbox-Cng-P-F1.js} +0 -0
- /package/dist/{mirc-CbQuFZKk.js → mirc-CNDqOVhQ.js} +0 -0
- /package/dist/{mllike-DsbHMX-5.js → mllike-C1n2UDyX.js} +0 -0
- /package/dist/{modelica-CQuvsOQk.js → modelica-QqQC2pFj.js} +0 -0
- /package/dist/{mscgen-LIpBP9VR.js → mscgen-C3fl8uhp.js} +0 -0
- /package/dist/{mumps-Ct5NXoaG.js → mumps-BeCUbMej.js} +0 -0
- /package/dist/{nginx-Dvc62C8z.js → nginx-ejv7DsBz.js} +0 -0
- /package/dist/{node-sql-parser-BqKV-TpL.js → node-sql-parser-CoPWN4hn.js} +0 -0
- /package/dist/{ntriples-jVkxWUuv.js → ntriples-CUgUpcma.js} +0 -0
- /package/dist/{octave-jGOImUB0.js → octave-BD652tGl.js} +0 -0
- /package/dist/{oz-Y0FKDMS2.js → oz-DrRsFa0K.js} +0 -0
- /package/dist/{pascal-BaLtPWWB.js → pascal-hpcx9sVn.js} +0 -0
- /package/dist/{path-VDkDgx1I.js → path-Bbv2tLY1.js} +0 -0
- /package/dist/{perl-CjfE0JLo.js → perl-DW8XHeFc.js} +0 -0
- /package/dist/{pig-DE4epV99.js → pig-Cv7Nxbfo.js} +0 -0
- /package/dist/{powershell-BZx53Ujw.js → powershell-Dr7WZMDU.js} +0 -0
- /package/dist/{prop-types-0wNc-99T.js → prop-types-Bd16OEUP.js} +0 -0
- /package/dist/{properties-CLyCG5C-.js → properties-D-qJDXAM.js} +0 -0
- /package/dist/{protobuf-BjBBs_V4.js → protobuf-B48QZbd3.js} +0 -0
- /package/dist/{puppet-ZImLuomA.js → puppet-15JDyiY2.js} +0 -0
- /package/dist/{python-C9YN71pR.js → python-DWkQA94h.js} +0 -0
- /package/dist/{q-CMoUHJ5Q.js → q-BzRpKgfd.js} +0 -0
- /package/dist/{r-DILmKWWW.js → r-dcNRe_Q8.js} +0 -0
- /package/dist/{range-PcytnUSJ.js → range-CQvYp_qE.js} +0 -0
- /package/dist/{rpm-fpIsm1Kr.js → rpm-Djl3Dsf1.js} +0 -0
- /package/dist/{ruby-BuiQI41h.js → ruby-Dd2CZTip.js} +0 -0
- /package/dist/{sas-C76sJ1zF.js → sas-DYF5_Iqu.js} +0 -0
- /package/dist/{scheme-DHjM-txv.js → scheme-YtWcji1H.js} +0 -0
- /package/dist/{shell--7NmGJ9p.js → shell-C3uC3Y0Z.js} +0 -0
- /package/dist/{sieve-DaPvBv1M.js → sieve-DHB17sQG.js} +0 -0
- /package/dist/{simple-mode-BP3Jd4vf.js → simple-mode-BMmwP_vI.js} +0 -0
- /package/dist/{smalltalk-KPvwrjCs.js → smalltalk-Y5v1Np3H.js} +0 -0
- /package/dist/{solr-PvZUtEDb.js → solr-DvRJLlRD.js} +0 -0
- /package/dist/{sparql-CXSUIQer.js → sparql-BEt3GJwM.js} +0 -0
- /package/dist/{spreadsheet-DPJdGPkx.js → spreadsheet-Dp4B9_rc.js} +0 -0
- /package/dist/{sql-Dp4ZLSIa.js → sql-DBsUs8nQ.js} +0 -0
- /package/dist/{stex-CeXW4zzk.js → stex-C6-x52ei.js} +0 -0
- /package/dist/{stylus-BXcmrg9w.js → stylus-DroA8via.js} +0 -0
- /package/dist/{swift-DD8I7hKP.js → swift-DR0x1ESK.js} +0 -0
- /package/dist/{tcl-B9Lp4GtA.js → tcl-BeuTFc_c.js} +0 -0
- /package/dist/{textile-qdiY0teq.js → textile-C0ikhHN3.js} +0 -0
- /package/dist/{tiddlywiki-t32lkubq.js → tiddlywiki-C_2Nvsgu.js} +0 -0
- /package/dist/{tiki-B0qKrSMl.js → tiki-CKQlhmQQ.js} +0 -0
- /package/dist/{timer-CzOhIJuk.js → timer-CcUhugb0.js} +0 -0
- /package/dist/{toml-eSl4PUAH.js → toml-BqNUJWRI.js} +0 -0
- /package/dist/{treemap-BpgMKHv-.js → treemap-BYLUKIzA.js} +0 -0
- /package/dist/{troff-105XJOEu.js → troff-DkK0f2ZH.js} +0 -0
- /package/dist/{tslib.es6-DofFyd9S.js → tslib.es6-3ZL768sZ.js} +0 -0
- /package/dist/{ttcn-1_BxDcM8.js → ttcn-Bf8vrg-_.js} +0 -0
- /package/dist/{ttcn-cfg-Cn_XgXiw.js → ttcn-cfg-DjCKzd95.js} +0 -0
- /package/dist/{turtle-BI6LyfEu.js → turtle-SSc84S9m.js} +0 -0
- /package/dist/{vb-BecoBfmr.js → vb-CQ6DC3cL.js} +0 -0
- /package/dist/{vbscript-De-zpA4i.js → vbscript-Dw0gFssg.js} +0 -0
- /package/dist/{velocity-DhlYJTrD.js → velocity-BvJQyBmj.js} +0 -0
- /package/dist/{verilog-BDZgxDOW.js → verilog-CKGAvQjj.js} +0 -0
- /package/dist/{vhdl-CV0OKTbp.js → vhdl-B40_x6fM.js} +0 -0
- /package/dist/{webidl-BOM1Fs0O.js → webidl-Bi9hczCv.js} +0 -0
- /package/dist/{xquery-CltP_CGh.js → xquery-DwWUXvP3.js} +0 -0
- /package/dist/{yacas-Dch4E2Dg.js → yacas-ClUs0mmH.js} +0 -0
- /package/dist/{z80-B5Yly27o.js → z80-DPC4UGzR.js} +0 -0
- /package/dist/{zod-ChY6miG5.js → zod-mAEs2ITo.js} +0 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
|
|
4
|
+
import { WebSocketTransport } from "@open-rpc/client-js";
|
|
5
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { Mocks } from "@/__mocks__/common";
|
|
7
|
+
import { ReconnectingWebSocketTransport } from "../transport";
|
|
8
|
+
|
|
9
|
+
// Mock the Logger
|
|
10
|
+
vi.mock("@/utils/Logger", () => ({
|
|
11
|
+
Logger: Mocks.logger(),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
// Mock the WebSocketTransport
|
|
15
|
+
vi.mock("@open-rpc/client-js", () => {
|
|
16
|
+
const mockWebSocketTransport = vi.fn();
|
|
17
|
+
mockWebSocketTransport.prototype.connect = vi.fn();
|
|
18
|
+
mockWebSocketTransport.prototype.close = vi.fn();
|
|
19
|
+
mockWebSocketTransport.prototype.sendData = vi.fn();
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
WebSocketTransport: mockWebSocketTransport,
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe("ReconnectingWebSocketTransport", () => {
|
|
27
|
+
const mockWsUrl = "ws://localhost:8080/lsp";
|
|
28
|
+
let mockConnection: any;
|
|
29
|
+
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
vi.clearAllMocks();
|
|
32
|
+
|
|
33
|
+
// Create a mock WebSocket connection with readyState
|
|
34
|
+
mockConnection = {
|
|
35
|
+
readyState: WebSocket.OPEN,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// Mock the WebSocketTransport constructor to set the connection
|
|
39
|
+
(WebSocketTransport as any).mockImplementation(function (this: any) {
|
|
40
|
+
this.connection = mockConnection;
|
|
41
|
+
this.connect = vi.fn().mockResolvedValue(undefined);
|
|
42
|
+
this.close = vi.fn();
|
|
43
|
+
this.sendData = vi.fn().mockResolvedValue({ result: "success" });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("should create a transport with the provided URL function", () => {
|
|
48
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
49
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
50
|
+
|
|
51
|
+
expect(transport).toBeDefined();
|
|
52
|
+
expect(getWsUrl).not.toHaveBeenCalled(); // URL function not called until connect
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("should connect successfully", async () => {
|
|
56
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
57
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
58
|
+
|
|
59
|
+
await transport.connect();
|
|
60
|
+
|
|
61
|
+
expect(getWsUrl).toHaveBeenCalledTimes(1);
|
|
62
|
+
expect(WebSocketTransport).toHaveBeenCalledWith(mockWsUrl);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("should wait for connection before connecting", async () => {
|
|
66
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
67
|
+
const waitForConnection = vi.fn().mockResolvedValue(undefined);
|
|
68
|
+
const transport = new ReconnectingWebSocketTransport({
|
|
69
|
+
getWsUrl,
|
|
70
|
+
waitForConnection,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await transport.connect();
|
|
74
|
+
|
|
75
|
+
expect(waitForConnection).toHaveBeenCalledTimes(1);
|
|
76
|
+
expect(getWsUrl).toHaveBeenCalledTimes(1);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("should reuse the same connection promise if already connecting", async () => {
|
|
80
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
81
|
+
const waitForConnection = vi
|
|
82
|
+
.fn()
|
|
83
|
+
.mockImplementation(
|
|
84
|
+
() => new Promise((resolve) => setTimeout(resolve, 100)),
|
|
85
|
+
);
|
|
86
|
+
const transport = new ReconnectingWebSocketTransport({
|
|
87
|
+
getWsUrl,
|
|
88
|
+
waitForConnection,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Start two connections concurrently
|
|
92
|
+
const promise1 = transport.connect();
|
|
93
|
+
const promise2 = transport.connect();
|
|
94
|
+
|
|
95
|
+
await Promise.all([promise1, promise2]);
|
|
96
|
+
|
|
97
|
+
// Should only create one delegate
|
|
98
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(1);
|
|
99
|
+
expect(waitForConnection).toHaveBeenCalledTimes(1);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("should send data successfully when connected", async () => {
|
|
103
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
104
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
105
|
+
|
|
106
|
+
await transport.connect();
|
|
107
|
+
|
|
108
|
+
const data: any = { method: "test", params: [] };
|
|
109
|
+
const result = await transport.sendData(data, 5000);
|
|
110
|
+
|
|
111
|
+
expect(result).toEqual({ result: "success" });
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("should reconnect when WebSocket is in CLOSED state", async () => {
|
|
115
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
116
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
117
|
+
|
|
118
|
+
// First connection
|
|
119
|
+
await transport.connect();
|
|
120
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(1);
|
|
121
|
+
|
|
122
|
+
// Simulate WebSocket closing
|
|
123
|
+
mockConnection.readyState = WebSocket.CLOSED;
|
|
124
|
+
|
|
125
|
+
// Send data should trigger reconnection
|
|
126
|
+
const data: any = { method: "test", params: [] };
|
|
127
|
+
await transport.sendData(data, 5000);
|
|
128
|
+
|
|
129
|
+
// Should have created a new WebSocketTransport
|
|
130
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(2);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("should reconnect when WebSocket is in CLOSING state", async () => {
|
|
134
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
135
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
136
|
+
|
|
137
|
+
// First connection
|
|
138
|
+
await transport.connect();
|
|
139
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(1);
|
|
140
|
+
|
|
141
|
+
// Simulate WebSocket closing
|
|
142
|
+
mockConnection.readyState = WebSocket.CLOSING;
|
|
143
|
+
|
|
144
|
+
// Send data should trigger reconnection
|
|
145
|
+
const data: any = { method: "test", params: [] };
|
|
146
|
+
await transport.sendData(data, 5000);
|
|
147
|
+
|
|
148
|
+
// Should have created a new WebSocketTransport
|
|
149
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(2);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it("should close the transport and prevent reconnection", async () => {
|
|
153
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
154
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
155
|
+
|
|
156
|
+
await transport.connect();
|
|
157
|
+
transport.close();
|
|
158
|
+
|
|
159
|
+
// Attempting to connect again should throw
|
|
160
|
+
await expect(transport.connect()).rejects.toThrow("Transport is closed");
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it("should close old delegate when creating a new one", async () => {
|
|
164
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
165
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
166
|
+
|
|
167
|
+
// First connection
|
|
168
|
+
await transport.connect();
|
|
169
|
+
const firstDelegate = (transport as any).delegate;
|
|
170
|
+
expect(firstDelegate).toBeDefined();
|
|
171
|
+
|
|
172
|
+
// Simulate connection closed
|
|
173
|
+
mockConnection.readyState = WebSocket.CLOSED;
|
|
174
|
+
|
|
175
|
+
// Reconnect by sending data
|
|
176
|
+
const data: any = { method: "test", params: [] };
|
|
177
|
+
await transport.sendData(data, 5000);
|
|
178
|
+
|
|
179
|
+
// Old delegate should have been closed
|
|
180
|
+
expect(firstDelegate.close).toHaveBeenCalled();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it("should handle connection failures gracefully", async () => {
|
|
184
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
185
|
+
const connectionError = new Error("Connection failed");
|
|
186
|
+
|
|
187
|
+
// Mock connect to fail
|
|
188
|
+
(WebSocketTransport as any).mockImplementationOnce(function (this: any) {
|
|
189
|
+
this.connection = mockConnection;
|
|
190
|
+
this.connect = vi.fn().mockRejectedValue(connectionError);
|
|
191
|
+
this.close = vi.fn();
|
|
192
|
+
this.sendData = vi.fn();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
196
|
+
|
|
197
|
+
await expect(transport.connect()).rejects.toThrow("Connection failed");
|
|
198
|
+
|
|
199
|
+
// Delegate should be cleared after failure
|
|
200
|
+
expect((transport as any).delegate).toBeUndefined();
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("should handle waitForConnection failures", async () => {
|
|
204
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
205
|
+
const waitError = new Error("Wait failed");
|
|
206
|
+
const waitForConnection = vi.fn().mockRejectedValue(waitError);
|
|
207
|
+
|
|
208
|
+
const transport = new ReconnectingWebSocketTransport({
|
|
209
|
+
getWsUrl,
|
|
210
|
+
waitForConnection,
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
await expect(transport.connect()).rejects.toThrow("Wait failed");
|
|
214
|
+
|
|
215
|
+
// Should not have created a delegate
|
|
216
|
+
expect(WebSocketTransport).not.toHaveBeenCalled();
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it("should automatically reconnect on sendData after connection loss", async () => {
|
|
220
|
+
const getWsUrl = vi.fn(() => mockWsUrl);
|
|
221
|
+
const transport = new ReconnectingWebSocketTransport({ getWsUrl });
|
|
222
|
+
|
|
223
|
+
// Don't connect initially
|
|
224
|
+
// Simulate WebSocket in closed state (no delegate exists)
|
|
225
|
+
expect((transport as any).delegate).toBeUndefined();
|
|
226
|
+
|
|
227
|
+
// Send data should trigger automatic connection
|
|
228
|
+
const data: any = { method: "test", params: [] };
|
|
229
|
+
await transport.sendData(data, 5000);
|
|
230
|
+
|
|
231
|
+
expect(WebSocketTransport).toHaveBeenCalledTimes(1);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
import { WebSocketTransport } from "@open-rpc/client-js";
|
|
3
|
+
import type { JSONRPCRequestData } from "@open-rpc/client-js/build/Request";
|
|
4
|
+
import { Transport } from "@open-rpc/client-js/build/transports/Transport";
|
|
5
|
+
import { Logger } from "@/utils/Logger";
|
|
6
|
+
|
|
7
|
+
export interface ReconnectingWebSocketTransportOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Function that returns the WebSocket URL to connect to.
|
|
10
|
+
*/
|
|
11
|
+
getWsUrl: () => string;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Optional function to wait for before attempting to connect.
|
|
15
|
+
* This is useful for ensuring dependencies (like the runtime) are ready.
|
|
16
|
+
*/
|
|
17
|
+
waitForConnection?: () => Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A WebSocket transport that automatically reconnects when the connection is lost.
|
|
22
|
+
* This handles cases like computer sleep/wake or network interruptions.
|
|
23
|
+
*/
|
|
24
|
+
export class ReconnectingWebSocketTransport extends Transport {
|
|
25
|
+
private delegate: WebSocketTransport | undefined;
|
|
26
|
+
private readonly options: ReconnectingWebSocketTransportOptions;
|
|
27
|
+
private connectionPromise: Promise<void> | undefined;
|
|
28
|
+
private isClosed = false;
|
|
29
|
+
|
|
30
|
+
constructor(options: ReconnectingWebSocketTransportOptions) {
|
|
31
|
+
super();
|
|
32
|
+
this.options = options;
|
|
33
|
+
this.delegate = undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Create a new WebSocket delegate, replacing any existing one.
|
|
38
|
+
*/
|
|
39
|
+
private createDelegate(): WebSocketTransport {
|
|
40
|
+
// Close the old delegate if it exists
|
|
41
|
+
if (this.delegate) {
|
|
42
|
+
try {
|
|
43
|
+
this.delegate.close();
|
|
44
|
+
} catch (error) {
|
|
45
|
+
Logger.warn("Error closing old WebSocket delegate", error);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Create a new delegate
|
|
50
|
+
this.delegate = new WebSocketTransport(this.options.getWsUrl());
|
|
51
|
+
return this.delegate;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Check if the current delegate's WebSocket is in a closed or closing state.
|
|
56
|
+
*/
|
|
57
|
+
private isDelegateClosedOrClosing(): boolean {
|
|
58
|
+
if (!this.delegate) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Access the internal connection to check its readyState
|
|
63
|
+
const ws = this.delegate.connection;
|
|
64
|
+
if (!ws) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// WebSocket.CLOSING = 2, WebSocket.CLOSED = 3
|
|
69
|
+
return (
|
|
70
|
+
ws.readyState === WebSocket.CLOSING || ws.readyState === WebSocket.CLOSED
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
override async connect() {
|
|
75
|
+
// Don't reconnect if explicitly closed
|
|
76
|
+
if (this.isClosed) {
|
|
77
|
+
throw new Error("Transport is closed");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// If already connecting, wait for that connection
|
|
81
|
+
if (this.connectionPromise) {
|
|
82
|
+
return this.connectionPromise;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
this.connectionPromise = (async () => {
|
|
86
|
+
try {
|
|
87
|
+
// Wait for dependencies to be ready (e.g., runtime connection)
|
|
88
|
+
if (this.options.waitForConnection) {
|
|
89
|
+
await this.options.waitForConnection();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Create a new delegate if needed
|
|
93
|
+
let delegate = this.delegate;
|
|
94
|
+
if (!delegate || this.isDelegateClosedOrClosing()) {
|
|
95
|
+
delegate = this.createDelegate();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Connect the delegate
|
|
99
|
+
await delegate.connect();
|
|
100
|
+
Logger.log("WebSocket transport connected successfully");
|
|
101
|
+
} catch (error) {
|
|
102
|
+
Logger.error("WebSocket transport connection failed", error);
|
|
103
|
+
// Clear the delegate on failure so we create a new one on retry
|
|
104
|
+
this.delegate = undefined;
|
|
105
|
+
throw error;
|
|
106
|
+
} finally {
|
|
107
|
+
this.connectionPromise = undefined;
|
|
108
|
+
}
|
|
109
|
+
})();
|
|
110
|
+
|
|
111
|
+
return this.connectionPromise;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
override close() {
|
|
115
|
+
this.isClosed = true;
|
|
116
|
+
this.delegate?.close();
|
|
117
|
+
this.delegate = undefined;
|
|
118
|
+
this.connectionPromise = undefined;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
override async sendData(
|
|
122
|
+
data: JSONRPCRequestData,
|
|
123
|
+
timeout: number | null | undefined,
|
|
124
|
+
) {
|
|
125
|
+
// If the delegate is closed or closing, try to reconnect
|
|
126
|
+
if (this.isDelegateClosedOrClosing()) {
|
|
127
|
+
Logger.warn("WebSocket is closed or closing, attempting to reconnect");
|
|
128
|
+
try {
|
|
129
|
+
await this.connect();
|
|
130
|
+
} catch (error) {
|
|
131
|
+
Logger.error("Failed to reconnect WebSocket", error);
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Send the data using the delegate
|
|
137
|
+
return this.delegate?.sendData(data, timeout);
|
|
138
|
+
}
|
|
139
|
+
}
|
package/src/core/rtc/state.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
2
|
import { atomWithStorage } from "jotai/utils";
|
|
3
3
|
import { once } from "lodash-es";
|
|
4
|
+
import { jotaiJsonStorage } from "@/utils/storage/jotai";
|
|
4
5
|
import { getFeatureFlag } from "../config/feature-flag";
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* The username for the current user when using real-time collaboration.
|
|
8
9
|
* This is stored in localStorage.
|
|
9
10
|
*/
|
|
10
|
-
export const usernameAtom = atomWithStorage<string>(
|
|
11
|
+
export const usernameAtom = atomWithStorage<string>(
|
|
12
|
+
"marimo:rtc:username",
|
|
13
|
+
"",
|
|
14
|
+
jotaiJsonStorage,
|
|
15
|
+
);
|
|
11
16
|
|
|
12
17
|
/**
|
|
13
18
|
* Whether RTC is enabled.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Whether the current environment is in the VSCode extension
|
|
5
|
+
*/
|
|
6
|
+
export function isInVscodeExtension(): boolean {
|
|
7
|
+
// We check if the document has a data-vscode-theme-kind attribute
|
|
8
|
+
return document.querySelector("[data-vscode-theme-kind]") !== null;
|
|
9
|
+
}
|
package/src/core/wasm/store.ts
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
compressToEncodedURIComponent,
|
|
5
5
|
decompressFromEncodedURIComponent,
|
|
6
6
|
} from "lz-string";
|
|
7
|
-
import { TypedLocalStorage } from "@/utils/
|
|
7
|
+
import { TypedLocalStorage } from "@/utils/storage/typed";
|
|
8
8
|
import { PyodideRouter } from "./router";
|
|
9
9
|
|
|
10
10
|
export interface FileStore {
|
package/src/css/app/Cell.css
CHANGED
|
@@ -34,6 +34,37 @@
|
|
|
34
34
|
z-index: 1;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/* Styling for cells marked for deletion by AI */
|
|
38
|
+
&:has(.mo-ai-deleted-cell) {
|
|
39
|
+
opacity: 0.7;
|
|
40
|
+
position: relative;
|
|
41
|
+
|
|
42
|
+
.output-area,
|
|
43
|
+
.cm-gutters,
|
|
44
|
+
.cm {
|
|
45
|
+
background-color: var(--red-2);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Add a red glow to indicate deletion */
|
|
49
|
+
&::before {
|
|
50
|
+
content: "";
|
|
51
|
+
position: absolute;
|
|
52
|
+
inset: 0;
|
|
53
|
+
border-radius: 10px;
|
|
54
|
+
pointer-events: none;
|
|
55
|
+
opacity: 0.6;
|
|
56
|
+
box-shadow: 0px 0px 10px 0px var(--red-9);
|
|
57
|
+
z-index: 1;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Add strikethrough effect to the code */
|
|
61
|
+
.cm-content {
|
|
62
|
+
text-decoration: line-through;
|
|
63
|
+
text-decoration-color: var(--red-9);
|
|
64
|
+
text-decoration-thickness: 1px;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
37
68
|
&:focus-within {
|
|
38
69
|
z-index: 20;
|
|
39
70
|
}
|
package/src/css/globals.css
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import {
|
|
5
|
+
getIframeCapabilities,
|
|
6
|
+
type IframeCapabilities,
|
|
7
|
+
} from "@/utils/capabilities";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* React hook to access iframe capabilities
|
|
11
|
+
*/
|
|
12
|
+
export function useIframeCapabilities(): IframeCapabilities {
|
|
13
|
+
return useMemo(() => getIframeCapabilities(), []);
|
|
14
|
+
}
|
|
@@ -5,14 +5,26 @@ import parse, {
|
|
|
5
5
|
Element,
|
|
6
6
|
type HTMLReactParserOptions,
|
|
7
7
|
} from "html-react-parser";
|
|
8
|
-
import React, {
|
|
8
|
+
import React, {
|
|
9
|
+
isValidElement,
|
|
10
|
+
type JSX,
|
|
11
|
+
type ReactNode,
|
|
12
|
+
useMemo,
|
|
13
|
+
useRef,
|
|
14
|
+
} from "react";
|
|
9
15
|
import { CopyClipboardIcon } from "@/components/icons/copy-icon";
|
|
16
|
+
import { sanitizeHtml, useSanitizeHtml } from "./sanitize";
|
|
10
17
|
|
|
11
18
|
type ReplacementFn = NonNullable<HTMLReactParserOptions["replace"]>;
|
|
12
19
|
type TransformFn = NonNullable<HTMLReactParserOptions["transform"]>;
|
|
13
20
|
|
|
14
21
|
interface Options {
|
|
15
22
|
html: string;
|
|
23
|
+
/**
|
|
24
|
+
* Whether to sanitize the HTML.
|
|
25
|
+
* @default true
|
|
26
|
+
*/
|
|
27
|
+
alwaysSanitizeHtml?: boolean;
|
|
16
28
|
additionalReplacements?: ReplacementFn[];
|
|
17
29
|
}
|
|
18
30
|
|
|
@@ -110,9 +122,9 @@ const addCopyButtonToCodehilite: TransformFn = (
|
|
|
110
122
|
};
|
|
111
123
|
|
|
112
124
|
const CopyableCode = ({ children }: { children: ReactNode }) => {
|
|
113
|
-
const
|
|
125
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
114
126
|
return (
|
|
115
|
-
<div className="relative group codehilite-wrapper"
|
|
127
|
+
<div className="relative group codehilite-wrapper" ref={ref}>
|
|
116
128
|
{children}
|
|
117
129
|
|
|
118
130
|
<div className="absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity">
|
|
@@ -120,7 +132,7 @@ const CopyableCode = ({ children }: { children: ReactNode }) => {
|
|
|
120
132
|
tooltip={false}
|
|
121
133
|
className="p-1"
|
|
122
134
|
value={() => {
|
|
123
|
-
const codeElement =
|
|
135
|
+
const codeElement = ref.current?.firstChild;
|
|
124
136
|
if (codeElement) {
|
|
125
137
|
return codeElement.textContent || "";
|
|
126
138
|
}
|
|
@@ -132,7 +144,51 @@ const CopyableCode = ({ children }: { children: ReactNode }) => {
|
|
|
132
144
|
);
|
|
133
145
|
};
|
|
134
146
|
|
|
135
|
-
|
|
147
|
+
/**
|
|
148
|
+
*
|
|
149
|
+
* @param html - The HTML to render.
|
|
150
|
+
* @param additionalReplacements - Additional replacements to apply to the HTML.
|
|
151
|
+
* @param alwaysSanitizeHtml - Whether to sanitize the HTML.
|
|
152
|
+
* @returns
|
|
153
|
+
*/
|
|
154
|
+
export const renderHTML = ({
|
|
155
|
+
html,
|
|
156
|
+
additionalReplacements = [],
|
|
157
|
+
alwaysSanitizeHtml = true,
|
|
158
|
+
}: Options) => {
|
|
159
|
+
return (
|
|
160
|
+
<RenderHTML
|
|
161
|
+
html={html}
|
|
162
|
+
alwaysSanitizeHtml={alwaysSanitizeHtml}
|
|
163
|
+
additionalReplacements={additionalReplacements}
|
|
164
|
+
/>
|
|
165
|
+
);
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const RenderHTML = ({
|
|
169
|
+
html,
|
|
170
|
+
additionalReplacements = [],
|
|
171
|
+
alwaysSanitizeHtml,
|
|
172
|
+
}: Options) => {
|
|
173
|
+
const shouldSanitizeHtml = useSanitizeHtml();
|
|
174
|
+
|
|
175
|
+
const sanitizedHtml = useMemo(() => {
|
|
176
|
+
if (alwaysSanitizeHtml || shouldSanitizeHtml) {
|
|
177
|
+
return sanitizeHtml(html);
|
|
178
|
+
}
|
|
179
|
+
return html;
|
|
180
|
+
}, [html, alwaysSanitizeHtml, shouldSanitizeHtml]);
|
|
181
|
+
|
|
182
|
+
return parseHtml({
|
|
183
|
+
html: sanitizedHtml,
|
|
184
|
+
additionalReplacements,
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
function parseHtml({
|
|
189
|
+
html,
|
|
190
|
+
additionalReplacements = [],
|
|
191
|
+
}: Pick<Options, "html" | "additionalReplacements">) {
|
|
136
192
|
const renderFunctions: ReplacementFn[] = [
|
|
137
193
|
replaceValidTags,
|
|
138
194
|
replaceValidIframes,
|
|
@@ -166,4 +222,8 @@ export const renderHTML = ({ html, additionalReplacements = [] }: Options) => {
|
|
|
166
222
|
return reactNode as JSX.Element;
|
|
167
223
|
},
|
|
168
224
|
});
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export const visibleForTesting = {
|
|
228
|
+
parseHtml,
|
|
169
229
|
};
|