@marimo-team/islands 0.25.3-dev20 → 0.25.3-dev200

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 (688) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CNMliVzw.js → ConnectedDataExplorerComponent-BsWiIPFk.js} +22 -20
  2. package/dist/{ErrorBoundary-DAPIRYqd.js → ErrorBoundary-UWARECs-.js} +19 -19
  3. package/dist/{abnfDiagram-VCTEODGH-D-Ez91gV.js → abnfDiagram-VCTEODGH-I2x4Yu25.js} +2 -2
  4. package/dist/any-language-editor-BVFHDDQ3.js +75 -0
  5. package/dist/{architectureDiagram-5GKGNRK7-CTpcNtO8.js → architectureDiagram-5GKGNRK7-1bSQMKzK.js} +1 -1
  6. package/dist/{arrays-CN1djC4k.js → arrays-DoQ-AILx.js} +15 -27
  7. package/dist/assets/__vite-browser-external-BCJsx8QS.js +1 -0
  8. package/dist/assets/worker-DodjWT_Z.js +113 -0
  9. package/dist/{button-CvjkwdSk.js → button-BQRdqQi1.js} +199 -192
  10. package/dist/{capabilities-CQ5IjhzL.js → capabilities-C2QUNRXi.js} +2 -2
  11. package/dist/{chat-ui-DaHynk8g.js → chat-ui-DXDoSuS4.js} +370 -369
  12. package/dist/{check-EDwSwP89.js → check-C9Mp9eCK.js} +1 -1
  13. package/dist/{chunk-IMKFNOWR-DGxi-zeo.js → chunk-IMKFNOWR-fsCGAJ9G.js} +1 -1
  14. package/dist/{chunk-SHT3W25Y-CV9J3rAB.js → chunk-SHT3W25Y-D2STW4hj.js} +1 -1
  15. package/dist/{chunk-SVP7TREG-BL-9Fqgg.js → chunk-SVP7TREG-CiY7cQG-.js} +1 -1
  16. package/dist/{chunk-TICWLB2K-Cu_XMjDM.js → chunk-TICWLB2K-C_t5RBp9.js} +1 -1
  17. package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
  18. package/dist/{classDiagram-ZZMXUADV-BXXV13Hq.js → classDiagram-ZZMXUADV-B2JvZAP4.js} +2 -2
  19. package/dist/{classDiagram-v2-VYDZK3BY-B7FXJ1Cp.js → classDiagram-v2-VYDZK3BY-L8VsZG5A.js} +2 -2
  20. package/dist/code-visibility-33fxfX1p.js +134 -0
  21. package/dist/{common-DsUPhkD6.js → common-D09oJJ8Z.js} +6040 -5865
  22. package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-De584pZ4.js} +3 -3
  23. package/dist/{cynefinDiagram-5FMLGOSQ-CH96rwba.js → cynefinDiagram-5FMLGOSQ-DdllC264.js} +1 -1
  24. package/dist/{dagre-GXQ25YYZ-BD3PmpFY.js → dagre-GXQ25YYZ-BaWHw4_f.js} +1 -1
  25. package/dist/{data-grid-overlay-editor-D7UuVsgB.js → data-grid-overlay-editor-lGsInXfR.js} +5 -5
  26. package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-0PJ-9N5n.js} +1 -1
  27. package/dist/{diagram-S7CK7UJ4-BsSJJldB.js → diagram-S7CK7UJ4-pFt-tUDe.js} +1 -1
  28. package/dist/{diagram-UQ7AKVKN-muQtNZc4.js → diagram-UQ7AKVKN-DqGJiBp4.js} +1 -1
  29. package/dist/{diagram-VX7I27RA-CdhuZAqR.js → diagram-VX7I27RA-Dr-yzMjf.js} +1 -1
  30. package/dist/{diagram-Z3DM3KII-BD8mXjOj.js → diagram-Z3DM3KII-8xzJzv-w.js} +1 -1
  31. package/dist/{dialog-CEBFZNyc.js → dialog-DVRfQuhD.js} +25 -25
  32. package/dist/{dist-F8Ep36rk.js → dist-B1M0bGO3.js} +1 -1
  33. package/dist/{dist-D6d86eNJ.js → dist-BA13RJj5.js} +1 -1
  34. package/dist/{dist-Bvs24R_E.js → dist-BJtmSgcE.js} +48 -48
  35. package/dist/{dist-CN_BeG2I.js → dist-Ba2VIn1K.js} +53 -53
  36. package/dist/{dist-PXYI_yuP.js → dist-Bj4bmwUm.js} +12 -12
  37. package/dist/{dist-DoE4XJBC.js → dist-BmS-ZGjl.js} +8626 -8626
  38. package/dist/{dist-BorMD-uX.js → dist-Bzogh7CW.js} +87 -87
  39. package/dist/{dist-CN8zI-XC.js → dist-CThPVKaP.js} +1385 -1382
  40. package/dist/{dist-DiDibOYr.js → dist-CTi5FTiV.js} +87 -87
  41. package/dist/{dist-diIx5qJW.js → dist-Ck_C32ye.js} +2 -2
  42. package/dist/{dist-BLfKmR-l.js → dist-D1fnFp1J.js} +1 -1
  43. package/dist/{dist-OR1OnN-y.js → dist-D3x9__Fu.js} +46 -46
  44. package/dist/{dist-BMQf5zIS.js → dist-D7mrh5sO.js} +36 -36
  45. package/dist/{dist-CSJ0MDRw.js → dist-D9Q3xjiP.js} +1 -1
  46. package/dist/{dist-BuaRHxOc.js → dist-DP60Ubh8.js} +2 -2
  47. package/dist/{dist-CSbh1PNP.js → dist-DTv9KkpW.js} +12 -12
  48. package/dist/{dist-D-wwqlzJ.js → dist-DVVwOfrD.js} +109 -109
  49. package/dist/{dist-C8fAKSH1.js → dist-DYXM73-k.js} +36 -36
  50. package/dist/{dist-DBtSl3sf.js → dist-DjeybPOb.js} +1 -1
  51. package/dist/{dist-CrSP_H1M.js → dist-DtGn9N4h.js} +197 -197
  52. package/dist/{dist-CLdpGQVr.js → dist-KN80qWCP.js} +2 -2
  53. package/dist/{dist-DpBpA_n1.js → dist-Lm-D-Vr6.js} +3 -3
  54. package/dist/{dist-Cg7gzw-a.js → dist-O0qFpEJh.js} +56 -56
  55. package/dist/{dist-CkTTIdBe.js → dist-OUle2RT7.js} +207 -207
  56. package/dist/{dist-BK4Oj99o.js → dist-T5rh6JvL.js} +1 -1
  57. package/dist/{dropdown-menu-CP_qCYHC.js → dropdown-menu-NlnsmNA6.js} +1481 -1433
  58. package/dist/{ebnfDiagram-PWID7BFC-BIN1sweE.js → ebnfDiagram-PWID7BFC-Br04Wy-E.js} +2 -2
  59. package/dist/{erDiagram-RLTQ6QDP-Ctp5cfoN.js → erDiagram-RLTQ6QDP-D5-XVgvv.js} +1 -1
  60. package/dist/{error-banner-D-WCIiMt.js → error-banner-DxJ3s8YO.js} +86 -86
  61. package/dist/{error-entries-Bv6bZPF3.js → error-entries-C2Ux0Fjt.js} +8404 -9095
  62. package/dist/{esm-D2gTsXEV.js → esm-Bbw_Njjx.js} +575 -575
  63. package/dist/{esm-AMFssoNp.js → esm-mDQNEFe_.js} +354 -354
  64. package/dist/feedback-button-B0CMhVv7.js +374 -0
  65. package/dist/{flowDiagram-HODETNUW-3EfLrlFb.js → flowDiagram-HODETNUW-CVl2kREF.js} +2 -2
  66. package/dist/{formats-27CW_UP4.js → formats-BCYthwyc.js} +3 -3
  67. package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
  68. package/dist/{glide-data-editor-KvS90MGh.js → glide-data-editor-CL535A5q.js} +370 -368
  69. package/dist/{glide-utils-DJyqh0EM.js → glide-utils-D98laidb.js} +16 -16
  70. package/dist/{globals-yruoELTW.js → globals-Bsr6T2yD.js} +3 -3
  71. package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
  72. package/dist/{html-to-image-Bf8QMGi4.js → html-to-image-CkH7vdBZ.js} +477 -380
  73. package/dist/{infoDiagram-27XIBGKW-DipQoHxl.js → infoDiagram-27XIBGKW-BJ4vNcZE.js} +1 -1
  74. package/dist/{ishikawaDiagram-5VMMS53U-DgFMjSGz.js → ishikawaDiagram-5VMMS53U-B_Jy1Dsm.js} +1 -1
  75. package/dist/{kanban-definition-UXKFOSKX-w1ACVjgl.js → kanban-definition-UXKFOSKX-C6MkS9vw.js} +1 -1
  76. package/dist/{label-BDKF3Afc.js → label-Qvw1E97W.js} +3 -3
  77. package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
  78. package/dist/{loader-BQOfjTIJ.js → loader-DOVB0Syl.js} +12 -12
  79. package/dist/main.js +9706 -7709
  80. package/dist/{mermaid-CHo49Yv-.js → mermaid-Bh918qrq.js} +52 -52
  81. package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
  82. package/dist/{mindmap-definition-YA3MSWOX-CrT0KSfX.js → mindmap-definition-YA3MSWOX-BP3ZTuir.js} +1 -1
  83. package/dist/{number-overlay-editor-R2i0FdxV.js → number-overlay-editor-CzbkG4E2.js} +3 -3
  84. package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
  85. package/dist/{once-BtE-wKRL.js → once-NnpX_HnX.js} +1 -1
  86. package/dist/{pegDiagram-XKGWAZYB-BqvywNJA.js → pegDiagram-XKGWAZYB-nNGOQtnt.js} +2 -2
  87. package/dist/{pieDiagram-E7YTZNPT-BfxJ_XCc.js → pieDiagram-E7YTZNPT-CpRz5BZz.js} +1 -1
  88. package/dist/precisionRound-DhAzeRcm.js +49 -0
  89. package/dist/{process-output-BZg56CCb.js → process-output-OujAtFW4.js} +5 -5
  90. package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
  91. package/dist/{railroadDiagram-O6MQD6OU-8vFLVTPu.js → railroadDiagram-O6MQD6OU-BqOEN4I0.js} +2 -2
  92. package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
  93. package/dist/{requirementDiagram-BXWQKSXE-a_MxGvxe.js → requirementDiagram-BXWQKSXE-CEfg6vu9.js} +1 -1
  94. package/dist/{reveal-component-C42-YBfQ.js → reveal-component-CbEK0sNX.js} +733 -710
  95. package/dist/{select-BButFi-d.js → select-2KOiReNY.js} +536 -457
  96. package/dist/{sequenceDiagram-WJ2MYXX4-CXFMnxGh.js → sequenceDiagram-WJ2MYXX4-IOmpQcOi.js} +1 -1
  97. package/dist/{spec-BwarBpUJ.js → spec-Dkp64vVQ.js} +41 -11
  98. package/dist/{stateDiagram-D77RDMKH-DQeA_CwI.js → stateDiagram-D77RDMKH-tgU-EY9_.js} +2 -2
  99. package/dist/{stateDiagram-v2-MP3YSRHH-BxxQucm1.js → stateDiagram-v2-MP3YSRHH-BofhG6q1.js} +2 -2
  100. package/dist/style.css +1 -1
  101. package/dist/{swimlanes-42K2YHIH-Do6L-cYg.js → swimlanes-42K2YHIH-DW4vWDBd.js} +1 -1
  102. package/dist/{swimlanesDiagram-VR7AAH4N-DUzPvSVU.js → swimlanesDiagram-VR7AAH4N-BJcrqUJr.js} +2 -2
  103. package/dist/{swiper-component-DKntyn8p.js → swiper-component-BVfnhbnt.js} +2 -2
  104. package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
  105. package/dist/{timeline-definition-24CTP7MA-D3c46WM5.js → timeline-definition-24CTP7MA-D_QU3NGs.js} +1 -1
  106. package/dist/{toDate-UtiwmnH2.js → toDate-BNDEXbfV.js} +44 -43
  107. package/dist/{toast-B9UMEi8u.js → toast-B5t9o6s_.js} +219 -201
  108. package/dist/{tooltip-BO1REbqs.js → tooltip-s4zZxwKe.js} +325 -301
  109. package/dist/{use-restore-focus-BEM7sFWl.js → use-restore-focus-BgDTd2tc.js} +1482 -1433
  110. package/dist/{useAsyncData-Deh5kszT.js → useAsyncData-ASDni9vH.js} +15 -14
  111. package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-D3Tkfzej.js} +2 -2
  112. package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-B1Ogyf53.js} +1 -1
  113. package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-6a_yDNXp.js} +1 -1
  114. package/dist/{useLifecycle-j7D9uD1o.js → useLifecycle-Bfpa2m7k.js} +28 -25
  115. package/dist/{useTheme-CRnjkku0.js → useTheme-5TwyOh3B.js} +522 -314
  116. package/dist/{vega-component-BeF9dfyO.js → vega-component-BHS9UOtC.js} +158 -158
  117. package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container--LYZqguO.js} +2 -2
  118. package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-B9Pz0EGP.js} +298 -507
  119. package/dist/{vennDiagram-4TSXK5OY-BSZD8JcZ.js → vennDiagram-4TSXK5OY-YFYsNIAh.js} +1 -1
  120. package/dist/{wardleyDiagram-VM6X3IG4-48cUWkfA.js → wardleyDiagram-VM6X3IG4-i_n8mAWC.js} +1 -1
  121. package/dist/{xychartDiagram-S5SC5T6Z-CswYgYeu.js → xychartDiagram-S5SC5T6Z-BYGN95wW.js} +2 -2
  122. package/package.json +16 -16
  123. package/src/__mocks__/document.tsx +63 -0
  124. package/src/__mocks__/notebook.ts +3 -4
  125. package/src/__mocks__/partial.ts +26 -0
  126. package/src/__mocks__/requests.ts +0 -3
  127. package/src/__tests__/main.test.tsx +24 -1
  128. package/src/__tests__/module-entry.test.ts +44 -0
  129. package/src/__tests__/mount.test.ts +1 -21
  130. package/src/__tests__/{host-imports.test.ts → replica-imports.test.ts} +12 -11
  131. package/src/components/ai/__tests__/ai-model-dropdown.test.tsx +63 -0
  132. package/src/components/ai/ai-model-dropdown.tsx +11 -6
  133. package/src/components/app-config/ai-config.tsx +7 -2
  134. package/src/components/app-config/app-config-form.tsx +5 -9
  135. package/src/components/app-config/user-config-form.tsx +35 -0
  136. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  137. package/src/components/chat/__tests__/notebook-access-selector.test.tsx +64 -0
  138. package/src/components/chat/acp/__tests__/session-tabs.test.tsx +43 -0
  139. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  140. package/src/components/chat/acp/blocks.tsx +3 -2
  141. package/src/components/chat/acp/session-tabs.tsx +8 -3
  142. package/src/components/chat/chat-components.tsx +2 -0
  143. package/src/components/chat/chat-panel.tsx +20 -101
  144. package/src/components/chat/chat-utils.ts +4 -8
  145. package/src/components/chat/notebook-access-selector.stories.tsx +22 -0
  146. package/src/components/chat/notebook-access-selector.tsx +100 -0
  147. package/src/components/data-table/TableBottomBar.tsx +4 -1
  148. package/src/components/data-table/TableTopBar.tsx +2 -0
  149. package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
  150. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  151. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  152. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  153. package/src/components/data-table/__tests__/data-table.test.tsx +1 -0
  154. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  155. package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
  156. package/src/components/data-table/__tests__/keyboard-selection.test.tsx +188 -0
  157. package/src/components/data-table/__tests__/pagination.test.tsx +28 -1
  158. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  159. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  160. package/src/components/data-table/cell-selection/feature.ts +2 -2
  161. package/src/components/data-table/cell-selection/types.ts +2 -2
  162. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  163. package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
  164. package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
  165. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  166. package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
  167. package/src/components/data-table/charts/charts.tsx +40 -30
  168. package/src/components/data-table/charts/storage.ts +16 -5
  169. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  170. package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
  171. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  172. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  173. package/src/components/data-table/columns.tsx +45 -46
  174. package/src/components/data-table/context-menu.tsx +36 -20
  175. package/src/components/data-table/data-table.tsx +17 -1
  176. package/src/components/data-table/date-popover.tsx +6 -4
  177. package/src/components/data-table/export-actions.tsx +76 -48
  178. package/src/components/data-table/pagination.tsx +44 -33
  179. package/src/components/data-table/range-focus/atoms.ts +4 -6
  180. package/src/components/data-table/range-focus/use-cell-range-selection.ts +65 -38
  181. package/src/components/data-table/range-focus/use-scroll-into-view.ts +21 -2
  182. package/src/components/data-table/renderers.tsx +16 -7
  183. package/src/components/data-table/row-viewer-panel/__tests__/row-viewer.test.tsx +24 -1
  184. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +4 -4
  185. package/src/components/data-table/search-highlight.tsx +79 -0
  186. package/src/components/data-table/types.ts +1 -0
  187. package/src/components/data-table/url-detector.tsx +49 -9
  188. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  189. package/src/components/datasources/__tests__/column-preview.test.tsx +96 -5
  190. package/src/components/datasources/__tests__/datasources-interactions.test.tsx +181 -0
  191. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  192. package/src/components/datasources/__tests__/utils.test.ts +57 -6
  193. package/src/components/datasources/column-preview.tsx +17 -12
  194. package/src/components/datasources/datasources.tsx +56 -43
  195. package/src/components/datasources/utils.ts +32 -23
  196. package/src/components/debugger/debugger-code.tsx +5 -0
  197. package/src/components/dependency-graph/custom-node.tsx +1 -1
  198. package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
  199. package/src/components/dependency-graph/elements.ts +24 -21
  200. package/src/components/dependency-graph/minimap-content.tsx +13 -19
  201. package/src/components/dependency-graph/panels.tsx +4 -2
  202. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
  203. package/src/components/editor/SortableCell.tsx +1 -3
  204. package/src/components/editor/__tests__/Output.test.tsx +50 -32
  205. package/src/{core/attachments/__tests__/toast.test.tsx → components/editor/__tests__/agent-toast.test.tsx} +1 -1
  206. package/src/components/editor/__tests__/data-attributes.test.tsx +28 -14
  207. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  208. package/src/components/editor/__tests__/output-persistence.test.tsx +6 -2
  209. package/src/components/editor/__tests__/package-alert.test.tsx +22 -1
  210. package/src/components/editor/actions/__tests__/name-cell-input.test.tsx +69 -0
  211. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +34 -8
  212. package/src/components/editor/actions/__tests__/pair-with-agent.test.tsx +2 -6
  213. package/src/components/editor/actions/name-cell-input.tsx +4 -3
  214. package/src/components/editor/actions/pair-with-agent-commands.ts +2 -2
  215. package/src/components/editor/actions/pair-with-agent-modal.tsx +19 -16
  216. package/src/components/editor/actions/useCellActionButton.tsx +26 -31
  217. package/src/components/editor/actions/useConfigActions.tsx +3 -4
  218. package/src/components/editor/actions/useNotebookActions.tsx +19 -23
  219. package/src/components/editor/actions/useRestartKernel.tsx +1 -1
  220. package/src/components/editor/actions/useSetCodeVisibility.ts +11 -12
  221. package/src/components/editor/actions/useSetOutputsExpanded.ts +14 -19
  222. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  223. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  224. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +1 -1
  225. package/src/components/editor/alerts/connection-notice.tsx +1 -1
  226. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  227. package/src/components/editor/alerts/stdin-blocking-alert.tsx +1 -1
  228. package/src/components/editor/app-container.tsx +1 -1
  229. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +1 -1
  230. package/src/components/editor/cell/CreateCellButton.tsx +15 -21
  231. package/src/components/editor/cell/DeleteButton.tsx +3 -2
  232. package/src/components/editor/cell/RunButton.tsx +2 -2
  233. package/src/components/editor/cell/StagedAICell.tsx +10 -2
  234. package/src/components/editor/cell/StopButton.tsx +2 -2
  235. package/src/components/editor/cell/__tests__/StagedAICell.test.tsx +3 -1
  236. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  237. package/src/components/editor/cell/cell-actions.tsx +12 -1
  238. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  239. package/src/components/editor/cell/code/cell-editor.tsx +36 -43
  240. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  241. package/src/components/editor/cell/collapse.tsx +11 -4
  242. package/src/components/editor/cell/useAddCell.ts +4 -8
  243. package/src/components/editor/cell/useDeleteCell.tsx +10 -36
  244. package/src/components/editor/cell/useRunCells.ts +2 -5
  245. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  246. package/src/components/editor/cell/useSplitCell.tsx +10 -6
  247. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +1 -1
  248. package/src/components/editor/chrome/components/feedback-button.tsx +2 -8
  249. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +31 -2
  250. package/src/components/editor/chrome/panels/__tests__/runtime-details.test.tsx +1 -1
  251. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +1 -1
  252. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  253. package/src/components/editor/chrome/panels/dependency-graph-panel.tsx +1 -1
  254. package/src/components/editor/chrome/panels/logs-panel.tsx +2 -1
  255. package/src/components/editor/chrome/panels/outline/__tests__/outline-keyboard.test.tsx +84 -0
  256. package/src/components/editor/chrome/panels/outline/floating-outline.tsx +39 -14
  257. package/src/components/editor/chrome/panels/outline/useActiveOutline.tsx +3 -2
  258. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  259. package/src/components/editor/chrome/panels/secrets-panel.tsx +1 -0
  260. package/src/components/editor/chrome/panels/session-panel.tsx +1 -1
  261. package/src/components/editor/chrome/panels/snippets-panel.tsx +10 -12
  262. package/src/components/editor/chrome/panels/variable-panel.tsx +1 -5
  263. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +9 -18
  264. package/src/components/editor/chrome/wrapper/__tests__/document-sync-status.test.tsx +92 -0
  265. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +61 -2
  266. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +4 -4
  267. package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
  268. package/src/components/editor/chrome/wrapper/footer-items/document-sync-status.tsx +54 -0
  269. package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +1 -1
  270. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +1 -1
  271. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  272. package/src/components/editor/chrome/wrapper/footer.tsx +2 -0
  273. package/src/components/editor/chrome/wrapper/minimap-state.ts +1 -1
  274. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  275. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  276. package/src/components/editor/columns/__tests__/cell-column.test.tsx +1 -1
  277. package/src/components/editor/columns/cell-column.tsx +1 -1
  278. package/src/components/editor/columns/sortable-column.tsx +2 -2
  279. package/src/components/editor/connections/components.tsx +5 -10
  280. package/src/components/editor/controls/Controls.tsx +4 -4
  281. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  282. package/src/components/editor/controls/__tests__/keyboard-shortcuts.test.tsx +61 -0
  283. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +10 -4
  284. package/src/components/editor/controls/command-palette.tsx +22 -10
  285. package/src/components/editor/controls/keyboard-shortcuts.tsx +14 -5
  286. package/src/components/editor/documentation.css +34 -11
  287. package/src/components/editor/dynamic-favicon.tsx +21 -40
  288. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +17 -29
  289. package/src/components/editor/errors/auto-fix.tsx +4 -8
  290. package/src/components/editor/errors/send-error-report-button.tsx +3 -6
  291. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  292. package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +47 -0
  293. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  294. package/src/components/editor/file-tree/file-explorer.tsx +48 -15
  295. package/src/components/editor/file-tree/file-name-input.tsx +1 -0
  296. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  297. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  298. package/src/components/editor/header/__tests__/status.test.tsx +5 -3
  299. package/src/components/editor/header/app-header.tsx +1 -1
  300. package/src/components/editor/header/status.tsx +40 -20
  301. package/src/components/editor/links/__tests__/cell-link.test.tsx +148 -0
  302. package/src/components/editor/links/cell-link-list.tsx +1 -1
  303. package/src/components/editor/links/cell-link.tsx +17 -7
  304. package/src/components/editor/navigation/__tests__/clipboard.test.ts +60 -38
  305. package/src/components/editor/navigation/__tests__/navigation.test.ts +108 -85
  306. package/src/components/editor/navigation/__tests__/selection.test.ts +43 -21
  307. package/src/components/editor/navigation/clipboard.ts +17 -14
  308. package/src/components/editor/navigation/focus-utils.ts +23 -4
  309. package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +17 -33
  310. package/src/components/editor/navigation/navigation.ts +71 -70
  311. package/src/components/editor/navigation/selection.ts +30 -29
  312. package/src/components/editor/notebook-banner.tsx +1 -0
  313. package/src/components/editor/notebook-cell.tsx +29 -31
  314. package/src/components/editor/output/MarimoErrorOutput.tsx +2 -1
  315. package/src/components/editor/output/MarimoTracebackOutput.tsx +19 -17
  316. package/src/components/editor/output/Outputs.css +8 -0
  317. package/src/components/editor/output/__tests__/traceback.test.tsx +27 -1
  318. package/src/components/editor/output/ansi-reduce.ts +33 -20
  319. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  320. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +125 -69
  321. package/src/components/editor/package-alert.tsx +14 -7
  322. package/src/components/editor/renderers/cell-array.tsx +22 -33
  323. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
  324. package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +0 -1
  325. package/src/components/editor/renderers/slides-layout/slides-layout.tsx +1 -1
  326. package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +4 -4
  327. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  328. package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +1 -1
  329. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +1 -1
  330. package/src/components/editor/stdin-blocking-alert.tsx +1 -1
  331. package/src/components/home/components.tsx +17 -31
  332. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  333. package/src/components/icons/large-spinner.tsx +3 -14
  334. package/src/components/icons/spinner.tsx +1 -1
  335. package/src/components/markdown/markdown-renderer.tsx +4 -8
  336. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  337. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  338. package/src/components/pages/edit-page.tsx +19 -17
  339. package/src/components/pages/home-page.tsx +164 -91
  340. package/src/components/scratchpad/scratchpad.test.tsx +97 -0
  341. package/src/components/scratchpad/scratchpad.tsx +20 -11
  342. package/src/components/slides/__tests__/minimap-actions.test.tsx +22 -29
  343. package/src/components/slides/__tests__/minimap.test.ts +38 -19
  344. package/src/components/slides/__tests__/slide-scroll-hint.test.tsx +37 -0
  345. package/src/components/slides/minimap.tsx +17 -12
  346. package/src/components/slides/reveal-component.tsx +58 -26
  347. package/src/components/slides/reveal-slides.css +5 -4
  348. package/src/components/slides/slide-cell-view.tsx +4 -5
  349. package/src/components/slides/slide-form.tsx +1 -0
  350. package/src/components/slides/slide-scroll-hint.tsx +3 -1
  351. package/src/components/sort/SortableCellsProvider.tsx +8 -25
  352. package/src/components/tracing/tracing-keyboard.test.tsx +85 -0
  353. package/src/components/tracing/tracing.tsx +46 -42
  354. package/src/components/ui/__tests__/draggable-popover.test.tsx +24 -0
  355. package/src/components/ui/__tests__/range-slider.test.tsx +165 -0
  356. package/src/components/ui/alert-dialog.tsx +1 -1
  357. package/src/components/ui/draggable-popover.tsx +24 -2
  358. package/src/components/ui/range-slider.tsx +22 -9
  359. package/src/core/MarimoApp.tsx +1 -1
  360. package/src/core/ai/__tests__/staged-cells.test.ts +27 -26
  361. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +8 -12
  362. package/src/core/ai/context/providers/cell-output.ts +2 -2
  363. package/src/core/ai/context/providers/datasource.ts +6 -2
  364. package/src/core/ai/staged-cells.ts +15 -18
  365. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +40 -88
  366. package/src/core/ai/tools/__tests__/registry.test.ts +17 -0
  367. package/src/core/ai/tools/base.ts +18 -15
  368. package/src/core/ai/tools/edit-notebook-tool.ts +86 -80
  369. package/src/core/ai/tools/registry.ts +13 -10
  370. package/src/core/ai/tools/sample-tool.ts +6 -7
  371. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -37
  372. package/src/core/cells/__tests__/actions.test.ts +624 -35
  373. package/src/core/cells/__tests__/add-missing-import.test.ts +7 -8
  374. package/src/core/cells/__tests__/arrange.test.ts +432 -0
  375. package/src/core/cells/__tests__/cell.test.ts +39 -0
  376. package/src/core/cells/__tests__/cells.test.ts +218 -2491
  377. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  378. package/src/core/cells/__tests__/document.test.ts +341 -0
  379. package/src/core/cells/__tests__/editor.test.ts +57 -0
  380. package/src/core/cells/__tests__/flush-document.test.ts +40 -0
  381. package/src/core/cells/__tests__/harness.ts +106 -0
  382. package/src/core/cells/__tests__/layout.test.ts +177 -0
  383. package/src/core/cells/__tests__/notebook-outline.test.ts +120 -0
  384. package/src/core/cells/__tests__/outputs.test.tsx +71 -53
  385. package/src/core/cells/__tests__/session.test.ts +445 -211
  386. package/src/core/cells/__tests__/utils.test.ts +9 -108
  387. package/src/core/cells/__tests__/with-document-save.test.ts +67 -0
  388. package/src/core/cells/actions.ts +636 -6
  389. package/src/core/cells/add-missing-import.ts +47 -43
  390. package/src/core/cells/arrange.ts +529 -0
  391. package/src/core/cells/cell.ts +14 -3
  392. package/src/core/cells/cells.ts +120 -1337
  393. package/src/core/cells/columns.ts +38 -0
  394. package/src/core/cells/document.ts +289 -0
  395. package/src/core/cells/edit.ts +30 -0
  396. package/src/core/cells/editor.ts +82 -0
  397. package/src/core/cells/layout.ts +221 -0
  398. package/src/core/cells/outputs.ts +12 -28
  399. package/src/core/cells/pending-delete-service.ts +3 -7
  400. package/src/core/cells/session.ts +76 -53
  401. package/src/core/cells/types.ts +22 -6
  402. package/src/core/cells/utils.ts +10 -8
  403. package/src/core/codemirror/__tests__/setup.test.ts +29 -29
  404. package/src/core/codemirror/ai/__tests__/resources.test.ts +117 -0
  405. package/src/core/codemirror/ai/resources.ts +1 -1
  406. package/src/core/codemirror/cells/__tests__/extensions.test.ts +42 -1
  407. package/src/core/codemirror/cells/extensions.ts +27 -9
  408. package/src/core/codemirror/cells/state.ts +1 -1
  409. package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +6 -7
  410. package/src/core/codemirror/copilot/getCodes.ts +2 -2
  411. package/src/core/codemirror/format.ts +6 -5
  412. package/src/core/codemirror/keymaps/vim.ts +4 -8
  413. package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
  414. package/src/core/codemirror/language/__tests__/utils.test.ts +187 -15
  415. package/src/core/codemirror/language/cell-code.ts +114 -0
  416. package/src/core/codemirror/language/extension.ts +52 -35
  417. package/src/core/codemirror/language/languages/markdown.ts +8 -6
  418. package/src/core/codemirror/language/languages/python.ts +16 -10
  419. package/src/core/codemirror/language/languages/sql/sql.ts +16 -24
  420. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  421. package/src/core/codemirror/language/types.ts +7 -7
  422. package/src/core/codemirror/language/utils.ts +9 -39
  423. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -2
  424. package/src/core/codemirror/lsp/notebook-lsp.ts +6 -5
  425. package/src/core/codemirror/lsp/utils.ts +1 -1
  426. package/src/core/codemirror/readonly/__tests__/extension.test.ts +1 -1
  427. package/src/core/codemirror/readonly/extension.ts +2 -2
  428. package/src/core/codemirror/rtc/extension.ts +24 -13
  429. package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
  430. package/src/core/codemirror/rtc/loro/sync.ts +1 -0
  431. package/src/core/codemirror/utils.ts +1 -0
  432. package/src/core/config/__tests__/app-config.test.ts +64 -0
  433. package/src/core/config/__tests__/config-schema.test.ts +13 -6
  434. package/src/core/config/config-schema.ts +13 -3
  435. package/src/core/config/config.ts +26 -12
  436. package/src/core/datasets/__tests__/data-source-discovery.test.ts +5 -5
  437. package/src/core/datasets/data-source-discovery.ts +4 -6
  438. package/src/core/documentation/doc-lookup.ts +1 -1
  439. package/src/core/edit-app.tsx +21 -28
  440. package/src/core/errors/error-entries.ts +4 -1
  441. package/src/core/export/hooks.ts +1 -1
  442. package/src/core/export/layout.ts +2 -2
  443. package/src/core/hotkeys/actions.ts +2 -4
  444. package/src/core/islands/__tests__/bootstrap.test.ts +69 -43
  445. package/src/core/islands/__tests__/bridge.test.ts +72 -25
  446. package/src/core/islands/bootstrap.ts +46 -54
  447. package/src/core/islands/bridge.ts +74 -23
  448. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  449. package/src/core/islands/components/web-components.tsx +1 -1
  450. package/src/core/islands/worker/__tests__/controller.test.ts +62 -4
  451. package/src/core/islands/worker/controller.ts +4 -10
  452. package/src/core/islands/worker/worker.tsx +33 -33
  453. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  454. package/src/core/kernel/__tests__/handlers.test.ts +7 -153
  455. package/src/core/kernel/handlers.ts +19 -72
  456. package/src/core/meta/__tests__/code-visibility.test.tsx +78 -70
  457. package/src/core/meta/code-visibility.ts +18 -9
  458. package/src/core/network/__tests__/connection.test.ts +1 -1
  459. package/src/core/network/__tests__/requests-lazy.test.ts +1 -3
  460. package/src/core/network/connection-notice.ts +1 -1
  461. package/src/core/network/connection.ts +1 -1
  462. package/src/core/network/requests-lazy.ts +1 -4
  463. package/src/core/network/requests-network.ts +0 -25
  464. package/src/core/network/requests-static.ts +0 -3
  465. package/src/core/network/requests-toasting.tsx +0 -3
  466. package/src/core/network/types.ts +0 -12
  467. package/src/core/network/useConnectionNotice.ts +8 -2
  468. package/src/core/notebook/__tests__/operations.test.ts +51 -0
  469. package/src/core/notebook/attachments.ts +38 -0
  470. package/src/core/notebook/document/__tests__/codemirror.test.ts +586 -0
  471. package/src/core/notebook/document/__tests__/draft.test.ts +363 -0
  472. package/src/core/notebook/document/__tests__/fixtures.ts +92 -0
  473. package/src/core/notebook/document/__tests__/hold.test.ts +88 -0
  474. package/src/core/notebook/document/__tests__/hooks.test.tsx +391 -0
  475. package/src/core/notebook/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  476. package/src/core/notebook/document/__tests__/model.test.ts +247 -0
  477. package/src/core/notebook/document/__tests__/protocol-fixtures.ts +38 -0
  478. package/src/core/notebook/document/__tests__/recovery-scenarios.test.ts +230 -0
  479. package/src/core/notebook/document/__tests__/scenario-fixture.ts +43 -0
  480. package/src/core/notebook/document/__tests__/scenarios.test.ts +205 -0
  481. package/src/core/notebook/document/__tests__/state.test.ts +459 -0
  482. package/src/core/notebook/document/__tests__/submission.test.ts +203 -0
  483. package/src/core/notebook/document/__tests__/test-host.test.ts +92 -0
  484. package/src/core/notebook/document/__tests__/test-host.ts +247 -0
  485. package/src/core/notebook/document/__tests__/test-notebook.ts +149 -0
  486. package/src/core/notebook/document/__tests__/user.ts +61 -0
  487. package/src/core/notebook/document/codemirror.ts +216 -0
  488. package/src/core/notebook/document/draft.ts +502 -0
  489. package/src/core/notebook/document/hooks.tsx +118 -0
  490. package/src/core/notebook/document/index.ts +24 -0
  491. package/src/core/notebook/document/model.ts +105 -0
  492. package/src/core/notebook/document/select.ts +41 -0
  493. package/src/core/notebook/document/state.ts +378 -0
  494. package/src/core/notebook/document/sync.ts +418 -0
  495. package/src/core/notebook/index.ts +19 -0
  496. package/src/core/notebook/operations.ts +30 -0
  497. package/src/core/notebook/replica/AGENTS.md +11 -0
  498. package/src/core/notebook/replica/__tests__/attachments.test.ts +56 -0
  499. package/src/core/{host → notebook/replica}/__tests__/document.test.ts +18 -16
  500. package/src/core/notebook/replica/__tests__/fixtures.ts +79 -0
  501. package/src/core/notebook/replica/__tests__/replica.test.ts +550 -0
  502. package/src/core/notebook/replica/backend.ts +19 -0
  503. package/src/core/notebook/replica/connection.ts +42 -0
  504. package/src/core/notebook/replica/index.ts +13 -0
  505. package/src/core/notebook/replica/replica.ts +286 -0
  506. package/src/core/notebook/replica/resources/attachments.ts +22 -0
  507. package/src/core/{host → notebook/replica}/resources/document.ts +4 -4
  508. package/src/core/packages/__tests__/useSandboxController.test.tsx +1 -1
  509. package/src/core/packages/useSandboxController.ts +1 -1
  510. package/src/core/run-app.tsx +48 -51
  511. package/src/core/runtime/__tests__/adapter.test.ts +1 -1
  512. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  513. package/src/core/runtime/__tests__/runtime.test.ts +32 -58
  514. package/src/core/runtime/adapter.ts +1 -1
  515. package/src/core/runtime/config.ts +2 -2
  516. package/src/core/runtime/runtime.ts +38 -42
  517. package/src/core/runtime/types.ts +0 -2
  518. package/src/core/saving/__tests__/state.test.ts +111 -0
  519. package/src/core/saving/__tests__/useAutoSave.test.tsx +67 -0
  520. package/src/core/saving/filename.ts +1 -1
  521. package/src/core/saving/save-component.tsx +28 -36
  522. package/src/core/saving/state.ts +38 -39
  523. package/src/core/saving/useAutoSave.ts +17 -53
  524. package/src/core/session/__tests__/backend.test.ts +236 -0
  525. package/src/core/session/__tests__/useNotebookReplica.hook.test.tsx +184 -0
  526. package/src/core/session/__tests__/useNotebookSession.hook.test.tsx +663 -0
  527. package/src/core/session/active-notebook.ts +22 -0
  528. package/src/core/session/backend.ts +123 -0
  529. package/src/core/session/embedded.ts +7 -0
  530. package/src/core/{websocket → session}/types.ts +2 -2
  531. package/src/core/session/useNotebookReplica.ts +74 -0
  532. package/src/core/{websocket → session}/useNotebookSession.tsx +77 -72
  533. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  534. package/src/core/state/jotai.ts +1 -1
  535. package/src/core/static/__tests__/files.test.ts +38 -10
  536. package/src/core/static/files.ts +2 -0
  537. package/src/core/{websocket → transports}/__tests__/connection-state.test.ts +1 -13
  538. package/src/core/transports/__tests__/server.test.ts +408 -0
  539. package/src/core/transports/__tests__/static.test.ts +306 -0
  540. package/src/core/transports/__tests__/wasm.test.ts +166 -0
  541. package/src/core/{websocket → transports}/connection-state.ts +9 -16
  542. package/src/core/transports/server.ts +152 -0
  543. package/src/core/transports/static.ts +166 -0
  544. package/src/core/transports/wasm.ts +97 -0
  545. package/src/core/wasm/__tests__/bridge.test.ts +214 -50
  546. package/src/core/wasm/__tests__/worker.test.ts +187 -0
  547. package/src/core/wasm/bridge.ts +75 -69
  548. package/src/core/wasm/rpc.ts +15 -3
  549. package/src/core/wasm/store.ts +3 -3
  550. package/src/core/wasm/worker/bootstrap.ts +55 -51
  551. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  552. package/src/core/wasm/worker/save-worker.ts +9 -10
  553. package/src/core/wasm/worker/types.ts +29 -18
  554. package/src/core/wasm/worker/worker.ts +88 -44
  555. package/src/css/globals.css +66 -22
  556. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  557. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  558. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  559. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  560. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  561. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  562. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  563. package/src/hooks/useAsyncData.ts +3 -3
  564. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  565. package/src/hooks/useDebounce.ts +6 -10
  566. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  567. package/src/hooks/useDelayElapsed.ts +14 -10
  568. package/src/hooks/useElapsedTime.ts +3 -3
  569. package/src/hooks/useEventListener.ts +1 -2
  570. package/src/hooks/useInputHistory.ts +4 -7
  571. package/src/hooks/useInternalStateWithSync.ts +6 -6
  572. package/src/hooks/useResizeObserver.ts +4 -7
  573. package/src/hooks/useScript.ts +67 -70
  574. package/src/hooks/useStateForKey.ts +93 -0
  575. package/src/mount.tsx +20 -15
  576. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  577. package/src/plugins/core/registerReactComponent.tsx +1 -1
  578. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  579. package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
  580. package/src/plugins/impl/DataTablePlugin.tsx +69 -37
  581. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  582. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  583. package/src/plugins/impl/FormPlugin.tsx +1 -1
  584. package/src/plugins/impl/RangeSliderPlugin.tsx +16 -2
  585. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  586. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  587. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +387 -1
  588. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  589. package/src/plugins/impl/__tests__/RangeSliderPlugin.test.tsx +109 -0
  590. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  591. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +153 -0
  592. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  593. package/src/plugins/impl/anywidget/model.ts +3 -1
  594. package/src/plugins/impl/anywidget/registry.ts +18 -14
  595. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  596. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  597. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  598. package/src/plugins/impl/chat/chat-ui.tsx +14 -11
  599. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  600. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  601. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  602. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  603. package/src/plugins/impl/data-explorer/components/column-summary.tsx +4 -2
  604. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  605. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
  606. package/src/plugins/impl/data-frames/__tests__/sidebar.test.tsx +160 -0
  607. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
  608. package/src/plugins/impl/data-frames/panel.tsx +43 -16
  609. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  610. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  611. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  612. package/src/plugins/impl/panel/utils.ts +17 -0
  613. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  614. package/src/plugins/impl/plotly/selection.ts +25 -19
  615. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  616. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  617. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  618. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  619. package/src/stories/button.stories.tsx +1 -0
  620. package/src/stories/cell.stories.tsx +2 -5
  621. package/src/stories/data-table.stories.tsx +31 -0
  622. package/src/stories/editor.stories.tsx +24 -17
  623. package/src/stories/form-wrapper.stories.tsx +2 -2
  624. package/src/stories/layout/vertical/one-column.stories.tsx +2 -5
  625. package/src/stories/runtime-story.tsx +23 -17
  626. package/src/stories/select.stories.tsx +2 -2
  627. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  628. package/src/utils/__tests__/arrays.test.ts +35 -0
  629. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  630. package/src/utils/__tests__/{createReducer.test.ts → createReducer.test.tsx} +29 -0
  631. package/src/utils/__tests__/numbers.test.ts +105 -1
  632. package/src/utils/__tests__/objects.test.ts +21 -0
  633. package/src/utils/arrays.ts +11 -2
  634. package/src/utils/blob.ts +1 -1
  635. package/src/utils/createReducer.ts +53 -26
  636. package/src/utils/maps.ts +0 -3
  637. package/src/utils/numbers.ts +79 -18
  638. package/src/utils/objects.ts +4 -9
  639. package/src/utils/once.ts +19 -19
  640. package/src/utils/tracer.ts +9 -5
  641. package/src/utils/zod-utils.ts +1 -3
  642. package/dist/any-language-editor-DZ_YTVus.js +0 -76
  643. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  644. package/dist/assets/worker-HPY9fbhz.js +0 -114
  645. package/dist/code-visibility-DkCqn-PO.js +0 -138
  646. package/dist/feedback-button-wnAMXOGA.js +0 -379
  647. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
  648. package/dist/precisionRound-DMIVQrt2.js +0 -97
  649. package/src/components/editor/navigation/__tests__/state.test.ts +0 -81
  650. package/src/components/editor/navigation/state.ts +0 -65
  651. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +0 -656
  652. package/src/core/ai/tools/run-cells-tool.ts +0 -303
  653. package/src/core/attachments/state.ts +0 -21
  654. package/src/core/cells/__tests__/apply-transaction.test.ts +0 -991
  655. package/src/core/cells/__tests__/document-changes.test.ts +0 -1140
  656. package/src/core/cells/__tests__/document-roundtrip.test.ts +0 -392
  657. package/src/core/cells/document-changes.ts +0 -944
  658. package/src/core/host/AGENTS.md +0 -11
  659. package/src/core/host/__tests__/events.test.ts +0 -46
  660. package/src/core/host/__tests__/fixtures.ts +0 -39
  661. package/src/core/host/__tests__/notebook-client.test.ts +0 -303
  662. package/src/core/host/__tests__/protocol.test.ts +0 -214
  663. package/src/core/host/__tests__/stream.test.ts +0 -211
  664. package/src/core/host/connection.ts +0 -81
  665. package/src/core/host/events.ts +0 -60
  666. package/src/core/host/notebook-client.ts +0 -272
  667. package/src/core/host/protocol.ts +0 -1943
  668. package/src/core/host/resources/resource.ts +0 -59
  669. package/src/core/host/stream.ts +0 -213
  670. package/src/core/state/__tests__/jotai.test.ts +0 -25
  671. package/src/core/wasm/worker/message-buffer.ts +0 -33
  672. package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
  673. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +0 -140
  674. package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +0 -883
  675. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  676. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
  677. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  678. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  679. package/src/core/websocket/transports/basic.ts +0 -102
  680. package/src/core/websocket/transports/create.ts +0 -31
  681. package/src/core/websocket/transports/sse.ts +0 -308
  682. package/src/core/websocket/transports/transport.ts +0 -50
  683. package/src/core/websocket/transports/ws.ts +0 -98
  684. package/src/core/websocket/useNotebookClient.ts +0 -80
  685. package/src/utils/__tests__/id-tree.test.ts +0 -2145
  686. package/src/utils/id-tree.tsx +0 -1134
  687. /package/src/{core/attachments/toast.ts → components/editor/agent-toast.ts} +0 -0
  688. /package/src/core/{websocket → session}/connection-utils.ts +0 -0
