@marimo-team/islands 0.23.7-dev7 → 0.23.7-dev71
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-PmilQqXR.js → ConnectedDataExplorerComponent-2lBNiUv6.js} +14 -14
- package/dist/{ErrorBoundary-Da4UeYxT.js → ErrorBoundary-D3wrPNma.js} +1 -1
- package/dist/{any-language-editor-BVR0l12r.js → any-language-editor-VWs_7v27.js} +15 -15
- package/dist/apl-Bdc61P1y.js +4 -0
- package/dist/{arc-CHF8PiiF.js → arc-DfkSnvZm.js} +2 -2
- package/dist/{architecture-7HQA4BMR-D0JB_3hE.js → architecture-7HQA4BMR-CS9jOrqM.js} +1 -1
- package/dist/{architectureDiagram-VXUJARFQ-BXQEUDtK.js → architectureDiagram-VXUJARFQ-CXVJxFhH.js} +16 -16
- package/dist/asciiarmor-DVRHDGzT.js +4 -0
- package/dist/asn1-BmuKfkfu.js +4 -0
- package/dist/assets/__vite-browser-external-CAdMKBac.js +1 -0
- package/dist/assets/worker-CpBbwbQo.js +73 -0
- package/dist/{blockDiagram-VD42YOAC-DhJe-Y9i.js → blockDiagram-VD42YOAC-DGDaxR8I.js} +11 -11
- package/dist/brainfuck-DPrRpyTV.js +4 -0
- package/dist/{button-CA5pI2YF.js → button-Dj4BTre0.js} +5 -0
- package/dist/{c4Diagram-YG6GDRKO-9dSfzOFR.js → c4Diagram-YG6GDRKO-C2hc6ne8.js} +5 -5
- package/dist/{capabilities-6laDasij.js → capabilities-C9rrYCzf.js} +1 -1
- package/dist/{channel-MqYIiKgS.js → channel-BBoIVUrJ.js} +1 -1
- package/dist/{chat-ui-B-gbqk_F.js → chat-ui-D3XBept8.js} +626 -234
- package/dist/{check-CFM2mVDr.js → check-BcUIXnUT.js} +1 -1
- package/dist/{chunk-4BX2VUAB-BwfrWBqN.js → chunk-4BX2VUAB-CzXltWHN.js} +1 -1
- package/dist/{chunk-55IACEB6-D8THf2mi.js → chunk-55IACEB6-B-1mjMMC.js} +1 -1
- package/dist/{chunk-5FQGJX7Z-CO1e63h_.js → chunk-5FQGJX7Z-BOg95xG5.js} +2 -2
- package/dist/{chunk-ABZYJK2D-BrBb_0yY.js → chunk-ABZYJK2D-D0cLy8Bb.js} +2 -2
- package/dist/{chunk-ATLVNIR6-D-0XqNah.js → chunk-ATLVNIR6-BXsEjlHF.js} +2 -2
- package/dist/{chunk-B4BG7PRW-8iRKvugR.js → chunk-B4BG7PRW-Q1usn6T3.js} +7 -7
- package/dist/{chunk-CVBHYZKI-B6xhgaBd.js → chunk-CVBHYZKI-B_c5YBcW.js} +1 -1
- package/dist/{chunk-DI55MBZ5-C0_2D4m4.js → chunk-DI55MBZ5-D1qLYNrb.js} +6 -6
- package/dist/{chunk-EXTU4WIE-Jiw9ca1u.js → chunk-EXTU4WIE-BKNXdLmD.js} +2 -2
- package/dist/{chunk-FMBD7UC4-CHdus51S.js → chunk-FMBD7UC4-Ie8M9q0W.js} +1 -1
- package/dist/{chunk-HN2XXSSU-2Vfbq-kU.js → chunk-HN2XXSSU-E3n-Ys7Z.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-6wbaigKe.js → chunk-JA3XYJ7Z-D6c6cOBG.js} +3 -3
- package/dist/{chunk-JZLCHNYA-_rfptlUP.js → chunk-JZLCHNYA-BvsPHJmL.js} +6 -6
- package/dist/{chunk-MI3HLSF2-Do0-KRc0.js → chunk-MI3HLSF2-CUYEasXO.js} +1 -1
- package/dist/{chunk-N4CR4FBY-DIZG9dVD.js → chunk-N4CR4FBY-8ycT-O9a.js} +7 -7
- package/dist/{chunk-QN33PNHL-Cc64y40m.js → chunk-QN33PNHL-Bb-eUBW3.js} +2 -2
- package/dist/{chunk-QXUST7PY-BDG0-0Or.js → chunk-QXUST7PY-DV8yRwBd.js} +10 -10
- package/dist/{chunk-QZHKN3VN-B_Mdb8GC.js → chunk-QZHKN3VN-DRjXVwuJ.js} +1 -1
- package/dist/{chunk-S3R3BYOJ-DphMP0FA.js → chunk-S3R3BYOJ-mQeCz5CE.js} +4 -4
- package/dist/{chunk-TZMSLE5B-C9LUoYkc.js → chunk-TZMSLE5B-BqW10dHe.js} +3 -3
- package/dist/classDiagram-2ON5EDUG--Yh__LHb.js +30 -0
- package/dist/classDiagram-v2-WZHVMYZB-BC7X7Xtc.js +30 -0
- package/dist/{clike-sBZrGeF8.js → clike-DTxNUn7l.js} +1 -1
- package/dist/clojure-DEttQW5T.js +4 -0
- package/dist/cmake-jNlx_DaM.js +4 -0
- package/dist/cobol-BvvIm5MJ.js +4 -0
- package/dist/{code-block-37QAKDTI-0JNwiPGv.js → code-block-37QAKDTI-BsGy1AOJ.js} +1 -1
- package/dist/{code-visibility-CiN3Xnfo.js → code-visibility-CsrBHiek.js} +11480 -1992
- package/dist/coffeescript-DTpBMyFU.js +4 -0
- package/dist/commonlisp-BmmUG8jb.js +4 -0
- package/dist/{copy-TGGAUEWp.js → copy-DLf4aN7I.js} +2 -2
- package/dist/{cose-bilkent-S5V4N54A-DXHZkJKX.js → cose-bilkent-S5V4N54A-kjoZoid4.js} +2 -2
- package/dist/crystal-BxyqmEWC.js +4 -0
- package/dist/css-BGoCtuG3.js +4 -0
- package/dist/cypher-BmCbdl3u.js +4 -0
- package/dist/d-CFrlbjZt.js +4 -0
- package/dist/{dagre-6UL2VRFP-tH87fkPA.js → dagre-6UL2VRFP-DRBWoQUw.js} +10 -10
- package/dist/{data-grid-overlay-editor-CWUN78-s.js → data-grid-overlay-editor-efe5ZagF.js} +2 -2
- package/dist/{diagram-PSM6KHXK-2VjPSCDn.js → diagram-PSM6KHXK-H66ATWP2.js} +18 -18
- package/dist/{diagram-QEK2KX5R-CiLmNyta.js → diagram-QEK2KX5R-DItl5Wns.js} +14 -14
- package/dist/{diagram-S2PKOQOG-Zha_1CLx.js → diagram-S2PKOQOG-CtuW_ZuL.js} +14 -14
- package/dist/diff-D6XwL6P8.js +4 -0
- package/dist/{dist-Brkazupz.js → dist--sWVZwjW.js} +1 -1
- package/dist/{dist-FN0ZA_8F.js → dist-21ButRCu.js} +1 -1
- package/dist/{dist-BetEKbPG.js → dist-B8RaFTRF.js} +1 -1
- package/dist/dist-BoHGySTM.js +5 -0
- package/dist/dist-ByAz19Qc.js +5 -0
- package/dist/dist-C93EysN4.js +5 -0
- package/dist/{dist-BHnX0ia_.js → dist-CY-lVor6.js} +1 -1
- package/dist/{dist-YP-G7W0f.js → dist-CYDuv4bR.js} +1 -1
- package/dist/{dist-CMjD5MQb.js → dist-Cfo5EE2t.js} +1 -1
- package/dist/dist-CjivSDvN.js +5 -0
- package/dist/dist-Cqwx-MH7.js +5 -0
- package/dist/{dist-ESg7xyoD.js → dist-D3ZI9nhS.js} +2 -2
- package/dist/{dist-DkC6YEo0.js → dist-DMZNjfX4.js} +1 -1
- package/dist/{dist-ChC1BhqM.js → dist-DbpcoFAV.js} +1 -1
- package/dist/dist-FUNenbiQ.js +5 -0
- package/dist/{dist-BEOU2g1b.js → dist-zhSud5X3.js} +1 -1
- package/dist/{dockerfile-COvlVLcE.js → dockerfile-twL37N91.js} +1 -1
- package/dist/dtd-Bw0lRN0-.js +4 -0
- package/dist/dylan-B55eBHTt.js +4 -0
- package/dist/ecl-C8G4p0wn.js +4 -0
- package/dist/eiffel-BmH46VJl.js +4 -0
- package/dist/elm-DhzeFqkl.js +4 -0
- package/dist/{erDiagram-Q2GNP2WA-biHZS05w.js → erDiagram-Q2GNP2WA--19X2kU5.js} +14 -14
- package/dist/erlang-CY-wdlsU.js +4 -0
- package/dist/{error-banner-DnBPzEWg.js → error-banner-CVkfBUT3.js} +2 -2
- package/dist/{esm-Dd1z1auZ.js → esm-CWp0KQeK.js} +1 -1
- package/dist/{esm-CYEyrE3Y.js → esm-DjNnlmpf.js} +96 -96
- package/dist/{extends-CzJgxo2J.js → extends-vAi97cpa.js} +4 -4
- package/dist/{factor-C2GT7jfQ.js → factor-CajWS6mS.js} +1 -1
- package/dist/factor-DWkgl0xw.js +4 -0
- package/dist/{flowDiagram-NV44I4VS-CWWlUpBR.js → flowDiagram-NV44I4VS-DQmWlo7f.js} +16 -16
- package/dist/{formats-CgaK7Gmx.js → formats-Dsy9kkZu.js} +3 -3
- package/dist/forth-Cij_ie2t.js +4 -0
- package/dist/fortran-Br3X9cfm.js +4 -0
- package/dist/{ganttDiagram-JELNMOA3-D7B2c4Z9.js → ganttDiagram-JELNMOA3-BOGXJ8Lk.js} +7 -7
- package/dist/gas-DYsGcMN2.js +4 -0
- package/dist/gherkin-eVgXQ0fQ.js +4 -0
- package/dist/{gitGraph-G5XIXVHT-BdepdFa_.js → gitGraph-G5XIXVHT-DGlbae5m.js} +1 -1
- package/dist/{gitGraphDiagram-V2S2FVAM-CtLvNR1S.js → gitGraphDiagram-V2S2FVAM-DjzxfF0P.js} +14 -14
- package/dist/{glide-data-editor-CvlvtPWJ.js → glide-data-editor-DucgdjRo.js} +13 -13
- package/dist/groovy-_NFHIXG7.js +4 -0
- package/dist/haskell-D6xNG_bH.js +4 -0
- package/dist/haxe-sU_rzAwn.js +5 -0
- package/dist/{html-to-image-hMMPiNe_.js → html-to-image-CpggM7u1.js} +2806 -2547
- package/dist/idl-Ds_VbrUx.js +4 -0
- package/dist/{info-VBDWY6EO--JNA2rNu.js → info-VBDWY6EO-D2lvLLw5.js} +1 -1
- package/dist/{infoDiagram-HS3SLOUP-BbZyOxsP.js → infoDiagram-HS3SLOUP-ChNufFsP.js} +12 -12
- package/dist/{input-BAOe64zx.js → input-D4kjoQUB.js} +8 -6
- package/dist/javascript-CztfIl0i.js +4 -0
- package/dist/{journeyDiagram-XKPGCS4Q-BU2mjjzl.js → journeyDiagram-XKPGCS4Q-BO_O4Ij1.js} +6 -6
- package/dist/julia-DDv40QMV.js +4 -0
- package/dist/{kanban-definition-3W4ZIXB7-BlmczUuw.js → kanban-definition-3W4ZIXB7-CPpiiiWk.js} +11 -11
- package/dist/{katex-qPqrBHZ8.js → katex-9-9QRhxz.js} +1 -1
- package/dist/{label-BCWi-Oqu.js → label-BLqV33b1.js} +2 -2
- package/dist/{line-BWRi3U3S.js → line-C5s_12ee.js} +3 -3
- package/dist/{linear-DnHwODZa.js → linear-2NnK4cxi.js} +2 -2
- package/dist/livescript-BEOngLLc.js +4 -0
- package/dist/{loader-BvW0-YWZ.js → loader-Dr8Qem8p.js} +1 -1
- package/dist/lua-9-7BhQ4Y.js +4 -0
- package/dist/main.js +1631 -10231
- package/dist/mathematica-DDa0Pfxm.js +4 -0
- package/dist/mbox-iO03mmoE.js +4 -0
- package/dist/{mermaid-4DMBBIKO-CG1ECj5W.js → mermaid-4DMBBIKO-B7VQMwJx.js} +1 -1
- package/dist/{mermaid-CEbzCxCc.js → mermaid-DO-Daq7u.js} +46 -46
- package/dist/{mermaid-parser.core-CleJseNW.js → mermaid-parser.core-DreccfmS.js} +7 -7
- package/dist/{mhchem-BwoRNwg_.js → mhchem-yiCCuiEF.js} +1 -1
- package/dist/{mindmap-definition-VGOIOE7T-CcSYqYP9.js → mindmap-definition-VGOIOE7T-CC1_Vl0f.js} +13 -13
- package/dist/mirc-C9z5LT4X.js +4 -0
- package/dist/mllike-jGJbdm_C.js +6 -0
- package/dist/modelica-DzF7oIEL.js +4 -0
- package/dist/mscgen-DB-u125o.js +6 -0
- package/dist/mumps-CRTFHhzh.js +4 -0
- package/dist/nsis-C4NPTuox.js +4 -0
- package/dist/{nsis-B5K1qoyo.js → nsis-ClF3r5Tr.js} +1 -1
- package/dist/ntriples-BCOoGph1.js +4 -0
- package/dist/{number-overlay-editor-_GnlYFHC.js → number-overlay-editor-CpKi64Fy.js} +1 -1
- package/dist/octave-DTwNlazz.js +4 -0
- package/dist/{ordinal-2jIulmcR.js → ordinal-B43ZeR68.js} +1 -1
- package/dist/oz-DD38AzSz.js +4 -0
- package/dist/{packet-DYOGHKS2-CBxXGWNr.js → packet-DYOGHKS2-CmWtF3uO.js} +1 -1
- package/dist/pascal-BohSp9jV.js +4 -0
- package/dist/perl-f5OutoPM.js +4 -0
- package/dist/{pie-VRWISCQL-Bmdnqjip.js → pie-VRWISCQL-B6u8vus8.js} +1 -1
- package/dist/{pieDiagram-ADFJNKIX-DNyLF5H2.js → pieDiagram-ADFJNKIX-Di34MOFQ.js} +19 -19
- package/dist/pig-Dv7wSmHb.js +4 -0
- package/dist/powershell-rYgjKB39.js +4 -0
- package/dist/{process-output-Bza_GK7Q.js → process-output-X8TR20AK.js} +30 -25
- package/dist/properties-BFUNLRDN.js +4 -0
- package/dist/protobuf-B9QJQPPv.js +4 -0
- package/dist/{pug-tjbzJCFk.js → pug-B_rby2yb.js} +1 -1
- package/dist/pug-DzvWpaMC.js +4 -0
- package/dist/puppet-B_K-n_xK.js +4 -0
- package/dist/python-CAiFcaA2.js +4 -0
- package/dist/q-cLeFIBLK.js +4 -0
- package/dist/{quadrantDiagram-AYHSOK5B-rXwjifrj.js → quadrantDiagram-AYHSOK5B-B9kVk1ny.js} +3 -3
- package/dist/r-04Y-Wco3.js +4 -0
- package/dist/{radar-ZZBFDIW7-BmCWDffL.js → radar-ZZBFDIW7-XAmXSa8s.js} +1 -1
- package/dist/{react-vega-B-rkEqtS.js → react-vega-Cavbrg4l.js} +1 -1
- package/dist/{react-vega-k9ODWPlI.js → react-vega-Dh6-UKKe.js} +13 -13
- package/dist/{requirementDiagram-UZGBJVZJ-DBdrMVbs.js → requirementDiagram-UZGBJVZJ-BxGfGYEx.js} +13 -13
- package/dist/reveal-component-DjIjk-mv.js +7444 -0
- package/dist/rpm-FUdrIia9.js +5 -0
- package/dist/ruby-DMjFXuEW.js +4 -0
- package/dist/{sankeyDiagram-TZEHDZUN-CxmzalGv.js → sankeyDiagram-TZEHDZUN-D09PBJ-n.js} +4 -4
- package/dist/sas-DzHZxjXK.js +4 -0
- package/dist/scheme-DxHd_Rb9.js +4 -0
- package/dist/semaphore-CNDGTzkX.js +46 -0
- package/dist/{sequenceDiagram-WL72ISMW-CVCDsJ9h.js → sequenceDiagram-WL72ISMW-t_Dpemj0.js} +7 -7
- package/dist/shell-C8Kwypgf.js +4 -0
- package/dist/sieve-DdyqOKXZ.js +4 -0
- package/dist/smalltalk-pB7X1D9y.js +4 -0
- package/dist/sparql-NhBO6oOa.js +4 -0
- package/dist/{spec-DSIuqd3f.js → spec-hVaaZsY5.js} +4 -4
- package/dist/{src-BY0BGg6V.js → src-Bf2iLOlr.js} +1 -1
- package/dist/{stateDiagram-FKZM4ZOC-D_2djEhW.js → stateDiagram-FKZM4ZOC-B18gTP_j.js} +16 -16
- package/dist/stateDiagram-v2-4FDKWEC3-B6e_t14A.js +29 -0
- package/dist/{step-DGAGWg3y.js → step-CWipAYTY.js} +1 -1
- package/dist/{strings-B_FOH6eV.js → strings-BiIhGaI8.js} +4 -4
- package/dist/style.css +1 -1
- package/dist/stylus-SfWSnzPv.js +4 -0
- package/dist/swift-jRPdq2zR.js +4 -0
- package/dist/{swiper-component-KkEVUDd3.js → swiper-component-DlD2GU2g.js} +2 -2
- package/dist/tcl-_hpTHGX3.js +4 -0
- package/dist/textile-C9h8slqH.js +4 -0
- package/dist/{time-CMdrp3hw.js → time-C1SGcFMH.js} +2 -2
- package/dist/{timeline-definition-IT6M3QCI-E4NzxCs3.js → timeline-definition-IT6M3QCI-DJnh1ks5.js} +3 -3
- package/dist/{toDate-CHtl9vts.js → toDate-CIpC_34u.js} +33 -20
- package/dist/toml-DWvtinD4.js +4 -0
- package/dist/{tooltip-B0mtKTXm.js → tooltip-DRaMBu06.js} +3 -3
- package/dist/{treemap-GDKQZRPO-CoKHPxa7.js → treemap-GDKQZRPO-Du95DV6u.js} +1 -1
- package/dist/troff-Dwo_A0y7.js +4 -0
- package/dist/ttcn-V--CPFKq.js +4 -0
- package/dist/ttcn-cfg-CPSMchTG.js +4 -0
- package/dist/turtle-B4rPGBWu.js +4 -0
- package/dist/{types-DBtDeUKD.js → types-Dzuoc3LN.js} +1 -1
- package/dist/{useAsyncData-B6hCGywC.js → useAsyncData-C56Khv_R.js} +1 -1
- package/dist/{useDateFormatter-B3mCQMP3.js → useDateFormatter-B_9k85Ex.js} +2 -2
- package/dist/{useDeepCompareMemoize-CmwDuYUH.js → useDeepCompareMemoize-Dt98v2ua.js} +1 -1
- package/dist/{useIframeCapabilities-DbdLoEDm.js → useIframeCapabilities-BkYHTrss.js} +1 -1
- package/dist/{useLifecycle-CjMjllqy.js → useLifecycle-BF6-z62y.js} +3 -3
- package/dist/{useTheme-CByZUW0p.js → useTheme-DykuNHR2.js} +2 -2
- package/dist/vb-DaMBBd4j.js +4 -0
- package/dist/vbscript-BMJQqcE2.js +4 -0
- package/dist/{vega-component-CC8TqWWV.js → vega-component-cSdqoAxe.js} +26 -24
- package/dist/velocity-CGq2QRq2.js +4 -0
- package/dist/verilog-CUNo8F5u.js +4 -0
- package/dist/vhdl-CCzA0msW.js +4 -0
- package/dist/webidl-CqIMDIBL.js +4 -0
- package/dist/xquery-XC5Kbr-1.js +4 -0
- package/dist/{xychartDiagram-PRI3JC2R-CuxTvjw5.js → xychartDiagram-PRI3JC2R-Dk2d_bX0.js} +10 -10
- package/dist/yacas-CGOv7Dzy.js +4 -0
- package/dist/z80-CXhVmi-f.js +4 -0
- package/dist/{zod-BxdsqRPd.js → zod-BWkcDORu.js} +1 -1
- package/package.json +3 -3
- package/src/components/chat/chat-components.tsx +47 -0
- package/src/components/chat/chat-display.tsx +41 -7
- package/src/components/chat/chat-panel.tsx +37 -10
- package/src/components/chat/chat-utils.ts +42 -20
- package/src/components/chat/reasoning-accordion.tsx +14 -3
- package/src/components/chat/tool-call/shared.ts +13 -0
- package/src/components/chat/tool-call/tool-approval-card.tsx +62 -0
- package/src/components/chat/tool-call/tool-args.tsx +26 -0
- package/src/components/chat/tool-call/tool-call-view.tsx +99 -0
- package/src/components/chat/tool-call/tool-error-card.tsx +81 -0
- package/src/components/chat/tool-call/tool-history-row.tsx +153 -0
- package/src/components/chat/tool-call/tool-result.tsx +101 -0
- package/src/components/data-table/__tests__/column-header.test.ts +3 -1
- package/src/components/data-table/__tests__/column-header.test.tsx +308 -0
- package/src/components/data-table/__tests__/filter-by-values-picker.test.tsx +112 -0
- package/src/components/data-table/__tests__/filter-pill-editor.test.tsx +261 -0
- package/src/components/data-table/__tests__/filters.test.ts +196 -49
- package/src/components/data-table/charts/components/form-fields.tsx +1 -0
- package/src/components/data-table/column-header.tsx +349 -170
- package/src/components/data-table/date-filter-inputs.tsx +325 -0
- package/src/components/data-table/filter-by-values-picker.tsx +70 -9
- package/src/components/data-table/filter-pill-editor.tsx +410 -156
- package/src/components/data-table/filter-pills.tsx +69 -54
- package/src/components/data-table/filters.ts +218 -101
- package/src/components/data-table/header-items.tsx +8 -1
- package/src/components/data-table/operator-labels.ts +25 -0
- package/src/components/data-table/regex-input.tsx +61 -0
- package/src/components/dependency-graph/minimap-content.tsx +14 -3
- package/src/components/editor/actions/pair-with-agent-modal.tsx +140 -49
- package/src/components/editor/actions/useNotebookActions.tsx +3 -1
- package/src/components/editor/app-container.tsx +7 -1
- package/src/components/editor/chrome/panels/context-aware-panel/context-aware-panel.tsx +10 -2
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +1 -0
- package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
- package/src/components/editor/chrome/wrapper/footer.tsx +4 -1
- package/src/components/editor/chrome/wrapper/panels.tsx +4 -1
- package/src/components/editor/chrome/wrapper/sidebar.tsx +4 -1
- package/src/components/editor/controls/Controls.tsx +11 -3
- package/src/components/editor/file-tree/file-explorer.tsx +12 -2
- package/src/components/editor/file-tree/requesting-tree.tsx +27 -25
- package/src/components/editor/file-tree/upload.tsx +23 -24
- package/src/components/editor/header/__tests__/status.test.tsx +108 -0
- package/src/components/editor/header/status.tsx +44 -10
- package/src/components/editor/navigation/__tests__/clipboard.test.ts +106 -0
- package/src/components/editor/navigation/__tests__/navigation.test.ts +70 -0
- package/src/components/editor/navigation/clipboard.ts +99 -25
- package/src/components/editor/navigation/navigation.ts +15 -1
- package/src/components/editor/notebook-cell.tsx +3 -0
- package/src/components/editor/renderers/slides-layout/__tests__/compute-slide-cells.test.ts +5 -4
- package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +55 -15
- package/src/components/editor/renderers/slides-layout/plugin.tsx +8 -25
- package/src/components/editor/renderers/slides-layout/slides-layout.tsx +18 -5
- package/src/components/editor/renderers/slides-layout/types.ts +40 -31
- package/src/components/home/components.tsx +6 -0
- package/src/components/pages/run-page.tsx +4 -1
- package/src/components/slides/__tests__/slide-notes.test.ts +131 -0
- package/src/components/slides/reveal-component.tsx +242 -147
- package/src/components/slides/slide-notes-editor.tsx +127 -0
- package/src/components/slides/slide-notes.ts +64 -0
- package/src/components/slides/slides.css +14 -0
- package/src/components/ui/combobox.tsx +24 -5
- package/src/components/ui/number-field.tsx +2 -0
- package/src/core/ai/tools/__tests__/registry.test.ts +10 -12
- package/src/core/ai/tools/registry.ts +9 -5
- package/src/core/cells/__tests__/cells.test.ts +187 -0
- package/src/core/cells/__tests__/pending-cut-service.test.tsx +123 -0
- package/src/core/cells/cells.ts +102 -17
- package/src/core/cells/document-changes.ts +6 -1
- package/src/core/cells/pending-cut-service.ts +55 -0
- package/src/core/cells/utils.ts +11 -0
- package/src/core/codemirror/cells/extensions.ts +10 -0
- package/src/core/codemirror/go-to-definition/__tests__/commands.test.ts +152 -0
- package/src/core/codemirror/go-to-definition/__tests__/utils.test.ts +99 -0
- package/src/core/codemirror/go-to-definition/commands.ts +382 -22
- package/src/core/codemirror/go-to-definition/utils.ts +23 -5
- package/src/core/codemirror/markdown/__tests__/commands.test.ts +3 -3
- package/src/core/codemirror/markdown/commands.ts +1 -2
- package/src/core/edit-app.tsx +3 -2
- package/src/core/hotkeys/hotkeys.ts +5 -0
- package/src/core/islands/worker/worker.tsx +3 -2
- package/src/core/network/requests-network.ts +21 -3
- package/src/core/network/types.ts +12 -1
- package/src/core/run-app.tsx +2 -1
- package/src/core/runtime/__tests__/runtime.test.ts +38 -17
- package/src/core/runtime/runtime.ts +57 -34
- package/src/core/wasm/__tests__/utils.test.ts +34 -0
- package/src/core/wasm/bridge.ts +14 -1
- package/src/core/wasm/utils.ts +14 -0
- package/src/core/wasm/worker/bootstrap.ts +3 -2
- package/src/core/wasm/worker/worker.ts +3 -2
- package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +156 -0
- package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +101 -0
- package/src/core/websocket/transports/__tests__/ws.test.ts +125 -0
- package/src/core/websocket/transports/basic.ts +1 -1
- package/src/core/websocket/transports/ws.ts +96 -0
- package/src/core/websocket/useMarimoKernelConnection.tsx +133 -54
- package/src/core/websocket/useWebSocket.tsx +3 -15
- package/src/css/app/Cell.css +10 -0
- package/src/plugins/core/__test__/sanitize.test.ts +30 -0
- package/src/plugins/impl/DropdownPlugin.tsx +12 -1
- package/src/plugins/impl/MultiselectPlugin.tsx +4 -0
- package/src/plugins/impl/SearchableSelect.tsx +11 -1
- package/src/plugins/impl/TabsPlugin.tsx +35 -7
- package/src/plugins/impl/__tests__/DropdownPlugin.test.tsx +56 -0
- package/src/plugins/impl/__tests__/TabsPlugin.test.tsx +154 -0
- package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +48 -36
- package/src/plugins/impl/data-frames/schema.ts +4 -1
- package/src/plugins/impl/vega/resolve-data.ts +8 -1
- package/src/utils/__tests__/id-tree.test.ts +71 -0
- package/src/utils/__tests__/semaphore.test.ts +218 -0
- package/src/utils/fileToBase64.ts +8 -7
- package/src/utils/id-tree.tsx +89 -0
- package/src/utils/semaphore.ts +88 -0
- package/dist/apl-BKoVld9y.js +0 -4
- package/dist/asciiarmor-DQrKIjoo.js +0 -4
- package/dist/asn1-BZvnj0dq.js +0 -4
- package/dist/assets/__vite-browser-external-rrUYDKRl.js +0 -1
- package/dist/assets/worker-Bfy15ViQ.js +0 -73
- package/dist/brainfuck-D558nlUv.js +0 -4
- package/dist/classDiagram-2ON5EDUG-CBHMR6ZU.js +0 -30
- package/dist/classDiagram-v2-WZHVMYZB-BsUtUGM_.js +0 -30
- package/dist/clojure-Cq8mTSrE.js +0 -4
- package/dist/cmake-D8HCovWK.js +0 -4
- package/dist/cobol-UolN-9iU.js +0 -4
- package/dist/coffeescript-VdNuWrt5.js +0 -4
- package/dist/commonlisp-ALX7fpDc.js +0 -4
- package/dist/crystal-PbyO9Q_s.js +0 -4
- package/dist/css-DFklJkr_.js +0 -4
- package/dist/cypher-BifNeYlv.js +0 -4
- package/dist/d-BA-JP4PJ.js +0 -4
- package/dist/diff-CtkDpav4.js +0 -4
- package/dist/dist-BuBwsFva.js +0 -5
- package/dist/dist-BzmEQ9u7.js +0 -5
- package/dist/dist-Cih01ssx.js +0 -5
- package/dist/dist-CqfONiY9.js +0 -5
- package/dist/dist-D0iD0Fi9.js +0 -5
- package/dist/dist-DtNLXm8d.js +0 -5
- package/dist/dtd-DW3_UFEG.js +0 -4
- package/dist/dylan-pDhodO2N.js +0 -4
- package/dist/ecl-BJT8-YD7.js +0 -4
- package/dist/eiffel-Dmns-9vS.js +0 -4
- package/dist/elm-Da4sO4Bz.js +0 -4
- package/dist/erlang-C-zBsDi7.js +0 -4
- package/dist/factor-4xPWlWB5.js +0 -4
- package/dist/forth-l-c75zSd.js +0 -4
- package/dist/fortran-DIujSODW.js +0 -4
- package/dist/gas-CXnG5g_b.js +0 -4
- package/dist/gherkin-VPeqd4-X.js +0 -4
- package/dist/groovy-CphhZQgg.js +0 -4
- package/dist/haskell-CCvlS5Iq.js +0 -4
- package/dist/haxe-C_bi66fP.js +0 -5
- package/dist/idl-1DcP4Dm8.js +0 -4
- package/dist/javascript-DUIGhBvO.js +0 -4
- package/dist/julia-Cs2G4PQi.js +0 -4
- package/dist/livescript-DMtVFaAN.js +0 -4
- package/dist/lua-BAoLtdJg.js +0 -4
- package/dist/mathematica-C_NoFtbo.js +0 -4
- package/dist/mbox-DcFJFYrH.js +0 -4
- package/dist/mirc-71dccf_u.js +0 -4
- package/dist/mllike-CWcOFVDq.js +0 -6
- package/dist/modelica-Ape2VXxx.js +0 -4
- package/dist/mscgen-Cc6TwbSN.js +0 -6
- package/dist/mumps-h-ZbdkJ9.js +0 -4
- package/dist/nsis-C0p3m7JW.js +0 -4
- package/dist/ntriples-c9lEeT5w.js +0 -4
- package/dist/octave-DzEgB_74.js +0 -4
- package/dist/oz-CAxvHkyQ.js +0 -4
- package/dist/pascal-BJzu1sgP.js +0 -4
- package/dist/perl--IrOzZ2Z.js +0 -4
- package/dist/pig-CiBKKNhC.js +0 -4
- package/dist/powershell-KY0j6Qop.js +0 -4
- package/dist/properties-BW8q3ziV.js +0 -4
- package/dist/protobuf-BGaeuTGV.js +0 -4
- package/dist/pug-DjOKK-4J.js +0 -4
- package/dist/puppet-DWm2o6zX.js +0 -4
- package/dist/python-Bp2gezZy.js +0 -4
- package/dist/q-DljPshos.js +0 -4
- package/dist/r-BajPMnEu.js +0 -4
- package/dist/reveal-component-BCKa3sr-.js +0 -4863
- package/dist/rpm-BKx-ZZ62.js +0 -5
- package/dist/ruby-DJq_HNKc.js +0 -4
- package/dist/sas-WANvpcOU.js +0 -4
- package/dist/scheme-CliBbhGF.js +0 -4
- package/dist/shell-BwhrNUvM.js +0 -4
- package/dist/sieve-BIVePvMp.js +0 -4
- package/dist/smalltalk-D6G48JmY.js +0 -4
- package/dist/sparql-jjc3BmEP.js +0 -4
- package/dist/stateDiagram-v2-4FDKWEC3-Cv9Av10H.js +0 -29
- package/dist/stylus-WPBPQ4PE.js +0 -4
- package/dist/swift-O1Qy6iCm.js +0 -4
- package/dist/tcl-BAFdhvsi.js +0 -4
- package/dist/textile-DFuzhNLG.js +0 -4
- package/dist/toml-DRSTeely.js +0 -4
- package/dist/troff-B_ZjwBW0.js +0 -4
- package/dist/ttcn-CAyiB3ic.js +0 -4
- package/dist/ttcn-cfg-BS5_BGBJ.js +0 -4
- package/dist/turtle-CUBEDy3E.js +0 -4
- package/dist/vb-DY9S6-U2.js +0 -4
- package/dist/vbscript-gaHC39Jq.js +0 -4
- package/dist/velocity-TfCOtJZ_.js +0 -4
- package/dist/verilog-c2JOX8mv.js +0 -4
- package/dist/vhdl-dHBirRiO.js +0 -4
- package/dist/webidl-Bauj-i07.js +0 -4
- package/dist/xquery-CtaEAOt8.js +0 -4
- package/dist/yacas-BZ85agQP.js +0 -4
- package/dist/z80-hCgR-L4U.js +0 -4
- package/src/components/chat/tool-call-accordion.tsx +0 -247
- /package/dist/{ImageComparisonComponent-DaocPIse.js → ImageComparisonComponent-CNHIsPDj.js} +0 -0
- /package/dist/{Plot-PIeIvFnD.js → Plot-4wn-lMVn.js} +0 -0
- /package/dist/{apl-Dt8GMXYg.js → apl-BCgCq9iM.js} +0 -0
- /package/dist/{array-B-MVxRIF.js → array-tvvEqPy7.js} +0 -0
- /package/dist/{asciiarmor-CitDQ85h.js → asciiarmor-BtqU-KJQ.js} +0 -0
- /package/dist/{asn1-abrf9SMK.js → asn1-Dmb-dTMx.js} +0 -0
- /package/dist/{asterisk-BUZwqih-.js → asterisk-DaVJJDnV.js} +0 -0
- /package/dist/{brainfuck-BL-Boof0.js → brainfuck-C1HoZKlE.js} +0 -0
- /package/dist/{chunk-4F5CHEZ2-C6tO9vjs.js → chunk-4F5CHEZ2-BZq7Kom7.js} +0 -0
- /package/dist/{chunk-B2363JML-Ds8wZXyP.js → chunk-B2363JML-D9-XOau1.js} +0 -0
- /package/dist/{chunk-DR5Q36YT-CP69aZS_.js → chunk-DR5Q36YT-BflwErH1.js} +0 -0
- /package/dist/{chunk-FRFDVMJY-BgQv1HBE.js → chunk-FRFDVMJY-BSBUAX7r.js} +0 -0
- /package/dist/{chunk-PL6DKKU2-DHfTUHy8.js → chunk-PL6DKKU2-B0MTXvyc.js} +0 -0
- /package/dist/{chunk-SJTYNZTY-Diciw4sx.js → chunk-SJTYNZTY-CEG4F0pB.js} +0 -0
- /package/dist/{chunk-TQ3KTPDO-CQfP9npd.js → chunk-TQ3KTPDO-DiCtqVSi.js} +0 -0
- /package/dist/{chunk-UMXZTB3W-MSKeGL7W.js → chunk-UMXZTB3W-97iS1iEl.js} +0 -0
- /package/dist/{click-outside-container-BZgN7xS_.js → click-outside-container-BDd67_1U.js} +0 -0
- /package/dist/{clike-RWg7anhx.js → clike-CdT0yHjt.js} +0 -0
- /package/dist/{clojure-DaojKHow.js → clojure-CdyrCpUv.js} +0 -0
- /package/dist/{cmake-DN-_v0XE.js → cmake-BFlPxym7.js} +0 -0
- /package/dist/{cobol-C3VpMyux.js → cobol-CcJXewp8.js} +0 -0
- /package/dist/{coffeescript-DIkz3Tbt.js → coffeescript-DnKuIKRo.js} +0 -0
- /package/dist/{colors-Cn2p_FA3.js → colors-CQAOa8cK.js} +0 -0
- /package/dist/{common-keywords-hbLeU7VU.js → common-keywords-FBrXPTcz.js} +0 -0
- /package/dist/{commonlisp-CB1boOiP.js → commonlisp-B-kok83Z.js} +0 -0
- /package/dist/{crystal-DI2oCml6.js → crystal-FYRYjI1I.js} +0 -0
- /package/dist/{css-BdEVwQDV.js → css-B45lc2V3.js} +0 -0
- /package/dist/{cypher-BNHToqxU.js → cypher-DZMLyVY_.js} +0 -0
- /package/dist/{cytoscape.esm-WbbDoCfu.js → cytoscape.esm-ayF70frT.js} +0 -0
- /package/dist/{d-D7we7I1b.js → d-x-VVT4o9.js} +0 -0
- /package/dist/{diff-Cia6fzjN.js → diff-Dxe2mpXk.js} +0 -0
- /package/dist/{dist-BK-3fF4P.js → dist-B4LJpMEg.js} +0 -0
- /package/dist/{dist-CxdUraQr.js → dist-B507mf_I.js} +0 -0
- /package/dist/{dist-C89sHDXk.js → dist-BGdYVvOu.js} +0 -0
- /package/dist/{dist-DquyVv5H.js → dist-BNyrZfqT.js} +0 -0
- /package/dist/{dist-Zn0KNbo9.js → dist-Bc5pmZIw.js} +0 -0
- /package/dist/{dist-C-J0pt5p.js → dist-BvCfQQQE.js} +0 -0
- /package/dist/{dist-D9r7Cmw7.js → dist-C2ej4eOH.js} +0 -0
- /package/dist/{dist-HVuryI1a.js → dist-C34oIrQ9.js} +0 -0
- /package/dist/{dist-CGLzXdrt.js → dist-CDFZi-QD.js} +0 -0
- /package/dist/{dist-C9fmTOin.js → dist-CYEylvZA.js} +0 -0
- /package/dist/{dist-DadjmS-4.js → dist-DJ6zJQZ4.js} +0 -0
- /package/dist/{dist-CtCY55Jf.js → dist-Dh3wkoyH.js} +0 -0
- /package/dist/{dist-C474qFoq.js → dist-Dhk6FMb0.js} +0 -0
- /package/dist/{dist-DZjQ_MBo.js → dist-KnujRhFL.js} +0 -0
- /package/dist/{dist-CinA9Enb.js → dist-WdPUFc56.js} +0 -0
- /package/dist/{dist-DBLeRrPp.js → dist-t_qL7eB8.js} +0 -0
- /package/dist/{dist-CyFFzJTb.js → dist-usPCDYx8.js} +0 -0
- /package/dist/{dtd-H4Hubdwp.js → dtd-C9VM_Wfu.js} +0 -0
- /package/dist/{duckdb-keywords-CZ_ZTscu.js → duckdb-keywords-CvJhR_Yd.js} +0 -0
- /package/dist/{dylan-fVO6rnq3.js → dylan-DTSnEIFO.js} +0 -0
- /package/dist/{ebnf-WEXPLEWb.js → ebnf-2D4Ctp3y.js} +0 -0
- /package/dist/{ecl-B94VPjNR.js → ecl-N04ptnRK.js} +0 -0
- /package/dist/{eiffel-C_R6TusS.js → eiffel-Dd8rpqr_.js} +0 -0
- /package/dist/{elm-DzCHbO2g.js → elm-GT2E866W.js} +0 -0
- /package/dist/{erlang-BGNkx6JU.js → erlang-Cf0Bp5pY.js} +0 -0
- /package/dist/{esm-Bb_hbWan.js → esm-BaaaPNGl.js} +0 -0
- /package/dist/{fcl-B_Gv5Jfx.js → fcl-Ccj8Z5Xd.js} +0 -0
- /package/dist/{forth-Bybw0cJ7.js → forth-wd_XzGTg.js} +0 -0
- /package/dist/{fortran-C6PoCLkI.js → fortran-DcwUTZFe.js} +0 -0
- /package/dist/{gas-BBlhenj4.js → gas-DeALIER3.js} +0 -0
- /package/dist/{gherkin-NXtNG85X.js → gherkin-CKTqaJNX.js} +0 -0
- /package/dist/{groovy-BoFYK9xM.js → groovy-Bwdp_d8D.js} +0 -0
- /package/dist/{haskell-BtBdvQ1n.js → haskell-DCdCcPLK.js} +0 -0
- /package/dist/{haxe-D--o6dr0.js → haxe-DAyktQWJ.js} +0 -0
- /package/dist/{http-Dc2fv19V.js → http-_DVAYWoR.js} +0 -0
- /package/dist/{idl-AqTq5l7e.js → idl-CBuZiRYu.js} +0 -0
- /package/dist/{init-D-g0ONX1.js → init-uv0kkh4g.js} +0 -0
- /package/dist/{javascript-DvwNVye9.js → javascript-DzigE11c.js} +0 -0
- /package/dist/{julia-DoKiagZC.js → julia-PwfB-0Cm.js} +0 -0
- /package/dist/{katex-B7pMJpE0.js → katex-C_XRmjAP.js} +0 -0
- /package/dist/{livescript-DxBZMiWB.js → livescript-BJLz1EbT.js} +0 -0
- /package/dist/{lua-DmS_0NTu.js → lua-ZC-XC2jf.js} +0 -0
- /package/dist/{math-BYK36kWZ.js → math-DFcdCCU8.js} +0 -0
- /package/dist/{mathematica-ChlDFeIC.js → mathematica-DCYMx6qB.js} +0 -0
- /package/dist/{mbox-CguZuODr.js → mbox-OxMK_9XI.js} +0 -0
- /package/dist/{mirc-CFtY8dqz.js → mirc-nJVyhA0H.js} +0 -0
- /package/dist/{mllike-C0EJrEOk.js → mllike-DRO89bsU.js} +0 -0
- /package/dist/{modelica-C1kO1nfS.js → modelica-Don3E6ZD.js} +0 -0
- /package/dist/{mscgen-DEYdr7AY.js → mscgen-DJfqD3bN.js} +0 -0
- /package/dist/{mumps-B3NVJs2V.js → mumps-SjGTvDYL.js} +0 -0
- /package/dist/{nginx-ComVAAGN.js → nginx-DasThI7R.js} +0 -0
- /package/dist/{node-sql-parser-DNGGJ-Rw.js → node-sql-parser-B8nBD36q.js} +0 -0
- /package/dist/{ntriples-DHol9X9H.js → ntriples-CNBKRl3I.js} +0 -0
- /package/dist/{octave-CYGz0bfo.js → octave-DdeVHNlx.js} +0 -0
- /package/dist/{oz-kPxb2ni5.js → oz-CcKSoNvN.js} +0 -0
- /package/dist/{pascal-bZ0yrJKy.js → pascal-6leftwNj.js} +0 -0
- /package/dist/{path-Du6n3sOU.js → path-BGaWgPKg.js} +0 -0
- /package/dist/{perl-z4hvqyqz.js → perl-BhJIwWzN.js} +0 -0
- /package/dist/{pig-DZO8QDF9.js → pig-r-xDHqRf.js} +0 -0
- /package/dist/{powershell-BSuaDQEC.js → powershell-D-BELeNi.js} +0 -0
- /package/dist/{properties-BXhGLlIx.js → properties-CnuDhbll.js} +0 -0
- /package/dist/{protobuf-DM6iybWV.js → protobuf-CO8RBhvX.js} +0 -0
- /package/dist/{puppet-Bn05sQT8.js → puppet-NmXHjLy8.js} +0 -0
- /package/dist/{python-Cvnhm0g7.js → python-DAQXi720.js} +0 -0
- /package/dist/{q-B9V8hzex.js → q-DlikXfV0.js} +0 -0
- /package/dist/{r-Cf0gFqmq.js → r-CuohilwT.js} +0 -0
- /package/dist/{rpm-D-LMkTV1.js → rpm-0Pjwp0Pb.js} +0 -0
- /package/dist/{ruby-DeuPikpK.js → ruby-Dq8NJTDG.js} +0 -0
- /package/dist/{sas-C9tjgAo9.js → sas-CuwonyVP.js} +0 -0
- /package/dist/{scheme-D1_bUF0G.js → scheme-CYU-RRIf.js} +0 -0
- /package/dist/{shell-CJBmnks3.js → shell-COPmX2qE.js} +0 -0
- /package/dist/{sieve-1fSV75CF.js → sieve-B_3zyLne.js} +0 -0
- /package/dist/{simple-mode-B90Wdavj.js → simple-mode-DSBniks8.js} +0 -0
- /package/dist/{smalltalk-sZNPD0HO.js → smalltalk-DRft7iPv.js} +0 -0
- /package/dist/{solr-DTkyqJ-Z.js → solr-RZ9uTl59.js} +0 -0
- /package/dist/{sparql-oHc1nm77.js → sparql-CN6qj55H.js} +0 -0
- /package/dist/{spreadsheet-CER0raqY.js → spreadsheet-BNNUNXA2.js} +0 -0
- /package/dist/{sql-ByOoEONQ.js → sql-B4x8IkwU.js} +0 -0
- /package/dist/{stylus-KzkX6zRB.js → stylus-Bn_ZjOQ3.js} +0 -0
- /package/dist/{swift-DqVxZvKo.js → swift-BLUJhMbz.js} +0 -0
- /package/dist/{tcl-BtWSwXfA.js → tcl-C86fxecl.js} +0 -0
- /package/dist/{textile-CWDbn9Ql.js → textile-DmHh2rsK.js} +0 -0
- /package/dist/{tiddlywiki-Cr9xyOY1.js → tiddlywiki-DI0mF2WJ.js} +0 -0
- /package/dist/{tiki-D5JONyfZ.js → tiki-2HU6XLLn.js} +0 -0
- /package/dist/{timer-D7JVdX9U.js → timer-YZl28NYN.js} +0 -0
- /package/dist/{toml-BfehlgmL.js → toml-GWANRNAD.js} +0 -0
- /package/dist/{treemap-qFGzn7xk.js → treemap-D-ka1hvx.js} +0 -0
- /package/dist/{troff-BZBk6AAu.js → troff-BHTsomIy.js} +0 -0
- /package/dist/{ttcn-DVwvXg0_.js → ttcn-DQuhn5Mn.js} +0 -0
- /package/dist/{ttcn-cfg-gjbVLf1L.js → ttcn-cfg-HjFYtdB-.js} +0 -0
- /package/dist/{turtle-CgxKXorV.js → turtle-nCay33Nv.js} +0 -0
- /package/dist/{vb-B9kSwTdM.js → vb-BG-XlqqJ.js} +0 -0
- /package/dist/{vbscript-DrUKSCdb.js → vbscript-B6vyW0-D.js} +0 -0
- /package/dist/{velocity-AlMYTnMy.js → velocity-CWegueqO.js} +0 -0
- /package/dist/{verilog-DLUaM05j.js → verilog-CzSQm4cG.js} +0 -0
- /package/dist/{vhdl-DUJOtSmO.js → vhdl-DqnNVL7r.js} +0 -0
- /package/dist/{webidl-CQp4aHk_.js → webidl-DXEUpDWH.js} +0 -0
- /package/dist/{xquery-IxkjlwOD.js → xquery-Ba_NB5bD.js} +0 -0
- /package/dist/{yacas-Bnctn5w8.js → yacas-HKQU6hyk.js} +0 -0
- /package/dist/{z80-DrFwhx53.js → z80-CXkHXLdj.js} +0 -0
|
@@ -16,6 +16,10 @@ import { cellIdsAtom, notebookAtom, useCellActions } from "@/core/cells/cells";
|
|
|
16
16
|
import { useCellFocusActions } from "@/core/cells/focus";
|
|
17
17
|
import type { CellId } from "@/core/cells/ids";
|
|
18
18
|
import { HTMLCellId } from "@/core/cells/ids";
|
|
19
|
+
import {
|
|
20
|
+
clearPendingCutAtom,
|
|
21
|
+
pendingCutCellIdsAtom,
|
|
22
|
+
} from "@/core/cells/pending-cut-service";
|
|
19
23
|
import { usePendingDeleteService } from "@/core/cells/pending-delete-service";
|
|
20
24
|
import { scrollCellIntoView } from "@/core/cells/scrollCellIntoView";
|
|
21
25
|
import {
|
|
@@ -185,7 +189,7 @@ export function useCellNavigationProps(
|
|
|
185
189
|
const temporarilyShownCodeActions = useTemporarilyShownCodeActions();
|
|
186
190
|
const runCells = useRunCells();
|
|
187
191
|
const keymapPreset = useAtomValue(keymapPresetAtom);
|
|
188
|
-
const { copyCells, pasteAtCell } = useCellClipboard();
|
|
192
|
+
const { copyCells, pasteAtCell, cutCells } = useCellClipboard();
|
|
189
193
|
const rawSelectionActions = useCellSelectionActions();
|
|
190
194
|
const isSelected = useIsCellSelected(cellId);
|
|
191
195
|
const pendingDeleteService = usePendingDeleteService();
|
|
@@ -317,6 +321,12 @@ export function useCellNavigationProps(
|
|
|
317
321
|
},
|
|
318
322
|
// Clear selection
|
|
319
323
|
Escape: () => {
|
|
324
|
+
// Clear pending cut state if any
|
|
325
|
+
const pendingCutCellIds = store.get(pendingCutCellIdsAtom);
|
|
326
|
+
if (pendingCutCellIds.size > 0) {
|
|
327
|
+
store.set(clearPendingCutAtom);
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
320
330
|
if (isSelected) {
|
|
321
331
|
selectionActions.clear();
|
|
322
332
|
return true;
|
|
@@ -510,6 +520,10 @@ export function useCellNavigationProps(
|
|
|
510
520
|
copyCells(cellIds);
|
|
511
521
|
return true;
|
|
512
522
|
}),
|
|
523
|
+
"command.cutCell": addSingleHandler((cellIds) => {
|
|
524
|
+
cutCells(cellIds);
|
|
525
|
+
return true;
|
|
526
|
+
}),
|
|
513
527
|
"command.pasteCell": (cellIds) => {
|
|
514
528
|
pasteAtCell(cellIds);
|
|
515
529
|
return true;
|
|
@@ -27,6 +27,7 @@ import { Tooltip, TooltipProvider } from "@/components/ui/tooltip";
|
|
|
27
27
|
import { aiCompletionCellAtom } from "@/core/ai/state";
|
|
28
28
|
import { outputIsLoading, outputIsStale } from "@/core/cells/cell";
|
|
29
29
|
import { isOutputEmpty } from "@/core/cells/outputs";
|
|
30
|
+
import { useIsPendingCut } from "@/core/cells/pending-cut-service";
|
|
30
31
|
import { autocompletionKeymap } from "@/core/codemirror/cm";
|
|
31
32
|
import type { LanguageAdapterType } from "@/core/codemirror/language/types";
|
|
32
33
|
import { CSSClasses } from "@/core/constants";
|
|
@@ -391,6 +392,7 @@ const EditableCellComponent = ({
|
|
|
391
392
|
const deleteCell = useDeleteCellCallback();
|
|
392
393
|
const runCell = useRunCell(cellId);
|
|
393
394
|
const { sendStdin } = useRequestClient();
|
|
395
|
+
const isPendingCut = useIsPendingCut(cellId);
|
|
394
396
|
|
|
395
397
|
const [languageAdapter, setLanguageAdapter] = useState<LanguageAdapterType>();
|
|
396
398
|
|
|
@@ -545,6 +547,7 @@ const EditableCellComponent = ({
|
|
|
545
547
|
}),
|
|
546
548
|
borderless:
|
|
547
549
|
isMarkdownCodeHidden && hasOutput && !navigationProps["data-selected"],
|
|
550
|
+
"pending-cut": isPendingCut,
|
|
548
551
|
});
|
|
549
552
|
|
|
550
553
|
const handleRefactorWithAI: OnRefactorWithAI = useEvent(
|
|
@@ -4,6 +4,7 @@ import { describe, it, expect } from "vitest";
|
|
|
4
4
|
import { computeSlideCellsInfo } from "../compute-slide-cells";
|
|
5
5
|
import type { SlideConfig, SlidesLayout } from "../types";
|
|
6
6
|
import type { CellId } from "@/core/cells/ids";
|
|
7
|
+
import { cellId } from "@/__tests__/branded";
|
|
7
8
|
|
|
8
9
|
interface TestCell {
|
|
9
10
|
id: CellId;
|
|
@@ -15,10 +16,10 @@ const DEFAULT_OUTPUT: TestCell["output"] = { data: "ok" };
|
|
|
15
16
|
const cell = (
|
|
16
17
|
id: string,
|
|
17
18
|
output: TestCell["output"] = DEFAULT_OUTPUT,
|
|
18
|
-
): TestCell => ({ id: id
|
|
19
|
+
): TestCell => ({ id: cellId(id), output });
|
|
19
20
|
|
|
20
21
|
const layoutOf = (entries: Array<[string, SlideConfig]>): SlidesLayout => ({
|
|
21
|
-
cells: new Map(entries.map(([id, cfg]) => [id
|
|
22
|
+
cells: new Map(entries.map(([id, cfg]) => [cellId(id), cfg])),
|
|
22
23
|
deck: {},
|
|
23
24
|
});
|
|
24
25
|
|
|
@@ -121,7 +122,7 @@ describe("computeSlideCellsInfo", () => {
|
|
|
121
122
|
// Skipped cells are still "visible" deck cells — they just aren't rendered
|
|
122
123
|
// in reveal. The minimap relies on the full list plus skippedIds.
|
|
123
124
|
expect(result.cellsWithOutput.map((c) => c.id)).toEqual(["a", "b", "c"]);
|
|
124
|
-
expect(result.slideTypes.get("b"
|
|
125
|
+
expect(result.slideTypes.get(cellId("b"))).toBe("skip");
|
|
125
126
|
});
|
|
126
127
|
|
|
127
128
|
it("ignores layout entries for cells that have no output", () => {
|
|
@@ -137,7 +138,7 @@ describe("computeSlideCellsInfo", () => {
|
|
|
137
138
|
);
|
|
138
139
|
expect(result.cellsWithOutput.map((c) => c.id)).toEqual(["a"]);
|
|
139
140
|
expect(result.skippedIds.size).toBe(0);
|
|
140
|
-
expect(result.slideTypes.has("b"
|
|
141
|
+
expect(result.slideTypes.has(cellId("b"))).toBe(false);
|
|
141
142
|
});
|
|
142
143
|
|
|
143
144
|
it("preserves the input order of cells in cellsWithOutput", () => {
|
|
@@ -4,10 +4,11 @@ import { describe, it, expect } from "vitest";
|
|
|
4
4
|
import { SlidesLayoutPlugin } from "../plugin";
|
|
5
5
|
import type { CellData } from "@/core/cells/types";
|
|
6
6
|
import type { CellId } from "@/core/cells/ids";
|
|
7
|
+
import { cellId } from "@/__tests__/branded";
|
|
7
8
|
|
|
8
9
|
function makeCell(id: string, code = "print('hi')"): CellData {
|
|
9
10
|
return {
|
|
10
|
-
id: id
|
|
11
|
+
id: cellId(id),
|
|
11
12
|
name: id,
|
|
12
13
|
code,
|
|
13
14
|
edited: false,
|
|
@@ -198,7 +199,10 @@ const BACKWARDS_COMPAT_SNAPSHOTS: BackwardsCompatCase[] = [
|
|
|
198
199
|
},
|
|
199
200
|
{
|
|
200
201
|
// Defensive: if a future version adds a new SlideConfig field and a user
|
|
201
|
-
// downgrades, we must not crash on unknown keys
|
|
202
|
+
// downgrades, we must not crash on unknown keys — AND we must not silently
|
|
203
|
+
// drop them either. `notes` / `background` aren't in the current schema;
|
|
204
|
+
// they must still be present after validate + (de)serialize so a downgrade
|
|
205
|
+
// followed by a save doesn't erase the newer marimo's data.
|
|
202
206
|
label: "forward-compat: unknown SlideConfig fields present",
|
|
203
207
|
input: {
|
|
204
208
|
cells: [{ type: "slide", notes: "x", background: "#000" }],
|
|
@@ -206,7 +210,42 @@ const BACKWARDS_COMPAT_SNAPSHOTS: BackwardsCompatCase[] = [
|
|
|
206
210
|
expected: {
|
|
207
211
|
deck: {},
|
|
208
212
|
cellIds: ["a"],
|
|
209
|
-
cellEntries: [["a", { type: "slide" }]],
|
|
213
|
+
cellEntries: [["a", { type: "slide", notes: "x", background: "#000" }]],
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
// Same forward-compat guarantee for unknown deck-level fields (e.g. future
|
|
218
|
+
// Reveal options we haven't modeled yet).
|
|
219
|
+
label: "forward-compat: unknown deck fields present",
|
|
220
|
+
input: {
|
|
221
|
+
cells: [{}],
|
|
222
|
+
deck: { transition: "fade", controls: false, autoSlide: 5000 },
|
|
223
|
+
},
|
|
224
|
+
expected: {
|
|
225
|
+
deck: { transition: "fade", controls: false, autoSlide: 5000 },
|
|
226
|
+
cellIds: ["a"],
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
// `speakerNotes` was added to SlideConfig. The validator must
|
|
231
|
+
// know about it (so it isn't silently stripped), the deserializer must
|
|
232
|
+
// carry it through, and serialize → deserialize must round-trip it.
|
|
233
|
+
label: "speakerNotes round-trips through validate + (de)serialize",
|
|
234
|
+
input: {
|
|
235
|
+
cells: [
|
|
236
|
+
{ type: "slide", speakerNotes: "intro" },
|
|
237
|
+
{ type: "fragment", speakerNotes: "" },
|
|
238
|
+
{ type: "fragment", speakerNotes: "multi\n\nline\n\nnotes" },
|
|
239
|
+
],
|
|
240
|
+
},
|
|
241
|
+
expected: {
|
|
242
|
+
deck: {},
|
|
243
|
+
cellIds: ["a", "b", "c"],
|
|
244
|
+
cellEntries: [
|
|
245
|
+
["a", { type: "slide", speakerNotes: "intro" }],
|
|
246
|
+
["b", { type: "fragment", speakerNotes: "" }],
|
|
247
|
+
["c", { type: "fragment", speakerNotes: "multi\n\nline\n\nnotes" }],
|
|
248
|
+
],
|
|
210
249
|
},
|
|
211
250
|
},
|
|
212
251
|
];
|
|
@@ -223,20 +262,21 @@ describe("SlidesLayoutPlugin backwards compatibility", () => {
|
|
|
223
262
|
parsed.success,
|
|
224
263
|
`validator rejected: ${JSON.stringify(input)}`,
|
|
225
264
|
).toBe(true);
|
|
265
|
+
if (!parsed.success) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
226
268
|
|
|
227
|
-
// 2.
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
cells,
|
|
234
|
-
);
|
|
269
|
+
// 2. Deserializing the *validator output* (not the raw input) must
|
|
270
|
+
// preserve every field listed in `expected.cellEntries`. This is what
|
|
271
|
+
// catches a schema regression: if the validator silently strips a
|
|
272
|
+
// known field, the deserialized config won't carry it and the
|
|
273
|
+
// assertion below fails.
|
|
274
|
+
const layout = SlidesLayoutPlugin.deserializeLayout(parsed.data, cells);
|
|
235
275
|
if (expected.deck !== undefined) {
|
|
236
276
|
expect(layout.deck).toEqual(expected.deck);
|
|
237
277
|
}
|
|
238
|
-
for (const [
|
|
239
|
-
expect(layout.cells.get(cellId
|
|
278
|
+
for (const [cellEntryId, expectedConfig] of expected.cellEntries ?? []) {
|
|
279
|
+
expect(layout.cells.get(cellId(cellEntryId))).toMatchObject(
|
|
240
280
|
expectedConfig as object,
|
|
241
281
|
);
|
|
242
282
|
}
|
|
@@ -251,8 +291,8 @@ describe("SlidesLayoutPlugin backwards compatibility", () => {
|
|
|
251
291
|
reserialized,
|
|
252
292
|
cells,
|
|
253
293
|
);
|
|
254
|
-
for (const [
|
|
255
|
-
expect(redeserialized.cells.get(cellId
|
|
294
|
+
for (const [cellEntryId, expectedConfig] of expected.cellEntries ?? []) {
|
|
295
|
+
expect(redeserialized.cells.get(cellId(cellEntryId))).toMatchObject(
|
|
256
296
|
expectedConfig as object,
|
|
257
297
|
);
|
|
258
298
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import type { CellId } from "@/core/cells/ids";
|
|
4
|
+
import { Logger } from "@/utils/Logger";
|
|
4
5
|
import type { ICellRendererPlugin } from "../types";
|
|
5
6
|
import { SlidesLayoutRenderer } from "./slides-layout";
|
|
6
|
-
import
|
|
7
|
-
SerializedSlidesLayout,
|
|
8
|
-
SlideConfig,
|
|
9
|
-
SlidesLayout,
|
|
7
|
+
import {
|
|
8
|
+
type SerializedSlidesLayout,
|
|
9
|
+
type SlideConfig,
|
|
10
|
+
type SlidesLayout,
|
|
11
|
+
SlidesLayoutSchema,
|
|
10
12
|
} from "./types";
|
|
11
|
-
import { Logger } from "@/utils/Logger";
|
|
12
|
-
import type { CellId } from "@/core/cells/ids";
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Plugin definition for the slides layout.
|
|
@@ -20,24 +20,7 @@ export const SlidesLayoutPlugin: ICellRendererPlugin<
|
|
|
20
20
|
> = {
|
|
21
21
|
type: "slides",
|
|
22
22
|
name: "Slides",
|
|
23
|
-
|
|
24
|
-
// All fields are optional so layouts saved by older marimo versions will work
|
|
25
|
-
validator: z.object({
|
|
26
|
-
cells: z
|
|
27
|
-
.array(
|
|
28
|
-
z.object({
|
|
29
|
-
type: z.enum(["slide", "sub-slide", "fragment", "skip"]).optional(),
|
|
30
|
-
}),
|
|
31
|
-
)
|
|
32
|
-
.optional(),
|
|
33
|
-
deck: z
|
|
34
|
-
.object({
|
|
35
|
-
transition: z
|
|
36
|
-
.enum(["none", "fade", "slide", "convex", "concave", "zoom"])
|
|
37
|
-
.optional(),
|
|
38
|
-
})
|
|
39
|
-
.optional(),
|
|
40
|
-
}),
|
|
23
|
+
validator: SlidesLayoutSchema,
|
|
41
24
|
|
|
42
25
|
deserializeLayout: (serialized, cells): SlidesLayout => {
|
|
43
26
|
const serializedCells = serialized.cells ?? [];
|
|
@@ -3,6 +3,7 @@ import React, { useMemo, useState } from "react";
|
|
|
3
3
|
import { useAtomValue } from "jotai";
|
|
4
4
|
import { numColumnsAtom } from "@/core/cells/cells";
|
|
5
5
|
import type { CellId } from "@/core/cells/ids";
|
|
6
|
+
import { kioskModeAtom } from "@/core/mode";
|
|
6
7
|
import type { ICellRendererProps } from "../types";
|
|
7
8
|
import type { SlidesLayout } from "./types";
|
|
8
9
|
import { computeSlideCellsInfo } from "./compute-slide-cells";
|
|
@@ -21,7 +22,10 @@ export const SlidesLayoutRenderer: React.FC<Props> = ({
|
|
|
21
22
|
cells,
|
|
22
23
|
mode,
|
|
23
24
|
}) => {
|
|
24
|
-
|
|
25
|
+
// Kiosk clients (e.g. reveal.js's speaker-view iframes) are read-only and
|
|
26
|
+
// shouldn't show authoring chrome, so we collapse to the read-mode layout.
|
|
27
|
+
const kioskMode = useAtomValue(kioskModeAtom);
|
|
28
|
+
const isReading = mode === "read" || kioskMode;
|
|
25
29
|
const numColumns = useAtomValue(numColumnsAtom);
|
|
26
30
|
const isMultiColumn = numColumns > 1;
|
|
27
31
|
const [activeCellId, setActiveCellId] = useState<CellId | null>(null);
|
|
@@ -52,14 +56,23 @@ export const SlidesLayoutRenderer: React.FC<Props> = ({
|
|
|
52
56
|
activeIndex={resolvedIndex}
|
|
53
57
|
onSlideChange={handleSlideChange}
|
|
54
58
|
configWidth={300}
|
|
55
|
-
mode={mode}
|
|
56
|
-
isEditable={
|
|
59
|
+
mode={isReading ? "read" : mode}
|
|
60
|
+
isEditable={!isReading}
|
|
57
61
|
/>
|
|
58
62
|
);
|
|
59
63
|
|
|
60
64
|
if (isReading) {
|
|
61
|
-
//
|
|
62
|
-
//
|
|
65
|
+
// In kiosk mode (e.g. reveal.js's speaker-view iframes), anchor to the
|
|
66
|
+
// iframe viewport with `dvh`/`dvw` so the deck resizes with the popup
|
|
67
|
+
// window. The non-kiosk read mode keeps its 16:9 cap so the deck doesn't
|
|
68
|
+
// balloon to the full viewport on wide screens.
|
|
69
|
+
if (kioskMode) {
|
|
70
|
+
return (
|
|
71
|
+
<div className="flex h-dvh w-dvw overflow-hidden bg-background">
|
|
72
|
+
{slides}
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
63
76
|
return (
|
|
64
77
|
<div className="p-4 flex flex-1 items-center justify-center min-h-0">
|
|
65
78
|
<div className="h-full max-h-[95vh] aspect-video max-w-full flex">
|
|
@@ -1,41 +1,50 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
/* oxlint-disable typescript/no-empty-object-type */
|
|
3
2
|
|
|
3
|
+
import { z } from "zod";
|
|
4
4
|
import type { CellId } from "@/core/cells/ids";
|
|
5
5
|
|
|
6
|
+
const SlideTypeSchema = z.enum(["slide", "sub-slide", "fragment", "skip"]);
|
|
7
|
+
export type SlideType = z.infer<typeof SlideTypeSchema>;
|
|
8
|
+
|
|
9
|
+
const SlideConfigSchema = z.looseObject({
|
|
10
|
+
type: SlideTypeSchema.optional(),
|
|
11
|
+
speakerNotes: z.string().optional(),
|
|
12
|
+
});
|
|
13
|
+
export type SlideConfig = z.infer<typeof SlideConfigSchema>;
|
|
14
|
+
|
|
15
|
+
const DeckTransitionSchema = z.enum([
|
|
16
|
+
"none",
|
|
17
|
+
"fade",
|
|
18
|
+
"slide",
|
|
19
|
+
"convex",
|
|
20
|
+
"concave",
|
|
21
|
+
"zoom",
|
|
22
|
+
]);
|
|
23
|
+
export type DeckTransition = z.infer<typeof DeckTransitionSchema>;
|
|
24
|
+
|
|
25
|
+
const DeckConfigSchema = z.looseObject({
|
|
26
|
+
transition: DeckTransitionSchema.optional(),
|
|
27
|
+
});
|
|
28
|
+
export type DeckConfig = z.infer<typeof DeckConfigSchema>;
|
|
29
|
+
|
|
6
30
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
31
|
+
* Schema for the serialized form of a slides layout.
|
|
32
|
+
*
|
|
33
|
+
* This must be backwards-compatible as it is stored on the user's disk —
|
|
34
|
+
* fields are optional so files saved before they existed (e.g. the bare `{}`
|
|
35
|
+
* emitted by earlier marimo versions) still deserialize cleanly. Unknown
|
|
36
|
+
* keys are preserved (via `looseObject`) for the same reason.
|
|
9
37
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
cells?: SlideConfig[];
|
|
16
|
-
};
|
|
38
|
+
export const SlidesLayoutSchema = z.looseObject({
|
|
39
|
+
cells: z.array(SlideConfigSchema).optional(),
|
|
40
|
+
deck: DeckConfigSchema.optional(),
|
|
41
|
+
});
|
|
42
|
+
export type SerializedSlidesLayout = z.infer<typeof SlidesLayoutSchema>;
|
|
17
43
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// We map the cells to their IDs so that we can track them as they move around.
|
|
44
|
+
/**
|
|
45
|
+
* Runtime form of a slides layout.
|
|
46
|
+
*/
|
|
47
|
+
export interface SlidesLayout {
|
|
23
48
|
cells: Map<CellId, SlideConfig>;
|
|
24
49
|
deck: DeckConfig;
|
|
25
50
|
}
|
|
26
|
-
|
|
27
|
-
export type SlideType = "slide" | "sub-slide" | "fragment" | "skip";
|
|
28
|
-
export interface SlideConfig {
|
|
29
|
-
type?: SlideType;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export type DeckTransition =
|
|
33
|
-
| "none"
|
|
34
|
-
| "fade"
|
|
35
|
-
| "slide"
|
|
36
|
-
| "convex"
|
|
37
|
-
| "concave"
|
|
38
|
-
| "zoom";
|
|
39
|
-
export interface DeckConfig {
|
|
40
|
-
transition?: DeckTransition;
|
|
41
|
-
}
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
LinkIcon,
|
|
17
17
|
MessagesSquareIcon,
|
|
18
18
|
OrbitIcon,
|
|
19
|
+
PackageIcon,
|
|
19
20
|
YoutubeIcon,
|
|
20
21
|
} from "lucide-react";
|
|
21
22
|
import type React from "react";
|
|
@@ -58,6 +59,11 @@ const TUTORIALS: Record<
|
|
|
58
59
|
FileIcon,
|
|
59
60
|
"Understand marimo's pure-Python file format",
|
|
60
61
|
],
|
|
62
|
+
"external-dependencies": [
|
|
63
|
+
"External dependencies",
|
|
64
|
+
PackageIcon,
|
|
65
|
+
"Declare dependencies with Python script metadata",
|
|
66
|
+
],
|
|
61
67
|
"for-jupyter-users": [
|
|
62
68
|
"For Jupyter users",
|
|
63
69
|
OrbitIcon,
|
|
@@ -34,7 +34,10 @@ const RunPage = (props: Props) => {
|
|
|
34
34
|
|
|
35
35
|
const Watermark = () => {
|
|
36
36
|
return (
|
|
37
|
-
<div
|
|
37
|
+
<div
|
|
38
|
+
className="fixed bottom-0 right-0 z-50 print:hidden"
|
|
39
|
+
data-testid="watermark"
|
|
40
|
+
>
|
|
38
41
|
<a
|
|
39
42
|
href={Constants.githubPage}
|
|
40
43
|
target="_blank"
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import type {
|
|
5
|
+
SlideConfig,
|
|
6
|
+
SlideType,
|
|
7
|
+
} from "@/components/editor/renderers/slides-layout/types";
|
|
8
|
+
import type { CellId } from "@/core/cells/ids";
|
|
9
|
+
import { cellId } from "@/__tests__/branded";
|
|
10
|
+
import { composeSlides } from "../compose-slides";
|
|
11
|
+
import { buildSubslideNotes, collectBlockNotes } from "../slide-notes";
|
|
12
|
+
|
|
13
|
+
interface Cell {
|
|
14
|
+
id: CellId;
|
|
15
|
+
type?: SlideType;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const cell = (id: string, type?: SlideType): Cell => ({
|
|
19
|
+
id: cellId(id),
|
|
20
|
+
type,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const configs = (
|
|
24
|
+
notes: Record<string, string>,
|
|
25
|
+
): ReadonlyMap<CellId, SlideConfig> =>
|
|
26
|
+
new Map(
|
|
27
|
+
Object.entries(notes).map(([id, speakerNotes]) => [
|
|
28
|
+
cellId(id),
|
|
29
|
+
{ speakerNotes } satisfies SlideConfig,
|
|
30
|
+
]),
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
const firstSubslide = (cells: Cell[]) =>
|
|
34
|
+
composeSlides({ cells, getType: (c) => c.type ?? "slide" }).stacks[0]
|
|
35
|
+
.subslides[0];
|
|
36
|
+
|
|
37
|
+
describe("collectBlockNotes", () => {
|
|
38
|
+
it("concatenates non-empty notes with paragraph spacing", () => {
|
|
39
|
+
const result = collectBlockNotes(
|
|
40
|
+
[cell("a"), cell("b"), cell("c")],
|
|
41
|
+
configs({ a: "first", b: "", c: "third" }),
|
|
42
|
+
);
|
|
43
|
+
expect(result).toBe("first\n\nthird");
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("returns an empty string when no cell has notes", () => {
|
|
47
|
+
expect(collectBlockNotes([cell("a")], configs({}))).toBe("");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("ignores whitespace-only notes", () => {
|
|
51
|
+
expect(
|
|
52
|
+
collectBlockNotes([cell("a"), cell("b")], configs({ a: " ", b: "x" })),
|
|
53
|
+
).toBe("x");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe("buildSubslideNotes", () => {
|
|
58
|
+
it("returns empty notes when no cell has any", () => {
|
|
59
|
+
const subslide = firstSubslide([cell("a"), cell("b", "fragment")]);
|
|
60
|
+
expect(buildSubslideNotes(subslide, configs({}))).toEqual({
|
|
61
|
+
slideLevel: "",
|
|
62
|
+
cumulativeByBlock: new Map(),
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("returns only slide-level notes when there are no fragments", () => {
|
|
67
|
+
const subslide = firstSubslide([cell("a")]);
|
|
68
|
+
expect(buildSubslideNotes(subslide, configs({ a: "intro" }))).toEqual({
|
|
69
|
+
slideLevel: "intro",
|
|
70
|
+
cumulativeByBlock: new Map(),
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("accumulates fragments below the slide-level notes with a divider", () => {
|
|
75
|
+
const subslide = firstSubslide([
|
|
76
|
+
cell("a"),
|
|
77
|
+
cell("b", "fragment"),
|
|
78
|
+
cell("c", "fragment"),
|
|
79
|
+
]);
|
|
80
|
+
const { slideLevel, cumulativeByBlock } = buildSubslideNotes(
|
|
81
|
+
subslide,
|
|
82
|
+
configs({ a: "intro", b: "step one", c: "step two" }),
|
|
83
|
+
);
|
|
84
|
+
expect(slideLevel).toBe("intro");
|
|
85
|
+
expect(cumulativeByBlock.get(1)).toBe("intro\n\n---\n\nstep one");
|
|
86
|
+
expect(cumulativeByBlock.get(2)).toBe(
|
|
87
|
+
"intro\n\n---\n\nstep one\n\n---\n\nstep two",
|
|
88
|
+
);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("accumulates fragments with no slide-level notes", () => {
|
|
92
|
+
const subslide = firstSubslide([
|
|
93
|
+
cell("a"),
|
|
94
|
+
cell("b", "fragment"),
|
|
95
|
+
cell("c", "fragment"),
|
|
96
|
+
]);
|
|
97
|
+
const { slideLevel, cumulativeByBlock } = buildSubslideNotes(
|
|
98
|
+
subslide,
|
|
99
|
+
configs({ b: "first reveal", c: "second reveal" }),
|
|
100
|
+
);
|
|
101
|
+
expect(slideLevel).toBe("");
|
|
102
|
+
expect(cumulativeByBlock.get(1)).toBe("first reveal");
|
|
103
|
+
expect(cumulativeByBlock.get(2)).toBe(
|
|
104
|
+
"first reveal\n\n---\n\nsecond reveal",
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("skips empty fragments without leaving dangling dividers", () => {
|
|
109
|
+
const subslide = firstSubslide([
|
|
110
|
+
cell("a"),
|
|
111
|
+
cell("b", "fragment"),
|
|
112
|
+
cell("c", "fragment"),
|
|
113
|
+
]);
|
|
114
|
+
const { cumulativeByBlock } = buildSubslideNotes(
|
|
115
|
+
subslide,
|
|
116
|
+
configs({ a: "intro", c: "third" }),
|
|
117
|
+
);
|
|
118
|
+
expect(cumulativeByBlock.get(1)).toBe("intro");
|
|
119
|
+
expect(cumulativeByBlock.get(2)).toBe("intro\n\n---\n\nthird");
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("returns no cumulative entries when fragments and slide have no notes", () => {
|
|
123
|
+
const subslide = firstSubslide([
|
|
124
|
+
cell("a"),
|
|
125
|
+
cell("b", "fragment"),
|
|
126
|
+
cell("c", "fragment"),
|
|
127
|
+
]);
|
|
128
|
+
const { cumulativeByBlock } = buildSubslideNotes(subslide, configs({}));
|
|
129
|
+
expect(cumulativeByBlock.size).toBe(0);
|
|
130
|
+
});
|
|
131
|
+
});
|