@marimo-team/islands 0.23.7-dev7 → 0.23.7-dev70

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.
Files changed (553) hide show
  1. package/dist/{ConnectedDataExplorerComponent-PmilQqXR.js → ConnectedDataExplorerComponent-2lBNiUv6.js} +14 -14
  2. package/dist/{ErrorBoundary-Da4UeYxT.js → ErrorBoundary-D3wrPNma.js} +1 -1
  3. package/dist/{any-language-editor-BVR0l12r.js → any-language-editor-VWs_7v27.js} +15 -15
  4. package/dist/apl-Bdc61P1y.js +4 -0
  5. package/dist/{arc-CHF8PiiF.js → arc-DfkSnvZm.js} +2 -2
  6. package/dist/{architecture-7HQA4BMR-D0JB_3hE.js → architecture-7HQA4BMR-CS9jOrqM.js} +1 -1
  7. package/dist/{architectureDiagram-VXUJARFQ-BXQEUDtK.js → architectureDiagram-VXUJARFQ-CXVJxFhH.js} +16 -16
  8. package/dist/asciiarmor-DVRHDGzT.js +4 -0
  9. package/dist/asn1-BmuKfkfu.js +4 -0
  10. package/dist/assets/__vite-browser-external-CAdMKBac.js +1 -0
  11. package/dist/assets/worker-CpBbwbQo.js +73 -0
  12. package/dist/{blockDiagram-VD42YOAC-DhJe-Y9i.js → blockDiagram-VD42YOAC-DGDaxR8I.js} +11 -11
  13. package/dist/brainfuck-DPrRpyTV.js +4 -0
  14. package/dist/{button-CA5pI2YF.js → button-Dj4BTre0.js} +5 -0
  15. package/dist/{c4Diagram-YG6GDRKO-9dSfzOFR.js → c4Diagram-YG6GDRKO-C2hc6ne8.js} +5 -5
  16. package/dist/{capabilities-6laDasij.js → capabilities-C9rrYCzf.js} +1 -1
  17. package/dist/{channel-MqYIiKgS.js → channel-BBoIVUrJ.js} +1 -1
  18. package/dist/{chat-ui-B-gbqk_F.js → chat-ui-D3XBept8.js} +626 -234
  19. package/dist/{check-CFM2mVDr.js → check-BcUIXnUT.js} +1 -1
  20. package/dist/{chunk-4BX2VUAB-BwfrWBqN.js → chunk-4BX2VUAB-CzXltWHN.js} +1 -1
  21. package/dist/{chunk-55IACEB6-D8THf2mi.js → chunk-55IACEB6-B-1mjMMC.js} +1 -1
  22. package/dist/{chunk-5FQGJX7Z-CO1e63h_.js → chunk-5FQGJX7Z-BOg95xG5.js} +2 -2
  23. package/dist/{chunk-ABZYJK2D-BrBb_0yY.js → chunk-ABZYJK2D-D0cLy8Bb.js} +2 -2
  24. package/dist/{chunk-ATLVNIR6-D-0XqNah.js → chunk-ATLVNIR6-BXsEjlHF.js} +2 -2
  25. package/dist/{chunk-B4BG7PRW-8iRKvugR.js → chunk-B4BG7PRW-Q1usn6T3.js} +7 -7
  26. package/dist/{chunk-CVBHYZKI-B6xhgaBd.js → chunk-CVBHYZKI-B_c5YBcW.js} +1 -1
  27. package/dist/{chunk-DI55MBZ5-C0_2D4m4.js → chunk-DI55MBZ5-D1qLYNrb.js} +6 -6
  28. package/dist/{chunk-EXTU4WIE-Jiw9ca1u.js → chunk-EXTU4WIE-BKNXdLmD.js} +2 -2
  29. package/dist/{chunk-FMBD7UC4-CHdus51S.js → chunk-FMBD7UC4-Ie8M9q0W.js} +1 -1
  30. package/dist/{chunk-HN2XXSSU-2Vfbq-kU.js → chunk-HN2XXSSU-E3n-Ys7Z.js} +1 -1
  31. package/dist/{chunk-JA3XYJ7Z-6wbaigKe.js → chunk-JA3XYJ7Z-D6c6cOBG.js} +3 -3
  32. package/dist/{chunk-JZLCHNYA-_rfptlUP.js → chunk-JZLCHNYA-BvsPHJmL.js} +6 -6
  33. package/dist/{chunk-MI3HLSF2-Do0-KRc0.js → chunk-MI3HLSF2-CUYEasXO.js} +1 -1
  34. package/dist/{chunk-N4CR4FBY-DIZG9dVD.js → chunk-N4CR4FBY-8ycT-O9a.js} +7 -7
  35. package/dist/{chunk-QN33PNHL-Cc64y40m.js → chunk-QN33PNHL-Bb-eUBW3.js} +2 -2
  36. package/dist/{chunk-QXUST7PY-BDG0-0Or.js → chunk-QXUST7PY-DV8yRwBd.js} +10 -10
  37. package/dist/{chunk-QZHKN3VN-B_Mdb8GC.js → chunk-QZHKN3VN-DRjXVwuJ.js} +1 -1
  38. package/dist/{chunk-S3R3BYOJ-DphMP0FA.js → chunk-S3R3BYOJ-mQeCz5CE.js} +4 -4
  39. package/dist/{chunk-TZMSLE5B-C9LUoYkc.js → chunk-TZMSLE5B-BqW10dHe.js} +3 -3
  40. package/dist/classDiagram-2ON5EDUG--Yh__LHb.js +30 -0
  41. package/dist/classDiagram-v2-WZHVMYZB-BC7X7Xtc.js +30 -0
  42. package/dist/{clike-sBZrGeF8.js → clike-DTxNUn7l.js} +1 -1
  43. package/dist/clojure-DEttQW5T.js +4 -0
  44. package/dist/cmake-jNlx_DaM.js +4 -0
  45. package/dist/cobol-BvvIm5MJ.js +4 -0
  46. package/dist/{code-block-37QAKDTI-0JNwiPGv.js → code-block-37QAKDTI-BsGy1AOJ.js} +1 -1
  47. package/dist/{code-visibility-CiN3Xnfo.js → code-visibility-Ci8Uv-1s.js} +11480 -1992
  48. package/dist/coffeescript-DTpBMyFU.js +4 -0
  49. package/dist/commonlisp-BmmUG8jb.js +4 -0
  50. package/dist/{copy-TGGAUEWp.js → copy-DLf4aN7I.js} +2 -2
  51. package/dist/{cose-bilkent-S5V4N54A-DXHZkJKX.js → cose-bilkent-S5V4N54A-kjoZoid4.js} +2 -2
  52. package/dist/crystal-BxyqmEWC.js +4 -0
  53. package/dist/css-BGoCtuG3.js +4 -0
  54. package/dist/cypher-BmCbdl3u.js +4 -0
  55. package/dist/d-CFrlbjZt.js +4 -0
  56. package/dist/{dagre-6UL2VRFP-tH87fkPA.js → dagre-6UL2VRFP-DRBWoQUw.js} +10 -10
  57. package/dist/{data-grid-overlay-editor-CWUN78-s.js → data-grid-overlay-editor-efe5ZagF.js} +2 -2
  58. package/dist/{diagram-PSM6KHXK-2VjPSCDn.js → diagram-PSM6KHXK-H66ATWP2.js} +18 -18
  59. package/dist/{diagram-QEK2KX5R-CiLmNyta.js → diagram-QEK2KX5R-DItl5Wns.js} +14 -14
  60. package/dist/{diagram-S2PKOQOG-Zha_1CLx.js → diagram-S2PKOQOG-CtuW_ZuL.js} +14 -14
  61. package/dist/diff-D6XwL6P8.js +4 -0
  62. package/dist/{dist-Brkazupz.js → dist--sWVZwjW.js} +1 -1
  63. package/dist/{dist-FN0ZA_8F.js → dist-21ButRCu.js} +1 -1
  64. package/dist/{dist-BetEKbPG.js → dist-B8RaFTRF.js} +1 -1
  65. package/dist/dist-BoHGySTM.js +5 -0
  66. package/dist/dist-ByAz19Qc.js +5 -0
  67. package/dist/dist-C93EysN4.js +5 -0
  68. package/dist/{dist-BHnX0ia_.js → dist-CY-lVor6.js} +1 -1
  69. package/dist/{dist-YP-G7W0f.js → dist-CYDuv4bR.js} +1 -1
  70. package/dist/{dist-CMjD5MQb.js → dist-Cfo5EE2t.js} +1 -1
  71. package/dist/dist-CjivSDvN.js +5 -0
  72. package/dist/dist-Cqwx-MH7.js +5 -0
  73. package/dist/{dist-ESg7xyoD.js → dist-D3ZI9nhS.js} +2 -2
  74. package/dist/{dist-DkC6YEo0.js → dist-DMZNjfX4.js} +1 -1
  75. package/dist/{dist-ChC1BhqM.js → dist-DbpcoFAV.js} +1 -1
  76. package/dist/dist-FUNenbiQ.js +5 -0
  77. package/dist/{dist-BEOU2g1b.js → dist-zhSud5X3.js} +1 -1
  78. package/dist/{dockerfile-COvlVLcE.js → dockerfile-twL37N91.js} +1 -1
  79. package/dist/dtd-Bw0lRN0-.js +4 -0
  80. package/dist/dylan-B55eBHTt.js +4 -0
  81. package/dist/ecl-C8G4p0wn.js +4 -0
  82. package/dist/eiffel-BmH46VJl.js +4 -0
  83. package/dist/elm-DhzeFqkl.js +4 -0
  84. package/dist/{erDiagram-Q2GNP2WA-biHZS05w.js → erDiagram-Q2GNP2WA--19X2kU5.js} +14 -14
  85. package/dist/erlang-CY-wdlsU.js +4 -0
  86. package/dist/{error-banner-DnBPzEWg.js → error-banner-CVkfBUT3.js} +2 -2
  87. package/dist/{esm-Dd1z1auZ.js → esm-CWp0KQeK.js} +1 -1
  88. package/dist/{esm-CYEyrE3Y.js → esm-DjNnlmpf.js} +96 -96
  89. package/dist/{extends-CzJgxo2J.js → extends-vAi97cpa.js} +4 -4
  90. package/dist/{factor-C2GT7jfQ.js → factor-CajWS6mS.js} +1 -1
  91. package/dist/factor-DWkgl0xw.js +4 -0
  92. package/dist/{flowDiagram-NV44I4VS-CWWlUpBR.js → flowDiagram-NV44I4VS-DQmWlo7f.js} +16 -16
  93. package/dist/{formats-CgaK7Gmx.js → formats-Dsy9kkZu.js} +3 -3
  94. package/dist/forth-Cij_ie2t.js +4 -0
  95. package/dist/fortran-Br3X9cfm.js +4 -0
  96. package/dist/{ganttDiagram-JELNMOA3-D7B2c4Z9.js → ganttDiagram-JELNMOA3-BOGXJ8Lk.js} +7 -7
  97. package/dist/gas-DYsGcMN2.js +4 -0
  98. package/dist/gherkin-eVgXQ0fQ.js +4 -0
  99. package/dist/{gitGraph-G5XIXVHT-BdepdFa_.js → gitGraph-G5XIXVHT-DGlbae5m.js} +1 -1
  100. package/dist/{gitGraphDiagram-V2S2FVAM-CtLvNR1S.js → gitGraphDiagram-V2S2FVAM-DjzxfF0P.js} +14 -14
  101. package/dist/{glide-data-editor-CvlvtPWJ.js → glide-data-editor-DucgdjRo.js} +13 -13
  102. package/dist/groovy-_NFHIXG7.js +4 -0
  103. package/dist/haskell-D6xNG_bH.js +4 -0
  104. package/dist/haxe-sU_rzAwn.js +5 -0
  105. package/dist/{html-to-image-hMMPiNe_.js → html-to-image-CpggM7u1.js} +2806 -2547
  106. package/dist/idl-Ds_VbrUx.js +4 -0
  107. package/dist/{info-VBDWY6EO--JNA2rNu.js → info-VBDWY6EO-D2lvLLw5.js} +1 -1
  108. package/dist/{infoDiagram-HS3SLOUP-BbZyOxsP.js → infoDiagram-HS3SLOUP-ChNufFsP.js} +12 -12
  109. package/dist/{input-BAOe64zx.js → input-D4kjoQUB.js} +8 -6
  110. package/dist/javascript-CztfIl0i.js +4 -0
  111. package/dist/{journeyDiagram-XKPGCS4Q-BU2mjjzl.js → journeyDiagram-XKPGCS4Q-BO_O4Ij1.js} +6 -6
  112. package/dist/julia-DDv40QMV.js +4 -0
  113. package/dist/{kanban-definition-3W4ZIXB7-BlmczUuw.js → kanban-definition-3W4ZIXB7-CPpiiiWk.js} +11 -11
  114. package/dist/{katex-qPqrBHZ8.js → katex-9-9QRhxz.js} +1 -1
  115. package/dist/{label-BCWi-Oqu.js → label-BLqV33b1.js} +2 -2
  116. package/dist/{line-BWRi3U3S.js → line-C5s_12ee.js} +3 -3
  117. package/dist/{linear-DnHwODZa.js → linear-2NnK4cxi.js} +2 -2
  118. package/dist/livescript-BEOngLLc.js +4 -0
  119. package/dist/{loader-BvW0-YWZ.js → loader-Dr8Qem8p.js} +1 -1
  120. package/dist/lua-9-7BhQ4Y.js +4 -0
  121. package/dist/main.js +1631 -10231
  122. package/dist/mathematica-DDa0Pfxm.js +4 -0
  123. package/dist/mbox-iO03mmoE.js +4 -0
  124. package/dist/{mermaid-4DMBBIKO-CG1ECj5W.js → mermaid-4DMBBIKO-B7VQMwJx.js} +1 -1
  125. package/dist/{mermaid-CEbzCxCc.js → mermaid-DO-Daq7u.js} +46 -46
  126. package/dist/{mermaid-parser.core-CleJseNW.js → mermaid-parser.core-DreccfmS.js} +7 -7
  127. package/dist/{mhchem-BwoRNwg_.js → mhchem-yiCCuiEF.js} +1 -1
  128. package/dist/{mindmap-definition-VGOIOE7T-CcSYqYP9.js → mindmap-definition-VGOIOE7T-CC1_Vl0f.js} +13 -13
  129. package/dist/mirc-C9z5LT4X.js +4 -0
  130. package/dist/mllike-jGJbdm_C.js +6 -0
  131. package/dist/modelica-DzF7oIEL.js +4 -0
  132. package/dist/mscgen-DB-u125o.js +6 -0
  133. package/dist/mumps-CRTFHhzh.js +4 -0
  134. package/dist/nsis-C4NPTuox.js +4 -0
  135. package/dist/{nsis-B5K1qoyo.js → nsis-ClF3r5Tr.js} +1 -1
  136. package/dist/ntriples-BCOoGph1.js +4 -0
  137. package/dist/{number-overlay-editor-_GnlYFHC.js → number-overlay-editor-CpKi64Fy.js} +1 -1
  138. package/dist/octave-DTwNlazz.js +4 -0
  139. package/dist/{ordinal-2jIulmcR.js → ordinal-B43ZeR68.js} +1 -1
  140. package/dist/oz-DD38AzSz.js +4 -0
  141. package/dist/{packet-DYOGHKS2-CBxXGWNr.js → packet-DYOGHKS2-CmWtF3uO.js} +1 -1
  142. package/dist/pascal-BohSp9jV.js +4 -0
  143. package/dist/perl-f5OutoPM.js +4 -0
  144. package/dist/{pie-VRWISCQL-Bmdnqjip.js → pie-VRWISCQL-B6u8vus8.js} +1 -1
  145. package/dist/{pieDiagram-ADFJNKIX-DNyLF5H2.js → pieDiagram-ADFJNKIX-Di34MOFQ.js} +19 -19
  146. package/dist/pig-Dv7wSmHb.js +4 -0
  147. package/dist/powershell-rYgjKB39.js +4 -0
  148. package/dist/{process-output-Bza_GK7Q.js → process-output-X8TR20AK.js} +30 -25
  149. package/dist/properties-BFUNLRDN.js +4 -0
  150. package/dist/protobuf-B9QJQPPv.js +4 -0
  151. package/dist/{pug-tjbzJCFk.js → pug-B_rby2yb.js} +1 -1
  152. package/dist/pug-DzvWpaMC.js +4 -0
  153. package/dist/puppet-B_K-n_xK.js +4 -0
  154. package/dist/python-CAiFcaA2.js +4 -0
  155. package/dist/q-cLeFIBLK.js +4 -0
  156. package/dist/{quadrantDiagram-AYHSOK5B-rXwjifrj.js → quadrantDiagram-AYHSOK5B-B9kVk1ny.js} +3 -3
  157. package/dist/r-04Y-Wco3.js +4 -0
  158. package/dist/{radar-ZZBFDIW7-BmCWDffL.js → radar-ZZBFDIW7-XAmXSa8s.js} +1 -1
  159. package/dist/{react-vega-B-rkEqtS.js → react-vega-Cavbrg4l.js} +1 -1
  160. package/dist/{react-vega-k9ODWPlI.js → react-vega-Dh6-UKKe.js} +13 -13
  161. package/dist/{requirementDiagram-UZGBJVZJ-DBdrMVbs.js → requirementDiagram-UZGBJVZJ-BxGfGYEx.js} +13 -13
  162. package/dist/reveal-component-CIs-OouT.js +7444 -0
  163. package/dist/rpm-FUdrIia9.js +5 -0
  164. package/dist/ruby-DMjFXuEW.js +4 -0
  165. package/dist/{sankeyDiagram-TZEHDZUN-CxmzalGv.js → sankeyDiagram-TZEHDZUN-D09PBJ-n.js} +4 -4
  166. package/dist/sas-DzHZxjXK.js +4 -0
  167. package/dist/scheme-DxHd_Rb9.js +4 -0
  168. package/dist/semaphore-CNDGTzkX.js +46 -0
  169. package/dist/{sequenceDiagram-WL72ISMW-CVCDsJ9h.js → sequenceDiagram-WL72ISMW-t_Dpemj0.js} +7 -7
  170. package/dist/shell-C8Kwypgf.js +4 -0
  171. package/dist/sieve-DdyqOKXZ.js +4 -0
  172. package/dist/smalltalk-pB7X1D9y.js +4 -0
  173. package/dist/sparql-NhBO6oOa.js +4 -0
  174. package/dist/{spec-DSIuqd3f.js → spec-hVaaZsY5.js} +4 -4
  175. package/dist/{src-BY0BGg6V.js → src-Bf2iLOlr.js} +1 -1
  176. package/dist/{stateDiagram-FKZM4ZOC-D_2djEhW.js → stateDiagram-FKZM4ZOC-B18gTP_j.js} +16 -16
  177. package/dist/stateDiagram-v2-4FDKWEC3-B6e_t14A.js +29 -0
  178. package/dist/{step-DGAGWg3y.js → step-CWipAYTY.js} +1 -1
  179. package/dist/{strings-B_FOH6eV.js → strings-BiIhGaI8.js} +4 -4
  180. package/dist/style.css +1 -1
  181. package/dist/stylus-SfWSnzPv.js +4 -0
  182. package/dist/swift-jRPdq2zR.js +4 -0
  183. package/dist/{swiper-component-KkEVUDd3.js → swiper-component-DlD2GU2g.js} +2 -2
  184. package/dist/tcl-_hpTHGX3.js +4 -0
  185. package/dist/textile-C9h8slqH.js +4 -0
  186. package/dist/{time-CMdrp3hw.js → time-C1SGcFMH.js} +2 -2
  187. package/dist/{timeline-definition-IT6M3QCI-E4NzxCs3.js → timeline-definition-IT6M3QCI-DJnh1ks5.js} +3 -3
  188. package/dist/{toDate-CHtl9vts.js → toDate-CIpC_34u.js} +33 -20
  189. package/dist/toml-DWvtinD4.js +4 -0
  190. package/dist/{tooltip-B0mtKTXm.js → tooltip-DRaMBu06.js} +3 -3
  191. package/dist/{treemap-GDKQZRPO-CoKHPxa7.js → treemap-GDKQZRPO-Du95DV6u.js} +1 -1
  192. package/dist/troff-Dwo_A0y7.js +4 -0
  193. package/dist/ttcn-V--CPFKq.js +4 -0
  194. package/dist/ttcn-cfg-CPSMchTG.js +4 -0
  195. package/dist/turtle-B4rPGBWu.js +4 -0
  196. package/dist/{types-DBtDeUKD.js → types-Dzuoc3LN.js} +1 -1
  197. package/dist/{useAsyncData-B6hCGywC.js → useAsyncData-C56Khv_R.js} +1 -1
  198. package/dist/{useDateFormatter-B3mCQMP3.js → useDateFormatter-B_9k85Ex.js} +2 -2
  199. package/dist/{useDeepCompareMemoize-CmwDuYUH.js → useDeepCompareMemoize-Dt98v2ua.js} +1 -1
  200. package/dist/{useIframeCapabilities-DbdLoEDm.js → useIframeCapabilities-BkYHTrss.js} +1 -1
  201. package/dist/{useLifecycle-CjMjllqy.js → useLifecycle-BF6-z62y.js} +3 -3
  202. package/dist/{useTheme-CByZUW0p.js → useTheme-DykuNHR2.js} +2 -2
  203. package/dist/vb-DaMBBd4j.js +4 -0
  204. package/dist/vbscript-BMJQqcE2.js +4 -0
  205. package/dist/{vega-component-CC8TqWWV.js → vega-component-cSdqoAxe.js} +26 -24
  206. package/dist/velocity-CGq2QRq2.js +4 -0
  207. package/dist/verilog-CUNo8F5u.js +4 -0
  208. package/dist/vhdl-CCzA0msW.js +4 -0
  209. package/dist/webidl-CqIMDIBL.js +4 -0
  210. package/dist/xquery-XC5Kbr-1.js +4 -0
  211. package/dist/{xychartDiagram-PRI3JC2R-CuxTvjw5.js → xychartDiagram-PRI3JC2R-Dk2d_bX0.js} +10 -10
  212. package/dist/yacas-CGOv7Dzy.js +4 -0
  213. package/dist/z80-CXhVmi-f.js +4 -0
  214. package/dist/{zod-BxdsqRPd.js → zod-BWkcDORu.js} +1 -1
  215. package/package.json +3 -3
  216. package/src/components/chat/chat-components.tsx +47 -0
  217. package/src/components/chat/chat-display.tsx +41 -7
  218. package/src/components/chat/chat-panel.tsx +37 -10
  219. package/src/components/chat/chat-utils.ts +42 -20
  220. package/src/components/chat/reasoning-accordion.tsx +14 -3
  221. package/src/components/chat/tool-call/shared.ts +13 -0
  222. package/src/components/chat/tool-call/tool-approval-card.tsx +62 -0
  223. package/src/components/chat/tool-call/tool-args.tsx +26 -0
  224. package/src/components/chat/tool-call/tool-call-view.tsx +99 -0
  225. package/src/components/chat/tool-call/tool-error-card.tsx +81 -0
  226. package/src/components/chat/tool-call/tool-history-row.tsx +153 -0
  227. package/src/components/chat/tool-call/tool-result.tsx +101 -0
  228. package/src/components/data-table/__tests__/column-header.test.ts +3 -1
  229. package/src/components/data-table/__tests__/column-header.test.tsx +308 -0
  230. package/src/components/data-table/__tests__/filter-by-values-picker.test.tsx +112 -0
  231. package/src/components/data-table/__tests__/filter-pill-editor.test.tsx +261 -0
  232. package/src/components/data-table/__tests__/filters.test.ts +196 -49
  233. package/src/components/data-table/charts/components/form-fields.tsx +1 -0
  234. package/src/components/data-table/column-header.tsx +349 -170
  235. package/src/components/data-table/date-filter-inputs.tsx +325 -0
  236. package/src/components/data-table/filter-by-values-picker.tsx +70 -9
  237. package/src/components/data-table/filter-pill-editor.tsx +410 -156
  238. package/src/components/data-table/filter-pills.tsx +69 -54
  239. package/src/components/data-table/filters.ts +218 -101
  240. package/src/components/data-table/header-items.tsx +8 -1
  241. package/src/components/data-table/operator-labels.ts +25 -0
  242. package/src/components/data-table/regex-input.tsx +61 -0
  243. package/src/components/dependency-graph/minimap-content.tsx +14 -3
  244. package/src/components/editor/actions/pair-with-agent-modal.tsx +140 -49
  245. package/src/components/editor/actions/useNotebookActions.tsx +3 -1
  246. package/src/components/editor/app-container.tsx +7 -1
  247. package/src/components/editor/chrome/panels/context-aware-panel/context-aware-panel.tsx +10 -2
  248. package/src/components/editor/chrome/wrapper/app-chrome.tsx +1 -0
  249. package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
  250. package/src/components/editor/chrome/wrapper/footer.tsx +4 -1
  251. package/src/components/editor/chrome/wrapper/panels.tsx +4 -1
  252. package/src/components/editor/chrome/wrapper/sidebar.tsx +4 -1
  253. package/src/components/editor/controls/Controls.tsx +11 -3
  254. package/src/components/editor/file-tree/file-explorer.tsx +12 -2
  255. package/src/components/editor/file-tree/requesting-tree.tsx +27 -25
  256. package/src/components/editor/file-tree/upload.tsx +23 -24
  257. package/src/components/editor/header/__tests__/status.test.tsx +108 -0
  258. package/src/components/editor/header/status.tsx +44 -10
  259. package/src/components/editor/navigation/__tests__/clipboard.test.ts +106 -0
  260. package/src/components/editor/navigation/__tests__/navigation.test.ts +70 -0
  261. package/src/components/editor/navigation/clipboard.ts +99 -25
  262. package/src/components/editor/navigation/navigation.ts +15 -1
  263. package/src/components/editor/notebook-cell.tsx +3 -0
  264. package/src/components/editor/renderers/slides-layout/__tests__/compute-slide-cells.test.ts +5 -4
  265. package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +55 -15
  266. package/src/components/editor/renderers/slides-layout/plugin.tsx +8 -25
  267. package/src/components/editor/renderers/slides-layout/slides-layout.tsx +18 -5
  268. package/src/components/editor/renderers/slides-layout/types.ts +40 -31
  269. package/src/components/home/components.tsx +6 -0
  270. package/src/components/pages/run-page.tsx +4 -1
  271. package/src/components/slides/__tests__/slide-notes.test.ts +131 -0
  272. package/src/components/slides/reveal-component.tsx +242 -147
  273. package/src/components/slides/slide-notes-editor.tsx +127 -0
  274. package/src/components/slides/slide-notes.ts +64 -0
  275. package/src/components/slides/slides.css +14 -0
  276. package/src/components/ui/combobox.tsx +24 -5
  277. package/src/components/ui/number-field.tsx +2 -0
  278. package/src/core/ai/tools/__tests__/registry.test.ts +10 -12
  279. package/src/core/ai/tools/registry.ts +9 -5
  280. package/src/core/cells/__tests__/cells.test.ts +187 -0
  281. package/src/core/cells/__tests__/pending-cut-service.test.tsx +123 -0
  282. package/src/core/cells/cells.ts +102 -17
  283. package/src/core/cells/document-changes.ts +6 -1
  284. package/src/core/cells/pending-cut-service.ts +55 -0
  285. package/src/core/cells/utils.ts +11 -0
  286. package/src/core/codemirror/cells/extensions.ts +10 -0
  287. package/src/core/codemirror/go-to-definition/__tests__/commands.test.ts +152 -0
  288. package/src/core/codemirror/go-to-definition/__tests__/utils.test.ts +99 -0
  289. package/src/core/codemirror/go-to-definition/commands.ts +382 -22
  290. package/src/core/codemirror/go-to-definition/utils.ts +23 -5
  291. package/src/core/codemirror/markdown/__tests__/commands.test.ts +3 -3
  292. package/src/core/codemirror/markdown/commands.ts +1 -2
  293. package/src/core/edit-app.tsx +3 -2
  294. package/src/core/hotkeys/hotkeys.ts +5 -0
  295. package/src/core/islands/worker/worker.tsx +3 -2
  296. package/src/core/network/requests-network.ts +21 -3
  297. package/src/core/network/types.ts +12 -1
  298. package/src/core/run-app.tsx +2 -1
  299. package/src/core/runtime/__tests__/runtime.test.ts +38 -17
  300. package/src/core/runtime/runtime.ts +57 -34
  301. package/src/core/wasm/__tests__/utils.test.ts +34 -0
  302. package/src/core/wasm/bridge.ts +14 -1
  303. package/src/core/wasm/utils.ts +14 -0
  304. package/src/core/wasm/worker/bootstrap.ts +3 -2
  305. package/src/core/wasm/worker/worker.ts +3 -2
  306. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +156 -0
  307. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +101 -0
  308. package/src/core/websocket/transports/__tests__/ws.test.ts +125 -0
  309. package/src/core/websocket/transports/basic.ts +1 -1
  310. package/src/core/websocket/transports/ws.ts +96 -0
  311. package/src/core/websocket/useMarimoKernelConnection.tsx +133 -54
  312. package/src/core/websocket/useWebSocket.tsx +3 -15
  313. package/src/css/app/Cell.css +10 -0
  314. package/src/plugins/core/__test__/sanitize.test.ts +30 -0
  315. package/src/plugins/impl/DropdownPlugin.tsx +12 -1
  316. package/src/plugins/impl/MultiselectPlugin.tsx +4 -0
  317. package/src/plugins/impl/SearchableSelect.tsx +11 -1
  318. package/src/plugins/impl/TabsPlugin.tsx +35 -7
  319. package/src/plugins/impl/__tests__/DropdownPlugin.test.tsx +56 -0
  320. package/src/plugins/impl/__tests__/TabsPlugin.test.tsx +154 -0
  321. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +48 -36
  322. package/src/plugins/impl/data-frames/schema.ts +4 -1
  323. package/src/plugins/impl/vega/resolve-data.ts +8 -1
  324. package/src/utils/__tests__/id-tree.test.ts +71 -0
  325. package/src/utils/__tests__/semaphore.test.ts +218 -0
  326. package/src/utils/fileToBase64.ts +8 -7
  327. package/src/utils/id-tree.tsx +89 -0
  328. package/src/utils/semaphore.ts +88 -0
  329. package/dist/apl-BKoVld9y.js +0 -4
  330. package/dist/asciiarmor-DQrKIjoo.js +0 -4
  331. package/dist/asn1-BZvnj0dq.js +0 -4
  332. package/dist/assets/__vite-browser-external-rrUYDKRl.js +0 -1
  333. package/dist/assets/worker-Bfy15ViQ.js +0 -73
  334. package/dist/brainfuck-D558nlUv.js +0 -4
  335. package/dist/classDiagram-2ON5EDUG-CBHMR6ZU.js +0 -30
  336. package/dist/classDiagram-v2-WZHVMYZB-BsUtUGM_.js +0 -30
  337. package/dist/clojure-Cq8mTSrE.js +0 -4
  338. package/dist/cmake-D8HCovWK.js +0 -4
  339. package/dist/cobol-UolN-9iU.js +0 -4
  340. package/dist/coffeescript-VdNuWrt5.js +0 -4
  341. package/dist/commonlisp-ALX7fpDc.js +0 -4
  342. package/dist/crystal-PbyO9Q_s.js +0 -4
  343. package/dist/css-DFklJkr_.js +0 -4
  344. package/dist/cypher-BifNeYlv.js +0 -4
  345. package/dist/d-BA-JP4PJ.js +0 -4
  346. package/dist/diff-CtkDpav4.js +0 -4
  347. package/dist/dist-BuBwsFva.js +0 -5
  348. package/dist/dist-BzmEQ9u7.js +0 -5
  349. package/dist/dist-Cih01ssx.js +0 -5
  350. package/dist/dist-CqfONiY9.js +0 -5
  351. package/dist/dist-D0iD0Fi9.js +0 -5
  352. package/dist/dist-DtNLXm8d.js +0 -5
  353. package/dist/dtd-DW3_UFEG.js +0 -4
  354. package/dist/dylan-pDhodO2N.js +0 -4
  355. package/dist/ecl-BJT8-YD7.js +0 -4
  356. package/dist/eiffel-Dmns-9vS.js +0 -4
  357. package/dist/elm-Da4sO4Bz.js +0 -4
  358. package/dist/erlang-C-zBsDi7.js +0 -4
  359. package/dist/factor-4xPWlWB5.js +0 -4
  360. package/dist/forth-l-c75zSd.js +0 -4
  361. package/dist/fortran-DIujSODW.js +0 -4
  362. package/dist/gas-CXnG5g_b.js +0 -4
  363. package/dist/gherkin-VPeqd4-X.js +0 -4
  364. package/dist/groovy-CphhZQgg.js +0 -4
  365. package/dist/haskell-CCvlS5Iq.js +0 -4
  366. package/dist/haxe-C_bi66fP.js +0 -5
  367. package/dist/idl-1DcP4Dm8.js +0 -4
  368. package/dist/javascript-DUIGhBvO.js +0 -4
  369. package/dist/julia-Cs2G4PQi.js +0 -4
  370. package/dist/livescript-DMtVFaAN.js +0 -4
  371. package/dist/lua-BAoLtdJg.js +0 -4
  372. package/dist/mathematica-C_NoFtbo.js +0 -4
  373. package/dist/mbox-DcFJFYrH.js +0 -4
  374. package/dist/mirc-71dccf_u.js +0 -4
  375. package/dist/mllike-CWcOFVDq.js +0 -6
  376. package/dist/modelica-Ape2VXxx.js +0 -4
  377. package/dist/mscgen-Cc6TwbSN.js +0 -6
  378. package/dist/mumps-h-ZbdkJ9.js +0 -4
  379. package/dist/nsis-C0p3m7JW.js +0 -4
  380. package/dist/ntriples-c9lEeT5w.js +0 -4
  381. package/dist/octave-DzEgB_74.js +0 -4
  382. package/dist/oz-CAxvHkyQ.js +0 -4
  383. package/dist/pascal-BJzu1sgP.js +0 -4
  384. package/dist/perl--IrOzZ2Z.js +0 -4
  385. package/dist/pig-CiBKKNhC.js +0 -4
  386. package/dist/powershell-KY0j6Qop.js +0 -4
  387. package/dist/properties-BW8q3ziV.js +0 -4
  388. package/dist/protobuf-BGaeuTGV.js +0 -4
  389. package/dist/pug-DjOKK-4J.js +0 -4
  390. package/dist/puppet-DWm2o6zX.js +0 -4
  391. package/dist/python-Bp2gezZy.js +0 -4
  392. package/dist/q-DljPshos.js +0 -4
  393. package/dist/r-BajPMnEu.js +0 -4
  394. package/dist/reveal-component-BCKa3sr-.js +0 -4863
  395. package/dist/rpm-BKx-ZZ62.js +0 -5
  396. package/dist/ruby-DJq_HNKc.js +0 -4
  397. package/dist/sas-WANvpcOU.js +0 -4
  398. package/dist/scheme-CliBbhGF.js +0 -4
  399. package/dist/shell-BwhrNUvM.js +0 -4
  400. package/dist/sieve-BIVePvMp.js +0 -4
  401. package/dist/smalltalk-D6G48JmY.js +0 -4
  402. package/dist/sparql-jjc3BmEP.js +0 -4
  403. package/dist/stateDiagram-v2-4FDKWEC3-Cv9Av10H.js +0 -29
  404. package/dist/stylus-WPBPQ4PE.js +0 -4
  405. package/dist/swift-O1Qy6iCm.js +0 -4
  406. package/dist/tcl-BAFdhvsi.js +0 -4
  407. package/dist/textile-DFuzhNLG.js +0 -4
  408. package/dist/toml-DRSTeely.js +0 -4
  409. package/dist/troff-B_ZjwBW0.js +0 -4
  410. package/dist/ttcn-CAyiB3ic.js +0 -4
  411. package/dist/ttcn-cfg-BS5_BGBJ.js +0 -4
  412. package/dist/turtle-CUBEDy3E.js +0 -4
  413. package/dist/vb-DY9S6-U2.js +0 -4
  414. package/dist/vbscript-gaHC39Jq.js +0 -4
  415. package/dist/velocity-TfCOtJZ_.js +0 -4
  416. package/dist/verilog-c2JOX8mv.js +0 -4
  417. package/dist/vhdl-dHBirRiO.js +0 -4
  418. package/dist/webidl-Bauj-i07.js +0 -4
  419. package/dist/xquery-CtaEAOt8.js +0 -4
  420. package/dist/yacas-BZ85agQP.js +0 -4
  421. package/dist/z80-hCgR-L4U.js +0 -4
  422. package/src/components/chat/tool-call-accordion.tsx +0 -247
  423. /package/dist/{ImageComparisonComponent-DaocPIse.js → ImageComparisonComponent-CNHIsPDj.js} +0 -0
  424. /package/dist/{Plot-PIeIvFnD.js → Plot-4wn-lMVn.js} +0 -0
  425. /package/dist/{apl-Dt8GMXYg.js → apl-BCgCq9iM.js} +0 -0
  426. /package/dist/{array-B-MVxRIF.js → array-tvvEqPy7.js} +0 -0
  427. /package/dist/{asciiarmor-CitDQ85h.js → asciiarmor-BtqU-KJQ.js} +0 -0
  428. /package/dist/{asn1-abrf9SMK.js → asn1-Dmb-dTMx.js} +0 -0
  429. /package/dist/{asterisk-BUZwqih-.js → asterisk-DaVJJDnV.js} +0 -0
  430. /package/dist/{brainfuck-BL-Boof0.js → brainfuck-C1HoZKlE.js} +0 -0
  431. /package/dist/{chunk-4F5CHEZ2-C6tO9vjs.js → chunk-4F5CHEZ2-BZq7Kom7.js} +0 -0
  432. /package/dist/{chunk-B2363JML-Ds8wZXyP.js → chunk-B2363JML-D9-XOau1.js} +0 -0
  433. /package/dist/{chunk-DR5Q36YT-CP69aZS_.js → chunk-DR5Q36YT-BflwErH1.js} +0 -0
  434. /package/dist/{chunk-FRFDVMJY-BgQv1HBE.js → chunk-FRFDVMJY-BSBUAX7r.js} +0 -0
  435. /package/dist/{chunk-PL6DKKU2-DHfTUHy8.js → chunk-PL6DKKU2-B0MTXvyc.js} +0 -0
  436. /package/dist/{chunk-SJTYNZTY-Diciw4sx.js → chunk-SJTYNZTY-CEG4F0pB.js} +0 -0
  437. /package/dist/{chunk-TQ3KTPDO-CQfP9npd.js → chunk-TQ3KTPDO-DiCtqVSi.js} +0 -0
  438. /package/dist/{chunk-UMXZTB3W-MSKeGL7W.js → chunk-UMXZTB3W-97iS1iEl.js} +0 -0
  439. /package/dist/{click-outside-container-BZgN7xS_.js → click-outside-container-BDd67_1U.js} +0 -0
  440. /package/dist/{clike-RWg7anhx.js → clike-CdT0yHjt.js} +0 -0
  441. /package/dist/{clojure-DaojKHow.js → clojure-CdyrCpUv.js} +0 -0
  442. /package/dist/{cmake-DN-_v0XE.js → cmake-BFlPxym7.js} +0 -0
  443. /package/dist/{cobol-C3VpMyux.js → cobol-CcJXewp8.js} +0 -0
  444. /package/dist/{coffeescript-DIkz3Tbt.js → coffeescript-DnKuIKRo.js} +0 -0
  445. /package/dist/{colors-Cn2p_FA3.js → colors-CQAOa8cK.js} +0 -0
  446. /package/dist/{common-keywords-hbLeU7VU.js → common-keywords-FBrXPTcz.js} +0 -0
  447. /package/dist/{commonlisp-CB1boOiP.js → commonlisp-B-kok83Z.js} +0 -0
  448. /package/dist/{crystal-DI2oCml6.js → crystal-FYRYjI1I.js} +0 -0
  449. /package/dist/{css-BdEVwQDV.js → css-B45lc2V3.js} +0 -0
  450. /package/dist/{cypher-BNHToqxU.js → cypher-DZMLyVY_.js} +0 -0
  451. /package/dist/{cytoscape.esm-WbbDoCfu.js → cytoscape.esm-ayF70frT.js} +0 -0
  452. /package/dist/{d-D7we7I1b.js → d-x-VVT4o9.js} +0 -0
  453. /package/dist/{diff-Cia6fzjN.js → diff-Dxe2mpXk.js} +0 -0
  454. /package/dist/{dist-BK-3fF4P.js → dist-B4LJpMEg.js} +0 -0
  455. /package/dist/{dist-CxdUraQr.js → dist-B507mf_I.js} +0 -0
  456. /package/dist/{dist-C89sHDXk.js → dist-BGdYVvOu.js} +0 -0
  457. /package/dist/{dist-DquyVv5H.js → dist-BNyrZfqT.js} +0 -0
  458. /package/dist/{dist-Zn0KNbo9.js → dist-Bc5pmZIw.js} +0 -0
  459. /package/dist/{dist-C-J0pt5p.js → dist-BvCfQQQE.js} +0 -0
  460. /package/dist/{dist-D9r7Cmw7.js → dist-C2ej4eOH.js} +0 -0
  461. /package/dist/{dist-HVuryI1a.js → dist-C34oIrQ9.js} +0 -0
  462. /package/dist/{dist-CGLzXdrt.js → dist-CDFZi-QD.js} +0 -0
  463. /package/dist/{dist-C9fmTOin.js → dist-CYEylvZA.js} +0 -0
  464. /package/dist/{dist-DadjmS-4.js → dist-DJ6zJQZ4.js} +0 -0
  465. /package/dist/{dist-CtCY55Jf.js → dist-Dh3wkoyH.js} +0 -0
  466. /package/dist/{dist-C474qFoq.js → dist-Dhk6FMb0.js} +0 -0
  467. /package/dist/{dist-DZjQ_MBo.js → dist-KnujRhFL.js} +0 -0
  468. /package/dist/{dist-CinA9Enb.js → dist-WdPUFc56.js} +0 -0
  469. /package/dist/{dist-DBLeRrPp.js → dist-t_qL7eB8.js} +0 -0
  470. /package/dist/{dist-CyFFzJTb.js → dist-usPCDYx8.js} +0 -0
  471. /package/dist/{dtd-H4Hubdwp.js → dtd-C9VM_Wfu.js} +0 -0
  472. /package/dist/{duckdb-keywords-CZ_ZTscu.js → duckdb-keywords-CvJhR_Yd.js} +0 -0
  473. /package/dist/{dylan-fVO6rnq3.js → dylan-DTSnEIFO.js} +0 -0
  474. /package/dist/{ebnf-WEXPLEWb.js → ebnf-2D4Ctp3y.js} +0 -0
  475. /package/dist/{ecl-B94VPjNR.js → ecl-N04ptnRK.js} +0 -0
  476. /package/dist/{eiffel-C_R6TusS.js → eiffel-Dd8rpqr_.js} +0 -0
  477. /package/dist/{elm-DzCHbO2g.js → elm-GT2E866W.js} +0 -0
  478. /package/dist/{erlang-BGNkx6JU.js → erlang-Cf0Bp5pY.js} +0 -0
  479. /package/dist/{esm-Bb_hbWan.js → esm-BaaaPNGl.js} +0 -0
  480. /package/dist/{fcl-B_Gv5Jfx.js → fcl-Ccj8Z5Xd.js} +0 -0
  481. /package/dist/{forth-Bybw0cJ7.js → forth-wd_XzGTg.js} +0 -0
  482. /package/dist/{fortran-C6PoCLkI.js → fortran-DcwUTZFe.js} +0 -0
  483. /package/dist/{gas-BBlhenj4.js → gas-DeALIER3.js} +0 -0
  484. /package/dist/{gherkin-NXtNG85X.js → gherkin-CKTqaJNX.js} +0 -0
  485. /package/dist/{groovy-BoFYK9xM.js → groovy-Bwdp_d8D.js} +0 -0
  486. /package/dist/{haskell-BtBdvQ1n.js → haskell-DCdCcPLK.js} +0 -0
  487. /package/dist/{haxe-D--o6dr0.js → haxe-DAyktQWJ.js} +0 -0
  488. /package/dist/{http-Dc2fv19V.js → http-_DVAYWoR.js} +0 -0
  489. /package/dist/{idl-AqTq5l7e.js → idl-CBuZiRYu.js} +0 -0
  490. /package/dist/{init-D-g0ONX1.js → init-uv0kkh4g.js} +0 -0
  491. /package/dist/{javascript-DvwNVye9.js → javascript-DzigE11c.js} +0 -0
  492. /package/dist/{julia-DoKiagZC.js → julia-PwfB-0Cm.js} +0 -0
  493. /package/dist/{katex-B7pMJpE0.js → katex-C_XRmjAP.js} +0 -0
  494. /package/dist/{livescript-DxBZMiWB.js → livescript-BJLz1EbT.js} +0 -0
  495. /package/dist/{lua-DmS_0NTu.js → lua-ZC-XC2jf.js} +0 -0
  496. /package/dist/{math-BYK36kWZ.js → math-DFcdCCU8.js} +0 -0
  497. /package/dist/{mathematica-ChlDFeIC.js → mathematica-DCYMx6qB.js} +0 -0
  498. /package/dist/{mbox-CguZuODr.js → mbox-OxMK_9XI.js} +0 -0
  499. /package/dist/{mirc-CFtY8dqz.js → mirc-nJVyhA0H.js} +0 -0
  500. /package/dist/{mllike-C0EJrEOk.js → mllike-DRO89bsU.js} +0 -0
  501. /package/dist/{modelica-C1kO1nfS.js → modelica-Don3E6ZD.js} +0 -0
  502. /package/dist/{mscgen-DEYdr7AY.js → mscgen-DJfqD3bN.js} +0 -0
  503. /package/dist/{mumps-B3NVJs2V.js → mumps-SjGTvDYL.js} +0 -0
  504. /package/dist/{nginx-ComVAAGN.js → nginx-DasThI7R.js} +0 -0
  505. /package/dist/{node-sql-parser-DNGGJ-Rw.js → node-sql-parser-B8nBD36q.js} +0 -0
  506. /package/dist/{ntriples-DHol9X9H.js → ntriples-CNBKRl3I.js} +0 -0
  507. /package/dist/{octave-CYGz0bfo.js → octave-DdeVHNlx.js} +0 -0
  508. /package/dist/{oz-kPxb2ni5.js → oz-CcKSoNvN.js} +0 -0
  509. /package/dist/{pascal-bZ0yrJKy.js → pascal-6leftwNj.js} +0 -0
  510. /package/dist/{path-Du6n3sOU.js → path-BGaWgPKg.js} +0 -0
  511. /package/dist/{perl-z4hvqyqz.js → perl-BhJIwWzN.js} +0 -0
  512. /package/dist/{pig-DZO8QDF9.js → pig-r-xDHqRf.js} +0 -0
  513. /package/dist/{powershell-BSuaDQEC.js → powershell-D-BELeNi.js} +0 -0
  514. /package/dist/{properties-BXhGLlIx.js → properties-CnuDhbll.js} +0 -0
  515. /package/dist/{protobuf-DM6iybWV.js → protobuf-CO8RBhvX.js} +0 -0
  516. /package/dist/{puppet-Bn05sQT8.js → puppet-NmXHjLy8.js} +0 -0
  517. /package/dist/{python-Cvnhm0g7.js → python-DAQXi720.js} +0 -0
  518. /package/dist/{q-B9V8hzex.js → q-DlikXfV0.js} +0 -0
  519. /package/dist/{r-Cf0gFqmq.js → r-CuohilwT.js} +0 -0
  520. /package/dist/{rpm-D-LMkTV1.js → rpm-0Pjwp0Pb.js} +0 -0
  521. /package/dist/{ruby-DeuPikpK.js → ruby-Dq8NJTDG.js} +0 -0
  522. /package/dist/{sas-C9tjgAo9.js → sas-CuwonyVP.js} +0 -0
  523. /package/dist/{scheme-D1_bUF0G.js → scheme-CYU-RRIf.js} +0 -0
  524. /package/dist/{shell-CJBmnks3.js → shell-COPmX2qE.js} +0 -0
  525. /package/dist/{sieve-1fSV75CF.js → sieve-B_3zyLne.js} +0 -0
  526. /package/dist/{simple-mode-B90Wdavj.js → simple-mode-DSBniks8.js} +0 -0
  527. /package/dist/{smalltalk-sZNPD0HO.js → smalltalk-DRft7iPv.js} +0 -0
  528. /package/dist/{solr-DTkyqJ-Z.js → solr-RZ9uTl59.js} +0 -0
  529. /package/dist/{sparql-oHc1nm77.js → sparql-CN6qj55H.js} +0 -0
  530. /package/dist/{spreadsheet-CER0raqY.js → spreadsheet-BNNUNXA2.js} +0 -0
  531. /package/dist/{sql-ByOoEONQ.js → sql-B4x8IkwU.js} +0 -0
  532. /package/dist/{stylus-KzkX6zRB.js → stylus-Bn_ZjOQ3.js} +0 -0
  533. /package/dist/{swift-DqVxZvKo.js → swift-BLUJhMbz.js} +0 -0
  534. /package/dist/{tcl-BtWSwXfA.js → tcl-C86fxecl.js} +0 -0
  535. /package/dist/{textile-CWDbn9Ql.js → textile-DmHh2rsK.js} +0 -0
  536. /package/dist/{tiddlywiki-Cr9xyOY1.js → tiddlywiki-DI0mF2WJ.js} +0 -0
  537. /package/dist/{tiki-D5JONyfZ.js → tiki-2HU6XLLn.js} +0 -0
  538. /package/dist/{timer-D7JVdX9U.js → timer-YZl28NYN.js} +0 -0
  539. /package/dist/{toml-BfehlgmL.js → toml-GWANRNAD.js} +0 -0
  540. /package/dist/{treemap-qFGzn7xk.js → treemap-D-ka1hvx.js} +0 -0
  541. /package/dist/{troff-BZBk6AAu.js → troff-BHTsomIy.js} +0 -0
  542. /package/dist/{ttcn-DVwvXg0_.js → ttcn-DQuhn5Mn.js} +0 -0
  543. /package/dist/{ttcn-cfg-gjbVLf1L.js → ttcn-cfg-HjFYtdB-.js} +0 -0
  544. /package/dist/{turtle-CgxKXorV.js → turtle-nCay33Nv.js} +0 -0
  545. /package/dist/{vb-B9kSwTdM.js → vb-BG-XlqqJ.js} +0 -0
  546. /package/dist/{vbscript-DrUKSCdb.js → vbscript-B6vyW0-D.js} +0 -0
  547. /package/dist/{velocity-AlMYTnMy.js → velocity-CWegueqO.js} +0 -0
  548. /package/dist/{verilog-DLUaM05j.js → verilog-CzSQm4cG.js} +0 -0
  549. /package/dist/{vhdl-DUJOtSmO.js → vhdl-DqnNVL7r.js} +0 -0
  550. /package/dist/{webidl-CQp4aHk_.js → webidl-DXEUpDWH.js} +0 -0
  551. /package/dist/{xquery-IxkjlwOD.js → xquery-Ba_NB5bD.js} +0 -0
  552. /package/dist/{yacas-Bnctn5w8.js → yacas-HKQU6hyk.js} +0 -0
  553. /package/dist/{z80-DrFwhx53.js → z80-CXkHXLdj.js} +0 -0