@@ -4,7 +4,7 @@ import { renderHook, act } from "@testing-library/react";
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
5
  import type { CellId } from "@/core/cells/ids";
6
6
  import type { DragMoveEvent } from "@dnd-kit/core";
7
- import { MultiColumn } from "@/utils/id-tree";
7
+ import type { CellColumnId, Layout } from "@/core/cells/layout";
8
8
  import { exportedForTesting } from "../minimap";
9
9
 
10
10
  const { useVisibleCellIds, projectDropTarget, resolveDropTarget } =
@@ -318,15 +318,23 @@ describe("resolveDropTarget", () => {
318
318
  const C = "c" as CellId;
319
319
  const D = "d" as CellId;
320
320
 
321
- function makeSingleColumnIds(...ids: CellId[]) {
322
- return MultiColumn.from([ids]);
321
+ function makeLayout(...columns: CellId[][]): Layout {
322
+ return {
323
+ columns: columns.map((ids, index) => ({
324
+ id: `column-${index}` as CellColumnId,
325
+ ids,
326
+ visible: ids,
327
+ folds: new Map(),
328
+ })),
329
+ };
323
330
  }
331
+ const makeSingleColumnIds = (...ids: CellId[]) => makeLayout(ids);
324
332
 
325
333
  it("returns null when activeId matches target overId", () => {
326
- const cellIds = makeSingleColumnIds(A, B);
334
+ const layout = makeSingleColumnIds(A, B);
327
335
  expect(
328
336
  resolveDropTarget({
329
- cellIds,
337
+ layout,
330
338
  activeId: A,
331
339
  target: { overId: A, position: "after" },
332
340
  }),
@@ -334,68 +342,79 @@ describe("resolveDropTarget", () => {
334
342
  });
335
343
 
336
344
  it("returns null for multi-column layouts", () => {
337
- const cellIds = MultiColumn.from([[A, B], [C]]);
345
+ const layout = makeLayout([A, B], [C]);
338
346
  expect(
339
347
  resolveDropTarget({
340
- cellIds,
348
+ layout,
341
349
  activeId: A,
342
350
  target: { overId: B, position: "after" },
343
351
  }),
344
352
  ).toBeNull();
345
353
  });
346
354
 
355
+ it("returns null when the over cell has left the layout", () => {
356
+ const layout = makeSingleColumnIds(A, B);
357
+ expect(
358
+ resolveDropTarget({
359
+ layout,
360
+ activeId: A,
361
+ target: { overId: C, position: "after" },
362
+ }),
363
+ ).toBeNull();
364
+ });
365
+
347
366
  it('resolves "before" to the over index', () => {
348
- const cellIds = makeSingleColumnIds(A, B, C);
367
+ const layout = makeSingleColumnIds(A, B, C);
349
368
  const result = resolveDropTarget({
350
- cellIds,
369
+ layout,
351
370
  activeId: A,
352
371
  target: { overId: C, position: "before" },
353
372
  });
354
373
  expect(result).toEqual({
355
374
  cellId: A,
356
- columnId: cellIds.atOrThrow(0).id,
375
+ columnId: layout.columns[0].id,
357
376
  index: 2,
358
377
  });
359
378
  });
360
379
 
361
380
  it('resolves "after" to one past the over index', () => {
362
- const cellIds = makeSingleColumnIds(A, B, C);
381
+ const layout = makeSingleColumnIds(A, B, C);
363
382
  const result = resolveDropTarget({
364
- cellIds,
383
+ layout,
365
384
  activeId: C,
366
385
  target: { overId: A, position: "after" },
367
386
  });
368
387
  expect(result).toEqual({
369
388
  cellId: C,
370
- columnId: cellIds.atOrThrow(0).id,
389
+ columnId: layout.columns[0].id,
371
390
  index: 1,
372
391
  });
373
392
  });
374
393
 
375
394
  it('resolves "before" on first item to index 0', () => {
376
- const cellIds = makeSingleColumnIds(A, B, C);
395
+ const layout = makeSingleColumnIds(A, B, C);
377
396
  const result = resolveDropTarget({
378
- cellIds,
397
+ layout,
379
398
  activeId: C,
380
399
  target: { overId: A, position: "before" },
381
400
  });
382
401
  expect(result).toEqual({
383
402
  cellId: C,
384
- columnId: cellIds.atOrThrow(0).id,
403
+ columnId: layout.columns[0].id,
385
404
  index: 0,
386
405
  });
387
406
  });
388
407
 
389
408
  it('resolves "after" on last item to one past the end', () => {
390
- const cellIds = makeSingleColumnIds(A, B, C, D);
409
+ const layout = makeSingleColumnIds(A, B, C, D);
391
410
  const result = resolveDropTarget({
392
- cellIds,
411
+ layout,
393
412
  activeId: A,
394
413
  target: { overId: D, position: "after" },
395
414
  });
396
415
  expect(result).toEqual({
397
416
  cellId: A,
398
- columnId: cellIds.atOrThrow(0).id,
417
+ columnId: layout.columns[0].id,
399
418
  index: 4,
400
419
  });
401
420
  });
@@ -195,4 +195,41 @@ describe("SlideScrollContainer", () => {
195
195
 
196
196
  expect(screen.queryByTestId("slide-scroll-hint")).toBeNull();
197
197
  });
198
+
199
+ it.each([
200
+ { scale: 0.5, fragmentOffset: 1000, expected: true },
201
+ { scale: 2, fragmentOffset: 500, expected: false },
202
+ ])(
203
+ "measures revealed content in canvas coordinates at scale $scale",
204
+ ({ scale, fragmentOffset, expected }) => {
205
+ render(
206
+ <SlideScrollContainer>
207
+ <div>revealed content</div>
208
+ <div className="fragment">unrevealed content</div>
209
+ </SlideScrollContainer>,
210
+ );
211
+
212
+ const container = screen.getByTestId("slide-scroll-container");
213
+ const fragment = container.querySelector<HTMLElement>(".fragment");
214
+ if (!fragment) {
215
+ throw new Error("Missing fragment");
216
+ }
217
+ stubOverflow(container, { scrollHeight: 1200, clientHeight: 720 });
218
+ Object.defineProperty(container, "offsetHeight", { value: 720 });
219
+ vi.spyOn(container, "getBoundingClientRect").mockReturnValue(
220
+ DOMRect.fromRect({ y: 100, height: 720 * scale }),
221
+ );
222
+ vi.spyOn(fragment, "getBoundingClientRect").mockReturnValue(
223
+ DOMRect.fromRect({ y: 100 + fragmentOffset * scale }),
224
+ );
225
+
226
+ act(() => {
227
+ for (const observer of resizeObservers) {
228
+ observer.callback([], observer as unknown as ResizeObserver);
229
+ }
230
+ });
231
+
232
+ expect(screen.queryByTestId("slide-scroll-hint") !== null).toBe(expected);
233
+ },
234
+ );
198
235
  });
@@ -2,9 +2,9 @@
2
2
 
3
3
  import { useDeleteCellCallback } from "@/components/editor/cell/useDeleteCell";
4
4
  import { outputIsStale } from "@/core/cells/cell";
5
- import { useCellActions, useCellIds } from "@/core/cells/cells";
5
+ import { useCellActions } from "@/core/cells/actions";
6
6
  import type { CellId } from "@/core/cells/ids";
7
- import type { CellColumnId } from "@/utils/id-tree";
7
+ import { type CellColumnId, type Layout, useLayout } from "@/core/cells/layout";
8
8
  import { useEffect, useRef, useState } from "react";
9
9
  import type { ICellRendererProps } from "../editor/renderers/types";
10
10
  import type {
@@ -49,7 +49,6 @@ import { SLIDE_TYPE_OPTIONS_BY_VALUE } from "./slide-form";
49
49
 
50
50
  type Props = ICellRendererProps<SlidesLayout>;
51
51
  type SlideCell = Props["cells"][number];
52
- type CellIdsState = ReturnType<typeof useCellIds>;
53
52
  type DropPosition = "before" | "after";
54
53
 
55
54
  interface ProjectedDropTarget {
@@ -228,8 +227,8 @@ export const SlidesMinimap = ({
228
227
  slideTypes,
229
228
  onSlideClick,
230
229
  }: SlidesMinimapProps) => {
231
- const cellIds = useCellIds();
232
- const { moveCellToIndex, createNewCell } = useCellActions();
230
+ const layout = useLayout();
231
+ const { moveCellToIndex, createCell } = useCellActions();
233
232
  const deleteCell = useDeleteCellCallback();
234
233
  const containerRef = useRef<HTMLDivElement>(null);
235
234
  const visibleIds = useVisibleCellIds(containerRef);
@@ -240,7 +239,10 @@ export const SlidesMinimap = ({
240
239
  const dimensions = computeThumbnailDimensions(thumbnailWidth);
241
240
 
242
241
  const insertCell = (cellId: CellId, before: boolean) => {
243
- createNewCell({ cellId, before, code: "", autoFocus: false });
242
+ createCell({
243
+ ...(before ? { before: cellId } : { after: cellId }),
244
+ focus: false,
245
+ });
244
246
  };
245
247
 
246
248
  useEffect(() => {
@@ -293,7 +295,7 @@ export const SlidesMinimap = ({
293
295
  try {
294
296
  if (activeId && dropTarget) {
295
297
  const resolvedTarget = resolveDropTarget({
296
- cellIds,
298
+ layout,
297
299
  activeId,
298
300
  target: dropTarget,
299
301
  });
@@ -747,24 +749,27 @@ function projectDropTarget(
747
749
  }
748
750
 
749
751
  function resolveDropTarget({
750
- cellIds,
752
+ layout,
751
753
  activeId,
752
754
  target,
753
755
  }: {
754
- cellIds: CellIdsState;
756
+ layout: Layout;
755
757
  activeId: CellId;
756
758
  target: ProjectedDropTarget;
757
759
  }): ResolvedDropTarget | null {
758
760
  if (activeId === target.overId) {
759
761
  return null;
760
762
  }
761
- if (cellIds.colLength !== 1) {
763
+ if (layout.columns.length !== 1) {
762
764
  Logger.warn("Multi-column mode is not supported");
763
765
  return null;
764
766
  }
765
767
 
766
- const column = cellIds.findWithId(target.overId);
767
- const overIndex = column.indexOfOrThrow(target.overId);
768
+ const [column] = layout.columns;
769
+ const overIndex = column.ids.indexOf(target.overId);
770
+ if (overIndex === -1) {
771
+ return null;
772
+ }
768
773
 
769
774
  return {
770
775
  cellId: activeId,
@@ -69,6 +69,8 @@ import {
69
69
  } from "./speaker-view";
70
70
 
71
71
  const ASPECT_RATIO = 16 / 9;
72
+ const SLIDE_WIDTH = 1280;
73
+ const SLIDE_HEIGHT = SLIDE_WIDTH / ASPECT_RATIO;
72
74
  const CODE_TOGGLE_KEY_CODE = 67;
73
75
 
74
76
  // Reveal retains custom key bindings after initialization. Replace the `C`
@@ -133,8 +135,11 @@ function classifyNavKey(event: KeyboardEvent): 1 | -1 | 0 {
133
135
  return 0;
134
136
  }
135
137
 
136
- function useSlideDimensions(ref: React.RefObject<HTMLDivElement | null>) {
137
- const [dims, setDims] = useState({ width: 960, height: 540 });
138
+ function useSlideViewportSize(ref: React.RefObject<HTMLDivElement | null>) {
139
+ const [dims, setDims] = useState({
140
+ width: SLIDE_WIDTH,
141
+ height: SLIDE_HEIGHT,
142
+ });
138
143
 
139
144
  useEffect(() => {
140
145
  const el = ref.current;
@@ -404,13 +409,15 @@ const SubslideView = ({
404
409
  if (block.isFragment) {
405
410
  const cumulative = cumulativeByBlock.get(i);
406
411
  return (
407
- <Fragment key={i} as="div">
412
+ <Fragment key={block.cells[0].id} as="div">
408
413
  {rendered}
409
414
  {cumulative && <NotesAside text={cumulative} />}
410
415
  </Fragment>
411
416
  );
412
417
  }
413
- return <ReactFragment key={i}>{rendered}</ReactFragment>;
418
+ return (
419
+ <ReactFragment key={block.cells[0].id}>{rendered}</ReactFragment>
420
+ );
414
421
  })}
415
422
  </div>
416
423
  </SlideScrollContainer>
@@ -480,8 +487,21 @@ const RevealSlidesComponent = ({
480
487
  }) => {
481
488
  const containerRef = useRef<HTMLDivElement>(null);
482
489
  const deckRef = useRef<RevealApi | null>(null);
483
- const { width, height } = useSlideDimensions(containerRef);
490
+ const { width, height } = useSlideViewportSize(containerRef);
484
491
  const isFullscreen = useFullScreenElement() != null;
492
+ const [slideScale, setSlideScale] = useState(1);
493
+
494
+ useEffect(() => {
495
+ // Embedded decks also resize when panels change, without a window resize.
496
+ const frame = requestAnimationFrame(() => {
497
+ const deck = deckRef.current;
498
+ if (deck) {
499
+ deck.layout();
500
+ setSlideScale(deck.getScale());
501
+ }
502
+ });
503
+ return () => cancelAnimationFrame(frame);
504
+ }, [width, height, isFullscreen]);
485
505
 
486
506
  // A receiver frame cannot spawn another speaker view. WebAssembly exports
487
507
  // also omit the plugin because each receiver would start another runtime.
@@ -499,7 +519,7 @@ const RevealSlidesComponent = ({
499
519
  const [showCodeOverrides, setShowCodeOverrides] = useState<
500
520
  ReadonlySet<CellId>
501
521
  >(() => new Set());
502
- const codeAvailable = useNotebookCodeAvailable(slideCells);
522
+ const codeAvailable = useNotebookCodeAvailable();
503
523
  const codeRenderingEnabled = !isIslands() && codeAvailable;
504
524
  const isSpeakerReceiver = isSpeakerViewReceiver(
505
525
  kioskMode,
@@ -587,10 +607,10 @@ const RevealSlidesComponent = ({
587
607
  const revealConfig: RevealConfig = useMemo(
588
608
  () => ({
589
609
  embedded: true,
590
- width,
591
- height,
610
+ width: SLIDE_WIDTH,
611
+ height: SLIDE_HEIGHT,
592
612
  center: false,
593
- minScale: 0.2,
613
+ minScale: 0,
594
614
  maxScale: 2,
595
615
  transition: deckTransition,
596
616
  keyboardCondition: (event: KeyboardEvent) => !Events.fromInput(event),
@@ -600,7 +620,7 @@ const RevealSlidesComponent = ({
600
620
  // `@revealjs/react` owns, which crashes on `reveal.sync()` re-renders.
601
621
  scrollActivationWidth: 0,
602
622
  }),
603
- [width, height, deckTransition, kioskUrl],
623
+ [deckTransition, kioskUrl],
604
624
  );
605
625
 
606
626
  const navigateDeckToActiveCell = useEvent((deck: RevealApi) => {
@@ -701,6 +721,7 @@ const RevealSlidesComponent = ({
701
721
  });
702
722
 
703
723
  const handleDeckReady = useEvent((deck: RevealApi) => {
724
+ setSlideScale(deck.getScale());
704
725
  navigateDeckToActiveCell(deck);
705
726
  if (canResolveInitialHash) {
706
727
  reportDeckCell(deck);
@@ -827,22 +848,33 @@ const RevealSlidesComponent = ({
827
848
  <span>{parkedPreviewLabel}</span>
828
849
  </div>
829
850
  )}
830
- <div className="flex-1 overflow-auto flex">
831
- <div
832
- className={
833
- parkedShowsSource
834
- ? "mo-slide-content flex flex-col gap-3"
835
- : "mo-slide-content"
836
- }
837
- style={slideContentStyle}
838
- >
839
- <ParkedPreviewContent
840
- cell={parkedPreviewCell}
841
- isNoOutputPreview={isNoOutputPreview}
842
- isEditable={isEditable}
843
- showCode={parkedShowCode}
844
- />
845
- </div>
851
+ <div
852
+ className="reveal mo-slides-theme prose-slides absolute left-1/2 top-1/2"
853
+ data-testid="slide-preview-canvas"
854
+ style={{
855
+ position: "absolute",
856
+ width: SLIDE_WIDTH,
857
+ height: SLIDE_HEIGHT,
858
+ transform: `translate(-50%, -50%) scale(${slideScale})`,
859
+ }}
860
+ >
861
+ <SlideScrollContainer>
862
+ <div
863
+ className={
864
+ parkedShowsSource
865
+ ? "mo-slide-content flex flex-col gap-3"
866
+ : "mo-slide-content"
867
+ }
868
+ style={slideContentStyle}
869
+ >
870
+ <ParkedPreviewContent
871
+ cell={parkedPreviewCell}
872
+ isNoOutputPreview={isNoOutputPreview}
873
+ isEditable={isEditable}
874
+ showCode={parkedShowCode}
875
+ />
876
+ </div>
877
+ </SlideScrollContainer>
846
878
  </div>
847
879
  </div>
848
880
  )}
@@ -1,5 +1,10 @@
1
1
  @import "reveal.js/reveal.css";
2
2
 
3
+ /* Reveal scales the canvas; responsive rem sizes would reflow its content. */
4
+ html:has(.reveal.mo-slides-theme) {
5
+ font-size: 100%;
6
+ }
7
+
3
8
  /* Neutralize reveal-viewport styles so the slides inherit marimo's defaults */
4
9
  .reveal-viewport {
5
10
  background-color: transparent;
@@ -11,10 +16,6 @@
11
16
  .reveal-viewport:fullscreen {
12
17
  background-color: var(--background);
13
18
  }
14
- .reveal-viewport:fullscreen .mo-slide-content {
15
- padding-left: 2rem;
16
- padding-right: 2rem;
17
- }
18
19
  .reveal-viewport::backdrop {
19
20
  background-color: var(--background);
20
21
  }
@@ -14,7 +14,7 @@ import { useRunCell } from "@/components/editor/cell/useRunCells";
14
14
  import { Slide as CellOutputSlide } from "@/components/slides/slide";
15
15
  import { maybeAddMarimoImport } from "@/core/cells/add-missing-import";
16
16
  import { outputIsStale } from "@/core/cells/cell";
17
- import { useCellActions } from "@/core/cells/cells";
17
+ import { useCellActions } from "@/core/cells/actions";
18
18
  import { autoInstantiateAtom, useUserConfig } from "@/core/config/config";
19
19
  import {
20
20
  cellNeedsRun,
@@ -42,7 +42,7 @@ export const SlideCellView = ({ cell }: { cell: RuntimeCell }) => {
42
42
  const { theme } = useTheme();
43
43
  const runCell = useRunCell(cell.id);
44
44
  const connection = useAtomValue(connectionAtom);
45
- const cellActions = useCellActions();
45
+ const { createCell } = useCellActions();
46
46
  const autoInstantiate = useAtomValue(autoInstantiateAtom);
47
47
  const editorViewRef = useRef<EditorView | null>(null);
48
48
  const editorViewParentRef = useRef<HTMLDivElement | null>(null);
@@ -53,7 +53,7 @@ export const SlideCellView = ({ cell }: { cell: RuntimeCell }) => {
53
53
  const afterToggleLanguage = useEvent(() => {
54
54
  maybeAddMarimoImport({
55
55
  autoInstantiate,
56
- createNewCell: cellActions.createNewCell,
56
+ createCell,
57
57
  });
58
58
  });
59
59
 
@@ -117,7 +117,7 @@ export const SlideCellView = ({ cell }: { cell: RuntimeCell }) => {
117
117
  />
118
118
  <LanguageToggles
119
119
  code={cell.code}
120
- editorView={editorViewRef.current}
120
+ editorViewRef={editorViewRef}
121
121
  currentLanguageAdapter={languageAdapter}
122
122
  onAfterToggle={afterToggleLanguage}
123
123
  className="flex items-center gap-1"
@@ -149,7 +149,6 @@ export const SlideCellView = ({ cell }: { cell: RuntimeCell }) => {
149
149
  code={cell.code}
150
150
  config={cell.config}
151
151
  status={cell.status}
152
- serializedEditorState={cell.serializedEditorState}
153
152
  runCell={runCell}
154
153
  setEditorView={(ev) => {
155
154
  editorViewRef.current = ev;
@@ -450,6 +450,7 @@ export const SlideSidebar = ({
450
450
  )}
451
451
  <Tooltip content={isConfigOpen ? "Collapse panel" : "Expand panel"}>
452
452
  <Button
453
+ aria-label={isConfigOpen ? "Collapse panel" : "Expand panel"}
453
454
  variant="ghost"
454
455
  size="icon"
455
456
  className="h-7 w-7 text-muted-foreground hover:text-foreground"
@@ -41,8 +41,10 @@ function measureRevealedHeight(el: HTMLElement): number {
41
41
  if (!firstUnrevealed) {
42
42
  return el.scrollHeight;
43
43
  }
44
+ const bounds = el.getBoundingClientRect();
45
+ const scale = el.offsetHeight > 0 ? bounds.height / el.offsetHeight : 1;
44
46
  const fragmentTop = firstUnrevealed.getBoundingClientRect().top;
45
- return fragmentTop - el.getBoundingClientRect().top + el.scrollTop;
47
+ return (fragmentTop - bounds.top) / (scale || 1) + el.scrollTop;
46
48
  }
47
49
 
48
50
  /**
@@ -22,9 +22,10 @@ import React, { useCallback, useMemo, useState } from "react";
22
22
  import type { CellId } from "@/core/cells/ids";
23
23
  import { useAppConfig } from "@/core/config/config";
24
24
  import { Arrays } from "@/utils/arrays";
25
- import type { CellColumnId, MultiColumn } from "@/utils/id-tree";
26
25
  import { invariant } from "@/utils/invariant";
27
- import { getNotebook, useCellActions } from "../../core/cells/cells";
26
+ import { findColumn, isColumnId, layoutAtom } from "../../core/cells/layout";
27
+ import { store } from "../../core/state/jotai";
28
+ import { useCellActions } from "../../core/cells/actions";
28
29
  import { useEvent } from "../../hooks/useEvent";
29
30
 
30
31
  interface SortableCellsProviderProps {
@@ -47,11 +48,8 @@ const SortableCellsProviderInternal = ({
47
48
  useCellActions();
48
49
 
49
50
  const [activeId, setActiveId] = useState<UniqueIdentifier | null>(null);
50
- const [clonedItems, setClonedItems] = useState<MultiColumn<CellId> | null>(
51
- null,
52
- );
53
51
 
54
- const [config] = useAppConfig();
52
+ const config = useAppConfig();
55
53
  const modifiers = useMemo(() => {
56
54
  if (config.width === "columns") {
57
55
  return Arrays.EMPTY;
@@ -73,20 +71,10 @@ const SortableCellsProviderInternal = ({
73
71
 
74
72
  const handleDragStart = useEvent((event: DragStartEvent) => {
75
73
  setActiveId(event.active.id);
76
- const notebook = getNotebook();
77
- setClonedItems(notebook.cellIds);
78
74
  });
79
75
 
80
76
  const handleDragCancel = useEvent(() => {
81
- // TODO: restore cloned items
82
- if (clonedItems) {
83
- // Reset items to their original state in case items have been
84
- // Dragged across containers
85
- // setItems(clonedItems);
86
- }
87
-
88
77
  setActiveId(null);
89
- setClonedItems(null);
90
78
  });
91
79
 
92
80
  /**
@@ -135,16 +123,15 @@ const SortableCellsProviderInternal = ({
135
123
  invariant(isColumnId(overId), `Expected column id. Got: ${overId}`);
136
124
 
137
125
  // If column is empty, we can drop on it
138
- const notebook = getNotebook();
139
- const column = notebook.cellIds.get(overId);
126
+ const column = findColumn(store.get(layoutAtom), overId);
140
127
  invariant(column, `Expected column. Got: ${overId}`);
141
- if (column && column.topLevelIds.length === 0) {
128
+ if (column.visible.length === 0) {
142
129
  // Return the column
143
130
  return [{ id: overId }];
144
131
  }
145
132
 
146
133
  // If the column is not empty, we only consider the cells in the same column
147
- const cellIdSet = new Set(column.topLevelIds);
134
+ const cellIdSet = new Set(column.visible);
148
135
  const collisions = closestCenter({
149
136
  ...args,
150
137
  droppableContainers: args.droppableContainers.filter(
@@ -234,9 +221,5 @@ const SortableCellsProviderInternal = ({
234
221
  export const SortableCellsProvider = React.memo(SortableCellsProviderInternal);
235
222
 
236
223
  function isCellId(id: UniqueIdentifier): id is CellId {
237
- return typeof id === "string" && !id.startsWith("tree_");
238
- }
239
-
240
- function isColumnId(id: UniqueIdentifier): id is CellColumnId {
241
- return typeof id === "string" && id.startsWith("tree_");
224
+ return typeof id === "string" && !isColumnId(id);
242
225
  }
@@ -0,0 +1,85 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { act, fireEvent, render, screen } from "@testing-library/react";
4
+ import { createStore, Provider } from "jotai";
5
+ import { describe, expect, it, vi } from "vitest";
6
+ import { TooltipProvider } from "@/components/ui/tooltip";
7
+ import { type Run, type RunId, runsAtom } from "@/core/cells/runs";
8
+ import { Tracing } from "./tracing";
9
+
10
+ vi.mock("react-vega", () => ({ useVegaEmbed: () => undefined }));
11
+ vi.mock("vega-lite", () => ({ compile: () => ({ spec: {} }) }));
12
+ vi.mock("@/components/editor/chrome/panels/panel-context", () => ({
13
+ usePanelSection: () => "sidebar",
14
+ }));
15
+
16
+ const run: Run = {
17
+ runId: "run-1" as RunId,
18
+ runStartTime: 1_704_067_200,
19
+ cellRuns: new Map(),
20
+ };
21
+
22
+ describe("trace disclosure keyboard focus", () => {
23
+ it.each([false, true])(
24
+ "keeps the header focused across toggles (inline=%s)",
25
+ (inline) => {
26
+ const store = createStore();
27
+ store.set(runsAtom, {
28
+ runIds: [run.runId],
29
+ runMap: new Map([[run.runId, run]]),
30
+ });
31
+ render(
32
+ <Provider store={store}>
33
+ <TooltipProvider>
34
+ <Tracing />
35
+ </TooltipProvider>
36
+ </Provider>,
37
+ );
38
+ if (inline) {
39
+ fireEvent.click(screen.getByRole("checkbox", { name: "Inline chart" }));
40
+ }
41
+ const header = screen.getByRole("button", { name: /^Run -/ });
42
+ act(() => header.focus());
43
+ for (const expanded of [false, true, false]) {
44
+ // Native buttons emit a click with detail=0 for keyboard activation.
45
+ fireEvent.click(header, { detail: 0 });
46
+ expect(screen.getByRole("button", { name: /^Run -/ })).toBe(header);
47
+ expect(header).toHaveFocus();
48
+ expect(header).toHaveAttribute("aria-expanded", String(expanded));
49
+ }
50
+ },
51
+ );
52
+
53
+ it("does not steal focus when a newer run expands automatically", () => {
54
+ const store = createStore();
55
+ store.set(runsAtom, {
56
+ runIds: [run.runId],
57
+ runMap: new Map([[run.runId, run]]),
58
+ });
59
+ render(
60
+ <Provider store={store}>
61
+ <TooltipProvider>
62
+ <Tracing />
63
+ </TooltipProvider>
64
+ </Provider>,
65
+ );
66
+ const header = screen.getByRole("button", { name: /^Run -/ });
67
+ act(() => header.focus());
68
+ const newer: Run = {
69
+ ...run,
70
+ runId: "run-2" as RunId,
71
+ runStartTime: run.runStartTime + 1,
72
+ };
73
+ act(() => {
74
+ store.set(runsAtom, {
75
+ runIds: [newer.runId, run.runId],
76
+ runMap: new Map([
77
+ [run.runId, run],
78
+ [newer.runId, newer],
79
+ ]),
80
+ });
81
+ });
82
+ expect(header).toHaveFocus();
83
+ expect(header).toHaveAttribute("aria-expanded", "false");
84
+ });
85
+ });