@marimo-team/islands 0.23.15-dev6 → 0.23.15-dev63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ConnectedDataExplorerComponent-CU4fZJzG.js → ConnectedDataExplorerComponent-CJaUI-S-.js} +85 -84
- package/dist/{ErrorBoundary-DE6tzZf-.js → ErrorBoundary-DXlxsrTF.js} +3 -3
- package/dist/{ImageComparisonComponent-CHrI72em.js → ImageComparisonComponent-C3y7L3eJ.js} +173 -129
- package/dist/{any-language-editor-DN1R-1KZ.js → any-language-editor-P9tjkj4n.js} +21 -21
- package/dist/apl-e1B5LPEL.js +4 -0
- package/dist/{arc-DfkSnvZm.js → arc-CTIpFoOn.js} +2 -2
- package/dist/architecture-7HQA4BMR-DHUrQjL4.js +6 -0
- package/dist/{architectureDiagram-VXUJARFQ-CT2SuxNw.js → architectureDiagram-VXUJARFQ-DXwkyAaM.js} +19 -19
- package/dist/asciiarmor-B-gwgesP.js +4 -0
- package/dist/asn1-DF2ckRB4.js +4 -0
- package/dist/assets/__vite-browser-external-CjNAy01L.js +1 -0
- package/dist/assets/worker-B3XPCb6y.js +98 -0
- package/dist/{blockDiagram-VD42YOAC-Dy7hlFla.js → blockDiagram-VD42YOAC-CIOjvxeD.js} +12 -12
- package/dist/brainfuck-4G-7_gq_.js +4 -0
- package/dist/{button-BacYv-bE.js → button-BcSml68y.js} +12 -65
- package/dist/{c4Diagram-YG6GDRKO-BXlAmZ8Z.js → c4Diagram-YG6GDRKO-B6dZC_oU.js} +6 -6
- package/dist/{capabilities-D_4LYhSU.js → capabilities-BYLFYTYv.js} +2 -2
- package/dist/{channel-D_PHgcig.js → channel-BN070S0F.js} +1 -1
- package/dist/{chat-ui-DinOvbWu.js → chat-ui-BdSDiVjk.js} +3122 -3116
- package/dist/{check-C9OoNtR4.js → check-Cs-KV5XY.js} +1 -1
- package/dist/{chunk-4BX2VUAB-CzXltWHN.js → chunk-4BX2VUAB-iU5lQTDI.js} +1 -1
- package/dist/{chunk-4F5CHEZ2-D9nGEHV8.js → chunk-4F5CHEZ2-VlodlEGo.js} +1 -1
- package/dist/{chunk-55IACEB6-B-1mjMMC.js → chunk-55IACEB6-7h71GwyW.js} +1 -1
- package/dist/{chunk-5FQGJX7Z-BbqSm5gU.js → chunk-5FQGJX7Z-B9WoXK1R.js} +3 -3
- package/dist/{chunk-ABZYJK2D-Dz0-H2B5.js → chunk-ABZYJK2D-BxBDji1u.js} +3 -3
- package/dist/{chunk-ATLVNIR6-o0Z5MZLd.js → chunk-ATLVNIR6-qFiszptQ.js} +2 -2
- package/dist/{chunk-B2363JML-KEJpLGGP.js → chunk-B2363JML-zL3VngtH.js} +1 -1
- package/dist/{chunk-B4BG7PRW-BL98U9B4.js → chunk-B4BG7PRW-B_z2FEHm.js} +7 -7
- package/dist/{chunk-CVBHYZKI-B_c5YBcW.js → chunk-CVBHYZKI-CwazXVlJ.js} +1 -1
- package/dist/{chunk-DI55MBZ5-Dwkn0LWm.js → chunk-DI55MBZ5-D4Y8yV8B.js} +6 -6
- package/dist/{chunk-EXTU4WIE-9sNjmQrB.js → chunk-EXTU4WIE-BQPBhApE.js} +2 -2
- package/dist/{chunk-FMBD7UC4-Ie8M9q0W.js → chunk-FMBD7UC4-quJmebXa.js} +1 -1
- package/dist/{chunk-FRFDVMJY-DzQqMWrl.js → chunk-FRFDVMJY-BHBqN-vD.js} +1 -1
- package/dist/{chunk-HN2XXSSU-E3n-Ys7Z.js → chunk-HN2XXSSU-Bv0QkeMr.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-C32Y7Epf.js → chunk-JA3XYJ7Z-CY4CRbV5.js} +3 -3
- package/dist/{chunk-JZLCHNYA-C6ftyVMN.js → chunk-JZLCHNYA-DWIR9m5O.js} +6 -6
- package/dist/{chunk-MI3HLSF2-CUYEasXO.js → chunk-MI3HLSF2-HGWI-8Pg.js} +1 -1
- package/dist/{chunk-N4CR4FBY-DUhGZhZs.js → chunk-N4CR4FBY-Bw2HcMNc.js} +7 -7
- package/dist/{chunk-PL6DKKU2-D7km-08O.js → chunk-PL6DKKU2-CAHKc95s.js} +1 -1
- package/dist/{chunk-QN33PNHL-0K6SDYn3.js → chunk-QN33PNHL-DPBNNzpR.js} +2 -2
- package/dist/{chunk-QXUST7PY-DMhsRpYK.js → chunk-QXUST7PY-DtC2t9Mk.js} +10 -10
- package/dist/{chunk-QZHKN3VN-DRjXVwuJ.js → chunk-QZHKN3VN-Dym5BS7y.js} +1 -1
- package/dist/{chunk-S3R3BYOJ-oAe3dEbO.js → chunk-S3R3BYOJ-BdgLc8AM.js} +4 -4
- package/dist/{chunk-SJTYNZTY-BkJrPRFC.js → chunk-SJTYNZTY-DnXoKWpW.js} +1 -1
- package/dist/{chunk-TCCFYFTB-D58KeXnC.js → chunk-TCCFYFTB-DPWJa9zL.js} +1 -1
- package/dist/{chunk-TQ3KTPDO-D_yA_wAb.js → chunk-TQ3KTPDO-CsDx6v37.js} +1 -1
- package/dist/{chunk-TZMSLE5B-yBKS_DQU.js → chunk-TZMSLE5B-BzSHcq-K.js} +3 -3
- package/dist/{chunk-UMXZTB3W-D7uwvNjd.js → chunk-UMXZTB3W-D1uHz8MN.js} +1 -1
- package/dist/classDiagram-2ON5EDUG-BiQPjMNY.js +30 -0
- package/dist/classDiagram-v2-WZHVMYZB-YHdR8fqM.js +30 -0
- package/dist/{clike-DTxNUn7l.js → clike-7lgyEYRk.js} +1 -1
- package/dist/clojure-CUybM11R.js +4 -0
- package/dist/cmake-BPjGcuDL.js +4 -0
- package/dist/cobol-BETk_nb6.js +4 -0
- package/dist/{code-block-37QAKDTI-O6IH6wAi.js → code-block-37QAKDTI-MSxEjskJ.js} +1 -1
- package/dist/{code-visibility-Dpab3kCj.js → code-visibility-yIEEWI5w.js} +1554 -1471
- package/dist/coffeescript-CManZxXL.js +4 -0
- package/dist/commonlisp-DWkn7GW8.js +4 -0
- package/dist/{copy-COam1EG7.js → copy-Cs3yt6Vt.js} +2 -2
- package/dist/{cose-bilkent-S5V4N54A-kjoZoid4.js → cose-bilkent-S5V4N54A-BYj0aL7z.js} +2 -2
- package/dist/crystal-CCbg5EUH.js +4 -0
- package/dist/css-By8eo-XS.js +4 -0
- package/dist/cypher-DwfHg3nP.js +4 -0
- package/dist/d-Brs1wNbw.js +4 -0
- package/dist/{dagre-6UL2VRFP-J0JKgwOt.js → dagre-6UL2VRFP-DpYjBqQs.js} +11 -11
- package/dist/{data-grid-overlay-editor-C6lxUJp-.js → data-grid-overlay-editor-BWRG2b_o.js} +2 -2
- package/dist/{constants-T20xxyNf.js → debounce-BOD3DbfP.js} +1 -24
- package/dist/{diagram-PSM6KHXK-DYgJuNk9.js → diagram-PSM6KHXK-D4ftnaua.js} +22 -22
- package/dist/{diagram-QEK2KX5R-CKdBR2sb.js → diagram-QEK2KX5R-DVlUOgs1.js} +17 -17
- package/dist/{diagram-S2PKOQOG-Dpi7mo5W.js → diagram-S2PKOQOG-CGh4OMEV.js} +17 -17
- package/dist/diff-DJIRmJ1g.js +4 -0
- package/dist/{dist-DyyjKEYf.js → dist-3NCqaWjt.js} +2 -2
- package/dist/{dist-D-W5ny5a.js → dist-4lVIWUT3.js} +1 -1
- package/dist/dist-5o9uz19x.js +5 -0
- package/dist/{dist-GZXUmt0b.js → dist-B2jmQKKx.js} +2 -2
- package/dist/{dist--2Bqjvs0.js → dist-B96tMAst.js} +2 -2
- package/dist/{dist-BaoDKvdy.js → dist-BCX980mU.js} +2 -2
- package/dist/{dist-DMjWuVs8.js → dist-BIEt-mlF.js} +1 -1
- package/dist/{dist-BR_gyG9L.js → dist-BO5HRiTf.js} +2 -2
- package/dist/{dist-Dv_Y15yk.js → dist-BOMbzyb3.js} +85 -85
- package/dist/{dist-CIYBwstr.js → dist-BP39XM8u.js} +1 -1
- package/dist/{dist-DZo4nSS0.js → dist-BPF0gTRZ.js} +6 -6
- package/dist/{dist-BSAt6RhH.js → dist-BTdrwBWP.js} +22 -22
- package/dist/{dist-BY018Paw.js → dist-BdqCKQ1O.js} +2 -2
- package/dist/dist-BpDH0DEP.js +5 -0
- package/dist/dist-BpXhbQXO.js +8 -0
- package/dist/{dist-CcWX6tmx.js → dist-BpeiYpG2.js} +2 -2
- package/dist/{dist-A2846XWO.js → dist-BwhXBwMd.js} +1 -1
- package/dist/dist-ByadAk_L.js +5 -0
- package/dist/{dist-abid3KgM.js → dist-C18MUWTj.js} +2 -2
- package/dist/{dist-DZORgqKY.js → dist-C2_4pjuS.js} +1 -1
- package/dist/{dist-BzEzfugY.js → dist-CFSb_Frm.js} +1 -1
- package/dist/dist-CK0g7JvP.js +8 -0
- package/dist/{dist-C_Y3oV3C.js → dist-CRmSjkLP.js} +2 -2
- package/dist/{dist-hT4QzYX-.js → dist-CSlJrrAw.js} +86 -81
- package/dist/{dist-Du8WkPuU.js → dist-CV79CsQ0.js} +2 -2
- package/dist/dist-CfzCtiq2.js +5 -0
- package/dist/{dist-CoXAujgg.js → dist-D3bdsa1d.js} +4 -4
- package/dist/dist-D8JtVFrW.js +8 -0
- package/dist/dist-DK2Oocpu.js +6 -0
- package/dist/{dist-LTU8Hdvn.js → dist-DZwp8lro.js} +3 -3
- package/dist/{dist-t9Kf7xqC.js → dist-DaXJPX8F.js} +2 -2
- package/dist/{dist-U4F-tbMs.js → dist-De-GlSAs.js} +246 -184
- package/dist/{dist-M9Vag9Y0.js → dist-DgjbnqTg.js} +125 -125
- package/dist/dist-DnSu977r.js +5 -0
- package/dist/{dist-CxJDU6Bh.js → dist-DviUBLUp.js} +4 -4
- package/dist/{dist-CpxNdDkw.js → dist-DwqBJ014.js} +2 -2
- package/dist/{dist-Bf7SHuNp.js → dist-JGehap7K.js} +5 -5
- package/dist/{dist-Bk75fBZA.js → dist-LpLXa9Lb.js} +2 -2
- package/dist/{dist-Bf9f8MuT.js → dist-SXNmlE8A.js} +1 -1
- package/dist/dist-UmxJm6sW.js +8 -0
- package/dist/dist-aYSBQSyM.js +5 -0
- package/dist/dist-kkZ1Ztlh.js +6 -0
- package/dist/dist-ngPczwNi.js +5 -0
- package/dist/{dist-DgGbNavJ.js → dist-pqIwD8VD.js} +2 -2
- package/dist/dist-wQRyxyTV.js +5 -0
- package/dist/{dist-Dax--nl9.js → dist-w_gWE5Wf.js} +1 -1
- package/dist/{dockerfile-twL37N91.js → dockerfile-B82Pkz_V.js} +1 -1
- package/dist/dtd-Dyiazv4N.js +4 -0
- package/dist/dylan-D8Fcw7NA.js +4 -0
- package/dist/ecl-CjKp8Vii.js +4 -0
- package/dist/eiffel-K9ViOX5r.js +4 -0
- package/dist/elm-B5NVtRco.js +4 -0
- package/dist/{erDiagram-Q2GNP2WA-BU-m41EQ.js → erDiagram-Q2GNP2WA-BcKAHFqF.js} +15 -15
- package/dist/erlang-BnLzgk7R.js +4 -0
- package/dist/{error-banner-DFPfz_Qf.js → error-banner-DR7o3CbX.js} +68 -68
- package/dist/{esm-ga2Bf3O2.js → esm-DKOv6P2M.js} +424 -424
- package/dist/esm-k8PIvuZW.js +1180 -0
- package/dist/{extends-9MVIxxRo.js → extends-Cq2JYHKy.js} +36 -20
- package/dist/{factor-CajWS6mS.js → factor-Bq2mGIHt.js} +1 -1
- package/dist/factor-C7f9Jz5R.js +4 -0
- package/dist/{flowDiagram-NV44I4VS-CRoXKjGq.js → flowDiagram-NV44I4VS-BRhSg-ro.js} +17 -17
- package/dist/{formats-Dzx4J_z1.js → formats-BFhkZJwd.js} +3 -3
- package/dist/forth-rGM8jLao.js +4 -0
- package/dist/fortran-B3acSe0i.js +4 -0
- package/dist/{ganttDiagram-JELNMOA3-7mq5f9cO.js → ganttDiagram-JELNMOA3-CXXCN7LN.js} +10 -10
- package/dist/gas-Bb1Vmv_N.js +4 -0
- package/dist/gherkin-C9Lyidgd.js +4 -0
- package/dist/{gitGraph-G5XIXVHT-DiniR35k.js → gitGraph-G5XIXVHT-BjTx0kww.js} +3 -3
- package/dist/{gitGraphDiagram-V2S2FVAM-Dfuokq6w.js → gitGraphDiagram-V2S2FVAM-BOlkMSqK.js} +17 -17
- package/dist/{glide-data-editor-CjTu7ukN.js → glide-data-editor--CaN-f27.js} +13 -13
- package/dist/groovy-DQk6XcGH.js +4 -0
- package/dist/haskell-mV0Vw9gv.js +4 -0
- package/dist/haxe-DqxN89zH.js +5 -0
- package/dist/{html-to-image-_wGfk8V-.js → html-to-image-DDENewl2.js} +2649 -2607
- package/dist/idl-ya8W561J.js +4 -0
- package/dist/{info-VBDWY6EO-DVZvGhkQ.js → info-VBDWY6EO-CA67FznA.js} +3 -3
- package/dist/infoDiagram-HS3SLOUP-D3TyKnL_.js +30 -0
- package/dist/{input-DtsN7xm-.js → input-DStQIuqD.js} +51 -51
- package/dist/javascript-CgqgptVu.js +4 -0
- package/dist/{journeyDiagram-XKPGCS4Q-8XYSU1GI.js → journeyDiagram-XKPGCS4Q-DEal0aT1.js} +7 -7
- package/dist/julia-CFQ-HusI.js +4 -0
- package/dist/{kanban-definition-3W4ZIXB7--9pT9z1R.js → kanban-definition-3W4ZIXB7-Dl90wENN.js} +12 -12
- package/dist/{katex-9-9QRhxz.js → katex-C4t-BmrK.js} +1 -1
- package/dist/{label-WfTSU8L4.js → label-DIk0QoFe.js} +2 -2
- package/dist/{line-C5s_12ee.js → line-C43FIPBd.js} +3 -3
- package/dist/{linear-B5-AFRiR.js → linear-H_vsH9ao.js} +4 -4
- package/dist/livescript-D__3TmDo.js +4 -0
- package/dist/{loader-Boph2xIS.js → loader-CTHCI-qe.js} +5 -16
- package/dist/lua-Bytcgj_W.js +4 -0
- package/dist/main.js +2217 -2116
- package/dist/mathematica-DJhvVKvl.js +4 -0
- package/dist/mbox-IGHPCjfR.js +4 -0
- package/dist/{mermaid-4DMBBIKO-Eg3D4FVz.js → mermaid-4DMBBIKO-FXbOziy9.js} +1 -1
- package/dist/{mermaid-BYqXy_NE.js → mermaid-CdSvixW2.js} +47 -47
- package/dist/{mermaid-parser.core-C3XRsazI.js → mermaid-parser.core-DoivvxPd.js} +8 -8
- package/dist/{mhchem-yiCCuiEF.js → mhchem-EGhUZR1V.js} +1 -1
- package/dist/{mindmap-definition-VGOIOE7T-B-4mnfFG.js → mindmap-definition-VGOIOE7T-CCDupjWW.js} +14 -14
- package/dist/mirc-tcwvVugm.js +4 -0
- package/dist/mllike-Dx91i62r.js +6 -0
- package/dist/modelica-_SRt-yU5.js +4 -0
- package/dist/mscgen-GZrGS9gt.js +6 -0
- package/dist/mumps-Cv3ygyod.js +4 -0
- package/dist/nsis-BU7GeGbI.js +4 -0
- package/dist/{nsis-ClF3r5Tr.js → nsis-i9_sgigf.js} +1 -1
- package/dist/ntriples-CL-FCYXb.js +4 -0
- package/dist/{number-overlay-editor-BLJXvX9c.js → number-overlay-editor-Ck_mc_gT.js} +1 -1
- package/dist/objects-De59twF-.js +56 -0
- package/dist/octave-Dc6_3DIu.js +4 -0
- package/dist/{ordinal-ArJavP1Q.js → ordinal-Bkv2-veX.js} +1 -1
- package/dist/oz-DpUAJCXf.js +4 -0
- package/dist/{packet-DYOGHKS2-34raHOiB.js → packet-DYOGHKS2-Bkgofxf3.js} +3 -3
- package/dist/pascal-B17mncXs.js +4 -0
- package/dist/perl-BTpK97q9.js +4 -0
- package/dist/{pie-VRWISCQL-BaLlzZa3.js → pie-VRWISCQL-B1AMhN_7.js} +3 -3
- package/dist/{pieDiagram-ADFJNKIX-Cr3cNpZY.js → pieDiagram-ADFJNKIX-JvXG_6hk.js} +22 -22
- package/dist/pig-CFb638Ap.js +4 -0
- package/dist/powershell-Cxo-_2A5.js +4 -0
- package/dist/{precisionRound-Tqb4mg-H.js → precisionRound-CnHPY_5v.js} +1 -1
- package/dist/{process-output-Mh4UrjwM.js → process-output-2QPcgBQg.js} +4 -4
- package/dist/properties-BPgT1xTB.js +4 -0
- package/dist/protobuf-BgHBaIIK.js +4 -0
- package/dist/pug-25-oS0SG.js +4 -0
- package/dist/{pug-B_rby2yb.js → pug-BhE2JRSg.js} +1 -1
- package/dist/puppet-DarIr20S.js +4 -0
- package/dist/purify.es-EnR5yhgI.js +783 -0
- package/dist/python-BqmOsBsi.js +4 -0
- package/dist/q-D3QJCTup.js +4 -0
- package/dist/{quadrantDiagram-AYHSOK5B-BuNL8Q93.js → quadrantDiagram-AYHSOK5B-BqDB9tUC.js} +5 -5
- package/dist/r-Cz_yBX4z.js +4 -0
- package/dist/{radar-ZZBFDIW7-Ci7bfoZa.js → radar-ZZBFDIW7-C2b7A32s.js} +3 -3
- package/dist/{react-vega-B0sAlDTL.js → react-vega-BazDALhI.js} +469 -469
- package/dist/{requirementDiagram-UZGBJVZJ-BG2lLUN1.js → requirementDiagram-UZGBJVZJ-KbVt8SPH.js} +14 -14
- package/dist/{reveal-component-BfYO8h-9.js → reveal-component-CCyp8KHw.js} +629 -622
- package/dist/rpm-DGOtYwAI.js +5 -0
- package/dist/ruby-DBZu4rPc.js +4 -0
- package/dist/{sankeyDiagram-TZEHDZUN-DMal8sps.js → sankeyDiagram-TZEHDZUN-DgkF38jx.js} +5 -5
- package/dist/sas-Dd1D9qTq.js +4 -0
- package/dist/scheme-BmDjvTHX.js +4 -0
- package/dist/{sequenceDiagram-WL72ISMW-DT6Tk-Eo.js → sequenceDiagram-WL72ISMW-BDmx9n95.js} +8 -8
- package/dist/shell-BL8zFSaj.js +4 -0
- package/dist/sieve-BAx2WqUP.js +4 -0
- package/dist/smalltalk-CYRzF7VV.js +4 -0
- package/dist/sparql-YWaDRO4A.js +4 -0
- package/dist/{spec-Cz-Bj1JI.js → spec-CnaxwDqy.js} +4 -4
- package/dist/{src-Bf2iLOlr.js → src-DV3ha_nA.js} +1 -1
- package/dist/{stateDiagram-FKZM4ZOC-CB_lodq3.js → stateDiagram-FKZM4ZOC-ByOvQf2n.js} +17 -17
- package/dist/stateDiagram-v2-4FDKWEC3-C3xqeavR.js +29 -0
- package/dist/{step-CWipAYTY.js → step-BqHnkgWE.js} +1 -1
- package/dist/stex-B5O-env2.js +4 -0
- package/dist/{strings-Dq_j3Rxw.js → strings-BYAhZnQi.js} +354 -354
- package/dist/style.css +1 -1
- package/dist/stylus-lYsyLFc1.js +4 -0
- package/dist/swift-ClQz9z1n.js +4 -0
- package/dist/{swiper-component-5HoSsPi1.js → swiper-component-DE94711u.js} +4 -4
- package/dist/tcl-B3jhsfqY.js +4 -0
- package/dist/textile-Cb1Dw7Aq.js +4 -0
- package/dist/{time-CsmIF9YZ.js → time-Bb4A7I6a.js} +4 -4
- package/dist/{timeline-definition-IT6M3QCI-NfSKRvH0.js → timeline-definition-IT6M3QCI-CkD_trIn.js} +4 -4
- package/dist/{toDate-CWNNlFEX.js → toDate-B3IRfHhw.js} +16 -7
- package/dist/toml-nHZhetdO.js +4 -0
- package/dist/{tooltip-Czds6Qr8.js → tooltip-B-qh7UPB.js} +3 -3
- package/dist/{treemap-GDKQZRPO-Cl6OQh8D.js → treemap-GDKQZRPO-SDux0AV8.js} +3 -3
- package/dist/troff-DuJAGWKH.js +4 -0
- package/dist/ttcn-BxrcwP21.js +4 -0
- package/dist/ttcn-cfg-BAg_9dcc.js +4 -0
- package/dist/turtle-zCq949as.js +4 -0
- package/dist/{types-C2Ir191_.js → types-DQl7jVYK.js} +1 -1
- package/dist/use-vega-container-remeasure-DGNrIQSk.js +27 -0
- package/dist/{useAsyncData-KfHB8wQR.js → useAsyncData-CvO8WUy3.js} +1 -1
- package/dist/{useDateFormatter-CMnRuVmN.js → useDateFormatter-BSoGim-G.js} +2 -2
- package/dist/{useDeepCompareMemoize-nJMtxhm4.js → useDeepCompareMemoize-J3MKRdA4.js} +1 -1
- package/dist/{useIframeCapabilities-DWIYvDh7.js → useIframeCapabilities-POcFXHbw.js} +1 -1
- package/dist/{useLifecycle-DegSo0lV.js → useLifecycle-DqPxHgAN.js} +3 -3
- package/dist/{useTheme-6eZ3GOTS.js → useTheme-XMq9mNf_.js} +65 -29
- package/dist/vb-De5hElus.js +4 -0
- package/dist/vbscript-Cypcpv4F.js +4 -0
- package/dist/{vega-component-DzyyM9fc.js → vega-component-CrFoZT1S.js} +225 -223
- package/dist/vega-embed-container-DAQAMjiO.js +22 -0
- package/dist/vega-loader.browser-DmpxCJqx.js +1353 -0
- package/dist/velocity-Di7l-yhe.js +4 -0
- package/dist/verilog-Bzi-S3g2.js +4 -0
- package/dist/vhdl-B0ZZITaW.js +4 -0
- package/dist/webidl-0sviiRcN.js +4 -0
- package/dist/xquery-B4qMVWaB.js +4 -0
- package/dist/{xychartDiagram-PRI3JC2R-BvwftqMA.js → xychartDiagram-PRI3JC2R-BSkNxYNw.js} +13 -13
- package/dist/yacas-Jt25Fuv8.js +4 -0
- package/dist/z80-CrcbYzmp.js +4 -0
- package/dist/{zod-CijjQh4u.js → zod-D0yOqoGe.js} +26 -26
- package/package.json +3 -1
- package/src/__mocks__/requests.ts +3 -0
- package/src/components/charts/lazy.tsx +3 -1
- package/src/components/charts/vega-embed-container.tsx +18 -0
- package/src/components/chat/__tests__/chat-utils.test.ts +244 -1
- package/src/components/chat/__tests__/message-queue.test.tsx +121 -0
- package/src/components/chat/chat-panel.tsx +196 -67
- package/src/components/chat/chat-utils.ts +111 -2
- package/src/components/editor/RecoveryButton.tsx +2 -2
- package/src/components/editor/SortableCell.tsx +6 -2
- package/src/components/editor/__tests__/output-persistence.test.tsx +241 -0
- package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +153 -0
- package/src/components/editor/actions/pair-with-agent-commands.ts +109 -0
- package/src/components/editor/actions/pair-with-agent-modal.tsx +20 -64
- package/src/components/editor/actions/useNotebookActions.tsx +8 -0
- package/src/components/editor/ai/add-cell-with-ai.tsx +14 -5
- package/src/components/editor/ai/ai-completion-editor.tsx +4 -1
- package/src/components/editor/cell/cell-context-menu.tsx +7 -0
- package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +221 -0
- package/src/components/editor/chrome/components/feedback-button.tsx +308 -77
- package/src/components/editor/chrome/panels/packages-panel.tsx +11 -1
- package/src/components/editor/chrome/panels/write-secret-modal.tsx +3 -2
- package/src/components/editor/columns/__tests__/cell-column.test.tsx +105 -0
- package/src/components/editor/columns/cell-column.tsx +34 -4
- package/src/components/editor/columns/sortable-column.tsx +24 -4
- package/src/components/editor/connections/__tests__/secret-combobox.test.ts +134 -0
- package/src/components/editor/connections/database/schemas.ts +35 -27
- package/src/components/editor/connections/form-renderers.tsx +42 -110
- package/src/components/editor/connections/secret-combobox.tsx +253 -0
- package/src/components/editor/connections/storage/schemas.ts +12 -6
- package/src/components/editor/file-tree/download.ts +46 -0
- package/src/components/editor/file-tree/file-explorer.tsx +3 -21
- package/src/components/editor/file-tree/file-viewer.tsx +4 -27
- package/src/components/editor/navigation/__tests__/navigation.test.ts +33 -0
- package/src/components/editor/navigation/navigation.ts +8 -1
- package/src/components/editor/notebook-cell.tsx +203 -106
- package/src/components/editor/renderers/__tests__/cells-renderer.test.tsx +66 -0
- package/src/components/editor/renderers/cell-array.tsx +26 -13
- package/src/components/editor/renderers/cells-renderer.tsx +8 -2
- package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +29 -0
- package/src/components/editor/renderers/slides-layout/types.ts +4 -0
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +19 -19
- package/src/components/slides/reveal-component.tsx +37 -17
- package/src/components/slides/slide-form.tsx +72 -0
- package/src/components/ui/toast.tsx +11 -3
- package/src/components/ui/toaster.tsx +65 -9
- package/src/core/ai/context/providers/error.ts +6 -158
- package/src/core/cells/__tests__/utils.test.ts +59 -0
- package/src/core/cells/utils.ts +51 -0
- package/src/core/codemirror/completion/__tests__/signature-hint.test.ts +97 -3
- package/src/core/codemirror/completion/signature-hint.ts +78 -11
- package/src/core/constants.ts +8 -0
- package/src/core/diagnostics/__tests__/issue-details.test.ts +173 -0
- package/src/core/diagnostics/issue-details.ts +139 -0
- package/src/core/errors/__tests__/error-entries.test.ts +25 -0
- package/src/core/errors/error-entries.ts +176 -0
- package/src/core/islands/__tests__/bridge.test.ts +341 -46
- package/src/core/islands/__tests__/main.test.ts +176 -0
- package/src/core/islands/__tests__/parse.test.ts +105 -0
- package/src/core/islands/bootstrap.ts +8 -3
- package/src/core/islands/bridge.ts +117 -23
- package/src/core/islands/components/__tests__/web-components.test.tsx +214 -0
- package/src/core/islands/components/web-components.tsx +76 -15
- package/src/core/islands/constants.ts +1 -0
- package/src/core/islands/main.ts +69 -3
- package/src/core/islands/parse.ts +70 -23
- package/src/core/islands/worker/__tests__/controller.test.ts +173 -0
- package/src/core/islands/worker/worker.tsx +145 -57
- package/src/core/network/__tests__/requests-lazy.test.ts +18 -0
- package/src/core/network/__tests__/requests-network.test.ts +7 -0
- package/src/core/network/requests-lazy.ts +13 -1
- package/src/core/network/requests-network.ts +3 -0
- package/src/core/network/requests-static.ts +1 -0
- package/src/core/network/requests-toasting.tsx +1 -0
- package/src/core/network/types.ts +3 -0
- package/src/core/runtime/__tests__/runtime.test.ts +64 -0
- package/src/core/runtime/runtime.ts +30 -10
- package/src/core/wasm/bridge.ts +8 -0
- package/src/core/wasm/worker/bootstrap.ts +113 -20
- package/src/core/wasm/worker/types.ts +2 -0
- package/src/css/app/Cell.css +10 -0
- package/src/hooks/__tests__/useHotkey.test.tsx +88 -0
- package/src/hooks/useHotkey.ts +29 -4
- package/src/plugins/impl/anywidget/__tests__/host.test.ts +6 -9
- package/src/plugins/impl/anywidget/__tests__/registry.test.ts +3 -1
- package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +32 -61
- package/src/plugins/impl/anywidget/model-proxy.ts +0 -13
- package/src/plugins/impl/anywidget/runtime.ts +1 -0
- package/src/plugins/impl/anywidget/widget-binding.ts +8 -34
- package/src/plugins/impl/image-comparison/ImageComparisonComponent.tsx +53 -2
- package/src/plugins/impl/image-comparison/__tests__/ImageComparisonComponent.test.tsx +71 -0
- package/src/plugins/impl/vega/__tests__/use-vega-container-remeasure.test.ts +102 -0
- package/src/plugins/impl/vega/use-vega-container-remeasure.ts +39 -0
- package/src/plugins/impl/vega/vega-component.tsx +5 -4
- package/src/theme/__tests__/useTheme.test.ts +68 -0
- package/src/theme/useTheme.ts +16 -1
- package/dist/apl-Bdc61P1y.js +0 -4
- package/dist/architecture-7HQA4BMR-Kyc44TmC.js +0 -6
- package/dist/asciiarmor-DVRHDGzT.js +0 -4
- package/dist/asn1-BmuKfkfu.js +0 -4
- package/dist/assets/__vite-browser-external-BQCLNwri.js +0 -1
- package/dist/assets/worker-DAWRHcPq.js +0 -73
- package/dist/brainfuck-DPrRpyTV.js +0 -4
- package/dist/classDiagram-2ON5EDUG-QjoAcuFE.js +0 -30
- package/dist/classDiagram-v2-WZHVMYZB-bUCv4gu2.js +0 -30
- package/dist/clojure-DEttQW5T.js +0 -4
- package/dist/cmake-jNlx_DaM.js +0 -4
- package/dist/cobol-BvvIm5MJ.js +0 -4
- package/dist/coffeescript-DTpBMyFU.js +0 -4
- package/dist/commonlisp-BmmUG8jb.js +0 -4
- package/dist/crystal-BxyqmEWC.js +0 -4
- package/dist/css-BGoCtuG3.js +0 -4
- package/dist/cypher-BmCbdl3u.js +0 -4
- package/dist/d-CFrlbjZt.js +0 -4
- package/dist/diff-D6XwL6P8.js +0 -4
- package/dist/dist-7QfXoMdB.js +0 -5
- package/dist/dist-BEXXyZig.js +0 -5
- package/dist/dist-BYj57OV4.js +0 -5
- package/dist/dist-BlSvQzNr.js +0 -5
- package/dist/dist-CCBlxAgS.js +0 -8
- package/dist/dist-CIDTVIUf.js +0 -5
- package/dist/dist-CqQyhAM8.js +0 -8
- package/dist/dist-CwRu2Xzh.js +0 -5
- package/dist/dist-D8CDTVgf.js +0 -6
- package/dist/dist-D8DNB0nO.js +0 -8
- package/dist/dist-DL6N_q-A.js +0 -5
- package/dist/dist-DOFbNV_b.js +0 -8
- package/dist/dist-DPrYzMY0.js +0 -6
- package/dist/dist-cdmMjgsn.js +0 -5
- package/dist/dtd-Bw0lRN0-.js +0 -4
- package/dist/dylan-B55eBHTt.js +0 -4
- package/dist/ecl-C8G4p0wn.js +0 -4
- package/dist/eiffel-BmH46VJl.js +0 -4
- package/dist/elm-DhzeFqkl.js +0 -4
- package/dist/erlang-CY-wdlsU.js +0 -4
- package/dist/esm-M837UxV5.js +0 -1171
- package/dist/factor-DWkgl0xw.js +0 -4
- package/dist/forth-Cij_ie2t.js +0 -4
- package/dist/fortran-Br3X9cfm.js +0 -4
- package/dist/gas-DYsGcMN2.js +0 -4
- package/dist/gherkin-eVgXQ0fQ.js +0 -4
- package/dist/groovy-_NFHIXG7.js +0 -4
- package/dist/haskell-D6xNG_bH.js +0 -4
- package/dist/haxe-sU_rzAwn.js +0 -5
- package/dist/idl-Ds_VbrUx.js +0 -4
- package/dist/infoDiagram-HS3SLOUP-CEnzWruK.js +0 -30
- package/dist/javascript-CztfIl0i.js +0 -4
- package/dist/julia-DDv40QMV.js +0 -4
- package/dist/livescript-BEOngLLc.js +0 -4
- package/dist/lua-9-7BhQ4Y.js +0 -4
- package/dist/mathematica-DDa0Pfxm.js +0 -4
- package/dist/mbox-iO03mmoE.js +0 -4
- package/dist/mirc-C9z5LT4X.js +0 -4
- package/dist/mllike-jGJbdm_C.js +0 -6
- package/dist/modelica-DzF7oIEL.js +0 -4
- package/dist/mscgen-DB-u125o.js +0 -6
- package/dist/mumps-CRTFHhzh.js +0 -4
- package/dist/nsis-C4NPTuox.js +0 -4
- package/dist/ntriples-BCOoGph1.js +0 -4
- package/dist/octave-DTwNlazz.js +0 -4
- package/dist/oz-DD38AzSz.js +0 -4
- package/dist/pascal-BohSp9jV.js +0 -4
- package/dist/perl-f5OutoPM.js +0 -4
- package/dist/pig-Dv7wSmHb.js +0 -4
- package/dist/powershell-rYgjKB39.js +0 -4
- package/dist/properties-BFUNLRDN.js +0 -4
- package/dist/protobuf-B9QJQPPv.js +0 -4
- package/dist/pug-DzvWpaMC.js +0 -4
- package/dist/puppet-B_K-n_xK.js +0 -4
- package/dist/purify.es-H92eMd9-.js +0 -557
- package/dist/python-CAiFcaA2.js +0 -4
- package/dist/q-cLeFIBLK.js +0 -4
- package/dist/r-04Y-Wco3.js +0 -4
- package/dist/react-vega-B6ncY2Tp.js +0 -9
- package/dist/rpm-FUdrIia9.js +0 -5
- package/dist/ruby-DMjFXuEW.js +0 -4
- package/dist/sas-DzHZxjXK.js +0 -4
- package/dist/scheme-DxHd_Rb9.js +0 -4
- package/dist/shell-C8Kwypgf.js +0 -4
- package/dist/sieve-DdyqOKXZ.js +0 -4
- package/dist/smalltalk-pB7X1D9y.js +0 -4
- package/dist/sparql-NhBO6oOa.js +0 -4
- package/dist/stateDiagram-v2-4FDKWEC3-E0RGjKsm.js +0 -29
- package/dist/stex-KfRnSHzF.js +0 -4
- package/dist/stylus-SfWSnzPv.js +0 -4
- package/dist/swift-jRPdq2zR.js +0 -4
- package/dist/tcl-_hpTHGX3.js +0 -4
- package/dist/textile-C9h8slqH.js +0 -4
- package/dist/toml-DWvtinD4.js +0 -4
- package/dist/troff-Dwo_A0y7.js +0 -4
- package/dist/ttcn-V--CPFKq.js +0 -4
- package/dist/ttcn-cfg-CPSMchTG.js +0 -4
- package/dist/turtle-B4rPGBWu.js +0 -4
- package/dist/vb-DaMBBd4j.js +0 -4
- package/dist/vbscript-BMJQqcE2.js +0 -4
- package/dist/vega-loader.browser-CZ-J8Py3.js +0 -1321
- package/dist/velocity-CGq2QRq2.js +0 -4
- package/dist/verilog-CUNo8F5u.js +0 -4
- package/dist/vhdl-CCzA0msW.js +0 -4
- package/dist/webidl-CqIMDIBL.js +0 -4
- package/dist/xquery-XC5Kbr-1.js +0 -4
- package/dist/yacas-CGOv7Dzy.js +0 -4
- package/dist/z80-CXhVmi-f.js +0 -4
- /package/dist/{Plot-CAYS29h9.js → Plot-YQOuVIei.js} +0 -0
- /package/dist/{apl-BCgCq9iM.js → apl-99A7dLQe.js} +0 -0
- /package/dist/{array-tvvEqPy7.js → array-O78LT16Y.js} +0 -0
- /package/dist/{asciiarmor-BtqU-KJQ.js → asciiarmor-DLEhpFDx.js} +0 -0
- /package/dist/{asn1-Dmb-dTMx.js → asn1-CMrcTsT4.js} +0 -0
- /package/dist/{asterisk-DaVJJDnV.js → asterisk-CqykImq7.js} +0 -0
- /package/dist/{brainfuck-C1HoZKlE.js → brainfuck-ChPt5yBe.js} +0 -0
- /package/dist/{chunk-DR5Q36YT-BflwErH1.js → chunk-DR5Q36YT-5Yp2GWwR.js} +0 -0
- /package/dist/{click-outside-container-BLPjMamz.js → click-outside-container-BSIeYt4y.js} +0 -0
- /package/dist/{clike-CdT0yHjt.js → clike-CE0fXfM_.js} +0 -0
- /package/dist/{clojure-CdyrCpUv.js → clojure-QkBEMU-g.js} +0 -0
- /package/dist/{cmake-BFlPxym7.js → cmake-CU1jX7Mo.js} +0 -0
- /package/dist/{cobol-CcJXewp8.js → cobol-DMOKzzky.js} +0 -0
- /package/dist/{coffeescript-DnKuIKRo.js → coffeescript-DjnjLyfk.js} +0 -0
- /package/dist/{colors-CQAOa8cK.js → colors-DmiH1bIH.js} +0 -0
- /package/dist/{common-keywords-FBrXPTcz.js → common-keywords-D3nPJNQP.js} +0 -0
- /package/dist/{commonlisp-B-kok83Z.js → commonlisp-CYd9iOSe.js} +0 -0
- /package/dist/{crystal-FYRYjI1I.js → crystal-Dy55yoYG.js} +0 -0
- /package/dist/{css-B45lc2V3.js → css-CNU8w3HJ.js} +0 -0
- /package/dist/{cypher-DZMLyVY_.js → cypher-q47DGzK7.js} +0 -0
- /package/dist/{cytoscape.esm-ayF70frT.js → cytoscape.esm-Dr8XzXWK.js} +0 -0
- /package/dist/{d-x-VVT4o9.js → d-jEkaLvxX.js} +0 -0
- /package/dist/{defaultLocale-u-3osm0P.js → defaultLocale-BpsHxBd7.js} +0 -0
- /package/dist/{defaultLocale-BoHTsDG6.js → defaultLocale-DoeErsX2.js} +0 -0
- /package/dist/{diff-Dxe2mpXk.js → diff-vb2-unFN.js} +0 -0
- /package/dist/{dist-BGdYVvOu.js → dist-DsoKosxi.js} +0 -0
- /package/dist/{dtd-C9VM_Wfu.js → dtd-C9kR-bXa.js} +0 -0
- /package/dist/{duckdb-keywords-CvJhR_Yd.js → duckdb-keywords-B6HYCMOT.js} +0 -0
- /package/dist/{dylan-DTSnEIFO.js → dylan-BLckrK-V.js} +0 -0
- /package/dist/{ebnf-2D4Ctp3y.js → ebnf-Cnp3L9jg.js} +0 -0
- /package/dist/{ecl-N04ptnRK.js → ecl-CEsf6XVg.js} +0 -0
- /package/dist/{eiffel-Dd8rpqr_.js → eiffel-2KGZNzx6.js} +0 -0
- /package/dist/{elm-GT2E866W.js → elm-D2s3K5wF.js} +0 -0
- /package/dist/{emotion-is-prop-valid.esm-DzSb5hsH.js → emotion-is-prop-valid.esm-DdVSF4FD.js} +0 -0
- /package/dist/{erlang-Cf0Bp5pY.js → erlang-0PMFOndk.js} +0 -0
- /package/dist/{esm-BaaaPNGl.js → esm-CuQHjs36.js} +0 -0
- /package/dist/{fcl-Ccj8Z5Xd.js → fcl-D9nccAWI.js} +0 -0
- /package/dist/{forth-wd_XzGTg.js → forth-DG89iUsu.js} +0 -0
- /package/dist/{fortran-DcwUTZFe.js → fortran-ytKsAVvu.js} +0 -0
- /package/dist/{gas-DeALIER3.js → gas-Cg2Fm0N2.js} +0 -0
- /package/dist/{gherkin-CKTqaJNX.js → gherkin-B87FEnZ-.js} +0 -0
- /package/dist/{groovy-Bwdp_d8D.js → groovy-Dcs08AWD.js} +0 -0
- /package/dist/{haskell-DCdCcPLK.js → haskell-cwkOuhx6.js} +0 -0
- /package/dist/{haxe-DAyktQWJ.js → haxe-DWEo4q10.js} +0 -0
- /package/dist/{http-_DVAYWoR.js → http-B8jdG64J.js} +0 -0
- /package/dist/{idl-CBuZiRYu.js → idl-WWQwDcRV.js} +0 -0
- /package/dist/{init-uv0kkh4g.js → init-DNBbYZd_.js} +0 -0
- /package/dist/{javascript-DzigE11c.js → javascript-BeR74dxD.js} +0 -0
- /package/dist/{julia-PwfB-0Cm.js → julia-UlvCUYGL.js} +0 -0
- /package/dist/{katex-C_XRmjAP.js → katex-Bld7b-fk.js} +0 -0
- /package/dist/{livescript-BJLz1EbT.js → livescript-GPmFcmYV.js} +0 -0
- /package/dist/{lua-ZC-XC2jf.js → lua-DYoT_0zM.js} +0 -0
- /package/dist/{main-Tj_-QTyF.js → main-B1Jo_8pC.js} +0 -0
- /package/dist/{math-DFcdCCU8.js → math-CBNc2Ib0.js} +0 -0
- /package/dist/{mathematica-DCYMx6qB.js → mathematica-DSFIQlbG.js} +0 -0
- /package/dist/{mbox-OxMK_9XI.js → mbox-ej8lFMdL.js} +0 -0
- /package/dist/{micromark-factory-space-DF2w36zS.js → micromark-factory-space-CwHmg6iz.js} +0 -0
- /package/dist/{mirc-nJVyhA0H.js → mirc-CAdIdvHQ.js} +0 -0
- /package/dist/{mllike-DRO89bsU.js → mllike-CjTB1lHF.js} +0 -0
- /package/dist/{modelica-Don3E6ZD.js → modelica-BB68FYMa.js} +0 -0
- /package/dist/{mscgen-DJfqD3bN.js → mscgen-BkbzgGGI.js} +0 -0
- /package/dist/{mumps-SjGTvDYL.js → mumps-Cu-28E9F.js} +0 -0
- /package/dist/{nginx-DasThI7R.js → nginx-C1ofKPst.js} +0 -0
- /package/dist/{node-sql-parser-B8nBD36q.js → node-sql-parser-DLl_zNw0.js} +0 -0
- /package/dist/{ntriples-CNBKRl3I.js → ntriples-D9cQiZxZ.js} +0 -0
- /package/dist/{octave-DdeVHNlx.js → octave-BvtAnPX0.js} +0 -0
- /package/dist/{once-DPuqGUeo.js → once-B60G2fuJ.js} +0 -0
- /package/dist/{oz-CcKSoNvN.js → oz-COaVHk2E.js} +0 -0
- /package/dist/{pascal-6leftwNj.js → pascal-BFpqVD2x.js} +0 -0
- /package/dist/{path-BGaWgPKg.js → path-DwWbhZFI.js} +0 -0
- /package/dist/{perl-BhJIwWzN.js → perl-DaiORxHP.js} +0 -0
- /package/dist/{pig-r-xDHqRf.js → pig-DFzRhmsF.js} +0 -0
- /package/dist/{powershell-D-BELeNi.js → powershell-BG2LQNKN.js} +0 -0
- /package/dist/{properties-CnuDhbll.js → properties-CqJJR5QY.js} +0 -0
- /package/dist/{protobuf-CO8RBhvX.js → protobuf-WwDYV1yY.js} +0 -0
- /package/dist/{puppet-NmXHjLy8.js → puppet-QNY3w_uN.js} +0 -0
- /package/dist/{python-DAQXi720.js → python-4QrQ3Ugi.js} +0 -0
- /package/dist/{q-DlikXfV0.js → q-DhwXuxE2.js} +0 -0
- /package/dist/{r-CuohilwT.js → r-Df-nkR25.js} +0 -0
- /package/dist/{range-C-rmrM1O.js → range-BOiA8qqU.js} +0 -0
- /package/dist/{rpm-0Pjwp0Pb.js → rpm-Cokue07s.js} +0 -0
- /package/dist/{ruby-Dq8NJTDG.js → ruby-DrYcL3qF.js} +0 -0
- /package/dist/{sas-CuwonyVP.js → sas-CoiPirA5.js} +0 -0
- /package/dist/{scheme-CYU-RRIf.js → scheme-CwFLjzHv.js} +0 -0
- /package/dist/{semaphore-CNDGTzkX.js → semaphore-C8rmHdhj.js} +0 -0
- /package/dist/{shell-COPmX2qE.js → shell-BFV-R24I.js} +0 -0
- /package/dist/{sieve-B_3zyLne.js → sieve-CxwXF5T9.js} +0 -0
- /package/dist/{simple-mode-DSBniks8.js → simple-mode-DTaJtKPt.js} +0 -0
- /package/dist/{smalltalk-DRft7iPv.js → smalltalk-QivVOCtX.js} +0 -0
- /package/dist/{solr-RZ9uTl59.js → solr-BLvysN-c.js} +0 -0
- /package/dist/{sparql-CN6qj55H.js → sparql-nKsFk8j7.js} +0 -0
- /package/dist/{spreadsheet-BNNUNXA2.js → spreadsheet-BWc8C2FT.js} +0 -0
- /package/dist/{sql-B4x8IkwU.js → sql-CWfUjlV1.js} +0 -0
- /package/dist/{stex-BIsgBmK4.js → stex-DtMAhV4-.js} +0 -0
- /package/dist/{stylus-Bn_ZjOQ3.js → stylus-BLKQAycn.js} +0 -0
- /package/dist/{swift-BLUJhMbz.js → swift-CJoKqiKj.js} +0 -0
- /package/dist/{tcl-C86fxecl.js → tcl-YTeYFNUc.js} +0 -0
- /package/dist/{textile-DmHh2rsK.js → textile-C6rKQqMQ.js} +0 -0
- /package/dist/{tiddlywiki-DI0mF2WJ.js → tiddlywiki-ZXwTHGNT.js} +0 -0
- /package/dist/{tiki-2HU6XLLn.js → tiki-C628O_u4.js} +0 -0
- /package/dist/{timer-YZl28NYN.js → timer-BpI_FKSA.js} +0 -0
- /package/dist/{toml-GWANRNAD.js → toml-DxlPGbRy.js} +0 -0
- /package/dist/{treemap-D-ka1hvx.js → treemap-DY3NBr79.js} +0 -0
- /package/dist/{troff-BHTsomIy.js → troff-DFCfH7Ku.js} +0 -0
- /package/dist/{ttcn-DQuhn5Mn.js → ttcn-DAW-ERVP.js} +0 -0
- /package/dist/{ttcn-cfg-HjFYtdB-.js → ttcn-cfg-CpJ8b7EN.js} +0 -0
- /package/dist/{turtle-nCay33Nv.js → turtle-BneV2f8L.js} +0 -0
- /package/dist/{vb-BG-XlqqJ.js → vb-D973Vxxh.js} +0 -0
- /package/dist/{vbscript-B6vyW0-D.js → vbscript-Dckaq3YO.js} +0 -0
- /package/dist/{velocity-CWegueqO.js → velocity-DKty-GUC.js} +0 -0
- /package/dist/{verilog-CzSQm4cG.js → verilog-aNaK_biA.js} +0 -0
- /package/dist/{vhdl-DqnNVL7r.js → vhdl-CQuehnQy.js} +0 -0
- /package/dist/{webidl-DXEUpDWH.js → webidl-Bhg8vaMr.js} +0 -0
- /package/dist/{xquery-Ba_NB5bD.js → xquery-D2q16GaM.js} +0 -0
- /package/dist/{yacas-HKQU6hyk.js → yacas-DHGOHnNa.js} +0 -0
- /package/dist/{z80-CXkHXLdj.js → z80-BPhTmO22.js} +0 -0
package/src/core/wasm/bridge.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { getInitialAppMode } from "../mode";
|
|
|
16
16
|
import { API } from "../network/api";
|
|
17
17
|
import type {
|
|
18
18
|
EditRequests,
|
|
19
|
+
EnvironmentInfo,
|
|
19
20
|
ExportAsHTMLRequest,
|
|
20
21
|
ExportAsMarkdownRequest,
|
|
21
22
|
FileCopyResponse,
|
|
@@ -629,6 +630,13 @@ export class PyodideBridge implements RunRequests, EditRequests {
|
|
|
629
630
|
};
|
|
630
631
|
|
|
631
632
|
getUsageStats = throwNotImplemented;
|
|
633
|
+
getEnvironmentInfo: EditRequests["getEnvironmentInfo"] = async () => {
|
|
634
|
+
const response = await this.rpc.proxy.request.bridge({
|
|
635
|
+
functionName: "get_environment_info",
|
|
636
|
+
payload: undefined,
|
|
637
|
+
});
|
|
638
|
+
return response as EnvironmentInfo;
|
|
639
|
+
};
|
|
632
640
|
openTutorial = throwNotImplemented;
|
|
633
641
|
getRecentFiles = throwNotImplemented;
|
|
634
642
|
getWorkspaceFiles = throwNotImplemented;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
import { loadPyodide, type PyodideInterface } from "pyodide";
|
|
3
|
+
import type { PyCallable, PyProxy } from "pyodide/ffi";
|
|
3
4
|
import type { UserConfig } from "@/core/config/config-schema";
|
|
4
5
|
import type { NotificationPayload } from "@/core/kernel/messages";
|
|
5
6
|
import type { JsonString } from "@/utils/json/base64";
|
|
@@ -12,6 +13,12 @@ import type { SerializedBridge, WasmController } from "./types";
|
|
|
12
13
|
import { shouldLoadDuckDBPackages } from "../utils";
|
|
13
14
|
|
|
14
15
|
const MAKE_SNAPSHOT = false;
|
|
16
|
+
type SessionResources = [
|
|
17
|
+
bridge: PyProxy,
|
|
18
|
+
init: PyCallable,
|
|
19
|
+
packages: PyProxy,
|
|
20
|
+
stop: PyCallable,
|
|
21
|
+
];
|
|
15
22
|
|
|
16
23
|
// This class initializes the wasm environment
|
|
17
24
|
// We would like this initialization to be parallelizable
|
|
@@ -25,6 +32,9 @@ const MAKE_SNAPSHOT = false;
|
|
|
25
32
|
|
|
26
33
|
export class DefaultWasmController implements WasmController {
|
|
27
34
|
protected pyodide: PyodideInterface | null = null;
|
|
35
|
+
private packageLoadQueue = Promise.resolve();
|
|
36
|
+
private sessionGeneration = 0;
|
|
37
|
+
private activeSessionStops = new Set<PyCallable>();
|
|
28
38
|
|
|
29
39
|
get requirePyodide() {
|
|
30
40
|
invariant(this.pyodide, "Pyodide not loaded");
|
|
@@ -111,6 +121,7 @@ export class DefaultWasmController implements WasmController {
|
|
|
111
121
|
onMessage: (message: JsonString<NotificationPayload>) => void;
|
|
112
122
|
userConfig: UserConfig;
|
|
113
123
|
}): Promise<SerializedBridge> {
|
|
124
|
+
const sessionGeneration = this.sessionGeneration;
|
|
114
125
|
const { code, filename, onMessage, queryParameters, userConfig } = opts;
|
|
115
126
|
// We pass down a messenger object to the code
|
|
116
127
|
// This is used to have synchronous communication between the JS and Python code
|
|
@@ -126,47 +137,129 @@ export class DefaultWasmController implements WasmController {
|
|
|
126
137
|
|
|
127
138
|
const span = t.startSpan("startSession.runPython");
|
|
128
139
|
const nbFilename = filename || WasmFileSystem.NOTEBOOK_FILENAME;
|
|
129
|
-
const
|
|
140
|
+
const sessionResources = this.requirePyodide.runPython(
|
|
130
141
|
`
|
|
131
142
|
print("[py] Starting marimo...")
|
|
132
143
|
import asyncio
|
|
144
|
+
import gc
|
|
133
145
|
import js
|
|
134
146
|
from marimo._pyodide.bootstrap import create_session, instantiate
|
|
135
147
|
|
|
136
148
|
assert js.messenger, "messenger is not defined"
|
|
137
149
|
assert js.query_params, "query_params is not defined"
|
|
138
150
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
151
|
+
def create_session_resources():
|
|
152
|
+
session, bridge = create_session(
|
|
153
|
+
filename="${nbFilename}",
|
|
154
|
+
query_params=js.query_params.to_py(),
|
|
155
|
+
message_callback=js.messenger.callback,
|
|
156
|
+
user_config=js.user_config.to_py(),
|
|
157
|
+
)
|
|
158
|
+
session_task = None
|
|
145
159
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
160
|
+
def init(auto_instantiate=True):
|
|
161
|
+
nonlocal session_task
|
|
162
|
+
instantiate(session, auto_instantiate)
|
|
163
|
+
session_task = asyncio.create_task(session.start())
|
|
149
164
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
165
|
+
async def stop():
|
|
166
|
+
nonlocal bridge, session, session_task
|
|
167
|
+
task = session_task
|
|
168
|
+
kernel_task = getattr(session, "kernel_task", None)
|
|
169
|
+
if kernel_task is None:
|
|
170
|
+
if task is not None:
|
|
171
|
+
task.cancel()
|
|
172
|
+
else:
|
|
173
|
+
kernel_task.stop()
|
|
174
|
+
if task is not None:
|
|
175
|
+
await asyncio.gather(task, return_exceptions=True)
|
|
176
|
+
if bridge is not None:
|
|
177
|
+
bridge.session = None
|
|
178
|
+
task = None
|
|
179
|
+
kernel_task = None
|
|
180
|
+
session_task = None
|
|
181
|
+
session = None
|
|
182
|
+
bridge = None
|
|
183
|
+
gc.collect()
|
|
153
184
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
span.end();
|
|
185
|
+
with open("${nbFilename}", "r") as f:
|
|
186
|
+
packages = session.find_packages(f.read())
|
|
157
187
|
|
|
158
|
-
|
|
188
|
+
return bridge, init, packages, stop
|
|
189
|
+
|
|
190
|
+
create_session_resources()`,
|
|
191
|
+
) as PyProxy;
|
|
192
|
+
span.end();
|
|
193
|
+
let bridgeProxy!: PyProxy;
|
|
194
|
+
let initSession!: PyCallable;
|
|
195
|
+
let packagesProxy!: PyProxy;
|
|
196
|
+
let stopSession!: PyCallable;
|
|
197
|
+
try {
|
|
198
|
+
[bridgeProxy, initSession, packagesProxy, stopSession] =
|
|
199
|
+
sessionResources as unknown as SessionResources;
|
|
200
|
+
} finally {
|
|
201
|
+
sessionResources.destroy();
|
|
202
|
+
}
|
|
203
|
+
let foundPackages: Set<string>;
|
|
204
|
+
try {
|
|
205
|
+
foundPackages = new Set<string>(packagesProxy.toJs());
|
|
206
|
+
} catch (error) {
|
|
207
|
+
bridgeProxy.destroy();
|
|
208
|
+
initSession.destroy();
|
|
209
|
+
stopSession.destroy();
|
|
210
|
+
throw error;
|
|
211
|
+
} finally {
|
|
212
|
+
packagesProxy.destroy();
|
|
213
|
+
}
|
|
214
|
+
this.activeSessionStops.add(stopSession);
|
|
159
215
|
|
|
160
216
|
// Fire and forget:
|
|
161
217
|
// Load notebook dependencies and instantiate the session
|
|
162
218
|
// We don't want to wait for this to finish,
|
|
163
219
|
// so we can show the initial code immediately giving
|
|
164
220
|
// a sense of responsiveness.
|
|
165
|
-
|
|
166
|
-
|
|
221
|
+
const dependenciesReady = this.packageLoadQueue.then(() => {
|
|
222
|
+
if (sessionGeneration !== this.sessionGeneration) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
return this.loadNotebookDeps(code, foundPackages);
|
|
167
226
|
});
|
|
227
|
+
this.packageLoadQueue = dependenciesReady.catch(() => undefined);
|
|
228
|
+
void dependenciesReady
|
|
229
|
+
.then(() => {
|
|
230
|
+
if (sessionGeneration !== this.sessionGeneration) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
return initSession(userConfig.runtime.auto_instantiate);
|
|
234
|
+
})
|
|
235
|
+
.catch((error: unknown) => {
|
|
236
|
+
Logger.error("Failed to load notebook dependencies", error);
|
|
237
|
+
})
|
|
238
|
+
.finally(() => initSession.destroy());
|
|
239
|
+
|
|
240
|
+
return bridgeProxy as unknown as SerializedBridge;
|
|
241
|
+
}
|
|
168
242
|
|
|
169
|
-
|
|
243
|
+
async stopSession(): Promise<void> {
|
|
244
|
+
this.sessionGeneration += 1;
|
|
245
|
+
const stops = [...this.activeSessionStops];
|
|
246
|
+
let hasFailure = false;
|
|
247
|
+
let firstFailure: unknown;
|
|
248
|
+
for (const stop of stops) {
|
|
249
|
+
try {
|
|
250
|
+
await stop();
|
|
251
|
+
this.activeSessionStops.delete(stop);
|
|
252
|
+
stop.destroy();
|
|
253
|
+
} catch (error) {
|
|
254
|
+
if (!hasFailure) {
|
|
255
|
+
hasFailure = true;
|
|
256
|
+
firstFailure = error;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (hasFailure) {
|
|
261
|
+
throw firstFailure;
|
|
262
|
+
}
|
|
170
263
|
}
|
|
171
264
|
|
|
172
265
|
private async loadNotebookDeps(code: string, foundPackages: Set<string>) {
|
|
@@ -9,6 +9,7 @@ import type { JsonString } from "@/utils/json/base64";
|
|
|
9
9
|
import type {
|
|
10
10
|
CodeCompletionRequest,
|
|
11
11
|
CopyNotebookRequest,
|
|
12
|
+
EnvironmentInfo,
|
|
12
13
|
ExportAsHTMLRequest,
|
|
13
14
|
ExportAsMarkdownRequest,
|
|
14
15
|
FileCopyRequest,
|
|
@@ -73,6 +74,7 @@ export interface RawBridge {
|
|
|
73
74
|
code_complete(request: CodeCompletionRequest): Promise<string>;
|
|
74
75
|
read_code(): Promise<{ contents: string }>;
|
|
75
76
|
read_snippets(): Promise<Snippets>;
|
|
77
|
+
get_environment_info(): Promise<EnvironmentInfo>;
|
|
76
78
|
format(request: FormatCellsRequest): Promise<FormatResponse>;
|
|
77
79
|
save(request: SaveNotebookRequest): Promise<string>;
|
|
78
80
|
copy(request: CopyNotebookRequest): Promise<string>;
|
package/src/css/app/Cell.css
CHANGED
|
@@ -255,6 +255,12 @@
|
|
|
255
255
|
border: none;
|
|
256
256
|
box-shadow: none;
|
|
257
257
|
|
|
258
|
+
/* No dividers between sections. Tailwind v4's divide-y is structural
|
|
259
|
+
* (`> :not(:last-child)`), so hidden-but-mounted children (e.g. the tray
|
|
260
|
+
* while presenting) still count as siblings and would otherwise draw a
|
|
261
|
+
* stray rule under the output. */
|
|
262
|
+
@apply divide-y-0;
|
|
263
|
+
|
|
258
264
|
.output-area {
|
|
259
265
|
/* flow-root interferes with margin collapsing, but appears to be unneeded
|
|
260
266
|
* when cell outlines are hidden; clear:both is sufficient.
|
|
@@ -443,6 +449,10 @@
|
|
|
443
449
|
/* Set a fixed gutter width to ensure the hover area is always wide enough */
|
|
444
450
|
/* And make the gutter bigger when the window is super wide */
|
|
445
451
|
--gutter-width: 100px;
|
|
452
|
+
|
|
453
|
+
/* Vertical gap between notebook cells (gap-5). Overridable via custom css;
|
|
454
|
+
* zeroed while presenting, when published cells flow together. */
|
|
455
|
+
--notebook-cell-gap: 1.25rem;
|
|
446
456
|
}
|
|
447
457
|
|
|
448
458
|
/* ------------------------ CodeMirror Editor ----------------------------- */
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { renderHook } from "@testing-library/react";
|
|
3
|
+
import { createStore, Provider } from "jotai";
|
|
4
|
+
import { describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { Functions } from "@/utils/functions";
|
|
6
|
+
import { useHotkey } from "../useHotkey";
|
|
7
|
+
|
|
8
|
+
// global.hideCode is bound to "Mod-." by default; "mod" accepts ctrl or meta.
|
|
9
|
+
const SHORTCUT = "global.hideCode";
|
|
10
|
+
|
|
11
|
+
function createWrapper() {
|
|
12
|
+
const store = createStore();
|
|
13
|
+
return ({ children }: { children: React.ReactNode }) => (
|
|
14
|
+
<Provider store={store}>{children}</Provider>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function press() {
|
|
19
|
+
const event = new KeyboardEvent("keydown", {
|
|
20
|
+
key: ".",
|
|
21
|
+
ctrlKey: true,
|
|
22
|
+
cancelable: true,
|
|
23
|
+
bubbles: true,
|
|
24
|
+
});
|
|
25
|
+
document.dispatchEvent(event);
|
|
26
|
+
return event;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
describe("useHotkey", () => {
|
|
30
|
+
it("invokes the callback and prevents default", () => {
|
|
31
|
+
const callback = vi.fn();
|
|
32
|
+
renderHook(() => useHotkey(SHORTCUT, callback), {
|
|
33
|
+
wrapper: createWrapper(),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const event = press();
|
|
37
|
+
expect(callback).toHaveBeenCalledOnce();
|
|
38
|
+
expect(event.defaultPrevented).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("does not prevent default when the callback returns false", () => {
|
|
42
|
+
const callback = vi.fn(() => false);
|
|
43
|
+
renderHook(() => useHotkey(SHORTCUT, callback), {
|
|
44
|
+
wrapper: createWrapper(),
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const event = press();
|
|
48
|
+
expect(callback).toHaveBeenCalledOnce();
|
|
49
|
+
expect(event.defaultPrevented).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("still swallows the keystroke for NOOP catch-all handlers", () => {
|
|
53
|
+
renderHook(() => useHotkey(SHORTCUT, Functions.NOOP), {
|
|
54
|
+
wrapper: createWrapper(),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const event = press();
|
|
58
|
+
expect(event.defaultPrevented).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("neither runs the callback nor prevents default when disabled", () => {
|
|
62
|
+
const callback = vi.fn();
|
|
63
|
+
renderHook(() => useHotkey(SHORTCUT, callback, { disabled: true }), {
|
|
64
|
+
wrapper: createWrapper(),
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const event = press();
|
|
68
|
+
expect(callback).not.toHaveBeenCalled();
|
|
69
|
+
expect(event.defaultPrevented).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("re-enables when disabled flips back to false", () => {
|
|
73
|
+
const callback = vi.fn();
|
|
74
|
+
const { rerender } = renderHook(
|
|
75
|
+
({ disabled }: { disabled: boolean }) =>
|
|
76
|
+
useHotkey(SHORTCUT, callback, { disabled }),
|
|
77
|
+
{ wrapper: createWrapper(), initialProps: { disabled: true } },
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
press();
|
|
81
|
+
expect(callback).not.toHaveBeenCalled();
|
|
82
|
+
|
|
83
|
+
rerender({ disabled: false });
|
|
84
|
+
const event = press();
|
|
85
|
+
expect(callback).toHaveBeenCalledOnce();
|
|
86
|
+
expect(event.defaultPrevented).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
});
|
package/src/hooks/useHotkey.ts
CHANGED
|
@@ -17,13 +17,31 @@ type HotkeyHandler = (
|
|
|
17
17
|
// oxlint-disable-next-line typescript/no-invalid-void-type
|
|
18
18
|
) => boolean | void | undefined | Promise<void>;
|
|
19
19
|
|
|
20
|
+
interface HotkeyOptions {
|
|
21
|
+
/**
|
|
22
|
+
* If true, the hotkey is not handled at all: the callback does not run, the
|
|
23
|
+
* event's default is not prevented, and the action is not registered in the
|
|
24
|
+
* shortcut registry.
|
|
25
|
+
*
|
|
26
|
+
* This differs from passing `Functions.NOOP` as the callback, which still
|
|
27
|
+
* swallows the keystroke (preventDefault) to suppress native browser/OS
|
|
28
|
+
* behavior.
|
|
29
|
+
*/
|
|
30
|
+
disabled?: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
20
33
|
/**
|
|
21
34
|
* Registers a hotkey listener for the given shortcut.
|
|
22
35
|
*
|
|
23
36
|
* @param callback The callback to run when the shortcut is pressed. It does not need to be memoized as this hook will always use the latest callback.
|
|
24
37
|
* If the callback returns false, preventDefault will not be called on the event.
|
|
25
38
|
*/
|
|
26
|
-
export function useHotkey(
|
|
39
|
+
export function useHotkey(
|
|
40
|
+
shortcut: HotkeyAction,
|
|
41
|
+
callback: HotkeyHandler,
|
|
42
|
+
options: HotkeyOptions = {},
|
|
43
|
+
) {
|
|
44
|
+
const { disabled = false } = options;
|
|
27
45
|
const { registerAction, unregisterAction } = useSetRegisteredAction();
|
|
28
46
|
const hotkeys = useAtomValue(hotkeysAtom);
|
|
29
47
|
|
|
@@ -31,7 +49,7 @@ export function useHotkey(shortcut: HotkeyAction, callback: HotkeyHandler) {
|
|
|
31
49
|
const memoizeCallback = useEvent((evt?: KeyboardEvent) => callback(evt));
|
|
32
50
|
|
|
33
51
|
const listener = useEvent((e: KeyboardEvent) => {
|
|
34
|
-
if (e.defaultPrevented) {
|
|
52
|
+
if (disabled || e.defaultPrevented) {
|
|
35
53
|
return;
|
|
36
54
|
}
|
|
37
55
|
|
|
@@ -51,11 +69,18 @@ export function useHotkey(shortcut: HotkeyAction, callback: HotkeyHandler) {
|
|
|
51
69
|
|
|
52
70
|
// Register with the shortcut registry
|
|
53
71
|
useEffect(() => {
|
|
54
|
-
if (!isNOOP) {
|
|
72
|
+
if (!isNOOP && !disabled) {
|
|
55
73
|
registerAction(shortcut, memoizeCallback);
|
|
56
74
|
return () => unregisterAction(shortcut);
|
|
57
75
|
}
|
|
58
|
-
}, [
|
|
76
|
+
}, [
|
|
77
|
+
memoizeCallback,
|
|
78
|
+
shortcut,
|
|
79
|
+
isNOOP,
|
|
80
|
+
disabled,
|
|
81
|
+
registerAction,
|
|
82
|
+
unregisterAction,
|
|
83
|
+
]);
|
|
59
84
|
}
|
|
60
85
|
|
|
61
86
|
/**
|
|
@@ -277,25 +277,22 @@ describe("WidgetBinding receives a host in render props", () => {
|
|
|
277
277
|
});
|
|
278
278
|
});
|
|
279
279
|
|
|
280
|
-
describe("host-mounted views
|
|
281
|
-
it("
|
|
282
|
-
const childId = asModelId("host-
|
|
280
|
+
describe("host-mounted views", () => {
|
|
281
|
+
it("render with the child's current model state", async () => {
|
|
282
|
+
const childId = asModelId("host-child-state");
|
|
283
283
|
const parentController = new AbortController();
|
|
284
284
|
const getModuleSpy = vi.spyOn(WIDGET_DEF_REGISTRY, "getModule");
|
|
285
285
|
try {
|
|
286
286
|
const childWidget = {
|
|
287
287
|
render: vi.fn(({ model, el }) => {
|
|
288
|
-
el.textContent =
|
|
289
|
-
model.on("change:count", () => {
|
|
290
|
-
el.textContent = `count is ${model.get("count")}`;
|
|
291
|
-
});
|
|
288
|
+
el.textContent = `count is ${model.get("count")}`;
|
|
292
289
|
}),
|
|
293
290
|
};
|
|
294
291
|
const childModel = new Model<ModelState>({ count: 8 }, createMockComm());
|
|
295
292
|
WIDGET_REGISTRY.setModel(childId, childModel);
|
|
296
293
|
WIDGET_REGISTRY.setSpec(childId, {
|
|
297
|
-
url: "./@file/10-host-
|
|
298
|
-
hash: "hash-host-
|
|
294
|
+
url: "./@file/10-host-child-state.js",
|
|
295
|
+
hash: "hash-host-child-state",
|
|
299
296
|
});
|
|
300
297
|
getModuleSpy.mockResolvedValue({ default: childWidget });
|
|
301
298
|
|
|
@@ -210,7 +210,7 @@ describe("WidgetRegistry.getWidget", () => {
|
|
|
210
210
|
});
|
|
211
211
|
|
|
212
212
|
afterEach(() => {
|
|
213
|
-
|
|
213
|
+
vi.restoreAllMocks();
|
|
214
214
|
});
|
|
215
215
|
|
|
216
216
|
it("binds an undisplayed widget from its ESM spec", async () => {
|
|
@@ -309,6 +309,7 @@ describe("WidgetRegistry.getWidget", () => {
|
|
|
309
309
|
});
|
|
310
310
|
|
|
311
311
|
it("rejects with the AFM error when the module has no usable exports", async () => {
|
|
312
|
+
const invalidateSpy = vi.spyOn(WIDGET_DEF_REGISTRY, "invalidate");
|
|
312
313
|
getModuleSpy.mockResolvedValue({ notAWidget: true });
|
|
313
314
|
|
|
314
315
|
const model = new Model<ModelState>({ count: 0 }, createMockComm());
|
|
@@ -318,6 +319,7 @@ describe("WidgetRegistry.getWidget", () => {
|
|
|
318
319
|
await expect(registry.getWidget(testId)).rejects.toThrow(
|
|
319
320
|
/missing a default export/,
|
|
320
321
|
);
|
|
322
|
+
expect(invalidateSpy).toHaveBeenCalledWith(SPEC.hash);
|
|
321
323
|
});
|
|
322
324
|
|
|
323
325
|
it("rejects when the model never arrives", async () => {
|
|
@@ -95,6 +95,16 @@ describe("WidgetDefRegistry", () => {
|
|
|
95
95
|
promise1.catch(() => undefined);
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
+
it("should retry a new URL after invalidating the same hash", () => {
|
|
99
|
+
const promise1 = getModule(registry, "http://localhost/a.js", "same-hash");
|
|
100
|
+
registry.invalidate("same-hash");
|
|
101
|
+
const promise2 = getModule(registry, "http://localhost/b.js", "same-hash");
|
|
102
|
+
|
|
103
|
+
expect(promise1).not.toBe(promise2);
|
|
104
|
+
promise1.catch(() => undefined);
|
|
105
|
+
promise2.catch(() => undefined);
|
|
106
|
+
});
|
|
107
|
+
|
|
98
108
|
it("should create different promises for different hashes", () => {
|
|
99
109
|
const promise1 = getModule(registry, "http://localhost/a.js", "hash-a");
|
|
100
110
|
const promise2 = getModule(registry, "http://localhost/b.js", "hash-b");
|
|
@@ -337,13 +347,12 @@ describe("WidgetBinding", () => {
|
|
|
337
347
|
{ el: document.createElement("div") },
|
|
338
348
|
{ signal: controller.signal },
|
|
339
349
|
);
|
|
340
|
-
// Called once by the hydration replay at mount, once by the set.
|
|
341
350
|
model.set("count", 1);
|
|
342
|
-
expect(onCount).toHaveBeenCalledTimes(
|
|
351
|
+
expect(onCount).toHaveBeenCalledTimes(1);
|
|
343
352
|
|
|
344
353
|
controller.abort();
|
|
345
354
|
model.set("count", 2);
|
|
346
|
-
expect(onCount).toHaveBeenCalledTimes(
|
|
355
|
+
expect(onCount).toHaveBeenCalledTimes(1);
|
|
347
356
|
});
|
|
348
357
|
|
|
349
358
|
it("should auto-clear initialize listeners on destroy", async () => {
|
|
@@ -366,92 +375,54 @@ describe("WidgetBinding", () => {
|
|
|
366
375
|
});
|
|
367
376
|
});
|
|
368
377
|
|
|
369
|
-
describe("WidgetBinding
|
|
370
|
-
it("
|
|
378
|
+
describe("WidgetBinding render listeners", () => {
|
|
379
|
+
it("fire only for changes after mount, never for pre-existing state", async () => {
|
|
371
380
|
const model = new Model<ModelState>({ count: 8 }, createMockComm());
|
|
372
|
-
const
|
|
373
|
-
const
|
|
374
|
-
render: vi.fn(({ model, el }) => {
|
|
375
|
-
// A widget view that starts with a local default and relies on
|
|
376
|
-
// change events for hydration.
|
|
377
|
-
el.textContent = "count is 5";
|
|
378
|
-
model.on("change:count", () => {
|
|
379
|
-
el.textContent = `count is ${model.get("count")}`;
|
|
380
|
-
});
|
|
381
|
-
}),
|
|
382
|
-
};
|
|
383
|
-
const binding = await createBinding(widgetDef, model);
|
|
384
|
-
|
|
385
|
-
const controller = new AbortController();
|
|
386
|
-
await binding.createView({ el }, { signal: controller.signal });
|
|
387
|
-
expect(el.textContent).toBe("count is 8");
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
it("does not re-fire listeners of already-mounted views", async () => {
|
|
391
|
-
// Mounting view B must not double-paint view A: the replay is
|
|
392
|
-
// scoped to the listeners the new render attached.
|
|
393
|
-
const model = new Model<ModelState>({ count: 0 }, createMockComm());
|
|
394
|
-
const listeners: Array<ReturnType<typeof vi.fn>> = [];
|
|
381
|
+
const onCount = vi.fn();
|
|
382
|
+
const onAnyChange = vi.fn();
|
|
395
383
|
const widgetDef = {
|
|
396
384
|
render: vi.fn(({ model }) => {
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
model.on("change:count", listener);
|
|
385
|
+
model.on("change:count", onCount);
|
|
386
|
+
model.on("change", onAnyChange);
|
|
400
387
|
}),
|
|
401
388
|
};
|
|
402
389
|
const binding = await createBinding(widgetDef, model);
|
|
403
390
|
const controller = new AbortController();
|
|
404
|
-
|
|
405
391
|
await binding.createView(
|
|
406
392
|
{ el: document.createElement("div") },
|
|
407
393
|
{ signal: controller.signal },
|
|
408
394
|
);
|
|
409
|
-
expect(
|
|
395
|
+
expect(onCount).not.toHaveBeenCalled();
|
|
396
|
+
expect(onAnyChange).not.toHaveBeenCalled();
|
|
410
397
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
);
|
|
415
|
-
// View B's listener hydrated once; view A's was left alone.
|
|
416
|
-
expect(listeners[1]).toHaveBeenCalledTimes(1);
|
|
417
|
-
expect(listeners[0]).toHaveBeenCalledTimes(1);
|
|
398
|
+
model.set("count", 9);
|
|
399
|
+
expect(onCount).toHaveBeenCalledTimes(1);
|
|
400
|
+
expect(onCount).toHaveBeenCalledWith(9);
|
|
418
401
|
});
|
|
419
402
|
|
|
420
|
-
it("
|
|
421
|
-
const model = new Model<ModelState>({ count:
|
|
422
|
-
const
|
|
403
|
+
it("mounting a second view does not fire the first view's listeners", async () => {
|
|
404
|
+
const model = new Model<ModelState>({ count: 0 }, createMockComm());
|
|
405
|
+
const listeners: Array<ReturnType<typeof vi.fn>> = [];
|
|
423
406
|
const widgetDef = {
|
|
424
407
|
render: vi.fn(({ model }) => {
|
|
425
|
-
|
|
408
|
+
const listener = vi.fn();
|
|
409
|
+
listeners.push(listener);
|
|
410
|
+
model.on("change:count", listener);
|
|
426
411
|
}),
|
|
427
412
|
};
|
|
428
413
|
const binding = await createBinding(widgetDef, model);
|
|
429
414
|
const controller = new AbortController();
|
|
415
|
+
|
|
430
416
|
await binding.createView(
|
|
431
417
|
{ el: document.createElement("div") },
|
|
432
418
|
{ signal: controller.signal },
|
|
433
419
|
);
|
|
434
|
-
expect(onAnyChange).toHaveBeenCalledTimes(1);
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
it("does not replay initialize listeners", async () => {
|
|
438
|
-
// The guarantee is per-view: initialize listeners existed before
|
|
439
|
-
// any view, and replaying at them would fire once per mount.
|
|
440
|
-
const model = new Model<ModelState>({ count: 1 }, createMockComm());
|
|
441
|
-
const initListener = vi.fn();
|
|
442
|
-
const widgetDef = {
|
|
443
|
-
initialize: vi.fn(({ model }) => {
|
|
444
|
-
model.on("change:count", initListener);
|
|
445
|
-
}),
|
|
446
|
-
render: vi.fn(),
|
|
447
|
-
};
|
|
448
|
-
const binding = await createBinding(widgetDef, model);
|
|
449
|
-
const controller = new AbortController();
|
|
450
420
|
await binding.createView(
|
|
451
421
|
{ el: document.createElement("div") },
|
|
452
422
|
{ signal: controller.signal },
|
|
453
423
|
);
|
|
454
|
-
expect(
|
|
424
|
+
expect(listeners[0]).not.toHaveBeenCalled();
|
|
425
|
+
expect(listeners[1]).not.toHaveBeenCalled();
|
|
455
426
|
});
|
|
456
427
|
|
|
457
428
|
it("clears the element before rendering into it", async () => {
|
|
@@ -5,15 +5,6 @@ import type { ModelState } from "./types";
|
|
|
5
5
|
|
|
6
6
|
type ModelEventCallback = Parameters<AnyModel<ModelState>["on"]>[1];
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* A listener registered through a model proxy (see the hydration
|
|
10
|
-
* replay in `WidgetBinding.createView`).
|
|
11
|
-
*/
|
|
12
|
-
export interface ProxyRegistration {
|
|
13
|
-
event: string;
|
|
14
|
-
callback: ModelEventCallback;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
8
|
/**
|
|
18
9
|
* Wrap a model so every `on()` call from inside `initialize` or `render`
|
|
19
10
|
* is auto-tied to a lifetime `AbortSignal`. When the signal aborts,
|
|
@@ -27,14 +18,11 @@ export interface ProxyRegistration {
|
|
|
27
18
|
* The proxy is purely a host-side ergonomic helper. The widget author
|
|
28
19
|
* still writes `model.on("change:foo", handler)` exactly as before; the
|
|
29
20
|
* cleanup signal is supplied transparently.
|
|
30
|
-
*
|
|
31
|
-
* `onRegister`, when given, observes each `on()` registration.
|
|
32
21
|
*/
|
|
33
22
|
// oxlint-disable-next-line marimo/prefer-object-params -- concise internal helper used at protocol call sites
|
|
34
23
|
export function modelProxy<T extends ModelState>(
|
|
35
24
|
model: AnyModel<T>,
|
|
36
25
|
signal: AbortSignal,
|
|
37
|
-
onRegister?: (registration: ProxyRegistration) => void,
|
|
38
26
|
): AnyModel<T> {
|
|
39
27
|
return {
|
|
40
28
|
get(key) {
|
|
@@ -55,7 +43,6 @@ export function modelProxy<T extends ModelState>(
|
|
|
55
43
|
signal.addEventListener("abort", () => model.off(name, callback), {
|
|
56
44
|
once: true,
|
|
57
45
|
});
|
|
58
|
-
onRegister?.({ event: name, callback });
|
|
59
46
|
},
|
|
60
47
|
off(name?: string | null, callback?: ModelEventCallback | null): void {
|
|
61
48
|
model.off(name ?? null, callback ?? null);
|