@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
@@ -13,7 +13,16 @@ import { mergeProps, useFocusWithin, useKeyboard } from "react-aria";
13
13
  import { DATA_FOR_CELL_ID } from "@/components/data-table/cell-utils";
14
14
  import { aiCompletionCellAtom } from "@/core/ai/state";
15
15
  import { maybeAddMarimoImport } from "@/core/cells/add-missing-import";
16
- import { cellIdsAtom, notebookAtom, useCellActions } from "@/core/cells/cells";
16
+ import { notebookAtom } from "@/core/cells/cells";
17
+ import { hideShownCodeAtom, showHiddenCodeAtom } from "@/core/cells/editor";
18
+ import {
19
+ columnOf,
20
+ type LayoutColumn,
21
+ layoutAtom,
22
+ visibleNeighbor,
23
+ } from "@/core/cells/layout";
24
+ import { useCellActions } from "@/core/cells/actions";
25
+ import { useNotebookDocumentEdit } from "@/core/notebook/document";
17
26
  import { useCellFocusActions } from "@/core/cells/focus";
18
27
  import type { CellId } from "@/core/cells/ids";
19
28
  import { HTMLCellId } from "@/core/cells/ids";
@@ -36,21 +45,23 @@ import {
36
45
  } from "@/core/config/config";
37
46
  import type { HotkeyAction } from "@/core/hotkeys/hotkeys";
38
47
  import { parseShortcut } from "@/core/hotkeys/shortcuts";
39
- import { useRequestClient } from "@/core/network/requests";
40
48
  import { useSaveNotebook } from "@/core/saving/save-component";
41
49
  import { Events } from "@/utils/events";
42
- import type { CollapsibleTree } from "@/utils/id-tree";
43
50
  import type { CellActionsDropdownHandle } from "../cell/cell-actions";
44
51
  import { useDeleteManyCellsCallback } from "../cell/useDeleteCell";
45
52
  import { useRunCells } from "../cell/useRunCells";
46
53
  import { useCellClipboard } from "./clipboard";
47
- import { focusCell, focusCellEditor, raf2 } from "./focus-utils";
54
+ import {
55
+ focusCell,
56
+ focusCellEditor,
57
+ keepFocusedCellInView,
58
+ raf2,
59
+ } from "./focus-utils";
48
60
  import {
49
61
  getSelectedCells,
50
62
  useCellSelectionActions,
51
63
  useIsCellSelected,
52
64
  } from "./selection";
53
- import { useTemporarilyShownCodeActions } from "./state";
54
65
  import { handleVimKeybinding } from "./vim-bindings";
55
66
 