@@ -11,9 +11,11 @@ import {
11
11
  import useEvent from "react-use-event-hook";
12
12
  import { CodeIcon, ExpandIcon, EyeOffIcon } from "lucide-react";
13
13
  import { Deck, Fragment, Slide, Stack } from "@revealjs/react";
14
+ import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";
14
15
  import { Slide as CellOutputSlide } from "@/components/slides/slide";
15
16
  import { Button } from "@/components/ui/button";
16
17
  import { Tooltip } from "@/components/ui/tooltip";
18
+ import type { CellId } from "@/core/cells/ids";
17
19
  import type { RuntimeCell } from "@/core/cells/types";
18
20
  import type { RevealApi, RevealConfig } from "reveal.js";
19
21
  import { useEventListener } from "@/hooks/useEventListener";
@@ -21,7 +23,10 @@ import { Events } from "@/utils/events";
21
23
  import { Logger } from "@/utils/Logger";
22
24
  import "./slides.css";
23
25
  import "./reveal-slides.css";
24
- import type { SlidesLayout } from "../editor/renderers/slides-layout/types";
26
+ import type {
27
+ SlideConfig,
28
+ SlidesLayout,
29
+ } from "../editor/renderers/slides-layout/types";
25
30
  import {
26
31
  buildSlideIndices,
27
32
  composeSlides,
@@ -39,10 +44,14 @@ import {
39
44
  SlideCellReadOnlyView,
40
45
  SlideCellView,
41
46
  } from "@/components/slides/slide-cell-view";
47
+ import { SlideNotesEditor } from "./slide-notes-editor";
48
+ import { buildSubslideNotes, NOTES_DIVIDER } from "./slide-notes";
42
49
  import { cn } from "@/utils/cn";
43
50
  import { isIslands } from "@/core/islands/utils";
44
51
  import { useNotebookCodeAvailable } from "@/core/meta/code-visibility";
45
- import type { AppMode } from "@/core/mode";
52
+ import { type AppMode, kioskModeAtom } from "@/core/mode";
53
+ import { useAtomValue } from "jotai";
54
+ import RevealNotes from "reveal.js/plugin/notes";
46
55
 
47
56
  const ASPECT_RATIO = 16 / 9;
48
57
 
@@ -124,56 +133,93 @@ function triggerResize(deck: RevealApi | null) {
124
133
  }
125
134
  }
126
135
 
136
+ // The speaker view renders this via innerHTML with `white-space: normal`, so
137
+ // we materialize `\n` as `<br>` and a lone `---` line as `<hr>`.
138
+ const NotesAside = ({ text }: { text: string }) => {
139
+ const lines = text.split("\n");
140
+ return (
141
+ <aside className="notes">
142
+ {lines.map((line, idx) => {
143
+ const isLast = idx === lines.length - 1;
144
+ if (line === NOTES_DIVIDER) {
145
+ return <hr key={idx} />;
146
+ }
147
+ return (
148
+ <ReactFragment key={idx}>
149
+ {line}
150
+ {!isLast && <br />}
151
+ </ReactFragment>
152
+ );
153
+ })}
154
+ </aside>
155
+ );
156
+ };
157
+
127
158
  const SubslideView = ({
128
159
  subslide,
129
160
  showCode,
130
161
  isEditable,
162
+ slideConfigs,
131
163
  }: {
132
164
  subslide: ComposedSubslide<RuntimeCell>;
133
165
  showCode: boolean;
134
166
  isEditable: boolean;
135
- }) => (
136
- <Slide>
137
- <div className="h-full w-full overflow-auto flex">
138
- <div
139
- className={
140
- showCode ? "mo-slide-content flex flex-col gap-3" : "mo-slide-content"
141
- }
142
- style={{
143
- margin: "auto 20px",
144
- }}
145
- >
146
- {subslide.blocks.map((block, i) => {
147
- const rendered = block.cells.map((cell) => {
148
- if (!showCode) {
167
+ slideConfigs: ReadonlyMap<CellId, SlideConfig>;
168
+ }) => {
169
+ const { slideLevel, cumulativeByBlock } = buildSubslideNotes(
170
+ subslide,
171
+ slideConfigs,
172
+ );
173
+
174
+ return (
175
+ <Slide>
176
+ <div className="h-full w-full overflow-auto flex">
177
+ <div
178
+ className={
179
+ showCode
180
+ ? "mo-slide-content flex flex-col gap-3"
181
+ : "mo-slide-content"
182
+ }
183
+ style={{
184
+ margin: "auto 20px",
185
+ }}
186
+ >
187
+ {subslide.blocks.map((block, i) => {
188
+ const rendered = block.cells.map((cell) => {
189
+ if (!showCode) {
190
+ return (
191
+ <CellOutputSlide
192
+ key={cell.id}
193
+ cellId={cell.id}
194
+ status={cell.status}
195
+ output={cell.output}
196
+ />
197
+ );
198
+ }
199
+ return isEditable ? (
200
+ <SlideCellView key={cell.id} cell={cell} />
201
+ ) : (
202
+ <SlideCellReadOnlyView key={cell.id} cell={cell} />
203
+ );
204
+ });
205
+ if (block.isFragment) {
206
+ const cumulative = cumulativeByBlock.get(i);
149
207
  return (
150
- <CellOutputSlide
151
- key={cell.id}
152
- cellId={cell.id}
153
- status={cell.status}
154
- output={cell.output}
155
- />
208
+ <Fragment key={i} as="div">
209
+ {rendered}
210
+ {cumulative && <NotesAside text={cumulative} />}
211
+ </Fragment>
156
212
  );
157
213
  }
158
- return isEditable ? (
159
- <SlideCellView key={cell.id} cell={cell} />
160
- ) : (
161
- <SlideCellReadOnlyView key={cell.id} cell={cell} />
162
- );
163
- });
164
- if (block.isFragment) {
165
- return (
166
- <Fragment key={i} as="div">
167
- {rendered}
168
- </Fragment>
169
- );
170
- }
171
- return <ReactFragment key={i}>{rendered}</ReactFragment>;
172
- })}
214
+ return <ReactFragment key={i}>{rendered}</ReactFragment>;
215
+ })}
216
+ </div>
173
217
  </div>
174
- </div>
175
- </Slide>
176
- );
218
+ {/* Outside any `.fragment`: shown only before any fragment is revealed. */}
219
+ {slideLevel && <NotesAside text={slideLevel} />}
220
+ </Slide>
221
+ );
222
+ };
177
223
 
