@marimo-team/islands 0.24.3-dev9 → 0.25.0
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-C9OF_75w.js → ConnectedDataExplorerComponent-KVhjDMSe.js} +1066 -1066
- package/dist/ErrorBoundary-DnNkbB_U.js +200 -0
- package/dist/{ImageComparisonComponent-2a9TMMm2.js → ImageComparisonComponent-Dlm5aWnH.js} +4 -4
- package/dist/{Plot-C-9MQeGP.js → Plot-CTyjbQDT.js} +21032 -20666
- package/dist/_baseMerge-BiGRwuqv.js +165 -0
- package/dist/{abnfDiagram-N423BO3Z-CQKwzX8t.js → abnfDiagram-VCTEODGH-CpN0FRda.js} +17 -18
- package/dist/{any-language-editor-DmQ7dyCx.js → any-language-editor-CycIVIeP.js} +17 -17
- package/dist/arc-7ra3iNdN.js +81 -0
- package/dist/architecture-7GRP2DOG-BWLylgiA.js +3 -0
- package/dist/{architectureDiagram-T3A2C74G-CncrDpfa.js → architectureDiagram-5GKGNRK7-DDyj5SRB.js} +25 -25
- package/dist/assets/__vite-browser-external-C9iR87Zl.js +1 -0
- package/dist/assets/worker-D7hWi02M.js +109 -0
- package/dist/blockDiagram-I7D4REHJ-BbXEXJRu.js +1922 -0
- package/dist/{button-CKBkqR9J.js → button-DdXAm8iz.js} +5 -5
- package/dist/{c4Diagram-5PPSVZJV-DarUk3Yq.js → c4Diagram-7LVT6UL2-DcLsbQmR.js} +696 -668
- package/dist/{capabilities-CMBBJTcc.js → capabilities-B3ce_GNu.js} +1 -1
- package/dist/{html-to-image-BtFMe_Nq.js → cells-DYIkSxs6.js} +6757 -10137
- package/dist/{channel-CyiYUzJv.js → channel-B5XnTarr.js} +1 -1
- package/dist/chat-ui-BXj3uYjy.js +5786 -0
- package/dist/{check-CHig47QV.js → check-B7cIK6gb.js} +1 -1
- package/dist/{chunk-2Q5K7J3B-BMuJl2jB.js → chunk-2Q5K7J3B-BMkUkeuy.js} +2 -2
- package/dist/chunk-4HAMMTFA-D2qv8E0X.js +4188 -0
- package/dist/{chunk-5VM5RSS4-Bcq0ftdy.js → chunk-5VM5RSS4-DKsmPCL6.js} +2 -2
- package/dist/{chunk-NSK5VX7P-CDTMcJB0.js → chunk-75Z2AOVW-5_HsvXwr.js} +23 -23
- package/dist/{chunk-I66GZJ75-BqyTCAPf.js → chunk-DU6HZSFF-BUgAHvnM.js} +21 -4
- package/dist/{chunk-2GRJ4B5K-DgO8Qudq.js → chunk-F27PBJKO-DHmYWZXr.js} +4 -4
- package/dist/{chunk-KEIR6QF5-C4KX3XYh.js → chunk-FOHPRMQF-BpYR8RqP.js} +4 -4
- package/dist/{chunk-WRU74C26-BpWsbiDK.js → chunk-GMAD6QVW-Czynz8aA.js} +486 -258
- package/dist/chunk-GVQU2GXP-yQEdulRS.js +37 -0
- package/dist/{chunk-5RXB4S5H-tLNUVDdO.js → chunk-IMKFNOWR-BfwTebD0.js} +11 -11
- package/dist/{chunk-JWPE2WC7-BJwjGUnF.js → chunk-JWPE2WC7-DJvv1t8U.js} +2 -2
- package/dist/chunk-L3NEJ4N5-DwRWnDDK.js +245 -0
- package/dist/{chunk-7Z6QIM7H-Dc18hFxH.js → chunk-OSK3NFVY-BBKU_Ign.js} +222 -144
- package/dist/{chunk-W5SLKNZC-DLnvpEtV.js → chunk-P2QGCYS3-C0iGU29N.js} +20 -20
- package/dist/{chunk-KBJHAD2P-BuqWqkcW.js → chunk-POPQ4Y6H-BCbS3Ozc.js} +4 -4
- package/dist/{chunk-4I5QYGJK-DpytHuZQ.js → chunk-PWAF6VOD-CTFCL0jI.js} +4 -4
- package/dist/{chunk-JQJVKLGR-CgqCwe8E.js → chunk-SHT3W25Y-BspJEJ5H.js} +109 -63
- package/dist/{chunk-6Q2QTUOP-DmTcEBMn.js → chunk-SVP7TREG-DX3rFNTe.js} +5 -5
- package/dist/{chunk-GF5L2VYU-B0wgCQgS.js → chunk-TICWLB2K-fVF7Uujg.js} +13 -13
- package/dist/{chunk-XXDRQBXY-D73H4IN0.js → chunk-XXDRQBXY-Dnl5VBqG.js} +3 -3
- package/dist/{chunk-Y2CYZVJY-DoegUj_e.js → chunk-Y2CYZVJY-DKKS1VyV.js} +1 -1
- package/dist/{chunk-5FQGJX7Z-B85XCPv6.js → chunk-YOKDWASO-DrWbKnxA.js} +6925 -5460
- package/dist/classDiagram-ZZMXUADV-Fe-V14Sc.js +30 -0
- package/dist/classDiagram-v2-VYDZK3BY-xTDg7lOs.js +30 -0
- package/dist/code-visibility-DElzk_hh.js +138 -0
- package/dist/{common-Cv-4hMa0.js → common-B4-ih9IA.js} +8838 -12645
- package/dist/{compiler-runtime-CAH9RLw2.js → compiler-runtime-Cj8ZWiNS.js} +2 -2
- package/dist/copy-icon-CLdENY__.js +190 -0
- package/dist/{cose-bilkent-JH36ORCC-FUWHkXFX.js → cose-bilkent-JH36ORCC-_LyRKVqm.js} +2 -2
- package/dist/cubic-OaEBhQPK.js +1404 -0
- package/dist/cynefin-OW5HDTMX-obq-i80l.js +3 -0
- package/dist/{cynefinDiagram-MW4NZA55-BXSFK93J.js → cynefinDiagram-5FMLGOSQ-CFQrqzSX.js} +10 -10
- package/dist/{dagre-CGyalH38.js → dagre-BGSfXNEb.js} +678 -537
- package/dist/dagre-GXQ25YYZ-xHNAUTyG.js +425 -0
- package/dist/{data-grid-overlay-editor-DZM4BAaI.js → data-grid-overlay-editor-CRH6JQPE.js} +8 -9
- package/dist/{data-grid-types-BnZwWG8z.js → data-grid-types-BucVmDDp.js} +1 -1
- package/dist/{defaultLocale-DKaU_opG.js → defaultLocale-JI_lnoCe.js} +1 -1
- package/dist/{diagram-7IWD3JNH-BjfzDNvj.js → diagram-S7CK7UJ4-Bt1rPbAx.js} +40 -39
- package/dist/{diagram-UB23O5K3-DDg-7wLA.js → diagram-UQ7AKVKN-D1sq5FoZ.js} +10 -10
- package/dist/{diagram-B4RE2ZJO-CKccR9eE.js → diagram-VSXAHHWV-BKpmG23x.js} +10 -10
- package/dist/{diagram-Q27KOJAE-Zhz01ss7.js → diagram-VX7I27RA-BMwGFVD6.js} +21 -21
- package/dist/{diagram-LBJQPF4R-CJ-bOruh.js → diagram-Z3DM3KII--KLDR9Pl.js} +10 -10
- package/dist/dialog-CgNq6y9-.js +94 -0
- package/dist/{dist-dAqZAPcF.js → dist-1HDa70oE.js} +3 -3
- package/dist/{dist-Re9sOPOx.js → dist-9x1ZRe-e.js} +2 -2
- package/dist/{dist-DEeLqRlU.js → dist-B1vYLK28.js} +1 -1
- package/dist/{dist-C5Bn52W4.js → dist-B8D7McG3.js} +3 -3
- package/dist/{dist-_XvgytiS.js → dist-BHCHt1NI.js} +1 -1
- package/dist/{dist-CRjAdnqF.js → dist-BRxfaJgs.js} +3 -3
- package/dist/{dist-Byj2bV8o.js → dist-BVGtK7Ht.js} +1 -1
- package/dist/{dist-BIN5LKyE.js → dist-BaHjhkpZ.js} +2 -2
- package/dist/{dist-DVFbIwc5.js → dist-BtKIs9N-.js} +1 -1
- package/dist/{dist-BrQGcfQ9.js → dist-C2KzV-vf.js} +2 -2
- package/dist/{dist-DJFiGP2k.js → dist-C2wDlYdD.js} +2 -2
- package/dist/{dist-BVRM2y1P.js → dist-C8xMLVYi.js} +2 -2
- package/dist/dist-CMh_W4y4.js +538 -0
- package/dist/{extends-BPB6_lTK.js → dist-CO1AwwG_.js} +516 -561
- package/dist/{dist-BzN60Z2s.js → dist-CPGxfVGX.js} +1 -1
- package/dist/{dist-C7v-9nUK.js → dist-Cm3iAFMD.js} +3 -3
- package/dist/{dist-CGAxEiaM.js → dist-Cs2FijYk.js} +2 -2
- package/dist/{dist-hXd65f0_.js → dist-D1PpnuZB.js} +1 -1
- package/dist/{dist-VdvbxG72.js → dist-DHOTQar0.js} +1 -1
- package/dist/{dist-DcgzXCfy.js → dist-DPcEtqmG.js} +2 -2
- package/dist/{dist-D4Z_qdP4.js → dist-Df0wKI0F.js} +1 -1
- package/dist/{dist-qhLI-SHd.js → dist-DszxuxS1.js} +2 -2
- package/dist/{dist-BEmkrGoQ.js → dist-Kxgjxakw.js} +1 -1
- package/dist/{dist-BbSMhhD2.js → dist-KzZ7WELx.js} +2 -2
- package/dist/{dist-jWUab2d1.js → dist-lA1Cttkb.js} +1 -1
- package/dist/dropdown-menu-CZgjYSAh.js +4502 -0
- package/dist/{ebnfDiagram-BXEA7PRR-Dm75pCAS.js → ebnfDiagram-PWID7BFC-WnG4cvSQ.js} +17 -18
- package/dist/{erDiagram-JOGREHBK-rVDG3VSQ.js → erDiagram-RLTQ6QDP-DhzKiYHc.js} +1037 -798
- package/dist/error-banner-B94dcDmP.js +391 -0
- package/dist/error-entries-C0NsUqXl.js +56 -0
- package/dist/{esm-CR1nhb1c.js → esm-BElI3qKH.js} +22 -22
- package/dist/{esm-C1d0g6Bv.js → esm-G4Fhsgng.js} +51 -37
- package/dist/{esm-CesmlDrs.js → esm-h8f7-1CJ.js} +423 -423
- package/dist/eventmodeling-NTZA5JFV-D7nP7Uyu.js +3 -0
- package/dist/feedback-button-cQcMqpEP.js +380 -0
- package/dist/flowDiagram-HODETNUW-6dMdB8pR.js +16 -0
- package/dist/{formats-CslNOKy0.js → formats-BR5iGb4s.js} +8 -8
- package/dist/{ganttDiagram-PKOTCBZU-9D-LXF6P.js → ganttDiagram-EL5Y4UJY-DbzEBLbl.js} +15 -15
- package/dist/gitGraph-4MIJSDKK-Dy9uQXGh.js +3 -0
- package/dist/{gitGraphDiagram-DS77QQ5N-BfpsXTLf.js → gitGraphDiagram-WWUBYQGX-BMf0iKi1.js} +10 -10
- package/dist/{glide-data-editor-sPZ8fUFn.js → glide-data-editor-DYOxfSzI.js} +2143 -1910
- package/dist/{glide-utils-NShAPPtn.js → glide-utils-B3rUT5PI.js} +15 -15
- package/dist/globals-BOoLHa7X.js +19 -0
- package/dist/highlighted-body-KPVGNVTW-Ad3MKZ18.js +38 -0
- package/dist/html-to-image-CeYYvQNb.js +3272 -0
- package/dist/info-A6RAGUB7-DKoayiHY.js +3 -0
- package/dist/{infoDiagram-6WML65LV-DqCTXHVy.js → infoDiagram-27XIBGKW-BagtCX_5.js} +7 -7
- package/dist/{ishikawaDiagram-WSZJBQD7-BCUYmZ1v.js → ishikawaDiagram-5VMMS53U-DByDehYy.js} +8 -8
- package/dist/{journeyDiagram-NVQOT4AX-BXB6M4zN.js → journeyDiagram-3NMN7TZE-D2LcKDUO.js} +8 -8
- package/dist/{jsx-runtime-CpoKNRgu.js → jsx-runtime-DgDPJV9S.js} +1 -1
- package/dist/{kanban-definition-27J2QSJJ-CGRhrDUX.js → kanban-definition-UXKFOSKX-BxwkbBI_.js} +29 -29
- package/dist/katex-DFBiSucW.js +21840 -0
- package/dist/{label-lwzzBHUW.js → label-BJ49YTvk.js} +6 -6
- package/dist/{linear-D5r_1YqD.js → linear-Cnaq3Tfb.js} +4 -4
- package/dist/{loader-VZ__bv4g.js → loader-D2W4oM-3.js} +15 -15
- package/dist/main.js +8113 -13475
- package/dist/mermaid-DPNuhemn.js +3084 -0
- package/dist/mermaid-HWGCJPDP-DYCzSILp.js +2 -0
- package/dist/mermaid-parser.core-DxuSfYwJ.js +638 -0
- package/dist/{mhchem-BjwrxcV-.js → mhchem-DWCF06w9.js} +1 -1
- package/dist/{micromark-factory-space-DruVGzeG.js → micromark-factory-space-DGxAzmw8.js} +2 -2
- package/dist/{mindmap-definition-FAOFIHXS-C9gRhzZq.js → mindmap-definition-YA3MSWOX-Cgvojw3y.js} +17 -17
- package/dist/{node-sql-parser-DesT1xNw.js → node-sql-parser-BiZOJ-FS.js} +0 -3
- package/dist/{number-overlay-editor-De2CabLL.js → number-overlay-editor-DZp5bEmI.js} +5 -5
- package/dist/objectWithoutPropertiesLoose-BRDcTsfB.js +23 -0
- package/dist/packet-AYTQ26CC-Yw7ajchJ.js +3 -0
- package/dist/{pegDiagram-VL7TDLO6-Df9IUjMD.js → pegDiagram-XKGWAZYB-DahHhYyN.js} +19 -20
- package/dist/{pick-SnHlmIBN.js → pick-CJeoxYOS.js} +1 -1
- package/dist/pie-WAS4IAKB-BKdKOAkL.js +3 -0
- package/dist/{pieDiagram-7S7Q4E2Y-BmRzQ8ZP.js → pieDiagram-E7YTZNPT-CCtX0oCK.js} +29 -31
- package/dist/{process-output-CPy0YKUe.js → process-output-BCTjlyuH.js} +7 -6
- package/dist/purify.es-DgKyQviY.js +805 -0
- package/dist/{quadrantDiagram-CIZ2JOQS-wFBvWcxS.js → quadrantDiagram-AXDQQJYC-DftINo6g.js} +5 -5
- package/dist/radar-RG4KPBEZ-ScR_D_Ts.js +3 -0
- package/dist/railroad-74A4TZTK-DQvPSdo5.js +3 -0
- package/dist/railroad-abnf-HS5TGJTU-CsJQG2O8.js +3 -0
- package/dist/railroad-ebnf-LZEXJU2U-BgEobkSn.js +3 -0
- package/dist/railroad-peg-WCYAUIDC-DjLAjofI.js +3 -0
- package/dist/{railroadDiagram-AXF67PYL-DxbIatiN.js → railroadDiagram-O6MQD6OU-Du5NsPUb.js} +17 -18
- package/dist/{react-dom-C94wmq5w.js → react-dom-BUgJ-ab_.js} +3 -3
- package/dist/{react-DMWcHin-.js → react-ofJbxM4x.js} +2 -2
- package/dist/{react-vega-DSD5aT7_.js → react-vega-5AcMW8gG.js} +10012 -9369
- package/dist/{requirementDiagram-LRYGKXZP-X_x-Y713.js → requirementDiagram-BXWQKSXE-0pmmxL6_.js} +20 -19
- package/dist/{reveal-component-CVsYlb9J.js → reveal-component-C9h2Lubu.js} +1303 -1237
- package/dist/{sankeyDiagram-W5VNT64P-BYJALbbm.js → sankeyDiagram-P5KCCOFB-CDKR5TJH.js} +4 -4
- package/dist/{select-3qHpFKF9.js → select-C6plhmZr.js} +317 -562
- package/dist/{sequenceDiagram-SI44F4Z6-BiPBe3Sv.js → sequenceDiagram-WJ2MYXX4-DB-ChWwU.js} +11 -11
- package/dist/{sizeCapture-X5ZJPWSS-BKLDeh5H.js → sizeCapture-INFHLROL-Dx5SpkQF.js} +2 -2
- package/dist/{spec-CutWdqo3.js → spec-CAYwFeV6.js} +4 -4
- package/dist/{src-C31ngt98.js → src-CA_m4ONl.js} +298 -303
- package/dist/{stateDiagram-OKZ733FA-B7QyNBxH.js → stateDiagram-D77RDMKH-orN6AwMx.js} +19 -20
- package/dist/stateDiagram-v2-MP3YSRHH-o05_rJN8.js +30 -0
- package/dist/style.css +2 -2
- package/dist/{swimlanes-SLNWSIFB-B4f8VP3b.js → swimlanes-42K2YHIH-BkSDcqDT.js} +1501 -1591
- package/dist/swimlanesDiagram-VR7AAH4N-D_nFQfRc.js +30 -0
- package/dist/{swiper-component-C90YjhaV.js → swiper-component-IOUowglM.js} +39 -26
- package/dist/{time-aWGfjN8x.js → time-BieKwdYS.js} +42 -42
- package/dist/{timeline-definition-Z64GVDOM-Dacq_5lr.js → timeline-definition-24CTP7MA-BuqJUIRZ.js} +7 -7
- package/dist/{toDate-CpXBeDq0.js → toDate-WXg1yLcI.js} +7 -7
- package/dist/toast-DvY70eFX.js +1834 -0
- package/dist/tooltip-qB8NlSqV.js +1742 -0
- package/dist/treeView-Q6P3EWNA-DuRV97YF.js +3 -0
- package/dist/treemap-WGGIJYW6-AsLq-uwC.js +3 -0
- package/dist/use-restore-focus-D5D9xEjZ.js +5946 -0
- package/dist/{use-vega-container-remeasure-DUW4tRxq.js → use-vega-container-remeasure-4DwJbPWu.js} +2 -2
- package/dist/{useAsyncData-CH6-CgJF.js → useAsyncData-BD6AStMt.js} +3 -3
- package/dist/{useDateFormatter-Cp9Jdxls.js → useDateFormatter-BRTPsUK7.js} +8 -8
- package/dist/{useDeepCompareMemoize-JC87C_jO.js → useDeepCompareMemoize-D_HNdyvI.js} +2 -2
- package/dist/{useIframeCapabilities-De3C-9b4.js → useIframeCapabilities-CVtNkI3Y.js} +2 -2
- package/dist/{useLifecycle-B4RGlyf0.js → useLifecycle-DPgiiwwU.js} +6 -6
- package/dist/useNumberFormatter-BfDpa21j.js +251 -0
- package/dist/useTheme-DzXmYZ5V.js +904 -0
- package/dist/{vega-component-ovBXgp91.js → vega-component-D0QXopU8.js} +34 -34
- package/dist/{vega-embed-container-TJ5z5dZw.js → vega-embed-container-CbnTccZi.js} +6 -6
- package/dist/vega-loader.browser-D95WfUcj.js +1139 -0
- package/dist/{vennDiagram-T6HMQDX7-D-Rcq3Iu.js → vennDiagram-4TSXK5OY-CTUlJ2PK.js} +9 -9
- package/dist/wardley-WFR3VGLG-Na-tFhQJ.js +3 -0
- package/dist/{wardleyDiagram-T6FBY63Y-Z-Og7_Wd.js → wardleyDiagram-VM6X3IG4-3evLUb0M.js} +10 -10
- package/dist/{xychartDiagram-ELKLHX3M-BDJ2dITA.js → xychartDiagram-S5SC5T6Z-DL2E3K8-.js} +248 -139
- package/package.json +54 -57
- package/src/__mocks__/notebook.ts +1 -0
- package/src/__mocks__/requests.ts +7 -0
- package/src/__tests__/__snapshots__/CellStatus.test.tsx.snap +12 -12
- package/src/__tests__/fixtures/pair-preview.ts +19 -0
- package/src/__tests__/mount.test.ts +18 -0
- package/src/components/app-config/optional-features.tsx +6 -0
- package/src/components/chat/acp/__tests__/agent-panel-initialization.test.tsx +394 -0
- package/src/components/chat/acp/__tests__/agent-panel.test.tsx +272 -0
- package/src/components/chat/acp/__tests__/state.test.ts +2 -2
- package/src/components/chat/acp/agent-panel.tsx +115 -74
- package/src/components/chat/acp/state.ts +1 -1
- package/src/components/data-table/__tests__/filters.test.ts +21 -21
- package/src/components/data-table/charts/__tests__/spec.test.ts +5 -10
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +2 -6
- package/src/components/data-table/column-summary/chart-spec-model.tsx +1 -1
- package/src/components/data-table/columns.tsx +64 -67
- package/src/components/editor/RecoveryButton.tsx +1 -0
- package/src/components/editor/__tests__/dynamic-favicon.test.tsx +36 -2
- package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +115 -0
- package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +218 -0
- package/src/components/editor/actions/pair-with-agent-commands.ts +46 -9
- package/src/components/editor/actions/pair-with-agent-modal.tsx +49 -23
- package/src/components/editor/ai/add-cell-with-ai.tsx +1 -0
- package/src/components/editor/ai/ai-completion-editor.tsx +3 -1
- package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +186 -0
- package/src/components/editor/alerts/__tests__/startup-progress.test.tsx +185 -0
- package/src/components/editor/alerts/connecting-alert.tsx +1 -66
- package/src/components/editor/alerts/connection-notice.tsx +186 -0
- package/src/components/editor/alerts/startup-output.tsx +173 -0
- package/src/components/editor/alerts/startup-progress.tsx +204 -0
- package/src/components/editor/app-container.tsx +9 -3
- package/src/components/editor/boundary/ErrorBoundary.tsx +38 -16
- package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +311 -0
- package/src/components/editor/cell/__tests__/toolbar.test.tsx +73 -0
- package/src/components/editor/cell/code/__tests__/rtc-editor-config.test.ts +50 -0
- package/src/components/editor/cell/code/cell-editor.tsx +41 -42
- package/src/components/editor/cell/toolbar.tsx +11 -0
- package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +94 -0
- package/src/components/editor/chrome/components/feedback-button.tsx +63 -42
- package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +164 -8
- package/src/components/editor/chrome/panels/__tests__/sandbox-details.test.tsx +358 -0
- package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +168 -0
- package/src/components/editor/chrome/panels/packages-panel.tsx +113 -175
- package/src/components/editor/chrome/panels/sandbox-controller.tsx +106 -0
- package/src/components/editor/chrome/panels/sandbox-details-state.ts +38 -0
- package/src/components/editor/chrome/panels/sandbox-panel.tsx +230 -0
- package/src/components/editor/chrome/panels/sandbox-toggle.tsx +52 -0
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +7 -0
- package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +3 -1
- package/src/components/editor/code/__tests__/readonly-diff.test.tsx +65 -0
- package/src/components/editor/code/readonly-diff.tsx +1 -1
- package/src/components/editor/connections/database/__tests__/__snapshots__/as-code.test.ts.snap +98 -98
- package/src/components/editor/connections/database/__tests__/as-code.test.ts +11 -5
- package/src/components/editor/dynamic-favicon.tsx +17 -10
- package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +13 -11
- package/src/components/editor/file-tree/__tests__/tree-actions.test.tsx +54 -0
- package/src/components/editor/file-tree/tree-actions.tsx +11 -14
- package/src/components/editor/header/__tests__/status.test.tsx +8 -20
- package/src/components/editor/header/filename-input.tsx +2 -0
- package/src/components/editor/header/status.tsx +5 -3
- package/src/components/editor/navigation/clipboard.ts +1 -0
- package/src/components/editor/notebook-cell.tsx +4 -2
- package/src/components/editor/output/JsonOutput.tsx +182 -632
- package/src/components/editor/output/Outputs.css +49 -17
- package/src/components/editor/output/__tests__/JsonOutput-interactions.test.tsx +254 -0
- package/src/components/editor/output/__tests__/JsonOutput-mimetype.test.tsx +41 -46
- package/src/components/editor/output/__tests__/{json-output.test.ts → json-output-formatting.test.ts} +113 -75
- package/src/components/editor/output/__tests__/json-output-pagination.test.ts +252 -0
- package/src/components/editor/output/json-output/formatting.ts +167 -0
- package/src/components/editor/output/json-output/pagination.ts +155 -0
- package/src/components/editor/output/json-output/renderers.tsx +196 -0
- package/src/components/editor/output/json-output/themes.ts +52 -0
- package/src/components/editor/package-alert.tsx +112 -66
- package/src/components/editor/renderers/cell-array.tsx +1 -5
- package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +3 -7
- package/src/components/slides/slide-form.tsx +1 -0
- package/src/components/slides/slide-notes-editor.tsx +1 -0
- package/src/components/tracing/tracing-spec.ts +1 -1
- package/src/components/ui/__tests__/badge.test.ts +6 -4
- package/src/components/ui/use-toast.ts +8 -0
- package/src/core/MarimoApp.tsx +0 -2
- package/src/core/ai/context/providers/__tests__/error.test.ts +16 -22
- package/src/core/alerts/__tests__/environment.test.ts +183 -0
- package/src/core/alerts/__tests__/state.test.tsx +240 -0
- package/src/core/alerts/environment.ts +57 -0
- package/src/core/alerts/state.ts +155 -99
- package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +296 -259
- package/src/core/cells/__tests__/apply-transaction.test.ts +34 -0
- package/src/core/cells/__tests__/cell.test.ts +61 -0
- package/src/core/cells/__tests__/cells.test.ts +182 -37
- package/src/core/cells/__tests__/document-changes.test.ts +39 -1
- package/src/core/cells/__tests__/outputs.test.tsx +117 -0
- package/src/core/cells/__tests__/pending-delete-service.test.tsx +4 -3
- package/src/core/cells/__tests__/session.test.ts +7 -0
- package/src/core/cells/cell.ts +9 -1
- package/src/core/cells/cells.ts +13 -18
- package/src/core/cells/document-changes.ts +11 -1
- package/src/core/cells/outputs.ts +66 -9
- package/src/core/cells/pending-delete-service.ts +12 -16
- package/src/core/cells/session.ts +2 -0
- package/src/core/cells/types.ts +2 -0
- package/src/core/codemirror/find-replace/__tests__/navigate.test.ts +8 -16
- package/src/core/codemirror/language/__tests__/sql.test.ts +70 -2
- package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +4 -8
- package/src/core/codemirror/language/languages/sql/sql.ts +16 -1
- package/src/core/codemirror/rtc/extension.ts +5 -2
- package/src/core/config/pair.ts +19 -0
- package/src/core/datasets/__tests__/data-source.test.ts +2 -0
- package/src/core/datasets/data-source-connections.ts +15 -10
- package/src/core/edit-app.tsx +8 -5
- package/src/core/errors/state.ts +1 -2
- package/src/core/export/__tests__/hooks.test.ts +1 -6
- package/src/core/islands/bootstrap.ts +3 -1
- package/src/core/islands/bridge.ts +3 -0
- package/src/core/islands/worker-factory.ts +2 -12
- package/src/core/kernel/messages.ts +2 -2
- package/src/core/network/__tests__/requests-network.test.ts +4 -3
- package/src/core/network/connection-notice.ts +117 -0
- package/src/core/network/connection.ts +19 -0
- package/src/core/network/requests-lazy.ts +3 -0
- package/src/core/network/requests-network.ts +12 -0
- package/src/core/network/requests-static.ts +3 -0
- package/src/core/network/requests-toasting.tsx +3 -0
- package/src/core/network/resolve.ts +2 -1
- package/src/core/network/types.ts +7 -0
- package/src/core/network/useConnectionNotice.ts +53 -0
- package/src/core/packages/__tests__/usePackageAction.test.tsx +129 -0
- package/src/core/packages/__tests__/useSandboxController.test.tsx +246 -0
- package/src/core/packages/package-data.ts +35 -0
- package/src/core/packages/sandbox-state.ts +67 -0
- package/src/core/packages/toast-components.tsx +11 -0
- package/src/core/packages/useInstallPackage.ts +1 -1
- package/src/core/packages/usePackageAction.ts +51 -0
- package/src/core/packages/usePackageDependencies.ts +22 -0
- package/src/core/packages/useSandboxController.ts +208 -0
- package/src/core/run-app.tsx +2 -0
- package/src/core/static/__tests__/files.test.ts +12 -30
- package/src/core/wasm/__tests__/bootstrap.test.ts +63 -0
- package/src/core/wasm/__tests__/bridge.test.ts +13 -4
- package/src/core/wasm/__tests__/fs.test.ts +22 -0
- package/src/core/wasm/__tests__/runtime-config.test.ts +65 -0
- package/src/core/wasm/bridge.ts +35 -23
- package/src/core/wasm/rpc.ts +2 -0
- package/src/core/wasm/runtime-config.ts +31 -0
- package/src/core/wasm/worker/bootstrap.ts +21 -11
- package/src/core/wasm/worker/constants.ts +1 -0
- package/src/core/wasm/worker/fs.ts +4 -0
- package/src/core/wasm/worker/getController.ts +3 -1
- package/src/core/wasm/worker/save-worker.ts +10 -9
- package/src/core/wasm/worker/types.ts +6 -4
- package/src/core/wasm/worker/worker.ts +9 -9
- package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +404 -3
- package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +8 -6
- package/src/core/websocket/transports/transport.ts +1 -1
- package/src/core/websocket/transports/ws.ts +1 -1
- package/src/core/websocket/types.ts +11 -1
- package/src/core/websocket/useMarimoKernelConnection.tsx +63 -16
- package/src/hooks/useDebounce.ts +2 -0
- package/src/mount.tsx +3 -0
- package/src/plugins/core/BadPlugin.tsx +3 -14
- package/src/plugins/core/RenderHTML.tsx +22 -2
- package/src/plugins/core/__test__/RenderHTML.test.ts +187 -0
- package/src/plugins/core/registerReactComponent.tsx +0 -1
- package/src/plugins/impl/FileBrowserPlugin.tsx +10 -4
- package/src/plugins/impl/FormPlugin.tsx +2 -0
- package/src/plugins/impl/MatrixPlugin.tsx +2 -0
- package/src/plugins/impl/RangeSliderPlugin.tsx +2 -0
- package/src/plugins/impl/SliderPlugin.tsx +2 -0
- package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +50 -1
- package/src/plugins/impl/data-editor/__tests__/glide-data-editor.test.tsx +23 -18
- package/src/plugins/impl/data-frames/panel.tsx +1 -0
- package/src/plugins/impl/image-comparison/ImageComparisonComponent.tsx +1 -1
- package/src/plugins/impl/image-comparison/__tests__/ImageComparisonComponent.test.tsx +15 -0
- package/src/plugins/impl/vega/__tests__/make-selectable.test.ts +42 -48
- package/src/plugins/layout/AccordionPlugin.tsx +7 -2
- package/src/plugins/layout/JsonOutputPlugin.tsx +7 -10
- package/src/plugins/layout/__test__/AccordionPlugin.test.tsx +66 -0
- package/src/stories/sandbox.stories.tsx +488 -0
- package/src/utils/__tests__/path.test.ts +6 -5
- package/src/utils/__tests__/worker.test.ts +81 -0
- package/src/utils/worker.ts +22 -0
- package/dist/ErrorBoundary-CR-ZQN_c.js +0 -125
- package/dist/_baseMerge-Dv8bBloN.js +0 -73
- package/dist/_initCloneObject---vediN2.js +0 -95
- package/dist/arc-DOVLrCPd.js +0 -82
- package/dist/architecture-TIHT7OUA-MiJpPpQW.js +0 -3
- package/dist/array-CApNbSU9.js +0 -6
- package/dist/assets/__vite-browser-external-BdKGjRZ4.js +0 -1
- package/dist/assets/worker-DlIBfp9S.js +0 -98
- package/dist/blockDiagram-VBNYF7ZC-Bc--I65C.js +0 -3158
- package/dist/chat-ui-BSwr409J.js +0 -8455
- package/dist/chunk-3NCLNEKW-BIp_lB_4.js +0 -14
- package/dist/chunk-5FCAYU7R-C_HO9A1J.js +0 -23
- package/dist/chunk-5HE753X5-Bixm_MV-.js +0 -38
- package/dist/chunk-5JV3BV7I-CH5J3iZY.js +0 -54
- package/dist/chunk-5TONJI2A-DG6gDiSS.js +0 -62
- package/dist/chunk-7BUUIJ7U-5afmIPeo.js +0 -82
- package/dist/chunk-BIQX33UG-7TMBUf89.js +0 -23
- package/dist/chunk-CQNSW5MT-Cnqqsxt-.js +0 -38
- package/dist/chunk-CYSBUYHQ-BAbymFHR.js +0 -23
- package/dist/chunk-EMLP6XTP-Bsz-QL77.js +0 -23
- package/dist/chunk-J7OUQ5F2-CM_meqZH.js +0 -57
- package/dist/chunk-JG7HCLWE-DUnCDgPk.js +0 -62
- package/dist/chunk-MOZMSUNE-BG6IHvzT.js +0 -35
- package/dist/chunk-OSBZ3O6U-CYwj_bvR.js +0 -23
- package/dist/chunk-QBLGF6JB-B4vJ4j8J.js +0 -23
- package/dist/chunk-QR6OTTB3-D4wH2ldi.js +0 -3738
- package/dist/chunk-R7FJI6CG-Blf8FcmZ.js +0 -64
- package/dist/chunk-RYQCIY6F-BWbIlBIH.js +0 -241
- package/dist/chunk-U6XO7XAA-COw445DS.js +0 -63
- package/dist/chunk-UBXNYLIW-BHigVU4H.js +0 -32
- package/dist/chunk-YOTPTUD7-Dn044Q_d.js +0 -30
- package/dist/chunk-ZIRB5QZD-BR4TMfOa.js +0 -1153
- package/dist/classDiagram-JCYQIIEL-DmXSLxe_.js +0 -30
- package/dist/classDiagram-v2-OCEON4UE-CooqVexA.js +0 -30
- package/dist/click-outside-container-D_URcm3D.js +0 -167
- package/dist/code-block-37QAKDTI-CQrzBOr-.js +0 -107
- package/dist/copy-CD7S58CY.js +0 -141
- package/dist/cynefin-VYW2F7L2-CeHAxOEX.js +0 -3
- package/dist/dagre-VZM6K2ZE-CJggWPTJ.js +0 -328
- package/dist/dist-3_o3T78I.js +0 -1360
- package/dist/dist-ABQjhuek.js +0 -64
- package/dist/dist-CO5R6VMi.js +0 -538
- package/dist/dropdown-menu-DhCfcscX.js +0 -5858
- package/dist/emotion-is-prop-valid.esm-M57VsT8j.js +0 -14
- package/dist/error-banner-CsXbEEjo.js +0 -611
- package/dist/eventmodeling-45OFAUF4-B_lWZ-Pd.js +0 -3
- package/dist/flowDiagram-UKHOOZJN-g1AmrZzM.js +0 -17
- package/dist/gitGraph-TEB2WS4Q-Dj-eXUph.js +0 -3
- package/dist/info-DKCQHKI2-Bhb-pe2e.js +0 -3
- package/dist/line-CuKjIQa1.js +0 -34
- package/dist/map-BJpOfPlL.js +0 -149
- package/dist/math-BXtKgYah.js +0 -10
- package/dist/mermaid-4DMBBIKO-Ddp9TgNp.js +0 -2
- package/dist/mermaid-Bi23Ibnw.js +0 -1173
- package/dist/mermaid-parser.core-Din9FvSi.js +0 -99
- package/dist/packet-7NZHBO7P-fbkIIyKE.js +0 -3
- package/dist/path-BNHuHZP8.js +0 -87
- package/dist/pie-RZYD4A2V-CLRIsxY1.js +0 -3
- package/dist/purify.es-CB-YO1Hn.js +0 -774
- package/dist/radar-I7S5WNFK-BGzCbgXu.js +0 -3
- package/dist/railroad-3IZDKUUU-CvQIIcuU.js +0 -3
- package/dist/railroad-abnf-AHOZXSZD-CMwtlNtu.js +0 -3
- package/dist/railroad-ebnf-EBAXGLYW-n1QUOAsh.js +0 -3
- package/dist/railroad-peg-LSFZ7HO6-PjnrpmCs.js +0 -3
- package/dist/schemas-DzK6U94N.js +0 -6057
- package/dist/stateDiagram-v2-UEYNNEHI-BTRUs8Il.js +0 -30
- package/dist/step-CKczO72Q.js +0 -670
- package/dist/swimlanesDiagram-ULZ7WXOC-NBmgBl9G.js +0 -31
- package/dist/timer-DpDyj9G0.js +0 -596
- package/dist/tooltip-Dt77sBeT.js +0 -390
- package/dist/treeView-QDETBFTQ-DU8LwHuf.js +0 -3
- package/dist/treemap-6X3UGDF4-DUk4-k_O.js +0 -3
- package/dist/useTheme-CVJ0UOf2.js +0 -841
- package/dist/vega-loader.browser-DEggZzni.js +0 -1083
- package/dist/wardley-OPB4EBWU-Db-AaGas.js +0 -3
- package/src/components/editor/output/EmotionCacheProvider.tsx +0 -32
|
@@ -15,7 +15,7 @@ export type ConnectionTransportCallback<T extends ConnectionEvent> = (
|
|
|
15
15
|
export interface IConnectionTransport {
|
|
16
16
|
reconnect(code?: number | undefined, reason?: string | undefined): void;
|
|
17
17
|
close(): void;
|
|
18
|
-
send(data: string | ArrayBuffer | Blob | ArrayBufferView): void;
|
|
18
|
+
send(data: string | ArrayBuffer | Blob | ArrayBufferView<ArrayBuffer>): void;
|
|
19
19
|
addEventListener<T extends ConnectionEvent>(
|
|
20
20
|
event: T,
|
|
21
21
|
callback: ConnectionTransportCallback<T>,
|
|
@@ -42,7 +42,7 @@ export class WsTransport implements IConnectionTransport {
|
|
|
42
42
|
this.inner.close();
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
send(data: string | ArrayBuffer | Blob | ArrayBufferView): void {
|
|
45
|
+
send(data: string | ArrayBuffer | Blob | ArrayBufferView<ArrayBuffer>): void {
|
|
46
46
|
this.inner.send(data);
|
|
47
47
|
}
|
|
48
48
|
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
+
import type { NotificationMessageData } from "../kernel/messages";
|
|
4
|
+
|
|
5
|
+
export type ConnectionPhase =
|
|
6
|
+
| NotificationMessageData<"startup-progress">["phase"]
|
|
7
|
+
| "reconnecting";
|
|
8
|
+
|
|
3
9
|
// TODO: rename to ConnectionState
|
|
4
10
|
export const WebSocketState = {
|
|
5
11
|
NOT_STARTED: "NOT_STARTED",
|
|
@@ -28,10 +34,14 @@ export type ConnectionStatus =
|
|
|
28
34
|
* Human-readable reason for closing the connection.
|
|
29
35
|
*/
|
|
30
36
|
reason: string;
|
|
37
|
+
phase?: ConnectionPhase;
|
|
38
|
+
}
|
|
39
|
+
| {
|
|
40
|
+
state: typeof WebSocketState.CONNECTING;
|
|
41
|
+
phase?: ConnectionPhase;
|
|
31
42
|
}
|
|
32
43
|
| {
|
|
33
44
|
state:
|
|
34
|
-
| typeof WebSocketState.CONNECTING
|
|
35
45
|
| typeof WebSocketState.OPEN
|
|
36
46
|
| typeof WebSocketState.CLOSING
|
|
37
47
|
| typeof WebSocketState.NOT_STARTED;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
+
import { invalidatePackageData } from "@/core/packages/package-data";
|
|
3
4
|
import { useAtom, useAtomValue, useSetAtom } from "jotai";
|
|
4
5
|
import { useRef } from "react";
|
|
5
6
|
import { useErrorBoundary } from "react-error-boundary";
|
|
@@ -63,7 +64,7 @@ import type { SessionId } from "../kernel/session";
|
|
|
63
64
|
import { initialRunCompletedAtom, kernelStateAtom } from "../kernel/state";
|
|
64
65
|
import { type LayoutState, useLayoutActions } from "../layout/state";
|
|
65
66
|
import { kioskModeAtom } from "../mode";
|
|
66
|
-
import { connectionAtom } from "../network/connection";
|
|
67
|
+
import { connectionAtom, startupProgressAtom } from "../network/connection";
|
|
67
68
|
import type { RequestId } from "../network/DeferredRequestRegistry";
|
|
68
69
|
import { useRuntimeManager } from "../runtime/config";
|
|
69
70
|
import { SECRETS_REGISTRY } from "../secrets/request-registry";
|
|
@@ -221,8 +222,14 @@ export function useMarimoKernelConnection(opts: {
|
|
|
221
222
|
useDataSourceActions();
|
|
222
223
|
const { setLayoutData } = useLayoutActions();
|
|
223
224
|
const [connection, setConnection] = useAtom(connectionAtom);
|
|
225
|
+
const updateStartupProgress = useSetAtom(startupProgressAtom);
|
|
224
226
|
const { addBanner } = useBannersActions();
|
|
225
|
-
const {
|
|
227
|
+
const {
|
|
228
|
+
addMissingPackageAlert,
|
|
229
|
+
updateEnvironment,
|
|
230
|
+
setEnvironment,
|
|
231
|
+
addStartupLog,
|
|
232
|
+
} = useAlertActions();
|
|
226
233
|
const setKioskMode = useSetAtom(kioskModeAtom);
|
|
227
234
|
const setCapabilities = useSetAtom(capabilitiesAtom);
|
|
228
235
|
const runtimeManager = useRuntimeManager();
|
|
@@ -240,7 +247,21 @@ export function useMarimoKernelConnection(opts: {
|
|
|
240
247
|
case "reload":
|
|
241
248
|
reloadSafe();
|
|
242
249
|
return;
|
|
250
|
+
case "startup-progress": {
|
|
251
|
+
const { phase } = msg.data;
|
|
252
|
+
updateStartupProgress(msg.data);
|
|
253
|
+
setConnection((previous) =>
|
|
254
|
+
previous.state === WebSocketState.OPEN ||
|
|
255
|
+
(previous.state === WebSocketState.CONNECTING &&
|
|
256
|
+
previous.phase === phase)
|
|
257
|
+
? previous
|
|
258
|
+
: { state: WebSocketState.CONNECTING, phase },
|
|
259
|
+
);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
243
262
|
case "kernel-ready": {
|
|
263
|
+
setKernelStartupError(null);
|
|
264
|
+
setConnection({ state: WebSocketState.OPEN });
|
|
244
265
|
setInitialRunCompleted(
|
|
245
266
|
Boolean(msg.data.resumed || msg.data.auto_instantiated),
|
|
246
267
|
);
|
|
@@ -357,16 +378,25 @@ export function useMarimoKernelConnection(opts: {
|
|
|
357
378
|
addBanner(msg.data);
|
|
358
379
|
return;
|
|
359
380
|
case "missing-package-alert":
|
|
360
|
-
|
|
381
|
+
addMissingPackageAlert({
|
|
361
382
|
...msg.data,
|
|
362
383
|
kind: "missing",
|
|
363
384
|
});
|
|
364
385
|
return;
|
|
365
|
-
case "
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
kind
|
|
369
|
-
|
|
386
|
+
case "environment-operation":
|
|
387
|
+
if (
|
|
388
|
+
msg.data.source === "kernel" &&
|
|
389
|
+
msg.data.status.kind !== "running"
|
|
390
|
+
) {
|
|
391
|
+
invalidatePackageData();
|
|
392
|
+
}
|
|
393
|
+
updateEnvironment(msg.data);
|
|
394
|
+
return;
|
|
395
|
+
case "environment-state":
|
|
396
|
+
setEnvironment(msg.data);
|
|
397
|
+
if (msg.data.source === "kernel") {
|
|
398
|
+
invalidatePackageData();
|
|
399
|
+
}
|
|
370
400
|
return;
|
|
371
401
|
case "startup-logs":
|
|
372
402
|
addStartupLog({
|
|
@@ -439,6 +469,8 @@ export function useMarimoKernelConnection(opts: {
|
|
|
439
469
|
return;
|
|
440
470
|
|
|
441
471
|
case "reconnected":
|
|
472
|
+
setKernelStartupError(null);
|
|
473
|
+
setConnection({ state: WebSocketState.OPEN });
|
|
442
474
|
return;
|
|
443
475
|
|
|
444
476
|
case "focus-cell":
|
|
@@ -482,6 +514,7 @@ export function useMarimoKernelConnection(opts: {
|
|
|
482
514
|
return;
|
|
483
515
|
}
|
|
484
516
|
shouldTryReconnecting.current = true;
|
|
517
|
+
setKernelStartupError(null);
|
|
485
518
|
setConnection({ state: WebSocketState.CONNECTING });
|
|
486
519
|
const healthy = await runtimeManager.reconcileFromHealth();
|
|
487
520
|
if (!healthy) {
|
|
@@ -513,17 +546,12 @@ export function useMarimoKernelConnection(opts: {
|
|
|
513
546
|
headers: () => runtimeManager.headers(),
|
|
514
547
|
|
|
515
548
|
/**
|
|
516
|
-
*
|
|
549
|
+
* The transport is open; kernel-ready establishes session readiness.
|
|
517
550
|
*/
|
|
518
551
|
onOpen: async () => {
|
|
552
|
+
updateStartupProgress(null);
|
|
519
553
|
// If we are open, we can reset our reconnecting flag.
|
|
520
554
|
shouldTryReconnecting.current = true;
|
|
521
|
-
|
|
522
|
-
// DO NOT COMMIT THIS UNCOMMENTED
|
|
523
|
-
// Uncomment to emulate a slow connection
|
|
524
|
-
// await new Promise((resolve) => setTimeout(resolve, 10_000));
|
|
525
|
-
|
|
526
|
-
setConnection({ state: WebSocketState.OPEN });
|
|
527
555
|
},
|
|
528
556
|
|
|
529
557
|
/**
|
|
@@ -565,7 +593,26 @@ export function useMarimoKernelConnection(opts: {
|
|
|
565
593
|
onClose: (e) => {
|
|
566
594
|
Logger.warn("WebSocket closed", e.code, e.reason);
|
|
567
595
|
const decision = classifyCloseEvent(e);
|
|
568
|
-
setConnection(
|
|
596
|
+
setConnection((previous) => {
|
|
597
|
+
const status = decision.status;
|
|
598
|
+
if (
|
|
599
|
+
status.state === WebSocketState.CLOSED &&
|
|
600
|
+
status.code === WebSocketClosedReason.KERNEL_STARTUP_ERROR &&
|
|
601
|
+
(previous.state === WebSocketState.CONNECTING ||
|
|
602
|
+
previous.state === WebSocketState.CLOSED)
|
|
603
|
+
) {
|
|
604
|
+
return { ...status, phase: previous.phase };
|
|
605
|
+
}
|
|
606
|
+
if (
|
|
607
|
+
status.state === WebSocketState.CONNECTING &&
|
|
608
|
+
(previous.state === WebSocketState.OPEN ||
|
|
609
|
+
(previous.state === WebSocketState.CONNECTING &&
|
|
610
|
+
previous.phase === "reconnecting"))
|
|
611
|
+
) {
|
|
612
|
+
return { ...status, phase: "reconnecting" };
|
|
613
|
+
}
|
|
614
|
+
return status;
|
|
615
|
+
});
|
|
569
616
|
if (decision.kind === "terminal" && decision.closeTransport) {
|
|
570
617
|
ws.close(); // close to prevent reconnecting
|
|
571
618
|
return;
|
package/src/hooks/useDebounce.ts
CHANGED
|
@@ -48,6 +48,8 @@ export function useDebounceControlledState<T>(opts: {
|
|
|
48
48
|
|
|
49
49
|
// Handle external changes:
|
|
50
50
|
useEffect(() => {
|
|
51
|
+
// TODO: Replace this synchronization with a controlled-state primitive.
|
|
52
|
+
// oxlint-disable-next-line react/no-deriving-state-in-effects -- Synchronize the debounced draft when the controlled value changes.
|
|
51
53
|
setInternalValue(initialValue);
|
|
52
54
|
}, [initialValue]);
|
|
53
55
|
|
package/src/mount.tsx
CHANGED
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
userConfigAtom,
|
|
11
11
|
} from "@/core/config/config";
|
|
12
12
|
import { KnownQueryParams } from "@/core/constants";
|
|
13
|
+
import { pairPreviewAtom, pairPreviewSchema } from "@/core/config/pair";
|
|
13
14
|
import { getFilenameFromDOM } from "@/core/dom/htmlUtils";
|
|
14
15
|
import { getMarimoCode } from "@/core/meta/globals";
|
|
15
16
|
import {
|
|
@@ -208,6 +209,7 @@ const mountOptionsSchema = z.object({
|
|
|
208
209
|
* marimo config overrides
|
|
209
210
|
*/
|
|
210
211
|
configOverrides: passthroughObject,
|
|
212
|
+
pairPreview: pairPreviewSchema.optional(),
|
|
211
213
|
/**
|
|
212
214
|
* marimo app config
|
|
213
215
|
*/
|
|
@@ -345,6 +347,7 @@ function initStore(options: unknown) {
|
|
|
345
347
|
);
|
|
346
348
|
store.set(userConfigAtom, parseUserConfig(parsedOptions.data.config));
|
|
347
349
|
store.set(appConfigAtom, parseAppConfig(parsedOptions.data.appConfig));
|
|
350
|
+
store.set(pairPreviewAtom, parsedOptions.data.pairPreview);
|
|
348
351
|
|
|
349
352
|
// Runtime config
|
|
350
353
|
if (parsedOptions.data.runtimeConfig.length > 0) {
|
|
@@ -9,21 +9,15 @@ const AccordionTrigger = AccordionPrimitive.Trigger;
|
|
|
9
9
|
|
|
10
10
|
import type { JSX } from "react";
|
|
11
11
|
import { ZodError } from "zod";
|
|
12
|
-
import { EmotionCacheProvider } from "@/components/editor/output/EmotionCacheProvider";
|
|
13
12
|
import { JsonOutput } from "@/components/editor/output/JsonOutput";
|
|
14
13
|
import { Alert, AlertTitle } from "../../components/ui/alert";
|
|
15
14
|
|
|
16
15
|
interface Props {
|
|
17
16
|
error: ZodError | Error;
|
|
18
|
-
shadowRoot: ShadowRoot | null;
|
|
19
17
|
badData: Record<string, unknown>;
|
|
20
18
|
}
|
|
21
19
|
|
|
22
|
-
export const BadPluginData: React.FC<Props> = ({
|
|
23
|
-
error,
|
|
24
|
-
badData,
|
|
25
|
-
shadowRoot,
|
|
26
|
-
}) => {
|
|
20
|
+
export const BadPluginData: React.FC<Props> = ({ error, badData }) => {
|
|
27
21
|
if (error instanceof ZodError) {
|
|
28
22
|
return (
|
|
29
23
|
<Alert variant="destructive">
|
|
@@ -49,9 +43,7 @@ export const BadPluginData: React.FC<Props> = ({
|
|
|
49
43
|
View Data:
|
|
50
44
|
</AccordionTrigger>
|
|
51
45
|
<AccordionContent className="text-[0.84375rem]">
|
|
52
|
-
<
|
|
53
|
-
<JsonOutput data={badData} />
|
|
54
|
-
</EmotionCacheProvider>
|
|
46
|
+
<JsonOutput data={badData} />
|
|
55
47
|
</AccordionContent>
|
|
56
48
|
</AccordionItem>
|
|
57
49
|
</Accordion>
|
|
@@ -65,9 +57,6 @@ export const BadPluginData: React.FC<Props> = ({
|
|
|
65
57
|
export function renderError(
|
|
66
58
|
error: ZodError | Error,
|
|
67
59
|
badData: Record<string, unknown>,
|
|
68
|
-
shadowRoot: ShadowRoot | null,
|
|
69
60
|
): JSX.Element {
|
|
70
|
-
return
|
|
71
|
-
<BadPluginData error={error} badData={badData} shadowRoot={shadowRoot} />
|
|
72
|
-
);
|
|
61
|
+
return <BadPluginData error={error} badData={badData} />;
|
|
73
62
|
}
|
|
@@ -262,9 +262,29 @@ const wrapTooltipTargets: TransformFn = (
|
|
|
262
262
|
if (tagName.startsWith("marimo-")) {
|
|
263
263
|
return undefined;
|
|
264
264
|
}
|
|
265
|
-
const tooltipContent = domNode.attribs["data-tooltip"]
|
|
265
|
+
const tooltipContent = domNode.attribs["data-tooltip"].replace(
|
|
266
|
+
/^[\r\n]+|[\r\n]+$/g,
|
|
267
|
+
"",
|
|
268
|
+
);
|
|
266
269
|
return (
|
|
267
|
-
<Tooltip
|
|
270
|
+
<Tooltip
|
|
271
|
+
content={
|
|
272
|
+
tooltipContent.includes("\n") ? (
|
|
273
|
+
<span className="whitespace-pre-wrap">
|
|
274
|
+
{tooltipContent.split(/\r?\n/).map((line, i) => (
|
|
275
|
+
<React.Fragment key={i}>
|
|
276
|
+
{i > 0 && <br />}
|
|
277
|
+
{line}
|
|
278
|
+
</React.Fragment>
|
|
279
|
+
))}
|
|
280
|
+
</span>
|
|
281
|
+
) : (
|
|
282
|
+
tooltipContent
|
|
283
|
+
)
|
|
284
|
+
}
|
|
285
|
+
>
|
|
286
|
+
{reactNode as JSX.Element}
|
|
287
|
+
</Tooltip>
|
|
268
288
|
);
|
|
269
289
|
}
|
|
270
290
|
};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
import type { ExtractAtomValue } from "jotai";
|
|
3
|
+
import { isValidElement, type ReactNode } from "react";
|
|
4
|
+
import { renderToStaticMarkup } from "react-dom/server";
|
|
3
5
|
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
4
6
|
import { hasRunAnyCellAtom } from "@/components/editor/cell/useRunCells";
|
|
5
7
|
import { userConfigAtom } from "@/core/config/config";
|
|
@@ -450,6 +452,191 @@ describe("wrapTooltipTargets", () => {
|
|
|
450
452
|
</Tooltip>
|
|
451
453
|
`);
|
|
452
454
|
});
|
|
455
|
+
|
|
456
|
+
test("data-tooltip multiline via entity renders <br/>", () => {
|
|
457
|
+
const html =
|
|
458
|
+
'<span data-tooltip="Line A Line B Line C">hover</span>';
|
|
459
|
+
const result = parseHtml({ html });
|
|
460
|
+
expect(result).toMatchInlineSnapshot(`
|
|
461
|
+
<Tooltip
|
|
462
|
+
content={
|
|
463
|
+
<span
|
|
464
|
+
className="whitespace-pre-wrap"
|
|
465
|
+
>
|
|
466
|
+
<React.Fragment>
|
|
467
|
+
Line A
|
|
468
|
+
</React.Fragment>
|
|
469
|
+
<React.Fragment>
|
|
470
|
+
<br />
|
|
471
|
+
Line B
|
|
472
|
+
</React.Fragment>
|
|
473
|
+
<React.Fragment>
|
|
474
|
+
<br />
|
|
475
|
+
Line C
|
|
476
|
+
</React.Fragment>
|
|
477
|
+
</span>
|
|
478
|
+
}
|
|
479
|
+
>
|
|
480
|
+
<span
|
|
481
|
+
data-tooltip="Line A
|
|
482
|
+
Line B
|
|
483
|
+
Line C"
|
|
484
|
+
>
|
|
485
|
+
hover
|
|
486
|
+
</span>
|
|
487
|
+
</Tooltip>
|
|
488
|
+
`);
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
test("data-tooltip multiline via literal \\n renders <br/>", () => {
|
|
492
|
+
const html = '<span data-tooltip="Line A\nLine B">hover</span>';
|
|
493
|
+
expect(parseHtml({ html })).toMatchInlineSnapshot(`
|
|
494
|
+
<Tooltip
|
|
495
|
+
content={
|
|
496
|
+
<span
|
|
497
|
+
className="whitespace-pre-wrap"
|
|
498
|
+
>
|
|
499
|
+
<React.Fragment>
|
|
500
|
+
Line A
|
|
501
|
+
</React.Fragment>
|
|
502
|
+
<React.Fragment>
|
|
503
|
+
<br />
|
|
504
|
+
Line B
|
|
505
|
+
</React.Fragment>
|
|
506
|
+
</span>
|
|
507
|
+
}
|
|
508
|
+
>
|
|
509
|
+
<span
|
|
510
|
+
data-tooltip="Line A
|
|
511
|
+
Line B"
|
|
512
|
+
>
|
|
513
|
+
hover
|
|
514
|
+
</span>
|
|
515
|
+
</Tooltip>
|
|
516
|
+
`);
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
test("data-tooltip single line still works as before", () => {
|
|
520
|
+
const html = '<span data-tooltip="Single line">hover</span>';
|
|
521
|
+
expect(parseHtml({ html })).toMatchInlineSnapshot(`
|
|
522
|
+
<Tooltip
|
|
523
|
+
content="Single line"
|
|
524
|
+
>
|
|
525
|
+
<span
|
|
526
|
+
data-tooltip="Single line"
|
|
527
|
+
>
|
|
528
|
+
hover
|
|
529
|
+
</span>
|
|
530
|
+
</Tooltip>
|
|
531
|
+
`);
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
test.each([
|
|
535
|
+
["CRLF", "A\r\nB", '<span class="whitespace-pre-wrap">A<br/>B</span>'],
|
|
536
|
+
[
|
|
537
|
+
"encoded CRLF",
|
|
538
|
+
"A B",
|
|
539
|
+
'<span class="whitespace-pre-wrap">A<br/>B</span>',
|
|
540
|
+
],
|
|
541
|
+
["leading newline", "\nA", "A"],
|
|
542
|
+
["trailing newline", "A\n", "A"],
|
|
543
|
+
[
|
|
544
|
+
"boundary newlines",
|
|
545
|
+
"\n\nA\nB\n\n",
|
|
546
|
+
'<span class="whitespace-pre-wrap">A<br/>B</span>',
|
|
547
|
+
],
|
|
548
|
+
[
|
|
549
|
+
"boundary CRLF",
|
|
550
|
+
" A B ",
|
|
551
|
+
'<span class="whitespace-pre-wrap">A<br/>B</span>',
|
|
552
|
+
],
|
|
553
|
+
["only newlines", "\n\n", ""],
|
|
554
|
+
["only CRLF", " ", ""],
|
|
555
|
+
[
|
|
556
|
+
"internal blank line",
|
|
557
|
+
"A\n\nB",
|
|
558
|
+
'<span class="whitespace-pre-wrap">A<br/><br/>B</span>',
|
|
559
|
+
],
|
|
560
|
+
[
|
|
561
|
+
"spaces and tabs",
|
|
562
|
+
"\n A\t\n\tB \n",
|
|
563
|
+
'<span class="whitespace-pre-wrap"> A\t<br/>\tB </span>',
|
|
564
|
+
],
|
|
565
|
+
[
|
|
566
|
+
"HTML text",
|
|
567
|
+
"<b>A</b>\nB",
|
|
568
|
+
'<span class="whitespace-pre-wrap"><b>A</b><br/>B</span>',
|
|
569
|
+
],
|
|
570
|
+
])("data-tooltip handles %s", (_, content, expected) => {
|
|
571
|
+
const result = parseHtml({
|
|
572
|
+
html: `<span data-tooltip="${content}">Hover me</span>`,
|
|
573
|
+
});
|
|
574
|
+
if (!isValidElement<{ content: ReactNode }>(result)) {
|
|
575
|
+
throw new Error("Expected a Tooltip element");
|
|
576
|
+
}
|
|
577
|
+
expect(renderToStaticMarkup(result.props.content)).toBe(expected);
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
test("data-tooltip with newline renders as line breaks", () => {
|
|
581
|
+
const html = '<span data-tooltip="Line one\nLine two">Hover me</span>';
|
|
582
|
+
expect(parseHtml({ html })).toMatchInlineSnapshot(`
|
|
583
|
+
<Tooltip
|
|
584
|
+
content={
|
|
585
|
+
<span
|
|
586
|
+
className="whitespace-pre-wrap"
|
|
587
|
+
>
|
|
588
|
+
<React.Fragment>
|
|
589
|
+
Line one
|
|
590
|
+
</React.Fragment>
|
|
591
|
+
<React.Fragment>
|
|
592
|
+
<br />
|
|
593
|
+
Line two
|
|
594
|
+
</React.Fragment>
|
|
595
|
+
</span>
|
|
596
|
+
}
|
|
597
|
+
>
|
|
598
|
+
<span
|
|
599
|
+
data-tooltip="Line one
|
|
600
|
+
Line two"
|
|
601
|
+
>
|
|
602
|
+
Hover me
|
|
603
|
+
</span>
|
|
604
|
+
</Tooltip>
|
|
605
|
+
`);
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
test("data-tooltip with multiple newlines renders all as line breaks", () => {
|
|
609
|
+
const html = '<span data-tooltip="A\nB\nC">Hover me</span>';
|
|
610
|
+
expect(parseHtml({ html })).toMatchInlineSnapshot(`
|
|
611
|
+
<Tooltip
|
|
612
|
+
content={
|
|
613
|
+
<span
|
|
614
|
+
className="whitespace-pre-wrap"
|
|
615
|
+
>
|
|
616
|
+
<React.Fragment>
|
|
617
|
+
A
|
|
618
|
+
</React.Fragment>
|
|
619
|
+
<React.Fragment>
|
|
620
|
+
<br />
|
|
621
|
+
B
|
|
622
|
+
</React.Fragment>
|
|
623
|
+
<React.Fragment>
|
|
624
|
+
<br />
|
|
625
|
+
C
|
|
626
|
+
</React.Fragment>
|
|
627
|
+
</span>
|
|
628
|
+
}
|
|
629
|
+
>
|
|
630
|
+
<span
|
|
631
|
+
data-tooltip="A
|
|
632
|
+
B
|
|
633
|
+
C"
|
|
634
|
+
>
|
|
635
|
+
Hover me
|
|
636
|
+
</span>
|
|
637
|
+
</Tooltip>
|
|
638
|
+
`);
|
|
639
|
+
});
|
|
453
640
|
});
|
|
454
641
|
|
|
455
642
|
describe("parseHtml with < nad >", () => {
|
|
@@ -218,7 +218,7 @@ export const FileBrowser = ({
|
|
|
218
218
|
|
|
219
219
|
const { data, error, isPending } = useAsyncData(() => {
|
|
220
220
|
return list_directory({ path: path });
|
|
221
|
-
}, [path, randomId]);
|
|
221
|
+
}, [path, randomId, list_directory]);
|
|
222
222
|
|
|
223
223
|
useEffect(() => {
|
|
224
224
|
if (!isPending) {
|
|
@@ -238,9 +238,15 @@ export const FileBrowser = ({
|
|
|
238
238
|
// Reset the roving tabindex whenever the listing reloads (a new path or a
|
|
239
239
|
// same-path refresh) so activeIndex never points past the current rows.
|
|
240
240
|
const listingKey = `${path}::${randomId}`;
|
|
241
|
-
const [
|
|
242
|
-
|
|
243
|
-
|
|
241
|
+
const [prevListing, setPrevListing] = useState({
|
|
242
|
+
listingKey,
|
|
243
|
+
list_directory,
|
|
244
|
+
});
|
|
245
|
+
if (
|
|
246
|
+
prevListing.listingKey !== listingKey ||
|
|
247
|
+
prevListing.list_directory !== list_directory
|
|
248
|
+
) {
|
|
249
|
+
setPrevListing({ listingKey, list_directory });
|
|
244
250
|
setActiveIndex(0);
|
|
245
251
|
}
|
|
246
252
|
|
|
@@ -219,6 +219,8 @@ const Form = ({
|
|
|
219
219
|
// The Form may be rendered before the child plugin is, so after mount
|
|
220
220
|
// we lookup the plugin once again.
|
|
221
221
|
useEffect(() => {
|
|
222
|
+
// TODO: Replace the post-mount registry lookup with reactive initialization.
|
|
223
|
+
// oxlint-disable-next-line react/no-deriving-state-in-effects -- The child registry entry may not exist until after the parent mounts.
|
|
222
224
|
setInternalValue(UI_ELEMENT_REGISTRY.lookupValue(elementId));
|
|
223
225
|
}, [elementId]);
|
|
224
226
|
|
|
@@ -126,6 +126,8 @@ const MatrixComponent = ({
|
|
|
126
126
|
// which avoids stale-state bugs when the matrix shape changes.
|
|
127
127
|
const [draft, setDraft] = useState(value);
|
|
128
128
|
useEffect(() => {
|
|
129
|
+
// TODO: Model the active draft without synchronizing state in an effect.
|
|
130
|
+
// oxlint-disable-next-line react/no-deriving-state-in-effects -- Synchronize the editable draft when the controlled value changes.
|
|
129
131
|
setDraft(value);
|
|
130
132
|
}, [value]);
|
|
131
133
|
const displayValue = activeCell == null ? value : draft;
|
|
@@ -90,6 +90,8 @@ const RangeSliderComponent = ({
|
|
|
90
90
|
|
|
91
91
|
// Update internal value on prop change
|
|
92
92
|
useEffect(() => {
|
|
93
|
+
// TODO: Replace this synchronization with a controlled-state primitive.
|
|
94
|
+
// oxlint-disable-next-line react/no-deriving-state-in-effects -- Synchronize the editable buffer when the controlled value changes.
|
|
93
95
|
setInternalValue(value);
|
|
94
96
|
}, [value]);
|
|
95
97
|
|
|
@@ -158,6 +158,8 @@ const SliderComponent = ({
|
|
|
158
158
|
const [internalValue, setInternalValue] = useState(value);
|
|
159
159
|
// Update internal value on prop change
|
|
160
160
|
useEffect(() => {
|
|
161
|
+
// TODO: Replace this synchronization with a controlled-state primitive.
|
|
162
|
+
// oxlint-disable-next-line react/no-deriving-state-in-effects -- Synchronize the editable buffer when the controlled value changes.
|
|
161
163
|
setInternalValue(value);
|
|
162
164
|
}, [value]);
|
|
163
165
|
|
|
@@ -5,8 +5,9 @@ import { beforeAll, describe, expect, it, vi } from "vitest";
|
|
|
5
5
|
import { SetupMocks } from "@/__mocks__/common";
|
|
6
6
|
import { initialModeAtom } from "@/core/mode";
|
|
7
7
|
import { store } from "@/core/state/jotai";
|
|
8
|
+
import { CellNotInitializedError } from "@/utils/errors";
|
|
8
9
|
import type { IPluginProps } from "../../types";
|
|
9
|
-
import { FileBrowserPlugin } from "../FileBrowserPlugin";
|
|
10
|
+
import { FileBrowser, FileBrowserPlugin } from "../FileBrowserPlugin";
|
|
10
11
|
|
|
11
12
|
interface MockFile {
|
|
12
13
|
id: string;
|
|
@@ -80,6 +81,54 @@ beforeAll(() => {
|
|
|
80
81
|
store.set(initialModeAtom, "edit");
|
|
81
82
|
});
|
|
82
83
|
|
|
84
|
+
describe("FileBrowserPlugin session cache recovery", () => {
|
|
85
|
+
it("retries a failed cached listing when the plugin resets", async () => {
|
|
86
|
+
const host = document.createElement("marimo-file-browser");
|
|
87
|
+
const wrapper = document.createElement("marimo-ui-element");
|
|
88
|
+
wrapper.setAttribute("random-id", "cached-id");
|
|
89
|
+
wrapper.append(host);
|
|
90
|
+
|
|
91
|
+
const props = {
|
|
92
|
+
initialPath: "/home/user",
|
|
93
|
+
filetypes: [],
|
|
94
|
+
selectionMode: "directory",
|
|
95
|
+
multiple: false,
|
|
96
|
+
label: "Pick folder",
|
|
97
|
+
restrictNavigation: false,
|
|
98
|
+
value: [],
|
|
99
|
+
setValue: vi.fn(),
|
|
100
|
+
host,
|
|
101
|
+
};
|
|
102
|
+
const error = new CellNotInitializedError();
|
|
103
|
+
const cachedListDirectory = vi.fn().mockRejectedValue(error);
|
|
104
|
+
const { rerender } = render(
|
|
105
|
+
<FileBrowser {...props} list_directory={cachedListDirectory} />,
|
|
106
|
+
);
|
|
107
|
+
expect(await screen.findByText(error.message)).toBeInTheDocument();
|
|
108
|
+
|
|
109
|
+
// PluginSlot recreates the RPC functions on reset, even when the path
|
|
110
|
+
// and the host's attributes are unchanged.
|
|
111
|
+
const liveListDirectory = mockListDirectory(FILES);
|
|
112
|
+
rerender(<FileBrowser {...props} list_directory={liveListDirectory} />);
|
|
113
|
+
|
|
114
|
+
expect(await screen.findByText("docs")).toBeInTheDocument();
|
|
115
|
+
expect(screen.queryByText(error.message)).not.toBeInTheDocument();
|
|
116
|
+
expect(liveListDirectory.mock.calls).toEqual([[{ path: "/home/user" }]]);
|
|
117
|
+
|
|
118
|
+
fireEvent.click(screen.getByRole("checkbox", { name: "Select docs" }));
|
|
119
|
+
expect(props.setValue).toHaveBeenCalledWith([
|
|
120
|
+
{ ...FILES[0], id: FILES[0].path },
|
|
121
|
+
]);
|
|
122
|
+
|
|
123
|
+
fireEvent.keyDown(screen.getAllByRole("row")[0], { key: "End" });
|
|
124
|
+
rerender(
|
|
125
|
+
<FileBrowser {...props} list_directory={mockListDirectory([FILES[0]])} />,
|
|
126
|
+
);
|
|
127
|
+
await waitFor(() => expect(screen.getAllByRole("row")).toHaveLength(2));
|
|
128
|
+
expect(screen.getAllByRole("row")[0]).toHaveAttribute("tabindex", "0");
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
83
132
|
describe("FileBrowserPlugin keyboard accessibility", () => {
|
|
84
133
|
it("renders a row per file plus the parent row", async () => {
|
|
85
134
|
renderBrowser();
|