56
67
  interface HotkeyHandler {
@@ -104,8 +115,7 @@ function useCellFocusProps(
104
115
  editorView: React.RefObject<EditorView | null>,
105
116
  ) {
106
117
  const focusActions = useCellFocusActions();
107
- const actions = useCellActions();
108
- const temporarilyShownCodeActions = useTemporarilyShownCodeActions();
118
+ const hideShownCode = useSetAtom(hideShownCodeAtom);
109
119
 
110
120
  // This occurs at the cell level and descedants.
111
121
  const { focusWithinProps } = useFocusWithin({
@@ -130,9 +140,11 @@ function useCellFocusProps(
130
140
  return;
131
141
  }
132
142
 
133
- // On blur, hide the code if it was temporarily shown.
134
- temporarilyShownCodeActions.remove(cellId);
135
- actions.markTouched({ cellId });
143
+ // On blur, hide the code if it was showing for now. That shifts the
144
+ // layout, so the cell that took the focus is kept in view.
145
+ if (hideShownCode({ cellId })) {
146
+ keepFocusedCellInView();
147
+ }
136
148
  focusActions.blurCell();
137
149
  // Close signature help when clicking outside the cell
138
150
  if (editorView.current) {
@@ -189,11 +201,12 @@ export function useCellNavigationProps(
189
201
  },
190
202
  ) {
191
203
  const { saveOrNameNotebook } = useSaveNotebook();
192
- const { saveCellConfig } = useRequestClient();
204
+ const edit = useNotebookDocumentEdit();
193
205
  const setAiCompletionCell = useSetAtom(aiCompletionCellAtom);
194
206
  const actions = useCellActions();
207
+ const { createCell, moveToNextCell } = useCellActions();
195
208
  const store = useStore();
196
- const temporarilyShownCodeActions = useTemporarilyShownCodeActions();
209
+ const showHiddenCode = useSetAtom(showHiddenCodeAtom);
197
210
  const runCells = useRunCells();
198
211
  const keymapPreset = useAtomValue(keymapPresetAtom);
199
212
  const { copyCells, pasteAtCell, cutCells } = useCellClipboard();
@@ -266,12 +279,13 @@ export function useCellNavigationProps(
266
279
  // Move left across columns
267
280
  ArrowLeft: () => {
268
281
  if (canMoveX) {
269
- const notebook = store.get(notebookAtom);
270
- const column = notebook.cellIds.findWithId(cellId);
271
- const columnIndex = notebook.cellIds.indexOf(column);
272
- const leftColumn = notebook.cellIds.at(columnIndex - 1);
282
+ const layout = store.get(layoutAtom);
283
+ const columnIndex = layout.columns.indexOf(
284
+ columnOf(layout, cellId),
285
+ );
286
+ const leftColumn = layout.columns[columnIndex - 1];
273
287
 
274
- if (leftColumn && leftColumn.length > 0) {
288
+ if (leftColumn && leftColumn.visible.length > 0) {
275
289
  const leftCellId = findClosestAdjacentCell(cellId, leftColumn);
276
290
  actions.focusCell({ cellId: leftCellId, where: "exact" });
277
291
 
@@ -284,12 +298,13 @@ export function useCellNavigationProps(
284
298
  // Move right across columns
285
299
  ArrowRight: () => {
286
300
  if (canMoveX) {
287
- const notebook = store.get(notebookAtom);
288
- const column = notebook.cellIds.findWithId(cellId);
289
- const columnIndex = notebook.cellIds.indexOf(column);
290
- const rightColumn = notebook.cellIds.at(columnIndex + 1);
301
+ const layout = store.get(layoutAtom);
302
+ const columnIndex = layout.columns.indexOf(
303
+ columnOf(layout, cellId),
304
+ );
305
+ const rightColumn = layout.columns[columnIndex + 1];
291
306
 
292
- if (rightColumn && rightColumn.length > 0) {
307
+ if (rightColumn && rightColumn.visible.length > 0) {
293
308
  const rightCellId = findClosestAdjacentCell(cellId, rightColumn);
294
309
  actions.focusCell({ cellId: rightCellId, where: "exact" });
295
310
 
@@ -302,12 +317,12 @@ export function useCellNavigationProps(
302
317
  // Select up
303
318
  "Shift+ArrowUp": () => {
304
319
  // Select self
305
- const allCellIds = store.get(cellIdsAtom);
306
- selectionActions.extend({ cellId, allCellIds });
320
+ const layout = store.get(layoutAtom);
321
+ selectionActions.extend({ cellId, layout });
307
322
  // Select to where focus is going
308
- const beforeCellId = allCellIds.findWithId(cellId).before(cellId);
323
+ const beforeCellId = visibleNeighbor(layout, cellId, -1);
309
324
  if (beforeCellId) {
310
- selectionActions.extend({ cellId: beforeCellId, allCellIds });
325
+ selectionActions.extend({ cellId: beforeCellId, layout });
311
326
  }
312
327
  // Focus the cell
313
328
  actions.focusCell({ cellId, where: "before" });
@@ -316,12 +331,12 @@ export function useCellNavigationProps(
316
331
  // Select down
317
332
  "Shift+ArrowDown": () => {
318
333
  // Select self
319
- const allCellIds = store.get(cellIdsAtom);
320
- selectionActions.extend({ cellId, allCellIds });
334
+ const layout = store.get(layoutAtom);
335
+ selectionActions.extend({ cellId, layout });
321
336
  // Select to where focus is going
322
- const afterCellId = allCellIds.findWithId(cellId).after(cellId);
337
+ const afterCellId = visibleNeighbor(layout, cellId, 1);
323
338
  if (afterCellId) {
324
- selectionActions.extend({ cellId: afterCellId, allCellIds });
339
+ selectionActions.extend({ cellId: afterCellId, layout });
325
340
  }
326
341
  // Focus the cell
327
342
  actions.focusCell({ cellId, where: "after" });
@@ -343,7 +358,7 @@ export function useCellNavigationProps(
343
358
  },
344
359
  // Enter will focus the cell editor.
345
360
  Enter: () => {
346
- temporarilyShownCodeActions.add(cellId);
361
+ showHiddenCode({ cellId });
347
362
  focusCellEditor(store, cellId);
348
363
  selectionActions.clear();
349
364
  return true;
@@ -376,30 +391,28 @@ export function useCellNavigationProps(
376
391
  "cell.runAndNewBelow": addSingleHandler((cellIds) => {
377
392
  runCells(cellIds);
378
393
  const lastCellId = cellIds[cellIds.length - 1];
379
- actions.moveToNextCell({ cellId: lastCellId, before: false });
394
+ moveToNextCell({ cellId: lastCellId, before: false });
380
395
  return true;
381
396
  }),
382
397
  "cell.runAndNewAbove": addSingleHandler((cellIds) => {
383
398
  runCells(cellIds);
384
399
  const firstCellId = cellIds[0];
385
- actions.moveToNextCell({ cellId: firstCellId, before: true });
400
+ moveToNextCell({ cellId: firstCellId, before: true });
386
401
  return true;
387
402
  }),
388
403
  "cell.createAbove": (cellId) => {
389
- actions.createNewCell({ cellId, before: true });
404
+ createCell({ before: cellId });
390
405
  return true;
391
406
  },
392
407
  "cell.createBelow": (cellId) => {
393
- actions.createNewCell({ cellId, before: false });
408
+ createCell({ after: cellId });
394
409
  return true;
395
410
  },
396
411
  "cell.moveUp": addSingleHandler((cellIds) => {
397
412
  // If moving up, make sure the first cell is not at the top of the notebook
398
413
  const firstCellId = cellIds[0];
399
- const notebook = store.get(notebookAtom);
400
- const isFirst =
401
- notebook.cellIds.findWithId(firstCellId).first() === firstCellId;
402
- if (isFirst) {
414
+ const layout = store.get(layoutAtom);
415
+ if (columnOf(layout, firstCellId).visible[0] === firstCellId) {
403
416
  return false;
404
417
  }
405
418
 
@@ -411,10 +424,8 @@ export function useCellNavigationProps(
411
424
  "cell.moveDown": addSingleHandler((cellIds) => {
412
425
  // If moving down, make sure the last cell is not at the bottom of the notebook
413
426
  const lastCellId = cellIds[cellIds.length - 1];
414
- const notebook = store.get(notebookAtom);
415
- const isLast =
416
- notebook.cellIds.findWithId(lastCellId).last() === lastCellId;
417
- if (isLast) {
427
+ const layout = store.get(layoutAtom);
428
+ if (columnOf(layout, lastCellId).visible.at(-1) === lastCellId) {
418
429
  return false;
419
430
  }
420
431
 
@@ -453,20 +464,12 @@ export function useCellNavigationProps(
453
464
  (config) => config?.hide_code,
454
465
  );
455
466
 
456
- // Fire-and-forget
457
- void saveCellConfig({
458
- configs: Object.fromEntries(
459
- cellIds.map((cellId) => [cellId, { hide_code: nextHideCode }]),
460
- ),
467
+ edit((tx) => {
468
+ for (const cellId of cellIds) {
469
+ tx.updateConfig(cellId, { hide_code: nextHideCode });
470
+ }
461
471
  });
462
472
 
463
- for (const cellId of cellIds) {
464
- actions.updateCellConfig({
465
- cellId,
466
- config: { hide_code: nextHideCode },
467
- });
468
- }
469
-
470
473
  // Only focus if it is a single cell
471
474
  if (cellIds.length === 1) {
472
475
  const cellId = cellIds[0];
@@ -543,14 +546,14 @@ export function useCellNavigationProps(
543
546
  if (Events.hasModifier(evt)) {
544
547
  return false;
545
548
  }
546
- actions.createNewCell({ cellId, before: true, autoFocus: true });
549
+ createCell({ before: cellId });
547
550
  return true;
548
551
  },
549
552
  "command.createCellAfter": (cellId) => {
550
553
  if (Events.hasModifier(evt)) {
551
554
  return false;
552
555
  }
553
- actions.createNewCell({ cellId, before: false, autoFocus: true });
556
+ createCell({ after: cellId });
554
557
  return true;
555
558
  },
556
559
  "command.createSqlCellAfter": (cellId) => {
@@ -559,14 +562,12 @@ export function useCellNavigationProps(
559
562
  }
560
563
  maybeAddMarimoImport({
561
564
  autoInstantiate: true,
562
- createNewCell: actions.createNewCell,
565
+ createCell: createCell,
563
566
  fromCellId: cellId,
564
567
  before: true,
565
568
  });
566
- actions.createNewCell({
567
- cellId,
568
- before: false,
569
- autoFocus: true,
569
+ createCell({
570
+ after: cellId,
570
571
  code: LanguageAdapters.sql.defaultCode,
571
572
  });
572
573
  return true;
@@ -635,11 +636,11 @@ export function useCellNavigationProps(
635
636
  return true;
636
637
  },
637
638
  o: () => {
638
- actions.createNewCell({ cellId, before: false, autoFocus: true });
639
+ createCell({ after: cellId });
639
640
  return true;
640
641
  },
641
642
  "shift+o": () => {
642
- actions.createNewCell({ cellId, before: true, autoFocus: true });
643
+ createCell({ before: cellId });
643
644
  return true;
644
645
  },
645
646
  u: () => {
@@ -701,7 +702,7 @@ export function useCellEditorNavigationProps(
701
702
  cellId: CellId,
702
703
  editorView: React.RefObject<EditorView | null>,
703
704
  ) {
704
- const temporarilyShownCodeActions = useTemporarilyShownCodeActions();
705
+ const hideShownCode = useSetAtom(hideShownCodeAtom);
705
706
  const keymapPreset = useAtomValue(keymapPresetAtom);
706
707
  const hotkeys = useAtomValue(hotkeysAtom);
707
708
 
@@ -711,7 +712,7 @@ export function useCellEditorNavigationProps(
711
712
  }, [hotkeys]);
712
713
 
713
714
  const exitToCommandMode = () => {
714
- temporarilyShownCodeActions.remove(cellId);
715
+ hideShownCode({ cellId });
715
716
  focusCell(cellId);
716
717
  // Scroll to cell in case it is not in view because of layout shifts.
717
718
  raf2(() => {
@@ -778,18 +779,18 @@ export function useCellEditorNavigationProps(
778
779
 
779
780
  function findClosestAdjacentCell(
780
781
  currentCellId: CellId,
781
- adjacentColumn: CollapsibleTree<CellId>,
782
+ adjacentColumn: LayoutColumn,
782
783
  ): CellId {
783
784
  const current = document.getElementById(HTMLCellId.create(currentCellId));
784
785
 
785
786
  if (!current) {
786
787
  // fallback to first
787
- return adjacentColumn.first();
788
+ return adjacentColumn.visible[0];
788
789
  }
789
790
 
790
791
  const currentRect = current.getBoundingClientRect();
791
792
  // first to to either overlap or contain the current cell's top edge
792
- for (const candidateId of adjacentColumn.topLevelIds) {
793
+ for (const candidateId of adjacentColumn.visible) {
793
794
  const candidate = document.getElementById(HTMLCellId.create(candidateId));
794
795
  if (candidate) {
795
796
  const candidateRect = candidate.getBoundingClientRect();
@@ -803,7 +804,7 @@ function findClosestAdjacentCell(
803
804
  }
804
805
 
805
806
  // no aligned cells (column beyond other), jump to last element
806
- return adjacentColumn.last();
807
+ return adjacentColumn.visible[adjacentColumn.visible.length - 1];
807
808
  }
808
809
 
809
810
  export function closeSignatureHelp(view: EditorView) {
@@ -2,8 +2,8 @@
2
2
  import { atom, type createStore, useAtomValue } from "jotai";
3
3
  import { useMemo } from "react";
4
4
  import type { CellId } from "@/core/cells/ids";
5
+ import type { Layout } from "@/core/cells/layout";
5
6
  import { createReducerAndAtoms } from "@/utils/createReducer";
6
- import type { MultiColumn } from "@/utils/id-tree";
7
7
 
8
8
  export interface CellSelectionState {
9
9
  selectionStart: CellId | null;
@@ -34,43 +34,44 @@ const {
34
34
  selected: new Set([payload.cellId]),
35
35
  }),
36
36
 
37
+ /**
38
+ * Extend the selection from where it started to `cellId`, over the cells
39
+ * the page shows between them. Cells a fold hides are stepped over, as
40
+ * the focus steps over them.
41
+ */
37
42
  extend: (
38
43
  state: CellSelectionState,
39
- payload: {
40
- cellId: CellId;
41
- allCellIds: MultiColumn<CellId>;
42
- },
44
+ payload: { cellId: CellId; layout: Layout },
43
45
  ): CellSelectionState => {
44
- if (!state.selectionStart) {
45
- // fallback to single select
46
- return {
47
- selectionStart: payload.cellId,
48
- selectionEnd: payload.cellId,
49
- selected: new Set([payload.cellId]),
50
- };
51
- }
52
- const { cellId, allCellIds } = payload;
53
-
54
- try {
55
- const column = allCellIds.findWithId(state.selectionStart);
56
- const startIdx = column.indexOfOrThrow(state.selectionStart);
57
- const endIdx = column.indexOfOrThrow(cellId);
58
- const [from, to] =
59
- startIdx < endIdx ? [startIdx, endIdx] : [endIdx, startIdx];
60
- const selected = column.slice(from, to + 1);
61
- return {
62
- selectionStart: state.selectionStart,
63
- selectionEnd: cellId,
64
- selected: new Set(selected),
65
- };
66
- } catch {
67
- // fallback to single select
46
+ const { cellId, layout } = payload;
47
+ const start = state.selectionStart;
48
+ const column =
49
+ start === null
50
+ ? undefined
51
+ : layout.columns.find((column) => column.visible.includes(start));
52
+ const startIdx =
53
+ start === null ? -1 : (column?.visible.indexOf(start) ?? -1);
54
+ const endIdx = column?.visible.indexOf(cellId) ?? -1;
55
+ if (
56
+ start === null ||
57
+ column === undefined ||
58
+ startIdx === -1 ||
59
+ endIdx === -1
60
+ ) {
61
+ // Nothing to extend from, or the cells are not on the page together.
68
62
  return {
69
63
  selectionStart: cellId,
70
64
  selectionEnd: cellId,
71
65
  selected: new Set([cellId]),
72
66
  };
73
67
  }
68
+ const [from, to] =
69
+ startIdx < endIdx ? [startIdx, endIdx] : [endIdx, startIdx];
70
+ return {
71
+ selectionStart: start,
72
+ selectionEnd: cellId,
73
+ selected: new Set(column.visible.slice(from, to + 1)),
74
+ };
74
75
  },
75
76
 
76
77
  clear: (state: CellSelectionState): CellSelectionState => {
@@ -41,6 +41,7 @@ export const NotebookBanner: React.FC<Props> = ({ width }) => {
41
41
  {banner.title}
42
42
  </span>
43
43
  <Button
44
+ aria-label={`Dismiss ${banner.title}`}
44
45
  data-testid="remove-banner-button"
45
46
  variant="text"
46
47
  size="icon"
@@ -16,7 +16,6 @@ import {
16
16
  useCallback,
17
17
  useEffect,
18
18
  useImperativeHandle,
19
- useMemo,
20
19
  useRef,
21
20
  useState,
22
21
  } from "react";
@@ -43,13 +42,15 @@ import { useResizeObserver } from "@/hooks/useResizeObserver";
43
42
  import { cn } from "@/utils/cn";
44
43
  import type { Milliseconds, Seconds } from "@/utils/time";
45
44
  import {
46
- type CellActions,
47
- createUntouchedCellAtom,
48
- useCellActions,
49
45
  useCellData,
50
46
  useCellHandle,
51
47
  useCellRuntime,
52
48
  } from "../../core/cells/cells";
49
+ import { type CellActions, useCellActions } from "../../core/cells/actions";
50
+ import {
51
+ showHiddenCodeAtom,
52
+ useShowsHiddenCode,
53
+ } from "../../core/cells/editor";
53
54
  import { type CellId, SETUP_CELL_ID } from "../../core/cells/ids";
54
55
  import {
55
56
  cellNeedsRun,
@@ -59,7 +60,7 @@ import {
59
60
  shouldHidePublishedCell,
60
61
  } from "../../core/cells/utils";
61
62
  import type { UserConfig } from "../../core/config/config-schema";
62
- import { isAppInteractionDisabled } from "../../core/websocket/connection-utils";
63
+ import { isAppInteractionDisabled } from "../../core/session/connection-utils";
63
64
  import { useCellRenderCount } from "../../hooks/useCellRenderCount";
64
65
  import type { Theme } from "../../theme/useTheme";
65
66
  import { Functions } from "../../utils/functions";
@@ -86,10 +87,6 @@ import { useRunCell } from "./cell/useRunCells";
86
87
  import { cellDomProps } from "./common";
87
88
  import { SqlValidationErrorBanner } from "./errors/sql-validation-errors";
88
89
  import { useCellNavigationProps } from "./navigation/navigation";
89
- import {
90
- useTemporarilyShownCode,
91
- useTemporarilyShownCodeActions,
92
- } from "./navigation/state";
93
90
  import { type OnRefactorWithAI, OutputArea } from "./Output";
94
91
  import { ConsoleOutput } from "./output/console/ConsoleOutput";
95
92
  import { CellDragHandle, SortableCell } from "./SortableCell";
@@ -168,15 +165,12 @@ function useCellHiddenLogic({
168
165
  editorView: React.RefObject<EditorView | null>;
169
166
  editorViewParentRef: React.RefObject<HTMLDivElement | null>;
170
167
  }) {
171
- const temporarilyVisible = useTemporarilyShownCode(cellId);
172
- const temporarilyShownCodeActions = useTemporarilyShownCodeActions();
173
- const isUntouched = useAtomValue(
174
- useMemo(() => createUntouchedCellAtom(cellId), [cellId]),
175
- );
168
+ const showsHiddenCode = useShowsHiddenCode(cellId);
169
+ const showHiddenCodeNow = useSetAtom(showHiddenCodeAtom);
176
170
 
177
- // The cell code is shown if the cell is not configured to be hidden or if the code is temporarily visible (i.e. when focused).
178
- const isCellCodeShown =
179
- !cellConfig.hide_code || temporarilyVisible || isUntouched;
171
+ // The code is shown unless the cell hides it, and then still while it is
172
+ // being edited or was just created.
173
+ const isCellCodeShown = !cellConfig.hide_code || showsHiddenCode;
180
174
  const isMarkdown = languageAdapter === "markdown";
181
175
  const isMarkdownCodeHidden = isMarkdown && !isCellCodeShown;
182
176
 
@@ -189,7 +183,7 @@ function useCellHiddenLogic({
189
183
 
190
184
  // Default to true
191
185
  const focus = opts?.focus ?? true;
192
- temporarilyShownCodeActions.add(cellId);
186
+ showHiddenCodeNow({ cellId });
193
187
 
194
188
  if (focus) {
195
189
  editorView.current?.focus();
@@ -216,14 +210,10 @@ function useCellHiddenLogic({
216
210
  export type CellComponentActions = Pick<
217
211
  CellActions,
218
212
  | "updateCellCode"
219
- | "createNewCell"
220
213
  | "focusCell"
221
214
  | "moveCell"
222
215
  | "collapseCell"
223
216
  | "expandCell"
224
- | "moveToNextCell"
225
- | "updateCellConfig"
226
- | "clearSerializedEditorState"
227
217
  | "setStdinResponse"
228
218
  | "clearCellConsoleOutput"
229
219
  | "sendToBottom"
@@ -525,13 +515,22 @@ const EditableCellComponent = ({
525
515
  isMarkdownCodeHidden &&
526
516
  isEmptyMarkdownContent &&
527
517
  !needsRun && (
518
+ // Preserve pointer double-click editing; keyboard and assistive clicks activate directly.
519
+ // react-doctor-disable-next-line react-doctor/prefer-tag-over-role
528
520
  <div
521
+ // eslint-disable-next-line jsx-a11y/prefer-tag-over-role
529
522
  role="button"
530
- aria-label="Double-click to edit markdown"
523
+ aria-label="Edit markdown"
531
524
  className="relative cursor-pointer px-3 py-2"
532
525
  onDoubleClick={showHiddenCodeIfMarkdown}
526
+ onClick={(e) => {
527
+ if (e.detail === 0) {
528
+ showHiddenCodeIfMarkdown();
529
+ }
530
+ }}
533
531
  onKeyDown={(e) => {
534
- if (e.key === "Enter") {
532
+ if (e.key === "Enter" || e.key === " ") {
533
+ e.preventDefault();
535
534
  showHiddenCodeIfMarkdown();
536
535
  }
537
536
  }}
@@ -699,7 +698,6 @@ const EditableCellComponent = ({
699
698
  code={cellData.code}
700
699
  config={cellData.config}
701
700
  status={cellRuntime.status}
702
- serializedEditorState={cellData.serializedEditorState}
703
701
  runCell={runCell}
704
702
  setEditorView={setEditorView}
705
703
  userConfig={userConfig}
@@ -919,15 +917,16 @@ const CellLeftSideActions = memo(
919
917
  actions: CellComponentActions;
920
918
  }) => {
921
919
  const connection = useAtomValue(connectionAtom);
922
- const { className, actions, cellId } = props;
920
+ const { className, cellId } = props;
921
+ const { createCell } = useCellActions();
923
922
 
924
923
  const createBelow = useEvent(
925
- (opts: { code?: string; hideCode?: boolean } = {}) =>
926
- actions.createNewCell({ cellId, before: false, ...opts }),
924
+ ({ code, hideCode }: { code?: string; hideCode?: boolean } = {}) =>
925
+ createCell({ after: cellId, code, config: { hide_code: hideCode } }),
927
926
  );
928
927
  const createAbove = useEvent(
929
- (opts: { code?: string; hideCode?: boolean } = {}) =>
930
- actions.createNewCell({ cellId, before: true, ...opts }),
928
+ ({ code, hideCode }: { code?: string; hideCode?: boolean } = {}) =>
929
+ createCell({ before: cellId, code, config: { hide_code: hideCode } }),
931
930
  );
932
931
 
933
932
  const oneClickShortcut = "mod";
@@ -1227,7 +1226,6 @@ const SetupCellComponent = ({
1227
1226
  code={cellData.code}
1228
1227
  config={cellData.config}
1229
1228
  status={cellRuntime.status}
1230
- serializedEditorState={cellData.serializedEditorState}
1231
1229
  runCell={runCell}
1232
1230
  setEditorView={setEditorView}
1233
1231
  userConfig={userConfig}
@@ -207,7 +207,8 @@ export const MarimoErrorOutput = ({
207
207
  e.type === "ancestor-stopped",
208
208
  );
209
209
  const syntaxErrors = errors.filter(
210
- (e): e is Extract<MarimoError, { type: "syntax" }> => e.type === "syntax",
210
+ (e): e is Extract<MarimoError, { type: "syntax" | "lazy-import" }> =>
211
+ e.type === "syntax" || e.type === "lazy-import",
211
212
  );
212
213
  const unknownErrors = errors.filter(
213
214
  (e): e is Extract<MarimoError, { type: "unknown" }> => e.type === "unknown",
@@ -248,21 +248,22 @@ export const replaceTracebackFilenames = (domNode: DOMNode) => {
248
248
  <Tooltip content={tooltipContent}>
249
249
  <button
250
250
  type="button"
251
- className="ml-1 p-1 rounded-sm hover:bg-muted transition-all inline"
251
+ aria-label={
252
+ debuggerEnabled ? "Toggle breakpoint" : "Insert breakpoint"
253
+ }
254
+ className="ml-1 p-1 rounded-sm hover:bg-muted transition-colors inline"
255
+ onClick={() => {
256
+ if (debuggerEnabled && !isStaticNotebook()) {
257
+ toggleBreakpoint(info.cellId, info.lineNumber);
258
+ return;
259
+ }
260
+ const view = getCellEditorView(info.cellId);
261
+ if (view) {
262
+ insertDebuggerAtLine(view, info.lineNumber);
263
+ }
264
+ }}
252
265
  >
253
- <BugPlayIcon
254
- onClick={() => {
255
- if (debuggerEnabled && !isStaticNotebook()) {
256
- toggleBreakpoint(info.cellId, info.lineNumber);
257
- return;
258
- }
259
- const view = getCellEditorView(info.cellId);
260
- if (view) {
261
- insertDebuggerAtLine(view, info.lineNumber);
262
- }
263
- }}
264
- className="h-3 w-3"
265
- />
266
+ <BugPlayIcon className="h-3 w-3" />
266
267
  </button>
267
268
  </Tooltip>
268
269
  )}
@@ -272,9 +273,10 @@ export const replaceTracebackFilenames = (domNode: DOMNode) => {
272
273
  }
273
274
  if (info?.kind === "file") {
274
275
  return (
275
- <div
276
+ <button
277
+ type="button"
276
278
  className="inline-block cursor-pointer text-destructive hover:underline"
277
- onClick={(_) => {
279
+ onClick={() => {
278
280
  getRequestClient().openFile({
279
281
  path: info.filePath,
280
282
  lineNumber: info.lineNumber,
@@ -282,7 +284,7 @@ export const replaceTracebackFilenames = (domNode: DOMNode) => {
282
284
  }}
283
285
  >
284
286
  <span className="nb">"{info.filePath}"</span>
285
- </div>
287
+ </button>
286
288
  );
287
289
  }
288
290
  };
@@ -24,6 +24,14 @@
24
24
  max-width: 100%;
25
25
  }
26
26
 
27
+ .output audio,
28
+ .output-area audio,
29
+ .media audio {
30
+ width: 100%;
31
+ max-width: 100%;
32
+ transform: translateZ(0);
33
+ }
34
+
27
35
  .output {
28
36
  position: relative;
29
37