178
224
  // There is an upstream react bug in dev mode (https://github.com/facebook/react/issues/34840)
179
225
  // Uncaught SecurityError: Failed to read a named property '$$typeof' from 'Window'
@@ -200,6 +246,13 @@ const RevealSlidesComponent = ({
200
246
  const containerRef = useRef<HTMLDivElement>(null);
201
247
  const deckRef = useRef<RevealApi | null>(null);
202
248
  const { width, height } = useSlideDimensions(containerRef);
249
+ // Skip the Notes plugin inside reveal's own speaker-view iframes so pressing
250
+ // `S` there doesn't try to spawn another popup.
251
+ const kioskMode = useAtomValue(kioskModeAtom);
252
+ const deckPlugins = useMemo(
253
+ () => (kioskMode ? [] : [RevealNotes]),
254
+ [kioskMode],
255
+ );
203
256
 
204
257
  const [showCode, setShowCode] = useState(false);
205
258
  const codeAvailable = useNotebookCodeAvailable(cellsWithOutput);
@@ -241,6 +294,16 @@ const RevealSlidesComponent = ({
241
294
  );
242
295
 
243
296
  const deckTransition = layout.deck?.transition ?? DEFAULT_DECK_TRANSITION;
297
+ // Reveal's Notes plugin iframes the deck for the current/upcoming-slide
298
+ // previews. We load the same URL but as a read-only kiosk client with the
299
+ // app chrome hidden, which `<SlidesLayoutRenderer>` interprets the same as
300
+ // read mode (no minimap, sidebar, or notes editor).
301
+ const kioskUrl = useMemo(() => {
302
+ const url = new URL(window.location.href);
303
+ url.searchParams.set("kiosk", "true");
304
+ url.searchParams.set("show-chrome", "false");
305
+ return url.toString();
306
+ }, []);
244
307
  const revealConfig: RevealConfig = useMemo(
245
308
  () => ({
246
309
  embedded: true,
@@ -251,8 +314,9 @@ const RevealSlidesComponent = ({
251
314
  maxScale: 2,
252
315
  transition: deckTransition,
253
316
  keyboardCondition: (event: KeyboardEvent) => !Events.fromInput(event),
317
+ url: kioskUrl,
254
318
  }),
255
- [width, height, deckTransition],
319
+ [width, height, deckTransition, kioskUrl],
256
320
  );
257
321
 
258
322
  const navigateDeckToActiveCell = useEvent((deck: RevealApi) => {
@@ -357,126 +421,157 @@ const RevealSlidesComponent = ({
357
421
 
358
422
  useEventListener(document, "keydown", handleParkedNavKey, { capture: true });
359
423
 
360
- return (
361
- <div className="flex-1 min-w-0 flex flex-row gap-3">
362
- <div
363
- ref={containerRef}
364
- className="flex-1 min-w-0 flex items-center justify-center overflow-hidden"
365
- >
366
- <div className="group relative" style={{ width, height }}>
367
- <Deck
368
- deckRef={deckRef}
369
- className="aspect-video w-full overflow-hidden border rounded bg-background mo-slides-theme prose-slides"
370
- config={revealConfig}
371
- onReady={handleDeckReady}
372
- onSlideChange={handleSlideChange}
373
- onFragmentShown={reportCurrentCell}
374
- onFragmentHidden={reportCurrentCell}
375
- >
376
- {composition.stacks.map((stack, h) => {
377
- if (stack.subslides.length === 1) {
378
- const isActive =
379
- activeSubslide?.h === h && activeSubslide?.v === 0;
380
- return (
381
- <SubslideView
382
- key={h}
383
- subslide={stack.subslides[0]}
384
- showCode={codeShown && isActive}
385
- isEditable={isEditable}
386
- />
387
- );
388
- }
424
+ const slideArea = (
425
+ <div
426
+ ref={containerRef}
427
+ className="h-full w-full min-w-0 flex items-center justify-center overflow-hidden"
428
+ >
429
+ <div className="group relative" style={{ width, height }}>
430
+ <Deck
431
+ deckRef={deckRef}
432
+ className="aspect-video w-full overflow-hidden border rounded bg-background mo-slides-theme prose-slides"
433
+ config={revealConfig}
434
+ onReady={handleDeckReady}
435
+ onSlideChange={handleSlideChange}
436
+ onFragmentShown={reportCurrentCell}
437
+ onFragmentHidden={reportCurrentCell}
438
+ plugins={deckPlugins}
439
+ >
440
+ {composition.stacks.map((stack, h) => {
441
+ if (stack.subslides.length === 1) {
442
+ const isActive =
443
+ activeSubslide?.h === h && activeSubslide?.v === 0;
389
444
  return (
390
- <Stack key={h}>
391
- {stack.subslides.map((sub, v) => {
392
- const isActive =
393
- activeSubslide?.h === h && activeSubslide?.v === v;
394
- return (
395
- <SubslideView
396
- key={v}
397
- subslide={sub}
398
- showCode={codeShown && isActive}
399
- isEditable={isEditable}
400
- />
401
- );
402
- })}
403
- </Stack>
445
+ <SubslideView
446
+ key={h}
447
+ subslide={stack.subslides[0]}
448
+ showCode={codeShown && isActive}
449
+ isEditable={isEditable}
450
+ slideConfigs={layout.cells}
451
+ />
404
452
  );
405
- })}
406
- </Deck>
407
- {skippedPreviewCell && (
408
- <div
409
- className="absolute inset-0 z-10 border rounded bg-background flex flex-col overflow-hidden"
410
- aria-label="Skipped in presentation"
411
- >
412
- <div className="flex items-center gap-1.5 px-3 py-1.5 text-xs text-muted-foreground border-b bg-muted/40">
413
- <EyeOffIcon className="h-3.5 w-3.5" />
414
- <span>Skipped in presentation</span>
415
- </div>
416
- <div className="flex-1 overflow-auto flex">
417
- <div
418
- className="mo-slide-content"
419
- style={{ margin: "auto 20px" }}
420
- >
421
- <CellOutputSlide
422
- cellId={skippedPreviewCell.id}
423
- status={skippedPreviewCell.status}
424
- output={skippedPreviewCell.output}
425
- />
426
- </div>
453
+ }
454
+ return (
455
+ <Stack key={h}>
456
+ {stack.subslides.map((sub, v) => {
457
+ const isActive =
458
+ activeSubslide?.h === h && activeSubslide?.v === v;
459
+ return (
460
+ <SubslideView
461
+ key={v}
462
+ subslide={sub}
463
+ showCode={codeShown && isActive}
464
+ isEditable={isEditable}
465
+ slideConfigs={layout.cells}
466
+ />
467
+ );
468
+ })}
469
+ </Stack>
470
+ );
471
+ })}
472
+ </Deck>
473
+ {skippedPreviewCell && (
474
+ <div
475
+ className="absolute inset-0 z-10 border rounded bg-background flex flex-col overflow-hidden"
476
+ aria-label="Skipped in presentation"
477
+ >
478
+ <div className="flex items-center gap-1.5 px-3 py-1.5 text-xs text-muted-foreground border-b bg-muted/40">
479
+ <EyeOffIcon className="h-3.5 w-3.5" />
480
+ <span>Skipped in presentation</span>
481
+ </div>
482
+ <div className="flex-1 overflow-auto flex">
483
+ <div className="mo-slide-content" style={{ margin: "auto 20px" }}>
484
+ <CellOutputSlide
485
+ cellId={skippedPreviewCell.id}
486
+ status={skippedPreviewCell.status}
487
+ output={skippedPreviewCell.output}
488
+ />
427
489
  </div>
428
490
  </div>
429
- )}
430
- <div className="absolute top-2 right-2 z-20 opacity-0 group-hover:opacity-70 text-muted-foreground transition-opacity">
431
- {codeToggleEnabled && (
432
- <Tooltip content={codeShown ? "Hide code (C)" : "Show code (C)"}>
433
- <Button
434
- data-testid="marimo-plugin-slides-toggle-code"
435
- variant="ghost"
436
- size="icon"
437
- className={cn(
438
- "text-muted-foreground h-7 w-7",
439
- codeShown && "text-foreground bg-muted",
440
- )}
441
- aria-pressed={codeShown}
442
- aria-label={codeShown ? "Hide code" : "Show code"}
443
- onClick={toggleShowCode}
444
- >
445
- <CodeIcon className="h-4 w-4" />
446
- </Button>
447
- </Tooltip>
448
- )}
449
- <Tooltip content="Fullscreen (F)">
491
+ </div>
492
+ )}
493
+ <div className="absolute top-2 right-2 z-20 opacity-0 group-hover:opacity-70 text-muted-foreground transition-opacity">
494
+ {codeToggleEnabled && (
495
+ <Tooltip content={codeShown ? "Hide code (C)" : "Show code (C)"}>
450
496
  <Button
451
- data-testid="marimo-plugin-slides-fullscreen"
497
+ data-testid="marimo-plugin-slides-toggle-code"
452
498
  variant="ghost"
453
499
  size="icon"
454
- className="text-muted-foreground h-7 w-7"
455
- aria-label="Enter fullscreen"
456
- onClick={() => {
457
- deckRef.current
458
- ?.getViewportElement()
459
- ?.requestFullscreen()
460
- .catch((error) => {
461
- Logger.error("Failed to request fullscreen", error);
462
- });
463
- }}
500
+ className={cn(
501
+ "text-muted-foreground h-7 w-7",
502
+ codeShown && "text-foreground bg-muted",
503
+ )}
504
+ aria-pressed={codeShown}
505
+ aria-label={codeShown ? "Hide code" : "Show code"}
506
+ onClick={toggleShowCode}
464
507
  >
465
- <ExpandIcon className="h-4 w-4" />
508
+ <CodeIcon className="h-4 w-4" />
466
509
  </Button>
467
510
  </Tooltip>
468
- </div>
511
+ )}
512
+ <Tooltip content="Fullscreen (F)">
513
+ <Button
514
+ data-testid="marimo-plugin-slides-fullscreen"
515
+ variant="ghost"
516
+ size="icon"
517
+ className="text-muted-foreground h-7 w-7"
518
+ aria-label="Enter fullscreen"
519
+ onClick={() => {
520
+ deckRef.current
521
+ ?.getViewportElement()
522
+ ?.requestFullscreen()
523
+ .catch((error) => {
524
+ Logger.error("Failed to request fullscreen", error);
525
+ });
526
+ }}
527
+ >
528
+ <ExpandIcon className="h-4 w-4" />
529
+ </Button>
530
+ </Tooltip>
469
531
  </div>
470
532
  </div>
533
+ </div>
534
+ );
535
+
536
+ if (mode === "read") {
537
+ return (
538
+ <div className="flex-1 min-w-0 flex flex-row gap-3">{slideArea}</div>
539
+ );
540
+ }
471
541
 
472
- {mode !== "read" && (
473
- <SlideSidebar
474
- configWidth={configWidth}
475
- layout={layout}
476
- setLayout={setLayout}
477
- activeConfigCell={activeConfigCell}
542
+ return (
543
+ <div className="flex-1 min-w-0 flex flex-row gap-3">
544
+ <PanelGroup
545
+ direction="vertical"
546
+ autoSaveId="marimo:slides:notes-panel"
547
+ className="flex-1 min-w-0"
548
+ >
549
+ <Panel defaultSize={92} minSize={60}>
550
+ {slideArea}
551
+ </Panel>
552
+ <PanelResizeHandle
553
+ className="mo-slides-notes-resize"
554
+ hitAreaMargins={{ coarse: 12, fine: 4 }}
478
555
  />
479
- )}
556
+ <Panel
557
+ defaultSize={10}
558
+ minSize={4}
559
+ collapsible={true}
560
+ collapsedSize={4}
561
+ >
562
+ <SlideNotesEditor
563
+ layout={layout}
564
+ setLayout={setLayout}
565
+ cellId={activeConfigCell?.id}
566
+ />
567
+ </Panel>
568
+ </PanelGroup>
569
+ <SlideSidebar
570
+ configWidth={configWidth}
571
+ layout={layout}
572
+ setLayout={setLayout}
573
+ activeConfigCell={activeConfigCell}
574
+ />
480
575
  </div>
481
576
  );
482
577
  };
@@ -0,0 +1,127 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { StickyNoteIcon } from "lucide-react";
4
+ import { useEffect, useRef, useState } from "react";
5
+ import useEvent from "react-use-event-hook";
6
+ import type { CellId } from "@/core/cells/ids";
7
+ import { useDebouncedCallback } from "@/hooks/useDebounce";
8
+ import { cn } from "@/utils/cn";
9
+ import { Events } from "@/utils/events";
10
+ import type { SlidesLayout } from "../editor/renderers/slides-layout/types";
11
+
12
+ interface SlideNotesEditorProps {
13
+ layout: SlidesLayout;
14
+ setLayout: (layout: SlidesLayout) => void;
15
+ cellId: CellId | undefined;
16
+ className?: string;
17
+ }
18
+
19
+ const PERSIST_DELAY_MS = 300;
20
+
21
+ export const SlideNotesEditor = ({
22
+ layout,
23
+ setLayout,
24
+ cellId,
25
+ className,
26
+ }: SlideNotesEditorProps) => {
27
+ const initialValue = cellId
28
+ ? (layout.cells.get(cellId)?.speakerNotes ?? "")
29
+ : "";
30
+
31
+ const [draft, setDraft] = useState(initialValue);
32
+
33
+ // Tracks whether the user has typed something that hasn't been persisted
34
+ // yet. Used to decide if the textarea is safe to overwrite from props.
35
+ const hasPendingEditRef = useRef(false);
36
+
37
+ // The debounced callback takes `(cellId, text)` so a `flush()` replays with
38
+ // the latest args — which means the in-flight text lands on the slide it
39
+ // was typed for, even if `cellId` has since changed.
40
+ const persistImmediate = useEvent((targetCellId: CellId, next: string) => {
41
+ hasPendingEditRef.current = false;
42
+ const existing = layout.cells.get(targetCellId);
43
+ if ((existing?.speakerNotes ?? "") === next) {
44
+ return;
45
+ }
46
+ const newCells = new Map(layout.cells);
47
+ newCells.set(targetCellId, { ...existing, speakerNotes: next });
48
+ setLayout({ ...layout, cells: newCells });
49
+ });
50
+
51
+ const persistDebounced = useDebouncedCallback(
52
+ persistImmediate,
53
+ PERSIST_DELAY_MS,
54
+ );
55
+
56
+ // Keep the textarea in sync with `layout`:
57
+ // - On slide switch, flush any in-flight edit to the *previous* slide before
58
+ // adopting the new slide's notes.
59
+ // - On same-slide updates (e.g. future undo/redo or external setLayout
60
+ // writers), adopt the new value only when the user isn't mid-edit so
61
+ // pending keystrokes aren't clobbered.
62
+ const prevCellIdRef = useRef(cellId);
63
+ useEffect(() => {
64
+ if (prevCellIdRef.current !== cellId) {
65
+ persistDebounced.flush();
66
+ hasPendingEditRef.current = false;
67
+ setDraft(initialValue);
68
+ prevCellIdRef.current = cellId;
69
+ return;
70
+ }
71
+ if (!hasPendingEditRef.current && initialValue !== draft) {
72
+ setDraft(initialValue);
73
+ }
74
+ }, [cellId, initialValue, draft, persistDebounced]);
75
+
76
+ // Flush on unmount so closing the panel / navigating away doesn't lose text.
77
+ useEffect(() => {
78
+ return () => {
79
+ persistDebounced.flush();
80
+ };
81
+ }, [persistDebounced]);
82
+
83
+ const handleChange = (next: string) => {
84
+ setDraft(next);
85
+ if (cellId) {
86
+ hasPendingEditRef.current = true;
87
+ persistDebounced(cellId, next);
88
+ }
89
+ };
90
+
91
+ return (
92
+ <section
93
+ className={cn(
94
+ "h-full min-h-0 flex flex-col bg-muted/40 dark:bg-muted/20 border-t",
95
+ className,
96
+ )}
97
+ aria-label="Speaker notes"
98
+ // Keep keystrokes inside the textarea from advancing the reveal.js deck.
99
+ onKeyDown={(e) => e.stopPropagation()}
100
+ >
101
+ <header className="flex items-center gap-1.5 px-3 h-8 shrink-0 text-xs font-medium uppercase tracking-wide text-muted-foreground">
102
+ <StickyNoteIcon className="h-3.5 w-3.5" />
103
+ <span>Speaker notes</span>
104
+ </header>
105
+ <div className="flex-1 min-h-0 p-2">
106
+ {cellId ? (
107
+ <textarea
108
+ value={draft}
109
+ onChange={(event) => handleChange(event.target.value)}
110
+ onClick={Events.stopPropagation()}
111
+ placeholder="Add notes for this slide. Visible to you in speaker view (press S during presentation)."
112
+ className={cn(
113
+ "h-full w-full resize-none rounded-sm border border-input/25 bg-background",
114
+ "px-3 py-2 text-sm leading-relaxed text-foreground placeholder:text-muted-foreground",
115
+ "ring-offset-background focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:border-accent",
116
+ )}
117
+ aria-label="Speaker notes for the current slide"
118
+ />
119
+ ) : (
120
+ <div className="h-full flex items-center justify-center text-xs text-muted-foreground">
121
+ Select a slide to add notes.
122
+ </div>
123
+ )}
124
+ </div>
125
+ </section>
126
+ );
127
+ };
@@ -0,0 +1,64 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import type { CellId } from "@/core/cells/ids";
4
+ import type { SlideConfig } from "../editor/renderers/slides-layout/types";
5
+ import type { ComposedSubslide } from "./compose-slides";
6
+
7
+ /** Lone-line marker between blocks; `<NotesAside>` renders this as `<hr>`. */
8
+ export const NOTES_DIVIDER = "---";
9
+
10
+ const BLOCK_JOIN = `\n\n${NOTES_DIVIDER}\n\n`;
11
+
12
+ export const collectBlockNotes = <C extends { id: CellId }>(
13
+ cells: readonly C[],
14
+ slideConfigs: ReadonlyMap<CellId, SlideConfig>,
15
+ ): string =>
16
+ cells
17
+ .map((cell) => slideConfigs.get(cell.id)?.speakerNotes ?? "")
18
+ .filter((note) => note.trim().length > 0)
19
+ .join("\n\n");
20
+
21
+ export interface SubslideNotes {
22
+ /** Notes shown when no fragment is current. */
23
+ slideLevel: string;
24
+ /** Cumulative notes for each fragment block, keyed by block index. */
25
+ cumulativeByBlock: Map<number, string>;
26
+ }
27
+
28
+ /**
29
+ * Per-fragment cumulative notes: slide-level notes plus each revealed
30
+ * fragment's notes, separated by a horizontal-rule line.
31
+ */
32
+ export const buildSubslideNotes = <C extends { id: CellId }>(
33
+ subslide: ComposedSubslide<C>,
34
+ slideConfigs: ReadonlyMap<CellId, SlideConfig>,
35
+ ): SubslideNotes => {
36
+ const blockNotes = subslide.blocks.map((block) =>
37
+ collectBlockNotes(block.cells, slideConfigs),
38
+ );
39
+
40
+ const slideLevel = subslide.blocks
41
+ .map((block, i) => (block.isFragment ? "" : blockNotes[i]))
42
+ .filter((note) => note.length > 0)
43
+ .join("\n\n");
44
+
45
+ const cumulativeByBlock = new Map<number, string>();
46
+ const revealsSoFar: string[] = [];
47
+ subslide.blocks.forEach((block, i) => {
48
+ if (!block.isFragment) {
49
+ return;
50
+ }
51
+ const myNotes = blockNotes[i];
52
+ if (myNotes.length > 0) {
53
+ revealsSoFar.push(myNotes);
54
+ }
55
+ const accumulated = [slideLevel, ...revealsSoFar]
56
+ .filter((s) => s.length > 0)
57
+ .join(BLOCK_JOIN);
58
+ if (accumulated.length > 0) {
59
+ cumulativeByBlock.set(i, accumulated);
60
+ }
61
+ });
62
+
63
+ return { slideLevel, cumulativeByBlock };
64
+ };