@marimo-team/islands 0.24.3-dev3 → 0.24.3-dev31
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-qIKbwYin.js → ConnectedDataExplorerComponent-BLO7UDpo.js} +18 -18
- package/dist/{ErrorBoundary-CR-ZQN_c.js → ErrorBoundary-B7uSdDUm.js} +6 -6
- package/dist/{ImageComparisonComponent-2a9TMMm2.js → ImageComparisonComponent-RspMflu6.js} +3 -3
- package/dist/{Plot-C-9MQeGP.js → Plot-CTyjbQDT.js} +21032 -20666
- package/dist/_baseMerge-Bnytch8P.js +165 -0
- package/dist/{abnfDiagram-N423BO3Z-CQKwzX8t.js → abnfDiagram-VCTEODGH-DCb2K_RB.js} +17 -18
- package/dist/{any-language-editor-CpTnK43-.js → any-language-editor-C0dftc2Z.js} +8 -8
- package/dist/arc-7ra3iNdN.js +81 -0
- package/dist/architecture-7GRP2DOG-BWLylgiA.js +3 -0
- package/dist/{architectureDiagram-T3A2C74G-CncrDpfa.js → architectureDiagram-5GKGNRK7-Bb_n642s.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/{channel-CyiYUzJv.js → channel-B5XnTarr.js} +1 -1
- package/dist/chat-ui-DiMxe-GH.js +5835 -0
- package/dist/{check-CHig47QV.js → check-mcQyZmFG.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-Du9BN2Ul.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-tUelricH.js} +109 -63
- package/dist/{chunk-6Q2QTUOP-DmTcEBMn.js → chunk-SVP7TREG-DK3egkfQ.js} +5 -5
- package/dist/{chunk-GF5L2VYU-B0wgCQgS.js → chunk-TICWLB2K-DRANTdnp.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-7wCSVH7o.js +30 -0
- package/dist/classDiagram-v2-VYDZK3BY-QwnvcnhB.js +30 -0
- package/dist/{common-CwJerb7K.js → common-BTmw6ocq.js} +7398 -6912
- package/dist/{compiler-runtime-CAH9RLw2.js → compiler-runtime-Cj8ZWiNS.js} +2 -2
- package/dist/{copy-CD7S58CY.js → copy-C0N4m1lm.js} +4 -4
- 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-CB7O4IZB.js} +10 -10
- package/dist/{dagre-CGyalH38.js → dagre-DfYd3btw.js} +678 -537
- package/dist/dagre-GXQ25YYZ-C-a95ISW.js +425 -0
- package/dist/{data-grid-overlay-editor-DZM4BAaI.js → data-grid-overlay-editor-C5eUZVTo.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-BsKLYQaH.js} +40 -39
- package/dist/{diagram-UB23O5K3-DDg-7wLA.js → diagram-UQ7AKVKN-ppYdvuTN.js} +10 -10
- package/dist/{diagram-B4RE2ZJO-CKccR9eE.js → diagram-VSXAHHWV-BKpmG23x.js} +10 -10
- package/dist/{diagram-Q27KOJAE-Zhz01ss7.js → diagram-VX7I27RA-CAMK2l0E.js} +21 -21
- package/dist/{diagram-LBJQPF4R-CJ-bOruh.js → diagram-Z3DM3KII-CxQ7MggT.js} +10 -10
- package/dist/{dist-dAqZAPcF.js → dist-1HDa70oE.js} +3 -3
- package/dist/{dist-3_o3T78I.js → dist-6ChWbo8z.js} +13 -13
- 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/{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-DhCfcscX.js → dropdown-menu-C73aTomr.js} +184 -184
- package/dist/{ebnfDiagram-BXEA7PRR-Dm75pCAS.js → ebnfDiagram-PWID7BFC-DzybELvk.js} +17 -18
- package/dist/{erDiagram-JOGREHBK-rVDG3VSQ.js → erDiagram-RLTQ6QDP-BVxV97ld.js} +1037 -798
- package/dist/{error-banner-WDhUzJyg.js → error-banner-hCaH06e3.js} +207 -207
- 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-blALgIVy.js} +332 -319
- package/dist/eventmodeling-NTZA5JFV-D7nP7Uyu.js +3 -0
- package/dist/{extends-BPB6_lTK.js → extends-Do6pRuJa.js} +8 -8
- package/dist/flowDiagram-HODETNUW-BKvXsWYX.js +16 -0
- package/dist/{formats-CJMVUfb3.js → formats-vDAoRpYs.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-Bcy8iaZa.js} +2785 -2562
- package/dist/{glide-utils-NShAPPtn.js → glide-utils-BMnFm0vZ.js} +4 -4
- package/dist/highlighted-body-KPVGNVTW-Ad3MKZ18.js +38 -0
- package/dist/{html-to-image-BTYnN4ev.js → html-to-image-mVIbKn_Y.js} +5720 -5452
- package/dist/info-A6RAGUB7-DKoayiHY.js +3 -0
- package/dist/{infoDiagram-6WML65LV-DqCTXHVy.js → infoDiagram-27XIBGKW-B_ucqo-U.js} +7 -7
- package/dist/{ishikawaDiagram-WSZJBQD7-BCUYmZ1v.js → ishikawaDiagram-5VMMS53U-BZFx9b-o.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-BpIfcu3G.js} +29 -29
- package/dist/katex-DFBiSucW.js +21840 -0
- package/dist/{label-lwzzBHUW.js → label-e37ixur5.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 +7018 -12382
- package/dist/mermaid-B1Jb9HfY.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-CmpAfv8K.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-CFofZaOi.js} +5 -5
- package/dist/packet-AYTQ26CC-Yw7ajchJ.js +3 -0
- package/dist/{pegDiagram-VL7TDLO6-Df9IUjMD.js → pegDiagram-XKGWAZYB-DO-0Q8SE.js} +19 -20
- package/dist/{pick-SnHlmIBN.js → pick-B7vX8zxG.js} +1 -1
- package/dist/pie-WAS4IAKB-BKdKOAkL.js +3 -0
- package/dist/{pieDiagram-7S7Q4E2Y-BmRzQ8ZP.js → pieDiagram-E7YTZNPT-B1MbuA_g.js} +29 -31
- package/dist/{process-output-CsALk6tp.js → process-output-Cr6U5ULK.js} +4 -4
- 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-DPVOQUXC.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-CC7wZ-tM.js} +20 -19
- package/dist/{reveal-component-DVMzBxwv.js → reveal-component-BK1wyO-B.js} +1171 -1105
- package/dist/{sankeyDiagram-W5VNT64P-BYJALbbm.js → sankeyDiagram-P5KCCOFB-CDKR5TJH.js} +4 -4
- package/dist/schemas-BDZr-nP0.js +5727 -0
- package/dist/{select-3qHpFKF9.js → select-UMOSCa3W.js} +246 -246
- package/dist/{sequenceDiagram-SI44F4Z6-BiPBe3Sv.js → sequenceDiagram-WJ2MYXX4-DomSyoJI.js} +11 -11
- package/dist/{sizeCapture-X5ZJPWSS-BKLDeh5H.js → sizeCapture-INFHLROL-Dx5SpkQF.js} +2 -2
- package/dist/{spec-CutWdqo3.js → spec-g740fOWu.js} +4 -4
- package/dist/{src-C31ngt98.js → src-CA_m4ONl.js} +298 -303
- package/dist/{stateDiagram-OKZ733FA-B7QyNBxH.js → stateDiagram-D77RDMKH-SQLLjdtF.js} +19 -20
- package/dist/stateDiagram-v2-MP3YSRHH-Dup4KkIr.js +30 -0
- package/dist/style.css +2 -2
- package/dist/{swimlanes-SLNWSIFB-B4f8VP3b.js → swimlanes-42K2YHIH-ZXbhyGv6.js} +1501 -1591
- package/dist/swimlanesDiagram-VR7AAH4N-CluwxV0g.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-B8i6B9RR.js} +7 -7
- package/dist/{toDate-D-Rx3ux5.js → toDate-C3JOXlJT.js} +10 -9
- package/dist/{tooltip-Dt77sBeT.js → tooltip-CdE8k0pS.js} +42 -42
- package/dist/treeView-Q6P3EWNA-DuRV97YF.js +3 -0
- package/dist/treemap-WGGIJYW6-AsLq-uwC.js +3 -0
- package/dist/{use-vega-container-remeasure-DUW4tRxq.js → use-vega-container-remeasure-4DwJbPWu.js} +2 -2
- package/dist/{useAsyncData-CH6-CgJF.js → useAsyncData-C0f7qnnN.js} +3 -3
- package/dist/{useDateFormatter-Cp9Jdxls.js → useDateFormatter-BKpQHt-W.js} +8 -8
- package/dist/{useDeepCompareMemoize-JC87C_jO.js → useDeepCompareMemoize-QCa0HbWB.js} +2 -2
- package/dist/{useIframeCapabilities-De3C-9b4.js → useIframeCapabilities-CVtNkI3Y.js} +2 -2
- package/dist/{useLifecycle-B4RGlyf0.js → useLifecycle-BGRBkTFT.js} +6 -6
- package/dist/useTheme-iQ0VoptU.js +904 -0
- package/dist/{vega-component-D-IXRnlx.js → vega-component-DRI4BDLQ.js} +15 -15
- 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-CS7lHhxI.js} +9 -9
- package/dist/wardley-WFR3VGLG-Na-tFhQJ.js +3 -0
- package/dist/{wardleyDiagram-T6FBY63Y-Z-Og7_Wd.js → wardleyDiagram-VM6X3IG4-BSm-L8JI.js} +10 -10
- package/dist/{xychartDiagram-ELKLHX3M-BDJ2dITA.js → xychartDiagram-S5SC5T6Z-8fKCJGrJ.js} +248 -139
- package/package.json +52 -52
- package/src/__mocks__/requests.ts +7 -2
- 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-visibility-dropdown.tsx +9 -3
- package/src/components/datasources/components.tsx +4 -2
- package/src/components/editor/RecoveryButton.tsx +1 -0
- package/src/components/editor/chrome/components/feedback-button.tsx +10 -9
- package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +143 -0
- package/src/components/editor/chrome/panels/packages-panel.tsx +145 -51
- 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/file-tree/__tests__/tree-actions.test.tsx +54 -0
- package/src/components/editor/file-tree/tree-actions.tsx +11 -14
- package/src/components/editor/notebook-cell.tsx +4 -2
- package/src/components/editor/output/Outputs.css +1 -0
- package/src/components/editor/package-alert.tsx +25 -1
- 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/core/cells/__tests__/cell.test.ts +61 -0
- 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/islands/__tests__/parse.test.ts +140 -7
- package/src/core/islands/parse.ts +20 -0
- package/src/core/packages/__tests__/useInstallPackage.test.tsx +47 -1
- package/src/core/packages/toast-components.tsx +26 -0
- package/src/core/packages/useInstallPackage.ts +7 -2
- package/src/core/runtime/__tests__/runtime.test.ts +11 -0
- package/src/core/runtime/runtime.ts +7 -2
- package/src/core/wasm/bridge.ts +1 -0
- package/src/core/websocket/transports/transport.ts +1 -1
- package/src/core/websocket/transports/ws.ts +1 -1
- package/src/css/app/Cell.css +2 -0
- package/src/plugins/core/RenderHTML.tsx +22 -2
- package/src/plugins/core/__test__/RenderHTML.test.ts +187 -0
- package/src/plugins/impl/data-frames/panel.tsx +1 -0
- package/src/plugins/layout/AccordionPlugin.tsx +7 -2
- package/src/plugins/layout/__test__/AccordionPlugin.test.tsx +66 -0
- 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-DttQ-5Ut.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/cynefin-VYW2F7L2-CeHAxOEX.js +0 -3
- package/dist/dagre-VZM6K2ZE-CJggWPTJ.js +0 -328
- package/dist/dist-ABQjhuek.js +0 -64
- package/dist/dist-CO5R6VMi.js +0 -538
- 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-BsHdQeQf.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/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
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
act,
|
|
4
|
+
fireEvent,
|
|
5
|
+
render,
|
|
6
|
+
renderHook,
|
|
7
|
+
screen,
|
|
8
|
+
} from "@testing-library/react";
|
|
3
9
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
10
|
import { useInstallPackages } from "../useInstallPackage";
|
|
11
|
+
import { Toast, ToastProvider, ToastViewport } from "@/components/ui/toast";
|
|
5
12
|
|
|
6
13
|
const toast = vi.fn();
|
|
7
14
|
const addPackage = vi.fn();
|
|
15
|
+
const restartKernel = vi.fn();
|
|
16
|
+
|
|
17
|
+
vi.mock("@/components/editor/actions/useRestartKernel", () => ({
|
|
18
|
+
useRestartKernel: () => restartKernel,
|
|
19
|
+
}));
|
|
8
20
|
|
|
9
21
|
vi.mock("@/components/ui/use-toast", () => ({
|
|
10
22
|
toast: (...args: unknown[]) => toast(...args),
|
|
@@ -20,6 +32,7 @@ describe("useInstallPackages", () => {
|
|
|
20
32
|
beforeEach(() => {
|
|
21
33
|
toast.mockClear();
|
|
22
34
|
addPackage.mockClear();
|
|
35
|
+
restartKernel.mockClear();
|
|
23
36
|
});
|
|
24
37
|
|
|
25
38
|
it("batches all packages into a single install call", async () => {
|
|
@@ -109,6 +122,39 @@ describe("useInstallPackages", () => {
|
|
|
109
122
|
);
|
|
110
123
|
});
|
|
111
124
|
|
|
125
|
+
it("reports saved changes requiring restart without claiming installation", async () => {
|
|
126
|
+
addPackage.mockResolvedValue({
|
|
127
|
+
success: false,
|
|
128
|
+
error: null,
|
|
129
|
+
restartRequired: true,
|
|
130
|
+
});
|
|
131
|
+
const { result } = renderHook(() => useInstallPackages());
|
|
132
|
+
await act(async () => {
|
|
133
|
+
await result.current.handleInstallPackages(["boltons", "six"]);
|
|
134
|
+
});
|
|
135
|
+
expect(toast).toHaveBeenCalledTimes(1);
|
|
136
|
+
expect(toast).toHaveBeenCalledWith(
|
|
137
|
+
expect.objectContaining({
|
|
138
|
+
title: "Changes saved — restart required",
|
|
139
|
+
description: expect.stringContaining(
|
|
140
|
+
"Restarting clears in-memory variables",
|
|
141
|
+
),
|
|
142
|
+
duration: Infinity,
|
|
143
|
+
action: expect.anything(),
|
|
144
|
+
}),
|
|
145
|
+
);
|
|
146
|
+
expect(toast.mock.calls[0][0].variant).not.toBe("danger");
|
|
147
|
+
render(
|
|
148
|
+
<ToastProvider>
|
|
149
|
+
<Toast>{toast.mock.calls[0][0].action}</Toast>
|
|
150
|
+
<ToastViewport />
|
|
151
|
+
</ToastProvider>,
|
|
152
|
+
);
|
|
153
|
+
expect(restartKernel).not.toHaveBeenCalled();
|
|
154
|
+
fireEvent.click(screen.getByRole("button", { name: "Restart Kernel" }));
|
|
155
|
+
expect(restartKernel).toHaveBeenCalledTimes(1);
|
|
156
|
+
});
|
|
157
|
+
|
|
112
158
|
it("calls onSuccess after a successful install", async () => {
|
|
113
159
|
addPackage.mockResolvedValue({ success: true, error: null });
|
|
114
160
|
const onSuccess = vi.fn();
|
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
+
import { useRestartKernel } from "@/components/editor/actions/useRestartKernel";
|
|
3
4
|
import { Kbd } from "@/components/ui/kbd";
|
|
5
|
+
import { ToastAction } from "@/components/ui/toast";
|
|
4
6
|
import { toast } from "@/components/ui/use-toast";
|
|
5
7
|
|
|
8
|
+
export const RESTART_REQUIRED_DESCRIPTION =
|
|
9
|
+
"Your dependency changes are saved. Restart the kernel to use the updated environment. Restarting clears in-memory variables.";
|
|
10
|
+
|
|
11
|
+
const RestartKernelAction = () => {
|
|
12
|
+
const restartKernel = useRestartKernel();
|
|
13
|
+
return (
|
|
14
|
+
<ToastAction
|
|
15
|
+
altText="Restart the kernel to use the updated dependencies"
|
|
16
|
+
onClick={restartKernel}
|
|
17
|
+
>
|
|
18
|
+
Restart Kernel
|
|
19
|
+
</ToastAction>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const showPackageRestartToast = () => {
|
|
24
|
+
toast({
|
|
25
|
+
title: "Changes saved — restart required",
|
|
26
|
+
description: RESTART_REQUIRED_DESCRIPTION,
|
|
27
|
+
duration: Infinity,
|
|
28
|
+
action: <RestartKernelAction />,
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
|
|
6
32
|
export const showAddPackageToast = (
|
|
7
33
|
packageName: string | string[],
|
|
8
34
|
error?: string | null,
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
import { Logger } from "@/utils/Logger";
|
|
5
5
|
import { useRequestClient } from "../network/requests";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
showAddPackageToast,
|
|
8
|
+
showPackageRestartToast,
|
|
9
|
+
} from "./toast-components";
|
|
7
10
|
|
|
8
11
|
export function useInstallPackages(): {
|
|
9
12
|
handleInstallPackages: (
|
|
@@ -30,7 +33,9 @@ export function useInstallPackages(): {
|
|
|
30
33
|
// response only carries an aggregate success/error. Report a single
|
|
31
34
|
// toast covering all requested packages rather than implying a
|
|
32
35
|
// per-package outcome we don't actually have.
|
|
33
|
-
if (response.
|
|
36
|
+
if (response.restartRequired) {
|
|
37
|
+
showPackageRestartToast();
|
|
38
|
+
} else if (response.success) {
|
|
34
39
|
showAddPackageToast(packages);
|
|
35
40
|
} else {
|
|
36
41
|
showAddPackageToast(packages, response.error);
|
|
@@ -276,6 +276,17 @@ describe("RuntimeManager", () => {
|
|
|
276
276
|
});
|
|
277
277
|
|
|
278
278
|
describe("getTerminalWsURL", () => {
|
|
279
|
+
it("should include dimensions in the terminal handshake", () => {
|
|
280
|
+
const runtime = new RuntimeManager(mockConfig);
|
|
281
|
+
const url = runtime.getTerminalWsURL({ rows: 30, cols: 140 });
|
|
282
|
+
|
|
283
|
+
expect(Object.fromEntries(url.searchParams)).toEqual({
|
|
284
|
+
access_token: "test-token",
|
|
285
|
+
rows: "30",
|
|
286
|
+
cols: "140",
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
|
|
279
290
|
it("should return terminal WebSocket URL", () => {
|
|
280
291
|
const runtime = new RuntimeManager(mockConfig);
|
|
281
292
|
const url = runtime.getTerminalWsURL();
|
|
@@ -183,8 +183,13 @@ export class RuntimeManager {
|
|
|
183
183
|
/**
|
|
184
184
|
* The WebSocket URL of the terminal.
|
|
185
185
|
*/
|
|
186
|
-
getTerminalWsURL(): URL {
|
|
187
|
-
|
|
186
|
+
getTerminalWsURL(size?: { rows: number; cols: number }): URL {
|
|
187
|
+
const url = this.formatWsURL("/terminal/ws");
|
|
188
|
+
if (size) {
|
|
189
|
+
url.searchParams.set("rows", String(size.rows));
|
|
190
|
+
url.searchParams.set("cols", String(size.cols));
|
|
191
|
+
}
|
|
192
|
+
return url;
|
|
188
193
|
}
|
|
189
194
|
|
|
190
195
|
/**
|
package/src/core/wasm/bridge.ts
CHANGED
|
@@ -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
|
|
package/src/css/app/Cell.css
CHANGED
|
@@ -82,6 +82,7 @@
|
|
|
82
82
|
.console-output-area {
|
|
83
83
|
max-height: 610px;
|
|
84
84
|
overflow: auto;
|
|
85
|
+
overscroll-behavior: contain;
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
/* Special case for particular components */
|
|
@@ -521,6 +522,7 @@
|
|
|
521
522
|
display: flow-root;
|
|
522
523
|
|
|
523
524
|
overflow: auto;
|
|
525
|
+
overscroll-behavior: contain;
|
|
524
526
|
}
|
|
525
527
|
|
|
526
528
|
.marimo-output-stale,
|
|
@@ -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 >", () => {
|
|
@@ -177,6 +177,7 @@ export const TransformPanel: React.FC<Props> = ({
|
|
|
177
177
|
return (
|
|
178
178
|
<ColumnInfoContext value={effectiveColumns}>
|
|
179
179
|
<ColumnFetchValuesContext value={getColumnValues}>
|
|
180
|
+
{/* oxlint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- Prevent Enter from submitting while using controls in the lazy form. */}
|
|
180
181
|
<form
|
|
181
182
|
onSubmit={(e) => e.preventDefault()}
|
|
182
183
|
// When lazy, prevent Enter from submitting
|
|
@@ -23,6 +23,7 @@ interface Data {
|
|
|
23
23
|
* Whether to allow multiple tabs to be open.
|
|
24
24
|
*/
|
|
25
25
|
multiple: boolean;
|
|
26
|
+
expanded: string[];
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
export class AccordionPlugin implements IStatelessPlugin<Data> {
|
|
@@ -31,6 +32,7 @@ export class AccordionPlugin implements IStatelessPlugin<Data> {
|
|
|
31
32
|
validator = z.object({
|
|
32
33
|
labels: z.array(z.string()),
|
|
33
34
|
multiple: z.boolean(),
|
|
35
|
+
expanded: z.array(z.string()).default([]),
|
|
34
36
|
});
|
|
35
37
|
|
|
36
38
|
render(props: IStatelessPluginProps<Data>): JSX.Element {
|
|
@@ -43,11 +45,14 @@ export class AccordionPlugin implements IStatelessPlugin<Data> {
|
|
|
43
45
|
const AccordionComponent = ({
|
|
44
46
|
labels,
|
|
45
47
|
multiple,
|
|
48
|
+
expanded,
|
|
46
49
|
children,
|
|
47
50
|
}: PropsWithChildren<Data>): JSX.Element => {
|
|
48
|
-
const
|
|
51
|
+
const expansionProps = multiple
|
|
52
|
+
? { type: "multiple" as const, defaultValue: expanded }
|
|
53
|
+
: { type: "single" as const, defaultValue: expanded[0], collapsible: true };
|
|
49
54
|
return (
|
|
50
|
-
<Accordion
|
|
55
|
+
<Accordion {...expansionProps} className="text-muted-foreground">
|
|
51
56
|
{React.Children.map(children, (child, index) => {
|
|
52
57
|
return (
|
|
53
58
|
<AccordionItem key={index} value={index.toString()}>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { cleanup, fireEvent, render } from "@testing-library/react";
|
|
3
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
4
|
+
import { AccordionPlugin } from "../AccordionPlugin";
|
|
5
|
+
|
|
6
|
+
const plugin = new AccordionPlugin();
|
|
7
|
+
|
|
8
|
+
function renderAccordion(multiple: boolean, expanded?: string[]) {
|
|
9
|
+
return plugin.render({
|
|
10
|
+
host: document.createElement("marimo-accordion"),
|
|
11
|
+
data: plugin.validator.parse({
|
|
12
|
+
labels: ["Summary", "Details"],
|
|
13
|
+
multiple,
|
|
14
|
+
expanded,
|
|
15
|
+
}),
|
|
16
|
+
children: [
|
|
17
|
+
<p key="summary">Overview</p>,
|
|
18
|
+
<p key="details">More information</p>,
|
|
19
|
+
],
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
describe("AccordionPlugin", () => {
|
|
24
|
+
afterEach(cleanup);
|
|
25
|
+
|
|
26
|
+
it.each([
|
|
27
|
+
{ multiple: false, expanded: undefined, expected: ["false", "false"] },
|
|
28
|
+
{ multiple: true, expanded: [], expected: ["false", "false"] },
|
|
29
|
+
{ multiple: false, expanded: ["0"], expected: ["true", "false"] },
|
|
30
|
+
{ multiple: false, expanded: ["1"], expected: ["false", "true"] },
|
|
31
|
+
{ multiple: true, expanded: ["0", "1"], expected: ["true", "true"] },
|
|
32
|
+
])(
|
|
33
|
+
"sets initial expansion: $multiple, $expanded",
|
|
34
|
+
({ multiple, expanded, expected }) => {
|
|
35
|
+
const { getAllByRole } = render(renderAccordion(multiple, expanded));
|
|
36
|
+
expect(
|
|
37
|
+
getAllByRole("button").map((button) =>
|
|
38
|
+
button.getAttribute("aria-expanded"),
|
|
39
|
+
),
|
|
40
|
+
).toEqual(expected);
|
|
41
|
+
},
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
it("lets users collapse and switch the initially expanded item", () => {
|
|
45
|
+
const { getAllByRole, rerender } = render(renderAccordion(false, ["1"]));
|
|
46
|
+
const [summary, details] = getAllByRole("button");
|
|
47
|
+
fireEvent.click(details);
|
|
48
|
+
expect(details.getAttribute("aria-expanded")).toBe("false");
|
|
49
|
+
rerender(renderAccordion(false, ["1"]));
|
|
50
|
+
expect(details.getAttribute("aria-expanded")).toBe("false");
|
|
51
|
+
fireEvent.click(details);
|
|
52
|
+
fireEvent.click(summary);
|
|
53
|
+
expect(
|
|
54
|
+
[summary, details].map((button) => button.getAttribute("aria-expanded")),
|
|
55
|
+
).toEqual(["true", "false"]);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("lets users collapse items independently with multiple enabled", () => {
|
|
59
|
+
const { getAllByRole } = render(renderAccordion(true, ["0", "1"]));
|
|
60
|
+
const [summary, details] = getAllByRole("button");
|
|
61
|
+
fireEvent.click(summary);
|
|
62
|
+
expect(
|
|
63
|
+
[summary, details].map((button) => button.getAttribute("aria-expanded")),
|
|
64
|
+
).toEqual(["false", "true"]);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { A as e, E as t, O as n, _ as r, b as i, f as a, h as o, i as s, j as c, k as l, l as u, n as d, p as f, t as p, y as m } from "./isArrayLikeObject-BZl-15ir.js";
|
|
2
|
-
import { a as h, i as g, l as _, n as v, o as y, s as b, t as x, u as S } from "./_initCloneObject---vediN2.js";
|
|
3
|
-
//#region ../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_isIterateeCall.js
|
|
4
|
-
function C(e, t, r) {
|
|
5
|
-
if (!n(r)) return !1;
|
|
6
|
-
var a = typeof t;
|
|
7
|
-
return (a == "number" ? o(r) && i(t, r.length) : a == "string" && t in r) ? m(r[t], e) : !1;
|
|
8
|
-
}
|
|
9
|
-
//#endregion
|
|
10
|
-
//#region ../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_createAssigner.js
|
|
11
|
-
function w(e) {
|
|
12
|
-
return r(function(t, n) {
|
|
13
|
-
var r = -1, i = n.length, a = i > 1 ? n[i - 1] : void 0, o = i > 2 ? n[2] : void 0;
|
|
14
|
-
for (a = e.length > 3 && typeof a == "function" ? (i--, a) : void 0, o && C(n[0], n[1], o) && (a = i < 3 ? void 0 : a, i = 1), t = Object(t); ++r < i;) {
|
|
15
|
-
var s = n[r];
|
|
16
|
-
s && e(t, s, r, a);
|
|
17
|
-
}
|
|
18
|
-
return t;
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
//#endregion
|
|
22
|
-
//#region ../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/isPlainObject.js
|
|
23
|
-
var T = "[object Object]", E = Function.prototype, D = Object.prototype, O = E.toString, k = D.hasOwnProperty, A = O.call(Object);
|
|
24
|
-
function j(t) {
|
|
25
|
-
if (!e(t) || c(t) != T) return !1;
|
|
26
|
-
var n = h(t);
|
|
27
|
-
if (n === null) return !0;
|
|
28
|
-
var r = k.call(n, "constructor") && n.constructor;
|
|
29
|
-
return typeof r == "function" && r instanceof r && O.call(r) == A;
|
|
30
|
-
}
|
|
31
|
-
//#endregion
|
|
32
|
-
//#region ../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_assignMergeValue.js
|
|
33
|
-
function M(e, t, n) {
|
|
34
|
-
(n !== void 0 && !m(e[t], n) || n === void 0 && !(t in e)) && _(e, t, n);
|
|
35
|
-
}
|
|
36
|
-
//#endregion
|
|
37
|
-
//#region ../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_safeGet.js
|
|
38
|
-
function N(e, t) {
|
|
39
|
-
if ((t !== "constructor" || typeof e[t] != "function") && t != "__proto__") return e[t];
|
|
40
|
-
}
|
|
41
|
-
//#endregion
|
|
42
|
-
//#region ../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/toPlainObject.js
|
|
43
|
-
function P(e) {
|
|
44
|
-
return b(e, y(e));
|
|
45
|
-
}
|
|
46
|
-
//#endregion
|
|
47
|
-
//#region ../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseMergeDeep.js
|
|
48
|
-
function F(e, r, i, o, s, c, d) {
|
|
49
|
-
var m = N(e, i), h = N(r, i), _ = d.get(h);
|
|
50
|
-
if (_) {
|
|
51
|
-
M(e, i, _);
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
var y = c ? c(m, h, i + "", e, r, d) : void 0, b = y === void 0;
|
|
55
|
-
if (b) {
|
|
56
|
-
var C = l(h), w = !C && a(h), T = !C && !w && u(h);
|
|
57
|
-
y = h, C || w || T ? l(m) ? y = m : p(m) ? y = S(m) : w ? (b = !1, y = g(h, !0)) : T ? (b = !1, y = v(h, !0)) : y = [] : j(h) || f(h) ? (y = m, f(m) ? y = P(m) : (!n(m) || t(m)) && (y = x(h))) : b = !1;
|
|
58
|
-
}
|
|
59
|
-
b && (d.set(h, y), s(y, h, o, c, d), d.delete(h)), M(e, i, y);
|
|
60
|
-
}
|
|
61
|
-
//#endregion
|
|
62
|
-
//#region ../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/_baseMerge.js
|
|
63
|
-
function I(e, t, r, i, a) {
|
|
64
|
-
e !== t && d(t, function(o, c) {
|
|
65
|
-
if (a ||= new s(), n(o)) F(e, t, c, r, I, i, a);
|
|
66
|
-
else {
|
|
67
|
-
var l = i ? i(N(e, c), o, c + "", e, t, a) : void 0;
|
|
68
|
-
l === void 0 && (l = o), M(e, c, l);
|
|
69
|
-
}
|
|
70
|
-
}, y);
|
|
71
|
-
}
|
|
72
|
-
//#endregion
|
|
73
|
-
export { w as n, C as r, I as t };
|