@marimo-team/islands 0.24.3-dev5 → 0.24.3-dev50
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-BW0xr_AR.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-BajL8aoc.js +1 -0
- package/dist/assets/worker-BemUy60C.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-BhNoIBSU.js → cells-BSgNCBZ8.js} +6740 -10126
- package/dist/{channel-CyiYUzJv.js → channel-B5XnTarr.js} +1 -1
- package/dist/chat-ui-CygzVJ9s.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-BdKqYmPi.js +138 -0
- package/dist/{common-xHoep60C.js → common-D9PY0k7A.js} +8839 -12646
- 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-BZiw7m3d.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-iJn-Nryx.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-BAHeJT2Q.js +380 -0
- package/dist/flowDiagram-HODETNUW-6dMdB8pR.js +16 -0
- package/dist/{formats-CJMVUfb3.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-Bp9hhneH.js} +2143 -1910
- package/dist/{glide-utils-NShAPPtn.js → glide-utils-B3rUT5PI.js} +15 -15
- package/dist/globals-BUgvsAck.js +19 -0
- package/dist/highlighted-body-KPVGNVTW-Ad3MKZ18.js +38 -0
- package/dist/html-to-image-kpuRfdfZ.js +3253 -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 +8105 -13485
- 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-C743iqsh.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-CpK6fX_C.js → process-output-DFe2tVIY.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-DwuC-61O.js → reveal-component-CgMzL2w5.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-D-Rx3ux5.js → toDate-WXg1yLcI.js} +10 -9
- 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-CPehZbUb.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__/requests.ts +7 -0
- package/src/__tests__/__snapshots__/CellStatus.test.tsx.snap +12 -12
- package/src/components/chat/acp/__tests__/agent-panel.test.tsx +270 -0
- package/src/components/chat/acp/agent-panel.tsx +45 -44
- 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/ai/add-cell-with-ai.tsx +1 -0
- package/src/components/editor/ai/ai-completion-editor.tsx +3 -1
- package/src/components/editor/alerts/connecting-alert.tsx +1 -66
- package/src/components/editor/alerts/connection-notice.tsx +140 -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/code/__tests__/rtc-editor-config.test.ts +50 -0
- package/src/components/editor/cell/code/cell-editor.tsx +41 -42
- 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 +114 -7
- package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +165 -0
- package/src/components/editor/chrome/panels/packages-panel.tsx +93 -166
- package/src/components/editor/chrome/panels/sandbox-controller.tsx +106 -0
- package/src/components/editor/chrome/panels/sandbox-panel.tsx +173 -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__/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/notebook-cell.tsx +4 -2
- package/src/components/editor/output/JsonOutput.tsx +182 -632
- package/src/components/editor/output/Outputs.css +50 -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/renderers/cell-array.tsx +1 -5
- package/src/components/home/components.tsx +17 -0
- package/src/components/pages/gallery-page.tsx +2 -4
- package/src/components/pages/home-page.tsx +2 -4
- package/src/components/slides/slide-form.tsx +1 -0
- package/src/components/slides/slide-notes-editor.tsx +1 -0
- package/src/components/terminal/terminal.tsx +4 -4
- package/src/components/tracing/tracing-spec.ts +1 -1
- package/src/components/ui/table.tsx +1 -1
- package/src/components/ui/use-toast.ts +8 -0
- package/src/core/MarimoApp.tsx +0 -2
- package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +259 -259
- package/src/core/cells/__tests__/cell.test.ts +61 -0
- package/src/core/cells/__tests__/cells.test.ts +37 -37
- package/src/core/cells/cell.ts +9 -1
- package/src/core/cells/pending-delete-service.ts +12 -16
- package/src/core/codemirror/language/__tests__/sql.test.ts +70 -2
- package/src/core/codemirror/language/languages/sql/sql.ts +16 -1
- package/src/core/codemirror/rtc/extension.ts +5 -2
- 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/islands/__tests__/parse.test.ts +140 -7
- package/src/core/islands/bootstrap.ts +1 -0
- package/src/core/islands/bridge.ts +3 -0
- package/src/core/islands/parse.ts +20 -0
- package/src/core/network/connection-notice.ts +84 -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/packages/__tests__/usePackageAction.test.tsx +129 -0
- package/src/core/packages/__tests__/useSandboxController.test.tsx +165 -0
- package/src/core/packages/package-data.ts +35 -0
- package/src/core/packages/sandbox-state.ts +15 -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 +188 -0
- package/src/core/run-app.tsx +2 -0
- package/src/core/runtime/__tests__/runtime.test.ts +11 -0
- package/src/core/runtime/runtime.ts +7 -2
- package/src/core/wasm/bridge.ts +11 -0
- package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +212 -2
- 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 +43 -8
- package/src/css/app/Cell.css +2 -0
- package/src/hooks/useDebounce.ts +2 -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/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/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/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 +308 -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-DjTMZRVP.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
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { isPlainObject } from "lodash-es";
|
|
3
|
+
|
|
4
|
+
export const PAGE_SIZE = 30;
|
|
5
|
+
|
|
6
|
+
interface Page {
|
|
7
|
+
path: string;
|
|
8
|
+
remaining: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface Options {
|
|
12
|
+
limits: Record<string, number>;
|
|
13
|
+
pageSize: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function paginateJson(data: object, { limits, pageSize }: Options) {
|
|
17
|
+
const originals = new WeakMap<object, object>();
|
|
18
|
+
const pages = new Map<symbol, Page>();
|
|
19
|
+
|
|
20
|
+
function visit(node: object, path: string[]): object {
|
|
21
|
+
if (!Array.isArray(node) && !isPlainObject(node)) {
|
|
22
|
+
return node;
|
|
23
|
+
}
|
|
24
|
+
const pathKey = JSON.stringify(path);
|
|
25
|
+
const limit = limits[pathKey] ?? pageSize;
|
|
26
|
+
const keys = Array.isArray(node)
|
|
27
|
+
? Array.from({ length: Math.min(node.length, limit) }, (_, i) =>
|
|
28
|
+
String(i),
|
|
29
|
+
)
|
|
30
|
+
: Object.keys(node).slice(0, limit);
|
|
31
|
+
const count = Array.isArray(node) ? node.length : Object.keys(node).length;
|
|
32
|
+
const result: object = Array.isArray(node) ? [] : Object.create(null);
|
|
33
|
+
originals.set(result, node);
|
|
34
|
+
|
|
35
|
+
for (const key of keys) {
|
|
36
|
+
// Materialize only the branches the viewer reads, including after expansion.
|
|
37
|
+
Object.defineProperty(result, key, {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
configurable: true,
|
|
40
|
+
get() {
|
|
41
|
+
const original: unknown = Reflect.get(node, key);
|
|
42
|
+
const value =
|
|
43
|
+
original !== null && typeof original === "object"
|
|
44
|
+
? visit(original, [...path, key])
|
|
45
|
+
: original;
|
|
46
|
+
Object.defineProperty(result, key, {
|
|
47
|
+
value,
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
});
|
|
51
|
+
return value;
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (count > limit) {
|
|
56
|
+
const marker = Symbol("show more");
|
|
57
|
+
pages.set(marker, { remaining: count - limit, path: pathKey });
|
|
58
|
+
let key = Array.isArray(node) ? String(limit) : "";
|
|
59
|
+
while (Object.hasOwn(result, key)) {
|
|
60
|
+
key += "\0";
|
|
61
|
+
}
|
|
62
|
+
Object.defineProperty(result, key, { value: marker, enumerable: true });
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
data: visit(data, []),
|
|
69
|
+
getOriginal(value: unknown): unknown {
|
|
70
|
+
return value !== null && typeof value === "object"
|
|
71
|
+
? (originals.get(value) ?? value)
|
|
72
|
+
: value;
|
|
73
|
+
},
|
|
74
|
+
getPage(value: unknown): Page | undefined {
|
|
75
|
+
return typeof value === "symbol" ? pages.get(value) : undefined;
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function estimateExpandedLines(
|
|
81
|
+
node: unknown,
|
|
82
|
+
cap: number,
|
|
83
|
+
depth = 0,
|
|
84
|
+
): number {
|
|
85
|
+
if (
|
|
86
|
+
depth > 4 ||
|
|
87
|
+
node === null ||
|
|
88
|
+
node === undefined ||
|
|
89
|
+
typeof node !== "object"
|
|
90
|
+
) {
|
|
91
|
+
return 1;
|
|
92
|
+
}
|
|
93
|
+
const children: unknown[] = Array.isArray(node) ? node : Object.values(node);
|
|
94
|
+
let lines = 0;
|
|
95
|
+
for (let i = 0; i < children.length && lines < cap; i++) {
|
|
96
|
+
const child = children[i];
|
|
97
|
+
if (child === null || child === undefined || typeof child !== "object") {
|
|
98
|
+
lines++;
|
|
99
|
+
} else {
|
|
100
|
+
const childLen = Array.isArray(child)
|
|
101
|
+
? child.length
|
|
102
|
+
: Object.keys(child).length;
|
|
103
|
+
lines +=
|
|
104
|
+
childLen <= 8
|
|
105
|
+
? estimateExpandedLines(child, cap - lines, depth + 1)
|
|
106
|
+
: 1;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return lines;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function shouldExpandNode(
|
|
113
|
+
_isExpanded: boolean,
|
|
114
|
+
{ value, level }: { value?: object; level: number },
|
|
115
|
+
): boolean {
|
|
116
|
+
if (level <= 1) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
if (level > 5) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
if (value === null || value === undefined || typeof value !== "object") {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
const len = Array.isArray(value) ? value.length : Object.keys(value).length;
|
|
126
|
+
if (len === 0) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
if (len > 200) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
return estimateExpandedLines(value, 150) <= 120;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export function determineMaxDisplayLength(data: unknown): number | undefined {
|
|
136
|
+
if (!Array.isArray(data)) {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
const sample = data.slice(0, 15);
|
|
140
|
+
let maxLength = 0;
|
|
141
|
+
for (const el of sample) {
|
|
142
|
+
if (Array.isArray(el)) {
|
|
143
|
+
for (const next of el.slice(0, 5)) {
|
|
144
|
+
if (Array.isArray(next)) {
|
|
145
|
+
return 5;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
maxLength = Math.max(maxLength, el.length);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (maxLength <= 20) {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
return maxLength >= 50 ? 5 : 10;
|
|
155
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import type { OutputMessage } from "@/core/kernel/messages";
|
|
4
|
+
import { isUrl } from "@/utils/urls";
|
|
5
|
+
import { OutputRenderer } from "../../Output";
|
|
6
|
+
import { HtmlOutput } from "../HtmlOutput";
|
|
7
|
+
import { ImageOutput } from "../ImageOutput";
|
|
8
|
+
import { JsonOutput } from "../JsonOutput";
|
|
9
|
+
import { VideoOutput } from "../VideoOutput";
|
|
10
|
+
import {
|
|
11
|
+
decodePythonKey,
|
|
12
|
+
formatTuplePayload,
|
|
13
|
+
formatSetPayload,
|
|
14
|
+
formatFrozensetPayload,
|
|
15
|
+
splitLeaf,
|
|
16
|
+
} from "./formatting";
|
|
17
|
+
|
|
18
|
+
export const COLLAPSED_TEXT_LENGTH = 100;
|
|
19
|
+
|
|
20
|
+
// Keep long text and quotes wrapping together.
|
|
21
|
+
/* oxlint-disable jsx-a11y/prefer-tag-over-role */
|
|
22
|
+
const CollapsibleTextOutput: React.FC<{ text: string }> = ({ text }) => {
|
|
23
|
+
const [collapsed, setCollapsed] = useState(true);
|
|
24
|
+
if (text.length <= COLLAPSED_TEXT_LENGTH) {
|
|
25
|
+
return <span className="break-all">{text}</span>;
|
|
26
|
+
}
|
|
27
|
+
return (
|
|
28
|
+
<span
|
|
29
|
+
className="cursor-pointer hover:opacity-90 break-all"
|
|
30
|
+
role="button"
|
|
31
|
+
tabIndex={0}
|
|
32
|
+
aria-expanded={!collapsed}
|
|
33
|
+
onClick={() => setCollapsed(!collapsed)}
|
|
34
|
+
onKeyDown={(event) => {
|
|
35
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
36
|
+
event.preventDefault();
|
|
37
|
+
setCollapsed(!collapsed);
|
|
38
|
+
}
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
41
|
+
{collapsed ? `${text.slice(0, COLLAPSED_TEXT_LENGTH)}...` : text}
|
|
42
|
+
</span>
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/* oxlint-enable jsx-a11y/prefer-tag-over-role */
|
|
47
|
+
|
|
48
|
+
type LeafRenderer = (
|
|
49
|
+
data: string,
|
|
50
|
+
mimeType: OutputMessage["mimetype"],
|
|
51
|
+
) => React.ReactNode;
|
|
52
|
+
|
|
53
|
+
const LEAF_RENDERERS: Record<string, LeafRenderer> = {
|
|
54
|
+
"image/": (v) => <ImageOutput src={v} />,
|
|
55
|
+
"video/": (v) => <VideoOutput src={v} />,
|
|
56
|
+
"text/html:": (v) => (
|
|
57
|
+
<HtmlOutput html={v} inline={true} alwaysSanitizeHtml={false} />
|
|
58
|
+
),
|
|
59
|
+
"text/markdown:": (v) => (
|
|
60
|
+
<HtmlOutput html={v} inline={true} alwaysSanitizeHtml={true} />
|
|
61
|
+
),
|
|
62
|
+
"text/plain+float:": (v) => <span>{v}</span>,
|
|
63
|
+
"text/plain+bigint:": (v) => <span>{v}</span>,
|
|
64
|
+
"text/plain+set:": (v) => <span>{formatSetPayload(v)}</span>,
|
|
65
|
+
"text/plain+frozenset:": (v) => <span>{formatFrozensetPayload(v)}</span>,
|
|
66
|
+
"text/plain+tuple:": (v) => <span>{formatTuplePayload(v)}</span>,
|
|
67
|
+
"text/plain:": (v) => <CollapsibleTextOutput text={v} />,
|
|
68
|
+
"application/json:": (v) => <JsonOutput data={JSON.parse(v)} />,
|
|
69
|
+
"application/": (v, mime) => (
|
|
70
|
+
<OutputRenderer
|
|
71
|
+
message={{ channel: "output", data: v, mimetype: mime }}
|
|
72
|
+
renderFallback={() => (
|
|
73
|
+
<span>
|
|
74
|
+
{mime}:{v}
|
|
75
|
+
</span>
|
|
76
|
+
)}
|
|
77
|
+
/>
|
|
78
|
+
),
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
function tryRenderMimeLeaf(value: string): React.ReactNode | null {
|
|
82
|
+
for (const prefix of Object.keys(LEAF_RENDERERS)) {
|
|
83
|
+
if (value.startsWith(prefix)) {
|
|
84
|
+
const [data, mime] = splitLeaf(value);
|
|
85
|
+
return mime
|
|
86
|
+
? LEAF_RENDERERS[prefix](data, mime as OutputMessage["mimetype"])
|
|
87
|
+
: null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
interface KeyRenderResult {
|
|
94
|
+
keyName?: string | number;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function renderKeyName(
|
|
98
|
+
props: Record<string, unknown>,
|
|
99
|
+
{ keyName }: KeyRenderResult,
|
|
100
|
+
): React.ReactNode {
|
|
101
|
+
const decoded = decodePythonKey(keyName);
|
|
102
|
+
if (!decoded) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
return <span {...props}>{decoded.text}</span>;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function renderKeyQuote(
|
|
109
|
+
_props: Record<string, unknown>,
|
|
110
|
+
{ keyName }: KeyRenderResult,
|
|
111
|
+
): React.ReactNode {
|
|
112
|
+
// The viewer treats null/undefined as a request for its default quotes.
|
|
113
|
+
return decodePythonKey(keyName)?.quoted === false ? <span /> : undefined;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface RenderResult {
|
|
117
|
+
type: string;
|
|
118
|
+
value?: unknown;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function renderStringValue(
|
|
122
|
+
_props: React.HTMLAttributes<HTMLSpanElement>,
|
|
123
|
+
result: RenderResult,
|
|
124
|
+
mode: "python" | "json",
|
|
125
|
+
): React.ReactNode {
|
|
126
|
+
if (result.type !== "value" || typeof result.value !== "string") {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
const { value } = result;
|
|
130
|
+
if (mode !== "python") {
|
|
131
|
+
return renderPlainString(value);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const mimeResult = tryRenderMimeLeaf(value);
|
|
135
|
+
if (mimeResult !== null) {
|
|
136
|
+
return <span className="w-rjv-value">{mimeResult}</span>;
|
|
137
|
+
}
|
|
138
|
+
if (isUrl(value)) {
|
|
139
|
+
return (
|
|
140
|
+
<span className="w-rjv-value">
|
|
141
|
+
<a
|
|
142
|
+
href={value}
|
|
143
|
+
target="_blank"
|
|
144
|
+
rel="noopener noreferrer"
|
|
145
|
+
className="text-link hover:underline"
|
|
146
|
+
>
|
|
147
|
+
{value}
|
|
148
|
+
</a>
|
|
149
|
+
</span>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
return renderPlainString(value);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function renderPlainString(value: string) {
|
|
156
|
+
if (value.length <= COLLAPSED_TEXT_LENGTH) {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
return (
|
|
160
|
+
<span
|
|
161
|
+
className="inline-block"
|
|
162
|
+
style={{ color: "var(--w-rjv-type-string-color)" }}
|
|
163
|
+
>
|
|
164
|
+
"
|
|
165
|
+
<CollapsibleTextOutput text={value} />
|
|
166
|
+
"
|
|
167
|
+
</span>
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function renderArrow(
|
|
172
|
+
props: React.HTMLAttributes<HTMLSpanElement>,
|
|
173
|
+
{ keyName }: KeyRenderResult,
|
|
174
|
+
): React.ReactNode {
|
|
175
|
+
// alpha.43's data-expanded is inverted and omits initial collapse rules.
|
|
176
|
+
// NestedOpen's transform reflects the effective state.
|
|
177
|
+
const expanded = props.style?.transform === "rotate(0deg)";
|
|
178
|
+
return (
|
|
179
|
+
<button
|
|
180
|
+
{...props}
|
|
181
|
+
type="button"
|
|
182
|
+
aria-label={`${expanded ? "Collapse" : "Expand"} ${keyName ?? "root"}`}
|
|
183
|
+
aria-expanded={expanded}
|
|
184
|
+
/>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function renderLiteral(text: string) {
|
|
189
|
+
return (_props: Record<string, unknown>, { type }: RenderResult) =>
|
|
190
|
+
type === "value" ? <span className="w-rjv-value">{text}</span> : undefined;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export const PYTHON_TRUE_RENDER = renderLiteral("True");
|
|
194
|
+
export const PYTHON_FALSE_RENDER = renderLiteral("False");
|
|
195
|
+
export const PYTHON_NULL_RENDER = renderLiteral("None");
|
|
196
|
+
export const JSON_NULL_RENDER = renderLiteral("null");
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import type React from "react";
|
|
3
|
+
|
|
4
|
+
type ViewerStyle = React.CSSProperties & Record<`--w-rjv-${string}`, string>;
|
|
5
|
+
|
|
6
|
+
const BASE_THEME: ViewerStyle = {
|
|
7
|
+
fontSize: "var(--text-xs, .75rem)",
|
|
8
|
+
lineHeight: "var(--text-xs--line-height, 1rem)",
|
|
9
|
+
"--w-rjv-font-family": "monospace",
|
|
10
|
+
"--w-rjv-background-color": "transparent",
|
|
11
|
+
"--w-rjv-key-string": "var(--w-rjv-color)",
|
|
12
|
+
"--w-rjv-arrow-color": "var(--w-rjv-color)",
|
|
13
|
+
"--w-rjv-curlybraces-color": "var(--w-rjv-color)",
|
|
14
|
+
"--w-rjv-colon-color": "var(--w-rjv-color)",
|
|
15
|
+
"--w-rjv-brackets-color": "var(--w-rjv-color)",
|
|
16
|
+
"--w-rjv-quotes-color": "var(--w-rjv-color)",
|
|
17
|
+
"--w-rjv-ellipsis-color": "var(--w-rjv-type-string-color)",
|
|
18
|
+
"--w-rjv-quotes-string-color": "var(--w-rjv-type-string-color)",
|
|
19
|
+
"--w-rjv-type-bigint-color": "var(--w-rjv-type-int-color)",
|
|
20
|
+
"--w-rjv-type-url-color": "var(--link)",
|
|
21
|
+
"--w-rjv-type-nan-color": "var(--w-rjv-type-null-color)",
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const marimoLightTheme: ViewerStyle = {
|
|
25
|
+
...BASE_THEME,
|
|
26
|
+
"--w-rjv-color": "#002b36",
|
|
27
|
+
"--w-rjv-key-number": "#6c71c4",
|
|
28
|
+
"--w-rjv-line-color": "rgb(235, 235, 235)",
|
|
29
|
+
"--w-rjv-info-color": "rgba(0, 0, 0, 0.3)",
|
|
30
|
+
"--w-rjv-type-string-color": "#cb4b16",
|
|
31
|
+
"--w-rjv-type-int-color": "#268bd2",
|
|
32
|
+
"--w-rjv-type-float-color": "#859900",
|
|
33
|
+
"--w-rjv-type-boolean-color": "#2aa198",
|
|
34
|
+
"--w-rjv-type-date-color": "#586e75",
|
|
35
|
+
"--w-rjv-type-null-color": "#d33682",
|
|
36
|
+
"--w-rjv-type-undefined-color": "#586e75",
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const marimoDarkTheme: ViewerStyle = {
|
|
40
|
+
...BASE_THEME,
|
|
41
|
+
"--w-rjv-color": "#f8f8f8",
|
|
42
|
+
"--w-rjv-key-number": "#86c1b9",
|
|
43
|
+
"--w-rjv-line-color": "#383838",
|
|
44
|
+
"--w-rjv-info-color": "#b8b8b8",
|
|
45
|
+
"--w-rjv-type-string-color": "#dc9656",
|
|
46
|
+
"--w-rjv-type-int-color": "#a16946",
|
|
47
|
+
"--w-rjv-type-float-color": "#a1b56c",
|
|
48
|
+
"--w-rjv-type-boolean-color": "#ba8baf",
|
|
49
|
+
"--w-rjv-type-date-color": "#7cafc2",
|
|
50
|
+
"--w-rjv-type-null-color": "#ab4642",
|
|
51
|
+
"--w-rjv-type-undefined-color": "#d8d8d8",
|
|
52
|
+
};
|
|
@@ -43,10 +43,7 @@ import type { AppMode } from "../../../core/mode";
|
|
|
43
43
|
import { useHotkey } from "../../../hooks/useHotkey";
|
|
44
44
|
import { type Theme, useTheme } from "../../../theme/useTheme";
|
|
45
45
|
import { AddCellWithAI } from "../ai/add-cell-with-ai";
|
|
46
|
-
import {
|
|
47
|
-
ConnectingAlert,
|
|
48
|
-
NotStartedConnectionAlert,
|
|
49
|
-
} from "../alerts/connecting-alert";
|
|
46
|
+
import { NotStartedConnectionAlert } from "../alerts/connecting-alert";
|
|
50
47
|
import { FloatingOutline } from "../chrome/panels/outline/floating-outline";
|
|
51
48
|
import { useChromeActions } from "../chrome/state";
|
|
52
49
|
import { Column } from "../columns/cell-column";
|
|
@@ -140,7 +137,6 @@ const CellArrayInternal: React.FC<CellArrayProps> = ({
|
|
|
140
137
|
<PackageAlert />
|
|
141
138
|
<StartupLogsAlert />
|
|
142
139
|
<StdinBlockingAlert />
|
|
143
|
-
<ConnectingAlert />
|
|
144
140
|
<NotebookBanner width={appConfig.width} />
|
|
145
141
|
{/* Only show if not cells, otherwise running a single cell will start the connection */}
|
|
146
142
|
{cellIds.idLength === 0 && <NotStartedConnectionAlert />}
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
import { Constants } from "@/core/constants";
|
|
32
32
|
import { useRequestClient } from "@/core/network/requests";
|
|
33
33
|
import type { TutorialId } from "@/core/network/types";
|
|
34
|
+
import { Banner } from "@/plugins/impl/common/error-banner";
|
|
34
35
|
import { openNotebook } from "@/utils/links";
|
|
35
36
|
import { Objects } from "@/utils/objects";
|
|
36
37
|
import { MarimoPlusIcon } from "../icons/marimo-icons";
|
|
@@ -186,6 +187,22 @@ export const ResourceLinks: React.FC = () => {
|
|
|
186
187
|
);
|
|
187
188
|
};
|
|
188
189
|
|
|
190
|
+
/**
|
|
191
|
+
* Shown when the workspace scan stopped early, so the file list the user is
|
|
192
|
+
* looking at is missing files and folders.
|
|
193
|
+
*/
|
|
194
|
+
export const TruncatedWorkspaceBanner: React.FC<{
|
|
195
|
+
fileCount: number | undefined;
|
|
196
|
+
}> = ({ fileCount }) => {
|
|
197
|
+
return (
|
|
198
|
+
<Banner kind="warn" className="rounded p-4">
|
|
199
|
+
Showing {fileCount} files. Some files and folders were skipped because
|
|
200
|
+
your workspace is large or deeply nested. Start marimo from a subfolder to
|
|
201
|
+
see them.
|
|
202
|
+
</Banner>
|
|
203
|
+
);
|
|
204
|
+
};
|
|
205
|
+
|
|
189
206
|
export const Header: React.FC<{
|
|
190
207
|
Icon: React.FC<React.SVGProps<SVGSVGElement>>;
|
|
191
208
|
control?: React.ReactNode;
|
|
@@ -4,6 +4,7 @@ import { SearchIcon } from "lucide-react";
|
|
|
4
4
|
import type React from "react";
|
|
5
5
|
import { Suspense, useMemo, useState } from "react";
|
|
6
6
|
import { ErrorBoundary } from "@/components/editor/boundary/ErrorBoundary";
|
|
7
|
+
import { TruncatedWorkspaceBanner } from "@/components/home/components";
|
|
7
8
|
import { Spinner } from "@/components/icons/spinner";
|
|
8
9
|
import { Card, CardContent } from "@/components/ui/card";
|
|
9
10
|
import { Input } from "@/components/ui/input";
|
|
@@ -119,10 +120,7 @@ const GalleryPage: React.FC = () => {
|
|
|
119
120
|
<ErrorBoundary>
|
|
120
121
|
<div className="flex flex-col gap-2">
|
|
121
122
|
{workspace.hasMore && (
|
|
122
|
-
<
|
|
123
|
-
Showing first {workspace.fileCount} files. Your workspace has
|
|
124
|
-
more files.
|
|
125
|
-
</Banner>
|
|
123
|
+
<TruncatedWorkspaceBanner fileCount={workspace.fileCount} />
|
|
126
124
|
)}
|
|
127
125
|
{formattedFiles.length > SEARCH_THRESHOLD && (
|
|
128
126
|
<Input
|
|
@@ -67,6 +67,7 @@ import {
|
|
|
67
67
|
Header,
|
|
68
68
|
OpenTutorialDropDown,
|
|
69
69
|
ResourceLinks,
|
|
70
|
+
TruncatedWorkspaceBanner,
|
|
70
71
|
} from "../home/components";
|
|
71
72
|
import {
|
|
72
73
|
expandedFoldersAtom,
|
|
@@ -196,10 +197,7 @@ const WorkspaceNotebooks: React.FC<{ onRefreshRecents: () => void }> = ({
|
|
|
196
197
|
<WorkspaceContext value={workspaceContextValue}>
|
|
197
198
|
<div className="flex flex-col gap-2">
|
|
198
199
|
{workspace.hasMore && (
|
|
199
|
-
<
|
|
200
|
-
Showing first {workspace.fileCount} files. Your workspace has more
|
|
201
|
-
files.
|
|
202
|
-
</Banner>
|
|
200
|
+
<TruncatedWorkspaceBanner fileCount={workspace.fileCount} />
|
|
203
201
|
)}
|
|
204
202
|
<Header
|
|
205
203
|
Icon={BookTextIcon}
|
|
@@ -427,6 +427,7 @@ export const SlideSidebar = ({
|
|
|
427
427
|
const [isConfigOpen, setIsConfigOpen] = useAtom(slideConfigOpenAtom);
|
|
428
428
|
|
|
429
429
|
return (
|
|
430
|
+
// oxlint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- Prevent slide navigation while using controls in the sidebar.
|
|
430
431
|
<aside
|
|
431
432
|
className="h-full flex flex-col border-l border-border/60 bg-muted/20 transition-[width] duration-200 ease-out overflow-hidden"
|
|
432
433
|
style={{
|
|
@@ -89,6 +89,7 @@ export const SlideNotesEditor = ({
|
|
|
89
89
|
};
|
|
90
90
|
|
|
91
91
|
return (
|
|
92
|
+
// oxlint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- Prevent slide navigation while editing speaker notes.
|
|
92
93
|
<section
|
|
93
94
|
className={cn(
|
|
94
95
|
"h-full min-h-0 flex flex-col bg-muted/40 dark:bg-muted/20 border-t",
|
|
@@ -254,7 +254,9 @@ const TerminalComponent: React.FC<TerminalComponentProps> = ({
|
|
|
254
254
|
try {
|
|
255
255
|
await waitForConnectionOpen();
|
|
256
256
|
|
|
257
|
-
|
|
257
|
+
// Size the PTY before the shell draws its first prompt.
|
|
258
|
+
fitAddon.fit();
|
|
259
|
+
const socket = new WebSocket(runtimeManager.getTerminalWsURL(terminal));
|
|
258
260
|
const attachAddon = new AttachAddon(socket);
|
|
259
261
|
terminal.loadAddon(attachAddon);
|
|
260
262
|
wsRef.current = socket;
|
|
@@ -270,9 +272,7 @@ const TerminalComponent: React.FC<TerminalComponentProps> = ({
|
|
|
270
272
|
|
|
271
273
|
const handleOpen = () => {
|
|
272
274
|
updateReadyState();
|
|
273
|
-
//
|
|
274
|
-
// before the WS was OPEN, dropping the resize message and leaving
|
|
275
|
-
// the PTY at its default 0x0 winsize.
|
|
275
|
+
// The container may have resized while the connection was opening.
|
|
276
276
|
fitAddon.fit();
|
|
277
277
|
if (terminal.cols > 0 && terminal.rows > 0) {
|
|
278
278
|
socket.send(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import type { TopLevelSpec } from "vega-lite";
|
|
4
|
-
import type { TimeUnit } from "vega-
|
|
4
|
+
import type { TimeUnit } from "vega-lite/types_unstable/timeunit.js";
|
|
5
5
|
import type { CellId } from "@/core/cells/ids";
|
|
6
6
|
import type { CellRun } from "@/core/cells/runs";
|
|
7
7
|
import type { ResolvedTheme } from "@/theme/useTheme";
|
|
@@ -7,7 +7,7 @@ const Table = React.forwardRef<
|
|
|
7
7
|
HTMLTableElement,
|
|
8
8
|
React.HTMLAttributes<HTMLTableElement>
|
|
9
9
|
>(({ className, ...props }, ref) => (
|
|
10
|
-
<div className="w-full overflow-auto scrollbar-thin flex-1 print:overflow-hidden">
|
|
10
|
+
<div className="w-full overflow-auto overscroll-contain scrollbar-thin flex-1 print:overflow-hidden">
|
|
11
11
|
<table
|
|
12
12
|
ref={ref}
|
|
13
13
|
className={cn("w-full caption-bottom text-sm", className)}
|
|
@@ -161,6 +161,14 @@ function dispatch(action: Action) {
|
|
|
161
161
|
});
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
+
export function clearToasts() {
|
|
165
|
+
for (const timeout of toastTimeouts.values()) {
|
|
166
|
+
clearTimeout(timeout);
|
|
167
|
+
}
|
|
168
|
+
toastTimeouts.clear();
|
|
169
|
+
dispatch({ type: "REMOVE_TOAST" });
|
|
170
|
+
}
|
|
171
|
+
|
|
164
172
|
type Toast = Omit<ToasterToast, "id">;
|
|
165
173
|
|
|
166
174
|
function toast({
|
package/src/core/MarimoApp.tsx
CHANGED
|
@@ -12,7 +12,6 @@ import { getInitialAppMode } from "@/core/mode";
|
|
|
12
12
|
import { CssVariables } from "@/theme/ThemeProvider";
|
|
13
13
|
import { reactLazyWithPreload } from "@/utils/lazy";
|
|
14
14
|
import { ErrorBoundary } from "../components/editor/boundary/ErrorBoundary";
|
|
15
|
-
import { KernelStartupErrorModal } from "../components/editor/KernelStartupErrorModal";
|
|
16
15
|
import { TracebackModalContainer } from "../components/editor/TracebackModalContainer";
|
|
17
16
|
import { ModalProvider } from "../components/modal/ImperativeModal";
|
|
18
17
|
import { Toaster } from "../components/ui/toaster";
|
|
@@ -105,7 +104,6 @@ const Providers = memo(({ children }: PropsWithChildren) => {
|
|
|
105
104
|
{children}
|
|
106
105
|
<Toaster />
|
|
107
106
|
<TailwindIndicator />
|
|
108
|
-
<KernelStartupErrorModal />
|
|
109
107
|
<TracebackModalContainer />
|
|
110
108
|
</ModalProvider>
|
|
111
109
|
</LocaleProvider>
|