@marimo-team/islands 0.25.3-dev24 → 0.25.3-dev244

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 (757) hide show
  1. package/dist/{ConnectedDataExplorerComponent-DfG3PRaJ.js → ConnectedDataExplorerComponent-BBihxHrr.js} +120 -116
  2. package/dist/{ErrorBoundary-LHjDFqXG.js → ErrorBoundary-DKniGLW9.js} +16 -16
  3. package/dist/_baseSet-BfI5FjBM.js +328 -0
  4. package/dist/{abnfDiagram-VCTEODGH-B3w-XWX8.js → abnfDiagram-VCTEODGH-DBcJVxYP.js} +2 -2
  5. package/dist/any-language-editor-jGaR0EAo.js +75 -0
  6. package/dist/{architectureDiagram-5GKGNRK7-C18U9A6k.js → architectureDiagram-5GKGNRK7-BcHZXF4S.js} +1 -1
  7. package/dist/{arrays-CN1djC4k.js → arrays-DoQ-AILx.js} +15 -27
  8. package/dist/assets/__vite-browser-external-BKBpimif.js +1 -0
  9. package/dist/assets/worker-CgoMtD-_.js +113 -0
  10. package/dist/{blockDiagram-I7D4REHJ-Cg25UrxT.js → blockDiagram-I7D4REHJ-Dkhe6_PP.js} +1 -1
  11. package/dist/{button-CvjkwdSk.js → button-B6RjDKJx.js} +227 -217
  12. package/dist/{capabilities-CQ5IjhzL.js → capabilities-CkVzWJEX.js} +2 -2
  13. package/dist/{chat-ui-w8SVynkn.js → chat-ui-DgaVxFrc.js} +1309 -1307
  14. package/dist/{check-BMKBBrdc.js → check-Z_vtI3OL.js} +1 -1
  15. package/dist/{chunk-IMKFNOWR-CrS5bzqW.js → chunk-IMKFNOWR-CTZlwBAA.js} +1 -1
  16. package/dist/{chunk-SHT3W25Y-StpvPvUG.js → chunk-SHT3W25Y-53g_RZHm.js} +1 -1
  17. package/dist/{chunk-SVP7TREG-CBXjbYZC.js → chunk-SVP7TREG-P6abNGV_.js} +1 -1
  18. package/dist/{chunk-TICWLB2K-Dp6bIb-q.js → chunk-TICWLB2K-BTJJqkyF.js} +1 -1
  19. package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
  20. package/dist/{classDiagram-ZZMXUADV-BFYuxV5g.js → classDiagram-ZZMXUADV-BUGqOrTm.js} +2 -2
  21. package/dist/{classDiagram-v2-VYDZK3BY-D_tjXVMl.js → classDiagram-v2-VYDZK3BY-CXpQvO-s.js} +2 -2
  22. package/dist/code-visibility-CIUgREo9.js +134 -0
  23. package/dist/{common-1pRFQo1N.js → common-DzCPFBsv.js} +9917 -9686
  24. package/dist/config-DbjzjwxX.js +636 -0
  25. package/dist/{copy-icon-BgUO8jsi.js → copy-icon-CG57cxwb.js} +3 -3
  26. package/dist/createReducer-DePYJ0F3.js +63 -0
  27. package/dist/{cynefinDiagram-5FMLGOSQ-DSgYrHB2.js → cynefinDiagram-5FMLGOSQ-DOcnl8wW.js} +1 -1
  28. package/dist/{dagre-GXQ25YYZ-GYlruCBf.js → dagre-GXQ25YYZ-CuHR9QfG.js} +3 -3
  29. package/dist/{dagre-BGSfXNEb.js → dagre-mqiMAsFY.js} +531 -680
  30. package/dist/{data-grid-overlay-editor-UR0x91Ij.js → data-grid-overlay-editor-PstJqwhX.js} +5 -5
  31. package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-0PJ-9N5n.js} +1 -1
  32. package/dist/{debounce-C3jyATpc.js → debounce-DrhhziJv.js} +2 -2
  33. package/dist/{diagram-S7CK7UJ4-DRu5LX5_.js → diagram-S7CK7UJ4-BPiG4kso.js} +1 -1
  34. package/dist/{diagram-UQ7AKVKN-DD7uiejP.js → diagram-UQ7AKVKN-_piBOvOC.js} +1 -1
  35. package/dist/{diagram-VX7I27RA-ByH9KAJJ.js → diagram-VX7I27RA-DCzVeJ8M.js} +1 -1
  36. package/dist/{diagram-Z3DM3KII-BsQHPRke.js → diagram-Z3DM3KII-D64CF1jQ.js} +1 -1
  37. package/dist/{dialog-Cc479ZEH.js → dialog-DsZ49mmU.js} +26 -26
  38. package/dist/{dist-Bvs24R_E.js → dist-11T5wq3_.js} +31 -30
  39. package/dist/{dist-F8Ep36rk.js → dist-17ugwGZc.js} +59 -58
  40. package/dist/{dist-BMQf5zIS.js → dist-7cRjf--y.js} +123 -122
  41. package/dist/{dist-diIx5qJW.js → dist-B8pkfkzc.js} +31 -30
  42. package/dist/{dist-CN_BeG2I.js → dist-B9UoM_wq.js} +58 -57
  43. package/dist/{dist-CLdpGQVr.js → dist-BGuMTs1i.js} +118 -117
  44. package/dist/{dist-BK4Oj99o.js → dist-BHW11fni.js} +18 -17
  45. package/dist/dist-BLY4m1Wi.js +850 -0
  46. package/dist/{dist-PXYI_yuP.js → dist-BNlcVoxs.js} +24 -23
  47. package/dist/{dist-D6d86eNJ.js → dist-BQYe5Bju.js} +47 -46
  48. package/dist/{dist-CkTTIdBe.js → dist-BX1mn8na.js} +337 -337
  49. package/dist/{dist-DiDibOYr.js → dist-Bh0PTKUW.js} +151 -150
  50. package/dist/{dist-CSJ0MDRw.js → dist-CKaXK92p.js} +56 -55
  51. package/dist/{dist-C8fAKSH1.js → dist-CLhwfhpJ.js} +53 -52
  52. package/dist/{dist-DoE4XJBC.js → dist-CYeqK4Xw.js} +9801 -10649
  53. package/dist/{dist-BLfKmR-l.js → dist-Cxlp3WH6.js} +16 -15
  54. package/dist/{dist-D-wwqlzJ.js → dist-DSJPGj42.js} +158 -157
  55. package/dist/{dist-BorMD-uX.js → dist-DU9ICsWZ.js} +75 -74
  56. package/dist/{dist-DBtSl3sf.js → dist-DWv0ALBi.js} +47 -46
  57. package/dist/{dist-OR1OnN-y.js → dist-DiBpWEsB.js} +31 -30
  58. package/dist/{dist-CrSP_H1M.js → dist-DiLFTlnl.js} +242 -242
  59. package/dist/{dist-DpBpA_n1.js → dist-Lm-D-Vr6.js} +3 -3
  60. package/dist/{dist-CSbh1PNP.js → dist-cVDV5IuI.js} +23 -22
  61. package/dist/{dist-BuaRHxOc.js → dist-fRfaOoq8.js} +44 -43
  62. package/dist/{dist-Cg7gzw-a.js → dist-gTTI-9Px.js} +78 -77
  63. package/dist/dropdown-menu-BRiE7Vnp.js +6083 -0
  64. package/dist/{ebnfDiagram-PWID7BFC-CQRK5_eT.js → ebnfDiagram-PWID7BFC-BapQPML-.js} +2 -2
  65. package/dist/{erDiagram-RLTQ6QDP-BKtWrDVh.js → erDiagram-RLTQ6QDP-CNQvC2_Q.js} +1 -1
  66. package/dist/{error-banner-CFPHFw4h.js → error-banner-IsonnvA0.js} +84 -83
  67. package/dist/error-entries-CRPfxMqm.js +2505 -0
  68. package/dist/{esm-D2gTsXEV.js → esm-BgKjMvWw.js} +530 -529
  69. package/dist/{esm-AMFssoNp.js → esm-CHjVSexr.js} +328 -329
  70. package/dist/feedback-button-C0iLkz-H.js +374 -0
  71. package/dist/{flowDiagram-HODETNUW-1IN-ih2E.js → flowDiagram-HODETNUW-BBt6S6oe.js} +2 -2
  72. package/dist/{formats-X4mMQWzX.js → formats-BK4VefeF.js} +6 -6
  73. package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
  74. package/dist/{glide-data-editor-DPjObn47.js → glide-data-editor-8CBjuK8C.js} +417 -415
  75. package/dist/{glide-utils-DM9zBO4W.js → glide-utils-CQddGpa-.js} +16 -16
  76. package/dist/{globals-DOHFyDcV.js → globals-M9WsksQz.js} +3 -3
  77. package/dist/{graphlib-BmY_CCV9.js → graphlib-nlwT3Wvy.js} +177 -220
  78. package/dist/hasIn-C20JsQ2m.js +28 -0
  79. package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
  80. package/dist/{error-entries-Damuuclv.js → html-to-image-Gx4q3ZoD.js} +26911 -26769
  81. package/dist/{infoDiagram-27XIBGKW-CkB-zr4p.js → infoDiagram-27XIBGKW-Hd8Ifz82.js} +1 -1
  82. package/dist/isArrayLikeObject-B-HXCsex.js +626 -0
  83. package/dist/isEmpty-CdX7MTE1.js +14 -0
  84. package/dist/{ishikawaDiagram-5VMMS53U-wlyLjBmM.js → ishikawaDiagram-5VMMS53U-CP7hnHWx.js} +1 -1
  85. package/dist/{kanban-definition-UXKFOSKX-C2usY0i-.js → kanban-definition-UXKFOSKX-CX91sa9b.js} +1 -1
  86. package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
  87. package/dist/{loader-BQOfjTIJ.js → loader-BisjOLiW.js} +12 -12
  88. package/dist/main.js +10234 -8104
  89. package/dist/{mermaid-BA-Z6wGL.js → mermaid-Djb3Ni9t.js} +54 -54
  90. package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
  91. package/dist/{mindmap-definition-YA3MSWOX-nKOWS8RR.js → mindmap-definition-YA3MSWOX-DgCNo07O.js} +1 -1
  92. package/dist/{now-jM8-M7IR.js → now-BKZCLE5P.js} +12 -13
  93. package/dist/{number-overlay-editor-B3cSnrr6.js → number-overlay-editor-uvNY9IUz.js} +3 -3
  94. package/dist/{dist-CN8zI-XC.js → objectWithoutPropertiesLoose-ai5NUqGa.js} +262 -240
  95. package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
  96. package/dist/{once-BtE-wKRL.js → once-NnpX_HnX.js} +1 -1
  97. package/dist/{pegDiagram-XKGWAZYB-Dac9EIKD.js → pegDiagram-XKGWAZYB-SGJhnIKo.js} +2 -2
  98. package/dist/pick-tCszMUbm.js +35 -0
  99. package/dist/{pieDiagram-E7YTZNPT-B7S-DsW_.js → pieDiagram-E7YTZNPT-1stXIWCQ.js} +1 -1
  100. package/dist/precisionRound-DhAzeRcm.js +49 -0
  101. package/dist/{process-output-CTPTtxXB.js → process-output-D2ISIyIs.js} +4 -4
  102. package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
  103. package/dist/{railroadDiagram-O6MQD6OU-Cfa5Q-hr.js → railroadDiagram-O6MQD6OU-DY1mojzB.js} +2 -2
  104. package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
  105. package/dist/{requirementDiagram-BXWQKSXE-d8zXCJIk.js → requirementDiagram-BXWQKSXE-gHzhUp0D.js} +1 -1
  106. package/dist/{reveal-component-CFFzSsPX.js → reveal-component-GMnfGiUU.js} +430 -407
  107. package/dist/schemas-CdscWNy_.js +4747 -0
  108. package/dist/select-BSxlITBo.js +1200 -0
  109. package/dist/{sequenceDiagram-WJ2MYXX4-b6pei3lJ.js → sequenceDiagram-WJ2MYXX4-rjPtD9fB.js} +1 -1
  110. package/dist/{spec-BJzgmvVa.js → spec-Dq8RNplp.js} +41 -11
  111. package/dist/{stateDiagram-D77RDMKH-Be-xSpaZ.js → stateDiagram-D77RDMKH-DMNxjUxV.js} +4 -4
  112. package/dist/{stateDiagram-v2-MP3YSRHH-5Y-FxesJ.js → stateDiagram-v2-MP3YSRHH-CumAaqGo.js} +2 -2
  113. package/dist/static-state-BldGd99T.js +72 -0
  114. package/dist/strings-BGW-fXVJ.js +507 -0
  115. package/dist/style.css +1 -1
  116. package/dist/{swimlanes-42K2YHIH-nRRl4NU0.js → swimlanes-42K2YHIH-BU14_Tej.js} +1 -1
  117. package/dist/{swimlanesDiagram-VR7AAH4N-BS79510V.js → swimlanesDiagram-VR7AAH4N-CieAnPqJ.js} +2 -2
  118. package/dist/{swiper-component-DKntyn8p.js → swiper-component-Dir1o8ml.js} +2 -2
  119. package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
  120. package/dist/{timeline-definition-24CTP7MA-Cfzf8WPf.js → timeline-definition-24CTP7MA-CrVj4E1K.js} +1 -1
  121. package/dist/toast-BWIPi3aF.js +491 -0
  122. package/dist/{tooltip-CtBZ5q8p.js → tooltip-C3UnvsRe.js} +329 -305
  123. package/dist/use-restore-focus-BWO0z1lo.js +1672 -0
  124. package/dist/{useAsyncData-BD534XmW.js → useAsyncData-DsZMvNXn.js} +15 -14
  125. package/dist/{useDateFormatter-DkajGwwd.js → useDateFormatter-ChB4eyim.js} +2 -2
  126. package/dist/{useDeepCompareMemoize-C72_RNsu.js → useDeepCompareMemoize-KMBBux8C.js} +1 -1
  127. package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-cMNQ80CK.js} +1 -1
  128. package/dist/useLifecycle-BquH9ET-.js +112 -0
  129. package/dist/useTheme-DgOLVISn.js +337 -0
  130. package/dist/utils-DXkj82sK.js +813 -0
  131. package/dist/{vega-component-DfcYgj-Y.js → vega-component-Bwg_Kuh-.js} +171 -170
  132. package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container--LYZqguO.js} +2 -2
  133. package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-B9Pz0EGP.js} +298 -507
  134. package/dist/{vennDiagram-4TSXK5OY-CeY6Z1xZ.js → vennDiagram-4TSXK5OY-ZLxQ8yhm.js} +1 -1
  135. package/dist/{wardleyDiagram-VM6X3IG4-Cxs9NtVi.js → wardleyDiagram-VM6X3IG4-D88pcLY1.js} +1 -1
  136. package/dist/{xychartDiagram-S5SC5T6Z-DNWbvPK7.js → xychartDiagram-S5SC5T6Z-_13d4g8g.js} +2 -2
  137. package/package.json +16 -20
  138. package/src/__mocks__/document.tsx +63 -0
  139. package/src/__mocks__/notebook.ts +3 -4
  140. package/src/__mocks__/partial.ts +26 -0
  141. package/src/__mocks__/requests.ts +1 -4
  142. package/src/__tests__/main.test.tsx +24 -1
  143. package/src/__tests__/module-entry.test.ts +44 -0
  144. package/src/__tests__/mount.test.ts +1 -21
  145. package/src/__tests__/{host-imports.test.ts → replica-imports.test.ts} +12 -11
  146. package/src/components/ai/__tests__/ai-model-dropdown.test.tsx +63 -0
  147. package/src/components/ai/ai-model-dropdown.tsx +11 -6
  148. package/src/components/app-config/ai-config.tsx +155 -149
  149. package/src/components/app-config/app-config-button.tsx +6 -5
  150. package/src/components/app-config/app-config-form.tsx +5 -9
  151. package/src/components/app-config/common.tsx +7 -9
  152. package/src/components/app-config/data-form.tsx +112 -113
  153. package/src/components/app-config/mcp-config.tsx +30 -53
  154. package/src/components/app-config/user-config-form.css +91 -0
  155. package/src/components/app-config/user-config-form.tsx +266 -349
  156. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  157. package/src/components/chat/__tests__/notebook-access-selector.test.tsx +64 -0
  158. package/src/components/chat/acp/__tests__/session-tabs.test.tsx +43 -0
  159. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  160. package/src/components/chat/acp/blocks.tsx +3 -2
  161. package/src/components/chat/acp/session-tabs.tsx +8 -3
  162. package/src/components/chat/capabilities-popover.tsx +1 -5
  163. package/src/components/chat/chat-components.tsx +2 -0
  164. package/src/components/chat/chat-panel.tsx +23 -104
  165. package/src/components/chat/chat-utils.ts +4 -8
  166. package/src/components/chat/notebook-access-selector.stories.tsx +22 -0
  167. package/src/components/chat/notebook-access-selector.tsx +100 -0
  168. package/src/components/data-table/TableBottomBar.tsx +4 -1
  169. package/src/components/data-table/TableTopBar.tsx +2 -0
  170. package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
  171. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  172. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  173. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  174. package/src/components/data-table/__tests__/data-table.test.tsx +1 -0
  175. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  176. package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
  177. package/src/components/data-table/__tests__/keyboard-selection.test.tsx +188 -0
  178. package/src/components/data-table/__tests__/pagination.test.tsx +28 -1
  179. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  180. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  181. package/src/components/data-table/cell-selection/feature.ts +2 -2
  182. package/src/components/data-table/cell-selection/types.ts +2 -2
  183. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  184. package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
  185. package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
  186. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  187. package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
  188. package/src/components/data-table/charts/charts.tsx +40 -30
  189. package/src/components/data-table/charts/storage.ts +16 -5
  190. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  191. package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
  192. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  193. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  194. package/src/components/data-table/columns.tsx +45 -46
  195. package/src/components/data-table/context-menu.tsx +36 -20
  196. package/src/components/data-table/data-table.tsx +17 -1
  197. package/src/components/data-table/date-popover.tsx +6 -4
  198. package/src/components/data-table/export-actions.tsx +76 -48
  199. package/src/components/data-table/pagination.tsx +44 -33
  200. package/src/components/data-table/range-focus/atoms.ts +4 -6
  201. package/src/components/data-table/range-focus/use-cell-range-selection.ts +65 -38
  202. package/src/components/data-table/range-focus/use-scroll-into-view.ts +21 -2
  203. package/src/components/data-table/renderers.tsx +16 -7
  204. package/src/components/data-table/row-viewer-panel/__tests__/row-viewer.test.tsx +24 -1
  205. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +4 -4
  206. package/src/components/data-table/search-highlight.tsx +79 -0
  207. package/src/components/data-table/types.ts +1 -0
  208. package/src/components/data-table/url-detector.tsx +49 -9
  209. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  210. package/src/components/datasources/__tests__/column-preview.test.tsx +96 -5
  211. package/src/components/datasources/__tests__/datasources-interactions.test.tsx +181 -0
  212. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  213. package/src/components/datasources/__tests__/utils.test.ts +57 -6
  214. package/src/components/datasources/column-preview.tsx +17 -12
  215. package/src/components/datasources/datasources.tsx +56 -43
  216. package/src/components/datasources/utils.ts +32 -23
  217. package/src/components/debugger/debugger-code.tsx +5 -0
  218. package/src/components/dependency-graph/custom-node.tsx +1 -1
  219. package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
  220. package/src/components/dependency-graph/elements.ts +24 -21
  221. package/src/components/dependency-graph/minimap-content.tsx +13 -19
  222. package/src/components/dependency-graph/panels.tsx +4 -2
  223. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
  224. package/src/components/editor/SortableCell.tsx +1 -3
  225. package/src/components/editor/__tests__/Output.test.tsx +50 -32
  226. package/src/{core/attachments/__tests__/toast.test.tsx → components/editor/__tests__/agent-toast.test.tsx} +1 -1
  227. package/src/components/editor/__tests__/data-attributes.test.tsx +28 -14
  228. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  229. package/src/components/editor/__tests__/output-persistence.test.tsx +6 -2
  230. package/src/components/editor/__tests__/package-alert.test.tsx +22 -1
  231. package/src/components/editor/actions/__tests__/name-cell-input.test.tsx +69 -0
  232. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +3 -3
  233. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +40 -10
  234. package/src/components/editor/actions/__tests__/pair-with-agent.test.tsx +6 -10
  235. package/src/components/editor/actions/__tests__/useCellActionButton.test.tsx +113 -0
  236. package/src/components/editor/actions/name-cell-input.tsx +4 -3
  237. package/src/components/editor/actions/pair-with-agent-commands.ts +10 -6
  238. package/src/components/editor/actions/pair-with-agent-modal.tsx +24 -21
  239. package/src/components/editor/actions/pair-with-agent.tsx +15 -10
  240. package/src/components/editor/actions/useCellActionButton.tsx +36 -31
  241. package/src/components/editor/actions/useConfigActions.tsx +3 -4
  242. package/src/components/editor/actions/useNotebookActions.tsx +25 -29
  243. package/src/components/editor/actions/useRestartKernel.tsx +1 -1
  244. package/src/components/editor/actions/useSetCodeVisibility.ts +11 -12
  245. package/src/components/editor/actions/useSetOutputsExpanded.ts +14 -19
  246. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  247. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  248. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +1 -1
  249. package/src/components/editor/alerts/connection-notice.tsx +1 -1
  250. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  251. package/src/components/editor/alerts/stdin-blocking-alert.tsx +1 -1
  252. package/src/components/editor/app-container.tsx +1 -1
  253. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +1 -1
  254. package/src/components/editor/cell/CreateCellButton.tsx +15 -21
  255. package/src/components/editor/cell/DeleteButton.tsx +3 -2
  256. package/src/components/editor/cell/RunButton.tsx +2 -2
  257. package/src/components/editor/cell/StagedAICell.tsx +10 -2
  258. package/src/components/editor/cell/StopButton.tsx +2 -2
  259. package/src/components/editor/cell/__tests__/StagedAICell.test.tsx +4 -2
  260. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  261. package/src/components/editor/cell/cell-actions.tsx +12 -1
  262. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  263. package/src/components/editor/cell/code/cell-editor.tsx +46 -165
  264. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  265. package/src/components/editor/cell/collapse.tsx +11 -4
  266. package/src/components/editor/cell/useAddCell.ts +4 -8
  267. package/src/components/editor/cell/useDeleteCell.tsx +10 -36
  268. package/src/components/editor/cell/useRunCells.ts +2 -5
  269. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  270. package/src/components/editor/cell/useSplitCell.tsx +10 -6
  271. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +1 -1
  272. package/src/components/editor/chrome/components/feedback-button.tsx +2 -8
  273. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +31 -2
  274. package/src/components/editor/chrome/panels/__tests__/runtime-details.test.tsx +1 -1
  275. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +1 -1
  276. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  277. package/src/components/editor/chrome/panels/dependency-graph-panel.tsx +1 -1
  278. package/src/components/editor/chrome/panels/logs-panel.tsx +2 -1
  279. package/src/components/editor/chrome/panels/outline/__tests__/outline-keyboard.test.tsx +84 -0
  280. package/src/components/editor/chrome/panels/outline/floating-outline.tsx +39 -14
  281. package/src/components/editor/chrome/panels/outline/useActiveOutline.tsx +3 -2
  282. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  283. package/src/components/editor/chrome/panels/secrets-panel.tsx +1 -0
  284. package/src/components/editor/chrome/panels/session-panel.tsx +1 -1
  285. package/src/components/editor/chrome/panels/snippets-panel.tsx +10 -12
  286. package/src/components/editor/chrome/panels/variable-panel.tsx +1 -5
  287. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +6 -9
  288. package/src/components/editor/chrome/wrapper/__tests__/document-sync-status.test.tsx +92 -0
  289. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +62 -3
  290. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +4 -4
  291. package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
  292. package/src/components/editor/chrome/wrapper/footer-items/document-sync-status.tsx +54 -0
  293. package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +1 -1
  294. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +1 -1
  295. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  296. package/src/components/editor/chrome/wrapper/footer.tsx +2 -2
  297. package/src/components/editor/chrome/wrapper/minimap-state.ts +1 -1
  298. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  299. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  300. package/src/components/editor/columns/__tests__/cell-column.test.tsx +1 -1
  301. package/src/components/editor/columns/cell-column.tsx +1 -1
  302. package/src/components/editor/columns/sortable-column.tsx +2 -2
  303. package/src/components/editor/connections/components.tsx +5 -10
  304. package/src/components/editor/controls/Controls.tsx +4 -4
  305. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  306. package/src/components/editor/controls/__tests__/keyboard-shortcuts.test.tsx +61 -0
  307. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +10 -4
  308. package/src/components/editor/controls/command-palette.tsx +22 -10
  309. package/src/components/editor/controls/keyboard-shortcuts.tsx +14 -5
  310. package/src/components/editor/documentation.css +34 -11
  311. package/src/components/editor/dynamic-favicon.tsx +21 -40
  312. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +25 -20
  313. package/src/components/editor/errors/auto-fix.tsx +4 -8
  314. package/src/components/editor/errors/send-error-report-button.tsx +3 -6
  315. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  316. package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +47 -0
  317. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  318. package/src/components/editor/file-tree/file-explorer.tsx +48 -15
  319. package/src/components/editor/file-tree/file-name-input.tsx +1 -0
  320. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  321. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  322. package/src/components/editor/header/__tests__/filename-form.test.tsx +1 -4
  323. package/src/components/editor/header/__tests__/status.test.tsx +5 -3
  324. package/src/components/editor/header/app-header.tsx +1 -1
  325. package/src/components/editor/header/filename-form.tsx +1 -1
  326. package/src/components/editor/header/status.tsx +40 -20
  327. package/src/components/editor/links/__tests__/cell-link.test.tsx +148 -0
  328. package/src/components/editor/links/cell-link-list.tsx +1 -1
  329. package/src/components/editor/links/cell-link.tsx +17 -7
  330. package/src/components/editor/navigation/__tests__/clipboard.test.ts +60 -38
  331. package/src/components/editor/navigation/__tests__/navigation.test.ts +108 -85
  332. package/src/components/editor/navigation/__tests__/selection.test.ts +43 -21
  333. package/src/components/editor/navigation/clipboard.ts +17 -14
  334. package/src/components/editor/navigation/focus-utils.ts +23 -4
  335. package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +17 -33
  336. package/src/components/editor/navigation/navigation.ts +71 -70
  337. package/src/components/editor/navigation/selection.ts +30 -29
  338. package/src/components/editor/notebook-banner.tsx +1 -0
  339. package/src/components/editor/notebook-cell.tsx +29 -32
  340. package/src/components/editor/output/MarimoErrorOutput.tsx +2 -1
  341. package/src/components/editor/output/MarimoTracebackOutput.tsx +19 -17
  342. package/src/components/editor/output/Outputs.css +8 -0
  343. package/src/components/editor/output/VideoOutput.tsx +6 -0
  344. package/src/components/editor/output/__tests__/VideoOutput.test.tsx +131 -0
  345. package/src/components/editor/output/__tests__/traceback.test.tsx +27 -1
  346. package/src/components/editor/output/ansi-reduce.ts +33 -20
  347. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  348. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +125 -69
  349. package/src/components/editor/package-alert.tsx +14 -7
  350. package/src/components/editor/renderers/cell-array.tsx +22 -33
  351. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
  352. package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +0 -1
  353. package/src/components/editor/renderers/slides-layout/slides-layout.tsx +1 -1
  354. package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +4 -4
  355. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  356. package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +1 -1
  357. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +1 -1
  358. package/src/components/editor/stdin-blocking-alert.tsx +1 -1
  359. package/src/components/home/components.tsx +17 -31
  360. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  361. package/src/components/icons/large-spinner.tsx +3 -14
  362. package/src/components/icons/spinner.tsx +1 -1
  363. package/src/components/markdown/markdown-renderer.tsx +4 -8
  364. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  365. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  366. package/src/components/pages/edit-page.tsx +19 -17
  367. package/src/components/pages/home-page.tsx +164 -91
  368. package/src/components/scratchpad/scratchpad.test.tsx +89 -0
  369. package/src/components/scratchpad/scratchpad.tsx +43 -32
  370. package/src/components/scratchpad/state.ts +7 -0
  371. package/src/components/slides/__tests__/minimap-actions.test.tsx +22 -29
  372. package/src/components/slides/__tests__/minimap.test.ts +38 -19
  373. package/src/components/slides/__tests__/slide-scroll-hint.test.tsx +37 -0
  374. package/src/components/slides/minimap.tsx +17 -12
  375. package/src/components/slides/reveal-component.tsx +58 -26
  376. package/src/components/slides/reveal-slides.css +5 -4
  377. package/src/components/slides/slide-cell-view.tsx +4 -5
  378. package/src/components/slides/slide-form.tsx +1 -0
  379. package/src/components/slides/slide-scroll-hint.tsx +3 -1
  380. package/src/components/sort/SortableCellsProvider.tsx +8 -25
  381. package/src/components/tracing/tracing-keyboard.test.tsx +85 -0
  382. package/src/components/tracing/tracing.tsx +46 -42
  383. package/src/components/ui/__tests__/draggable-popover.test.tsx +24 -0
  384. package/src/components/ui/__tests__/fullscreen.test.tsx +44 -2
  385. package/src/components/ui/__tests__/range-slider.test.tsx +165 -0
  386. package/src/components/ui/alert-dialog.tsx +1 -1
  387. package/src/components/ui/draggable-popover.tsx +24 -2
  388. package/src/components/ui/fullscreen.tsx +25 -1
  389. package/src/components/ui/range-slider.tsx +22 -9
  390. package/src/core/MarimoApp.tsx +3 -1
  391. package/src/core/ai/__tests__/staged-cells.test.ts +32 -33
  392. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +8 -12
  393. package/src/core/ai/context/providers/cell-output.ts +2 -2
  394. package/src/core/ai/context/providers/datasource.ts +6 -2
  395. package/src/core/ai/staged-cells.ts +18 -19
  396. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +40 -88
  397. package/src/core/ai/tools/__tests__/registry.test.ts +17 -0
  398. package/src/core/ai/tools/base.ts +18 -15
  399. package/src/core/ai/tools/edit-notebook-tool.ts +86 -80
  400. package/src/core/ai/tools/registry.ts +13 -10
  401. package/src/core/ai/tools/sample-tool.ts +6 -7
  402. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -37
  403. package/src/core/cells/__tests__/actions.test.ts +624 -35
  404. package/src/core/cells/__tests__/add-missing-import.test.ts +7 -8
  405. package/src/core/cells/__tests__/arrange.test.ts +432 -0
  406. package/src/core/cells/__tests__/cell.test.ts +39 -0
  407. package/src/core/cells/__tests__/cells.test.ts +251 -2540
  408. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  409. package/src/core/cells/__tests__/document.test.ts +164 -0
  410. package/src/core/cells/__tests__/editor.test.ts +57 -0
  411. package/src/core/cells/__tests__/flush-document.test.ts +40 -0
  412. package/src/core/cells/__tests__/harness.ts +106 -0
  413. package/src/core/cells/__tests__/layout.test.ts +177 -0
  414. package/src/core/cells/__tests__/notebook-outline.test.ts +122 -0
  415. package/src/core/cells/__tests__/outputs.test.tsx +71 -53
  416. package/src/core/cells/__tests__/session.test.ts +445 -211
  417. package/src/core/cells/__tests__/utils.test.ts +9 -108
  418. package/src/core/cells/actions.ts +675 -6
  419. package/src/core/cells/add-missing-import.ts +47 -43
  420. package/src/core/cells/arrange.ts +529 -0
  421. package/src/core/cells/cell.ts +14 -3
  422. package/src/core/cells/cells.ts +126 -1363
  423. package/src/core/cells/columns.ts +38 -0
  424. package/src/core/cells/document.ts +178 -0
  425. package/src/core/cells/edit.ts +30 -0
  426. package/src/core/cells/editor.ts +82 -0
  427. package/src/core/cells/layout.ts +221 -0
  428. package/src/core/cells/outputs.ts +12 -28
  429. package/src/core/cells/pending-delete-service.ts +3 -7
  430. package/src/core/cells/session.ts +76 -53
  431. package/src/core/cells/types.ts +22 -6
  432. package/src/core/cells/utils.ts +10 -8
  433. package/src/core/codemirror/__tests__/format.test.ts +0 -34
  434. package/src/core/codemirror/__tests__/setup.test.ts +29 -29
  435. package/src/core/codemirror/ai/__tests__/resources.test.ts +117 -0
  436. package/src/core/codemirror/ai/resources.ts +1 -1
  437. package/src/core/codemirror/cells/__tests__/extensions.test.ts +2 -6
  438. package/src/core/codemirror/cells/extensions.ts +30 -28
  439. package/src/core/codemirror/cells/state.ts +1 -6
  440. package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +6 -7
  441. package/src/core/codemirror/copilot/getCodes.ts +2 -2
  442. package/src/core/codemirror/format.ts +6 -23
  443. package/src/core/codemirror/keymaps/vim.ts +4 -8
  444. package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
  445. package/src/core/codemirror/language/__tests__/utils.test.ts +187 -15
  446. package/src/core/codemirror/language/cell-code.ts +114 -0
  447. package/src/core/codemirror/language/extension.ts +52 -35
  448. package/src/core/codemirror/language/languages/markdown.ts +8 -6
  449. package/src/core/codemirror/language/languages/python.ts +16 -10
  450. package/src/core/codemirror/language/languages/sql/sql.ts +16 -24
  451. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  452. package/src/core/codemirror/language/types.ts +7 -7
  453. package/src/core/codemirror/language/utils.ts +9 -39
  454. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -2
  455. package/src/core/codemirror/lsp/notebook-lsp.ts +6 -5
  456. package/src/core/codemirror/lsp/utils.ts +1 -1
  457. package/src/core/codemirror/misc/__tests__/paste.test.ts +3 -1
  458. package/src/core/codemirror/misc/paste.ts +1 -1
  459. package/src/core/codemirror/readonly/__tests__/extension.test.ts +1 -1
  460. package/src/core/codemirror/readonly/extension.ts +2 -2
  461. package/src/core/codemirror/utils.ts +1 -0
  462. package/src/core/config/__tests__/app-config.test.ts +64 -0
  463. package/src/core/config/__tests__/config-schema.test.ts +56 -6
  464. package/src/core/config/config-schema.ts +17 -4
  465. package/src/core/config/config.ts +65 -20
  466. package/src/core/config/feature-flag.tsx +0 -2
  467. package/src/core/datasets/__tests__/data-source-discovery.test.ts +5 -5
  468. package/src/core/datasets/data-source-discovery.ts +4 -6
  469. package/src/core/documentation/doc-lookup.ts +1 -1
  470. package/src/core/edit-app.tsx +21 -28
  471. package/src/core/errors/error-entries.ts +4 -1
  472. package/src/core/export/hooks.ts +1 -1
  473. package/src/core/export/layout.ts +2 -2
  474. package/src/core/hotkeys/actions.ts +2 -4
  475. package/src/core/islands/__tests__/bootstrap.test.ts +69 -17
  476. package/src/core/islands/__tests__/bridge.test.ts +85 -27
  477. package/src/core/islands/bootstrap.ts +46 -53
  478. package/src/core/islands/bridge.ts +84 -25
  479. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  480. package/src/core/islands/components/web-components.tsx +1 -1
  481. package/src/core/islands/worker/__tests__/controller.test.ts +62 -4
  482. package/src/core/islands/worker/controller.ts +4 -10
  483. package/src/core/islands/worker/worker.tsx +33 -33
  484. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  485. package/src/core/kernel/__tests__/handlers.test.ts +7 -153
  486. package/src/core/kernel/handlers.ts +19 -72
  487. package/src/core/meta/__tests__/code-visibility.test.tsx +78 -70
  488. package/src/core/meta/code-visibility.ts +18 -9
  489. package/src/core/network/__tests__/connection.test.ts +1 -1
  490. package/src/core/network/__tests__/requests-lazy.test.ts +1 -3
  491. package/src/core/network/connection-notice.ts +1 -1
  492. package/src/core/network/connection.ts +1 -1
  493. package/src/core/network/requests-lazy.ts +2 -5
  494. package/src/core/network/requests-network.ts +5 -31
  495. package/src/core/network/requests-static.ts +1 -4
  496. package/src/core/network/requests-toasting.tsx +1 -4
  497. package/src/core/network/types.ts +6 -14
  498. package/src/core/network/useConnectionNotice.ts +8 -2
  499. package/src/core/notebook/__tests__/operations.test.ts +51 -0
  500. package/src/core/notebook/attachments.ts +38 -0
  501. package/src/core/notebook/document/__tests__/codemirror.test.ts +758 -0
  502. package/src/core/notebook/document/__tests__/draft.test.ts +363 -0
  503. package/src/core/notebook/document/__tests__/fixtures.ts +92 -0
  504. package/src/core/notebook/document/__tests__/hooks.test.tsx +391 -0
  505. package/src/core/notebook/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  506. package/src/core/notebook/document/__tests__/model.test.ts +247 -0
  507. package/src/core/notebook/document/__tests__/protocol-fixtures.ts +38 -0
  508. package/src/core/notebook/document/__tests__/recovery-scenarios.test.ts +230 -0
  509. package/src/core/notebook/document/__tests__/scenario-fixture.ts +43 -0
  510. package/src/core/notebook/document/__tests__/scenarios.test.ts +205 -0
  511. package/src/core/notebook/document/__tests__/state.test.ts +459 -0
  512. package/src/core/notebook/document/__tests__/submission.test.ts +203 -0
  513. package/src/core/notebook/document/__tests__/test-host.test.ts +92 -0
  514. package/src/core/notebook/document/__tests__/test-host.ts +247 -0
  515. package/src/core/notebook/document/__tests__/test-notebook.ts +149 -0
  516. package/src/core/notebook/document/__tests__/user.ts +61 -0
  517. package/src/core/notebook/document/codemirror.ts +216 -0
  518. package/src/core/notebook/document/draft.ts +502 -0
  519. package/src/core/notebook/document/hooks.tsx +118 -0
  520. package/src/core/notebook/document/index.ts +24 -0
  521. package/src/core/notebook/document/model.ts +102 -0
  522. package/src/core/notebook/document/select.ts +41 -0
  523. package/src/core/notebook/document/state.ts +378 -0
  524. package/src/core/notebook/document/sync.ts +369 -0
  525. package/src/core/notebook/index.ts +19 -0
  526. package/src/core/notebook/operations.ts +30 -0
  527. package/src/core/notebook/replica/AGENTS.md +11 -0
  528. package/src/core/{host → notebook/replica}/__tests__/attachments.test.ts +9 -10
  529. package/src/core/{host → notebook/replica}/__tests__/document.test.ts +18 -16
  530. package/src/core/notebook/replica/__tests__/executions.test.ts +201 -0
  531. package/src/core/notebook/replica/__tests__/fixtures.ts +79 -0
  532. package/src/core/notebook/replica/__tests__/replica.test.ts +559 -0
  533. package/src/core/notebook/replica/__tests__/results.test.ts +193 -0
  534. package/src/core/notebook/replica/__tests__/runtime.test.ts +78 -0
  535. package/src/core/notebook/replica/backend.ts +19 -0
  536. package/src/core/notebook/replica/connection.ts +42 -0
  537. package/src/core/notebook/replica/index.ts +20 -0
  538. package/src/core/notebook/replica/replica.ts +336 -0
  539. package/src/core/{host → notebook/replica}/resources/attachments.ts +6 -3
  540. package/src/core/{host → notebook/replica}/resources/document.ts +3 -3
  541. package/src/core/notebook/replica/resources/executions.ts +157 -0
  542. package/src/core/notebook/replica/resources/results.ts +48 -0
  543. package/src/core/notebook/replica/resources/runtime.ts +14 -0
  544. package/src/core/packages/__tests__/useSandboxController.test.tsx +1 -1
  545. package/src/core/packages/useSandboxController.ts +1 -1
  546. package/src/core/run-app.tsx +48 -51
  547. package/src/core/runtime/__tests__/adapter.test.ts +1 -1
  548. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  549. package/src/core/runtime/__tests__/runtime.test.ts +32 -74
  550. package/src/core/runtime/adapter.ts +1 -1
  551. package/src/core/runtime/config.ts +2 -2
  552. package/src/core/runtime/runtime.ts +33 -46
  553. package/src/core/runtime/types.ts +0 -2
  554. package/src/core/saving/__tests__/document.test.tsx +123 -0
  555. package/src/core/saving/__tests__/state.test.ts +111 -0
  556. package/src/core/saving/__tests__/useAutoSave.test.tsx +67 -0
  557. package/src/core/saving/document.ts +33 -0
  558. package/src/core/saving/filename.ts +1 -1
  559. package/src/core/saving/save-component.tsx +39 -60
  560. package/src/core/saving/state.ts +38 -39
  561. package/src/core/saving/useAutoSave.ts +17 -53
  562. package/src/core/session/__tests__/backend.test.ts +236 -0
  563. package/src/core/session/__tests__/useNotebookReplica.hook.test.tsx +184 -0
  564. package/src/core/{websocket → session}/__tests__/useNotebookSession.hook.test.tsx +213 -262
  565. package/src/core/session/active-notebook.ts +28 -0
  566. package/src/core/session/backend.ts +123 -0
  567. package/src/core/session/embedded.ts +7 -0
  568. package/src/core/{websocket → session}/types.ts +2 -2
  569. package/src/core/session/useNotebookReplica.ts +74 -0
  570. package/src/core/{websocket → session}/useNotebookSession.tsx +77 -64
  571. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  572. package/src/core/state/jotai.ts +1 -1
  573. package/src/core/static/__tests__/files.test.ts +38 -10
  574. package/src/core/static/files.ts +2 -0
  575. package/src/core/{websocket → transports}/__tests__/connection-state.test.ts +1 -13
  576. package/src/core/transports/__tests__/server.test.ts +408 -0
  577. package/src/core/transports/__tests__/static.test.ts +306 -0
  578. package/src/core/transports/__tests__/wasm.test.ts +166 -0
  579. package/src/core/{websocket → transports}/connection-state.ts +9 -16
  580. package/src/core/transports/server.ts +152 -0
  581. package/src/core/transports/static.ts +166 -0
  582. package/src/core/transports/wasm.ts +97 -0
  583. package/src/core/vscode/__tests__/vscode-bindings.test.ts +125 -0
  584. package/src/core/vscode/vscode-bindings.ts +14 -2
  585. package/src/core/wasm/__tests__/bridge.test.ts +105 -65
  586. package/src/core/wasm/__tests__/worker.test.ts +187 -0
  587. package/src/core/wasm/bridge.ts +69 -72
  588. package/src/core/wasm/rpc.ts +15 -3
  589. package/src/core/wasm/store.ts +3 -3
  590. package/src/core/wasm/worker/bootstrap.ts +55 -51
  591. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  592. package/src/core/wasm/worker/save-worker.ts +9 -10
  593. package/src/core/wasm/worker/types.ts +29 -18
  594. package/src/core/wasm/worker/worker.ts +89 -45
  595. package/src/css/app/codemirror.css +1 -1
  596. package/src/css/common.css +1 -1
  597. package/src/css/globals.css +66 -22
  598. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  599. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  600. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  601. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  602. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  603. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  604. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  605. package/src/hooks/useAsyncData.ts +3 -3
  606. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  607. package/src/hooks/useDebounce.ts +6 -10
  608. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  609. package/src/hooks/useDelayElapsed.ts +14 -10
  610. package/src/hooks/useElapsedTime.ts +3 -3
  611. package/src/hooks/useEventListener.ts +1 -2
  612. package/src/hooks/useInputHistory.ts +4 -7
  613. package/src/hooks/useInternalStateWithSync.ts +6 -6
  614. package/src/hooks/useResizeObserver.ts +4 -7
  615. package/src/hooks/useScript.ts +67 -70
  616. package/src/hooks/useStateForKey.ts +93 -0
  617. package/src/mount.tsx +20 -15
  618. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  619. package/src/plugins/core/registerReactComponent.tsx +1 -1
  620. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  621. package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
  622. package/src/plugins/impl/DataTablePlugin.tsx +69 -37
  623. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  624. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  625. package/src/plugins/impl/FormPlugin.tsx +1 -1
  626. package/src/plugins/impl/RangeSliderPlugin.tsx +16 -2
  627. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  628. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  629. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +387 -1
  630. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  631. package/src/plugins/impl/__tests__/RangeSliderPlugin.test.tsx +109 -0
  632. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  633. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +153 -0
  634. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  635. package/src/plugins/impl/anywidget/model.ts +3 -1
  636. package/src/plugins/impl/anywidget/registry.ts +18 -14
  637. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  638. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  639. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  640. package/src/plugins/impl/chat/chat-ui.tsx +14 -11
  641. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  642. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  643. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  644. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  645. package/src/plugins/impl/data-explorer/components/column-summary.tsx +4 -2
  646. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  647. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
  648. package/src/plugins/impl/data-frames/__tests__/sidebar.test.tsx +160 -0
  649. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
  650. package/src/plugins/impl/data-frames/panel.tsx +44 -16
  651. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  652. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  653. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  654. package/src/plugins/impl/panel/utils.ts +17 -0
  655. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  656. package/src/plugins/impl/plotly/selection.ts +25 -19
  657. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  658. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  659. package/src/plugins/layout/DownloadPlugin.tsx +7 -11
  660. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  661. package/src/plugins/layout/__test__/DownloadPlugin.test.tsx +196 -0
  662. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  663. package/src/stories/button.stories.tsx +1 -0
  664. package/src/stories/cell.stories.tsx +2 -5
  665. package/src/stories/data-table.stories.tsx +31 -0
  666. package/src/stories/editor.stories.tsx +24 -17
  667. package/src/stories/form-wrapper.stories.tsx +2 -2
  668. package/src/stories/layout/vertical/one-column.stories.tsx +28 -23
  669. package/src/stories/runtime-story.tsx +23 -17
  670. package/src/stories/select.stories.tsx +2 -2
  671. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  672. package/src/utils/__tests__/arrays.test.ts +35 -0
  673. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  674. package/src/utils/__tests__/{createReducer.test.ts → createReducer.test.tsx} +29 -0
  675. package/src/utils/__tests__/download.test.tsx +62 -9
  676. package/src/utils/__tests__/numbers.test.ts +105 -1
  677. package/src/utils/__tests__/objects.test.ts +21 -0
  678. package/src/utils/arrays.ts +11 -2
  679. package/src/utils/blob.ts +1 -1
  680. package/src/utils/createReducer.ts +53 -26
  681. package/src/utils/download.ts +55 -3
  682. package/src/utils/maps.ts +0 -3
  683. package/src/utils/numbers.ts +79 -18
  684. package/src/utils/objects.ts +4 -9
  685. package/src/utils/tracer.ts +9 -5
  686. package/src/utils/zod-utils.ts +1 -3
  687. package/dist/_baseMerge-BiGRwuqv.js +0 -165
  688. package/dist/any-language-editor-D4q-IFcM.js +0 -76
  689. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  690. package/dist/assets/worker-HPY9fbhz.js +0 -114
  691. package/dist/code-visibility-HTfE7PV1.js +0 -138
  692. package/dist/dropdown-menu-DHP9P4VE.js +0 -4678
  693. package/dist/feedback-button-BL7Ed1J3.js +0 -379
  694. package/dist/hasIn-o2Us0uVx.js +0 -132
  695. package/dist/html-to-image-BdA59IUD.js +0 -3251
  696. package/dist/isArrayLikeObject-BZl-15ir.js +0 -450
  697. package/dist/isEmpty-BSZ1LaUo.js +0 -35
  698. package/dist/isSymbol-kQcfYbNX.js +0 -8
  699. package/dist/label-DoysmLMW.js +0 -281
  700. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
  701. package/dist/objectWithoutPropertiesLoose-BRDcTsfB.js +0 -23
  702. package/dist/pick-CJeoxYOS.js +0 -51
  703. package/dist/precisionRound-DMIVQrt2.js +0 -97
  704. package/dist/select-DemoKT4G.js +0 -1344
  705. package/dist/toDate-B5mIgxwZ.js +0 -1185
  706. package/dist/toast-PkdZraM8.js +0 -1830
  707. package/dist/use-restore-focus-CKjfFjLM.js +0 -6369
  708. package/dist/useLifecycle-BGWzTwHK.js +0 -169
  709. package/dist/useTheme-BhQvec43.js +0 -904
  710. package/src/components/editor/cell/code/__tests__/rtc-editor-config.test.ts +0 -50
  711. package/src/components/editor/chrome/wrapper/footer-items/rtc-status.tsx +0 -65
  712. package/src/components/editor/navigation/__tests__/state.test.ts +0 -81
  713. package/src/components/editor/navigation/state.ts +0 -65
  714. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +0 -656
  715. package/src/core/ai/tools/run-cells-tool.ts +0 -303
  716. package/src/core/attachments/state.ts +0 -18
  717. package/src/core/cells/__tests__/apply-transaction.test.ts +0 -991
  718. package/src/core/cells/__tests__/document-changes.test.ts +0 -1140
  719. package/src/core/cells/__tests__/document-roundtrip.test.ts +0 -392
  720. package/src/core/cells/document-changes.ts +0 -944
  721. package/src/core/codemirror/rtc/extension.ts +0 -453
  722. package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +0 -52
  723. package/src/core/codemirror/rtc/loro/awareness.ts +0 -531
  724. package/src/core/codemirror/rtc/loro/colors.ts +0 -38
  725. package/src/core/codemirror/rtc/loro/sync.ts +0 -168
  726. package/src/core/host/AGENTS.md +0 -11
  727. package/src/core/host/__tests__/events.test.ts +0 -46
  728. package/src/core/host/__tests__/fixtures.ts +0 -39
  729. package/src/core/host/__tests__/notebook-client.test.ts +0 -433
  730. package/src/core/host/__tests__/protocol.test.ts +0 -214
  731. package/src/core/host/__tests__/stream.test.ts +0 -209
  732. package/src/core/host/connection.ts +0 -81
  733. package/src/core/host/events.ts +0 -61
  734. package/src/core/host/notebook-client.ts +0 -290
  735. package/src/core/host/protocol.ts +0 -1943
  736. package/src/core/host/resources/resource.ts +0 -47
  737. package/src/core/host/stream.ts +0 -211
  738. package/src/core/rtc/state.ts +0 -34
  739. package/src/core/state/__tests__/jotai.test.ts +0 -25
  740. package/src/core/wasm/worker/message-buffer.ts +0 -33
  741. package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
  742. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +0 -170
  743. package/src/core/websocket/state.ts +0 -7
  744. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  745. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
  746. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  747. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  748. package/src/core/websocket/transports/basic.ts +0 -102
  749. package/src/core/websocket/transports/create.ts +0 -31
  750. package/src/core/websocket/transports/sse.ts +0 -308
  751. package/src/core/websocket/transports/transport.ts +0 -50
  752. package/src/core/websocket/transports/ws.ts +0 -98
  753. package/src/core/websocket/useNotebookClient.ts +0 -88
  754. package/src/utils/__tests__/id-tree.test.ts +0 -2145
  755. package/src/utils/id-tree.tsx +0 -1134
  756. /package/src/{core/attachments/toast.ts → components/editor/agent-toast.ts} +0 -0
  757. /package/src/core/{websocket → session}/connection-utils.ts +0 -0
@@ -3,15 +3,38 @@
3
3
 
4
4
  import type { EditorView } from "@codemirror/view";
5
5
  import { act, renderHook } from "@testing-library/react";
6
- import { Provider } from "jotai";
7
6
  import React, { createRef } from "react";
8
- import { afterAll, beforeEach, describe, expect, it, vi } from "vitest";
7
+ import {
8
+ afterAll,
9
+ afterEach,
10
+ beforeEach,
11
+ describe,
12
+ expect,
13
+ it,
14
+ vi,
15
+ } from "vitest";
9
16
  import { Mocks } from "@/__mocks__/common";
17
+
18
+ const { mockCreateCell, mockMoveToNextCell } = vi.hoisted(() => ({
19
+ mockCreateCell: vi.fn(),
20
+ mockMoveToNextCell: vi.fn(),
21
+ }));
22
+
23
+ import { DocumentWrapper, mockDocumentModel } from "@/__mocks__/document";
10
24
  import { MockNotebook } from "@/__mocks__/notebook";
11
25
  import { MockRequestClient } from "@/__mocks__/requests";
12
26
  import { aiCompletionCellAtom } from "@/core/ai/state";
13
- import type { CellActions } from "@/core/cells/cells";
27
+ import type { CellActions } from "@/core/cells/actions";
14
28
  import { notebookAtom } from "@/core/cells/cells";
29
+ import type { CellId } from "@/core/cells/ids";
30
+ import { layoutAtom } from "@/core/cells/layout";
31
+ import type { DocumentModel } from "@/core/notebook/document";
32
+ import {
33
+ cell,
34
+ CONFIG,
35
+ document as documentOf,
36
+ withCells,
37
+ } from "@/core/notebook/document/__tests__/fixtures";
15
38
  import { LanguageAdapters } from "@/core/codemirror/language/LanguageAdapters";
16
39
  import { signatureHintField } from "@/core/codemirror/completion/signature-hint";
17
40
  import {
@@ -30,9 +53,11 @@ import {
30
53
  } from "../navigation";
31
54
 
32
55
  // Mock only the essential dependencies that we need to control
56
+ vi.mock("@/core/cells/actions", () => ({
57
+ useCellActions: vi.fn(),
58
+ }));
33
59
  vi.mock("@/core/cells/cells", async (importOriginal) => ({
34
60
  ...(await importOriginal()),
35
- useCellActions: vi.fn(),
36
61
  }));
37
62
 
38
63
  vi.mock("@/core/cells/focus", async (importOriginal) => ({
@@ -80,7 +105,7 @@ vi.mock("@codemirror/autocomplete", () => ({
80
105
 
81
106
  // Get mocked functions
82
107
  const mockUseCellActions = vi.mocked(
83
- await import("@/core/cells/cells"),
108
+ await import("@/core/cells/actions"),
84
109
  ).useCellActions;
85
110
 
86
111
  const mockUseSaveNotebook = vi.mocked(
@@ -93,12 +118,13 @@ const mockUseCellClipboard = vi.mocked(
93
118
  await import("../clipboard"),
94
119
  ).useCellClipboard;
95
120
 
121
+ afterEach(() => stopModel());
122
+
96
123
  afterAll(() => {
97
124
  vi.resetAllMocks();
98
125
  });
99
126
 
100
127
  import { defaultUserConfig } from "@/core/config/config-schema";
101
- import { MultiColumn } from "@/utils/id-tree";
102
128
  import { focusCell, focusCellEditor } from "../focus-utils";
103
129
  import {
104
130
  type CellSelectionState,
@@ -107,11 +133,17 @@ import {
107
133
  useIsCellSelected,
108
134
  } from "../selection";
109
135
 
136
+ // The document the hooks edit, with cellId3's code hidden
137
+ let model: DocumentModel;
138
+ let stopModel = () => {};
139
+ const hideCodeOf = (id: CellId) =>
140
+ store.get(model.documentAtom)?.cells.get(id)?.config.hide_code;
141
+
110
142
  // Shared render helper
111
143
  const renderWithProvider = <T>(hook: () => T) => {
112
144
  return renderHook(hook, {
113
145
  wrapper: ({ children }) =>
114
- React.createElement(Provider, { store }, children),
146
+ React.createElement(DocumentWrapper, { store, model }, children),
115
147
  });
116
148
  };
117
149
 
@@ -125,17 +157,15 @@ const mockCutCell = vi.fn().mockResolvedValue(undefined);
125
157
  const mockPasteCell = vi.fn();
126
158
 
127
159
  const mockCellActions = MockNotebook.cellActions({
160
+ createCell: mockCreateCell,
161
+ moveToNextCell: mockMoveToNextCell,
128
162
  focusCell: vi.fn(),
129
- moveToNextCell: vi.fn(),
130
163
  focusTopCell: vi.fn(),
131
164
  focusBottomCell: vi.fn(),
132
- createNewCell: vi.fn(),
133
165
  moveCell: vi.fn(),
134
166
  sendToTop: vi.fn(),
135
167
  sendToBottom: vi.fn(),
136
- updateCellConfig: vi.fn(),
137
- markTouched: vi.fn(),
138
- deleteCell: vi.fn(),
168
+ deleteCells: vi.fn(),
139
169
  undoDeleteCell: vi.fn(),
140
170
  });
141
171
 
@@ -207,6 +237,23 @@ describe("useCellNavigationProps", () => {
207
237
  },
208
238
  });
209
239
  store.set(notebookAtom, notebookState);
240
+ stopModel();
241
+ ({ model, stop: stopModel } = mockDocumentModel(
242
+ store,
243
+ withCells(
244
+ documentOf(),
245
+ {
246
+ c1: null,
247
+ c2: null,
248
+ [cellId1]: cell(cellId1, ""),
249
+ [cellId2]: cell(cellId2, ""),
250
+ [cellId3]: cell(cellId3, "", {
251
+ config: { ...CONFIG, hide_code: true },
252
+ }),
253
+ },
254
+ [cellId1, cellId2, cellId3],
255
+ ),
256
+ ));
210
257
 
211
258
  // Clear AI completion state
212
259
  store.set(aiCompletionCellAtom, null);
@@ -270,7 +317,7 @@ describe("useCellNavigationProps", () => {
270
317
  selectionActions.select({ cellId: cellId1 });
271
318
  selectionActions.extend({
272
319
  cellId: cellId2,
273
- allCellIds: store.get(notebookAtom).cellIds,
320
+ layout: store.get(layoutAtom),
274
321
  });
275
322
 
276
323
  const { result } = renderWithProvider(() =>
@@ -367,7 +414,7 @@ describe("useCellNavigationProps", () => {
367
414
  });
368
415
 
369
416
  expect(mockRunCell).toHaveBeenCalled();
370
- expect(mockCellActions.moveToNextCell).toHaveBeenCalledWith({
417
+ expect(mockMoveToNextCell).toHaveBeenCalledWith({
371
418
  cellId: mockCellId,
372
419
  before: false,
373
420
  });
@@ -399,11 +446,7 @@ describe("useCellNavigationProps", () => {
399
446
  result.current.onKeyDown?.(mockEvent);
400
447
  });
401
448
 
402
- expect(mockCellActions.createNewCell).toHaveBeenCalledWith({
403
- cellId: mockCellId,
404
- before: true,
405
- autoFocus: true,
406
- });
449
+ expect(mockCreateCell).toHaveBeenCalledWith({ before: mockCellId });
407
450
  });
408
451
 
409
452
  it("should create cell after when 'b' key is pressed", () => {
@@ -417,11 +460,7 @@ describe("useCellNavigationProps", () => {
417
460
  result.current.onKeyDown?.(mockEvent);
418
461
  });
419
462
 
420
- expect(mockCellActions.createNewCell).toHaveBeenCalledWith({
421
- cellId: mockCellId,
422
- before: false,
423
- autoFocus: true,
424
- });
463
+ expect(mockCreateCell).toHaveBeenCalledWith({ after: mockCellId });
425
464
  });
426
465
 
427
466
  it("should add an import before and a SQL cell after when 'q' is pressed", () => {
@@ -435,18 +474,15 @@ describe("useCellNavigationProps", () => {
435
474
  result.current.onKeyDown?.(Mocks.keyboardEvent({ key: "q" }));
436
475
  });
437
476
 
438
- expect(mockCellActions.createNewCell).toHaveBeenNthCalledWith(
477
+ expect(mockCreateCell).toHaveBeenNthCalledWith(
439
478
  1,
440
479
  expect.objectContaining({
441
- cellId: mockCellId,
442
- before: true,
480
+ before: mockCellId,
443
481
  code: "import marimo as mo",
444
482
  }),
445
483
  );
446
- expect(mockCellActions.createNewCell).toHaveBeenNthCalledWith(2, {
447
- cellId: mockCellId,
448
- before: false,
449
- autoFocus: true,
484
+ expect(mockCreateCell).toHaveBeenNthCalledWith(2, {
485
+ after: mockCellId,
450
486
  code: LanguageAdapters.sql.defaultCode,
451
487
  });
452
488
  });
@@ -813,7 +849,7 @@ describe("useCellNavigationProps", () => {
813
849
  selectionActions.select({ cellId: cellId1 });
814
850
  selectionActions.extend({
815
851
  cellId: cellId2,
816
- allCellIds: store.get(notebookAtom).cellIds,
852
+ layout: store.get(layoutAtom),
817
853
  });
818
854
 
819
855
  const { result } = renderWithProvider(() =>
@@ -836,7 +872,7 @@ describe("useCellNavigationProps", () => {
836
872
  selectionActions.select({ cellId: cellId1 });
837
873
  selectionActions.extend({
838
874
  cellId: cellId3,
839
- allCellIds: store.get(notebookAtom).cellIds,
875
+ layout: store.get(layoutAtom),
840
876
  });
841
877
 
842
878
  const { result } = renderWithProvider(() =>
@@ -859,7 +895,7 @@ describe("useCellNavigationProps", () => {
859
895
  selectionActions.select({ cellId: cellId1 });
860
896
  selectionActions.extend({
861
897
  cellId: cellId3,
862
- allCellIds: store.get(notebookAtom).cellIds,
898
+ layout: store.get(layoutAtom),
863
899
  });
864
900
 
865
901
  const { result } = renderWithProvider(() =>
@@ -882,7 +918,7 @@ describe("useCellNavigationProps", () => {
882
918
  selectionActions.select({ cellId: cellId2 });
883
919
  selectionActions.extend({
884
920
  cellId: cellId3,
885
- allCellIds: store.get(notebookAtom).cellIds,
921
+ layout: store.get(layoutAtom),
886
922
  });
887
923
 
888
924
  const { result } = renderWithProvider(() =>
@@ -917,7 +953,7 @@ describe("useCellNavigationProps", () => {
917
953
  selectionActions.select({ cellId: cellId1 });
918
954
  selectionActions.extend({
919
955
  cellId: cellId2,
920
- allCellIds: store.get(notebookAtom).cellIds,
956
+ layout: store.get(layoutAtom),
921
957
  });
922
958
 
923
959
  const { result } = renderWithProvider(() =>
@@ -953,7 +989,7 @@ describe("useCellNavigationProps", () => {
953
989
  selectionActions.select({ cellId: cellId2 });
954
990
  selectionActions.extend({
955
991
  cellId: cellId3,
956
- allCellIds: store.get(notebookAtom).cellIds,
992
+ layout: store.get(layoutAtom),
957
993
  });
958
994
 
959
995
  const { result } = renderWithProvider(() =>
@@ -986,7 +1022,7 @@ describe("useCellNavigationProps", () => {
986
1022
  selectionActions.select({ cellId: cellId1 });
987
1023
  selectionActions.extend({
988
1024
  cellId: cellId2,
989
- allCellIds: store.get(notebookAtom).cellIds,
1025
+ layout: store.get(layoutAtom),
990
1026
  });
991
1027
 
992
1028
  const { result } = renderWithProvider(() =>
@@ -1019,7 +1055,7 @@ describe("useCellNavigationProps", () => {
1019
1055
  selectionActions.select({ cellId: cellId1 });
1020
1056
  selectionActions.extend({
1021
1057
  cellId: cellId2,
1022
- allCellIds: store.get(notebookAtom).cellIds,
1058
+ layout: store.get(layoutAtom),
1023
1059
  });
1024
1060
 
1025
1061
  const { result } = renderWithProvider(() =>
@@ -1034,7 +1070,7 @@ describe("useCellNavigationProps", () => {
1034
1070
 
1035
1071
  expect(mockRunCell).toHaveBeenCalledWith([cellId1, cellId2]);
1036
1072
  // Should move to next cell after the last selected cell
1037
- expect(mockCellActions.moveToNextCell).toHaveBeenCalledWith({
1073
+ expect(mockMoveToNextCell).toHaveBeenCalledWith({
1038
1074
  cellId: cellId2,
1039
1075
  before: false,
1040
1076
  });
@@ -1047,7 +1083,7 @@ describe("useCellNavigationProps", () => {
1047
1083
  selectionActions.select({ cellId: cellId2 });
1048
1084
  selectionActions.extend({
1049
1085
  cellId: cellId3,
1050
- allCellIds: store.get(notebookAtom).cellIds,
1086
+ layout: store.get(layoutAtom),
1051
1087
  });
1052
1088
 
1053
1089
  const { result } = renderWithProvider(() =>
@@ -1066,7 +1102,7 @@ describe("useCellNavigationProps", () => {
1066
1102
 
1067
1103
  expect(mockRunCell).toHaveBeenCalledWith([cellId2, cellId3]);
1068
1104
  // Should move to previous cell before the first selected cell
1069
- expect(mockCellActions.moveToNextCell).toHaveBeenCalledWith({
1105
+ expect(mockMoveToNextCell).toHaveBeenCalledWith({
1070
1106
  cellId: cellId2,
1071
1107
  before: true,
1072
1108
  });
@@ -1101,7 +1137,7 @@ describe("useCellNavigationProps", () => {
1101
1137
  selectionActions.select({ cellId: cellId1 });
1102
1138
  selectionActions.extend({
1103
1139
  cellId: cellId2,
1104
- allCellIds: store.get(notebookAtom).cellIds,
1140
+ layout: store.get(layoutAtom),
1105
1141
  });
1106
1142
 
1107
1143
  const { result } = renderWithProvider(() =>
@@ -1129,7 +1165,7 @@ describe("useCellNavigationProps", () => {
1129
1165
  selectionActions.select({ cellId: cellId1 });
1130
1166
  selectionActions.extend({
1131
1167
  cellId: cellId2,
1132
- allCellIds: store.get(notebookAtom).cellIds,
1168
+ layout: store.get(layoutAtom),
1133
1169
  });
1134
1170
 
1135
1171
  const { result } = renderWithProvider(() =>
@@ -1167,15 +1203,7 @@ describe("useCellNavigationProps", () => {
1167
1203
  result.current.onKeyDown?.(mockEvent);
1168
1204
  });
1169
1205
 
1170
- expect(mockRequestClient.saveCellConfig).toHaveBeenCalledWith({
1171
- configs: {
1172
- [cellId1]: { hide_code: true },
1173
- },
1174
- });
1175
- expect(mockCellActions.updateCellConfig).toHaveBeenCalledWith({
1176
- cellId: cellId1,
1177
- config: { hide_code: true },
1178
- });
1206
+ expect(hideCodeOf(cellId1)).toBe(true);
1179
1207
  expect(mockEvent.preventDefault).toHaveBeenCalled();
1180
1208
  });
1181
1209
 
@@ -1190,15 +1218,7 @@ describe("useCellNavigationProps", () => {
1190
1218
  result.current.onKeyDown?.(mockEvent);
1191
1219
  });
1192
1220
 
1193
- expect(mockRequestClient.saveCellConfig).toHaveBeenCalledWith({
1194
- configs: {
1195
- [cellId3]: { hide_code: false },
1196
- },
1197
- });
1198
- expect(mockCellActions.updateCellConfig).toHaveBeenCalledWith({
1199
- cellId: cellId3,
1200
- config: { hide_code: false },
1201
- });
1221
+ expect(hideCodeOf(cellId3)).toBe(false);
1202
1222
  });
1203
1223
 
1204
1224
  it("should toggle hide code for multiple selected cells", () => {
@@ -1207,7 +1227,7 @@ describe("useCellNavigationProps", () => {
1207
1227
  selectionActions.select({ cellId: cellId1 });
1208
1228
  selectionActions.extend({
1209
1229
  cellId: cellId2,
1210
- allCellIds: store.get(notebookAtom).cellIds,
1230
+ layout: store.get(layoutAtom),
1211
1231
  });
1212
1232
 
1213
1233
  const { result } = renderWithProvider(() =>
@@ -1220,20 +1240,8 @@ describe("useCellNavigationProps", () => {
1220
1240
  result.current.onKeyDown?.(mockEvent);
1221
1241
  });
1222
1242
 
1223
- expect(mockRequestClient.saveCellConfig).toHaveBeenCalledWith({
1224
- configs: {
1225
- [cellId1]: { hide_code: true },
1226
- [cellId2]: { hide_code: true },
1227
- },
1228
- });
1229
- expect(mockCellActions.updateCellConfig).toHaveBeenCalledWith({
1230
- cellId: cellId1,
1231
- config: { hide_code: true },
1232
- });
1233
- expect(mockCellActions.updateCellConfig).toHaveBeenCalledWith({
1234
- cellId: cellId2,
1235
- config: { hide_code: true },
1236
- });
1243
+ expect(hideCodeOf(cellId1)).toBe(true);
1244
+ expect(hideCodeOf(cellId2)).toBe(true);
1237
1245
  });
1238
1246
  });
1239
1247
 
@@ -1418,12 +1426,27 @@ describe("useCellNavigationProps", () => {
1418
1426
  },
1419
1427
  },
1420
1428
  });
1421
- // Override cellIds to be multi-column
1422
- notebookState.cellIds = MultiColumn.from([
1423
- [cellId1, cellId3],
1424
- [cellId2, cellId4, cellId5],
1425
- ]);
1426
1429
  store.set(notebookAtom, notebookState);
1430
+ // The layout reads columns from the document's cells.
1431
+ stopModel();
1432
+ const inColumn = (id: CellId, column: number) =>
1433
+ cell(id, "", { config: { ...CONFIG, column } });
1434
+ ({ model, stop: stopModel } = mockDocumentModel(
1435
+ store,
1436
+ withCells(
1437
+ documentOf(),
1438
+ {
1439
+ c1: null,
1440
+ c2: null,
1441
+ [cellId1]: inColumn(cellId1, 0),
1442
+ [cellId3]: inColumn(cellId3, 0),
1443
+ [cellId2]: inColumn(cellId2, 1),
1444
+ [cellId4]: inColumn(cellId4, 1),
1445
+ [cellId5]: inColumn(cellId5, 1),
1446
+ },
1447
+ [cellId1, cellId3, cellId2, cellId4, cellId5],
1448
+ ),
1449
+ ));
1427
1450
 
1428
1451
  // Mock DOM elements and their positions
1429
1452
  const mockGetElementById = vi.spyOn(document, "getElementById");
@@ -1613,7 +1636,7 @@ describe("useCellNavigationProps", () => {
1613
1636
  selectionActions.select({ cellId: cellId1 });
1614
1637
  selectionActions.extend({
1615
1638
  cellId: cellId2,
1616
- allCellIds: store.get(notebookAtom).cellIds,
1639
+ layout: store.get(layoutAtom),
1617
1640
  });
1618
1641
 
1619
1642
  const { result } = renderWithProvider(() =>
@@ -1701,7 +1724,7 @@ describe("useCellNavigationProps", () => {
1701
1724
  result.current.onKeyDown?.(mockEvent);
1702
1725
  });
1703
1726
 
1704
- expect(mockCellActions.createNewCell).not.toHaveBeenCalled();
1727
+ expect(mockCreateCell).not.toHaveBeenCalled();
1705
1728
  expect(mockEvent.preventDefault).not.toHaveBeenCalled();
1706
1729
  });
1707
1730
 
@@ -1716,7 +1739,7 @@ describe("useCellNavigationProps", () => {
1716
1739
  result.current.onKeyDown?.(mockEvent);
1717
1740
  });
1718
1741
 
1719
- expect(mockCellActions.createNewCell).not.toHaveBeenCalled();
1742
+ expect(mockCreateCell).not.toHaveBeenCalled();
1720
1743
  expect(mockEvent.preventDefault).not.toHaveBeenCalled();
1721
1744
  });
1722
1745
  });
@@ -2,7 +2,8 @@
2
2
 
3
3
  import { beforeEach, describe, expect, it } from "vitest";
4
4
  import { cellId } from "@/__tests__/branded";
5
- import { MultiColumn } from "@/utils/id-tree";
5
+ import type { CellId } from "@/core/cells/ids";
6
+ import type { CellColumnId, Layout } from "@/core/cells/layout";
6
7
  import type { CellSelectionState } from "../selection";
7
8
  import { exportedForTesting } from "../selection";
8
9
 
@@ -16,6 +17,14 @@ const CellIds = {
16
17
  e: cellId("e"),
17
18
  };
18
19
 
20
+ /** A one-column page of `ids`, with `hidden` folded away under the cell before them. */
21
+ function page(ids: CellId[], hidden: CellId[] = []): Layout {
22
+ const visible = ids.filter((id) => !hidden.includes(id));
23
+ return {
24
+ columns: [{ id: "column" as CellColumnId, ids, visible, folds: new Map() }],
25
+ };
26
+ }
27
+
19
28
  describe("cell selection reducer", () => {
20
29
  let state: CellSelectionState;
21
30
 
@@ -57,15 +66,13 @@ describe("cell selection reducer", () => {
57
66
  });
58
67
 
59
68
  it("should extend selection forward", () => {
60
- const allCellIds = MultiColumn.from([
61
- [CellIds.a, CellIds.b, CellIds.c, CellIds.d],
62
- ]);
69
+ const layout = page([CellIds.a, CellIds.b, CellIds.c, CellIds.d]);
63
70
 
64
71
  // First select cell a
65
72
  actions.select({ cellId: CellIds.a });
66
73
 
67
74
  // Then extend to cell c
68
- actions.extend({ cellId: CellIds.c, allCellIds });
75
+ actions.extend({ cellId: CellIds.c, layout });
69
76
 
70
77
  expect(state).toEqual({
71
78
  selectionStart: CellIds.a,
@@ -75,15 +82,13 @@ describe("cell selection reducer", () => {
75
82
  });
76
83
 
77
84
  it("should extend selection backward", () => {
78
- const allCellIds = MultiColumn.from([
79
- [CellIds.a, CellIds.b, CellIds.c, CellIds.d],
80
- ]);
85
+ const layout = page([CellIds.a, CellIds.b, CellIds.c, CellIds.d]);
81
86
 
82
87
  // First select cell c
83
88
  actions.select({ cellId: CellIds.c });
84
89
 
85
90
  // Then extend to cell a (backward)
86
- actions.extend({ cellId: CellIds.a, allCellIds });
91
+ actions.extend({ cellId: CellIds.a, layout });
87
92
 
88
93
  expect(state).toEqual({
89
94
  selectionStart: CellIds.c,
@@ -93,13 +98,13 @@ describe("cell selection reducer", () => {
93
98
  });
94
99
 
95
100
  it("should extend selection to same cell", () => {
96
- const allCellIds = MultiColumn.from([[CellIds.a, CellIds.b, CellIds.c]]);
101
+ const layout = page([CellIds.a, CellIds.b, CellIds.c]);
97
102
 
98
103
  // First select cell b
99
104
  actions.select({ cellId: CellIds.b });
100
105
 
101
106
  // Then extend to same cell
102
- actions.extend({ cellId: CellIds.b, allCellIds });
107
+ actions.extend({ cellId: CellIds.b, layout });
103
108
 
104
109
  expect(state).toEqual({
105
110
  selectionStart: CellIds.b,
@@ -109,10 +114,10 @@ describe("cell selection reducer", () => {
109
114
  });
110
115
 
111
116
  it("should fallback to single select when extending without selectionStart", () => {
112
- const allCellIds = MultiColumn.from([[CellIds.a, CellIds.b, CellIds.c]]);
117
+ const layout = page([CellIds.a, CellIds.b, CellIds.c]);
113
118
 
114
119
  // Try to extend without any previous selection
115
- actions.extend({ cellId: CellIds.b, allCellIds });
120
+ actions.extend({ cellId: CellIds.b, layout });
116
121
 
117
122
  expect(state).toEqual({
118
123
  selectionStart: CellIds.b,
@@ -122,11 +127,11 @@ describe("cell selection reducer", () => {
122
127
  });
123
128
 
124
129
  it("should fallback to single select when extending with invalid cell ids", () => {
125
- const allCellIds = MultiColumn.from([[CellIds.a, CellIds.b, CellIds.c]]);
130
+ const layout = page([CellIds.a, CellIds.b, CellIds.c]);
126
131
 
127
- // Create a state with invalid selection start (not in allCellIds)
132
+ // Create a state with invalid selection start (not on the page)
128
133
  const invalidState = {
129
- selectionStart: CellIds.d, // not in allCellIds
134
+ selectionStart: CellIds.d, // not on the page
130
135
  selectionEnd: CellIds.d,
131
136
  selected: new Set([CellIds.d]),
132
137
  };
@@ -134,7 +139,7 @@ describe("cell selection reducer", () => {
134
139
  // Test reducer directly since we need to start with custom state
135
140
  const result = reducer(invalidState, {
136
141
  type: "extend",
137
- payload: { cellId: CellIds.b, allCellIds },
142
+ payload: { cellId: CellIds.b, layout },
138
143
  });
139
144
 
140
145
  expect(result).toEqual({
@@ -144,6 +149,19 @@ describe("cell selection reducer", () => {
144
149
  });
145
150
  });
146
151
 
152
+ it("steps over the cells a fold hides", () => {
153
+ const layout = page(
154
+ [CellIds.a, CellIds.b, CellIds.c, CellIds.d, CellIds.e],
155
+ [CellIds.b, CellIds.c],
156
+ );
157
+
158
+ actions.select({ cellId: CellIds.a });
159
+ actions.extend({ cellId: CellIds.d, layout });
160
+
161
+ expect(state.selected).toEqual(new Set([CellIds.a, CellIds.d]));
162
+ expect(state.selectionEnd).toBe(CellIds.d);
163
+ });
164
+
147
165
  it("should clear selection", () => {
148
166
  // First select some cells
149
167
  actions.select({ cellId: CellIds.a });
@@ -171,19 +189,23 @@ describe("cell selection reducer", () => {
171
189
  });
172
190
 
173
191
  it("should handle complex selection scenarios", () => {
174
- const allCellIds = MultiColumn.from([
175
- [CellIds.a, CellIds.b, CellIds.c, CellIds.d, CellIds.e],
192
+ const layout = page([
193
+ CellIds.a,
194
+ CellIds.b,
195
+ CellIds.c,
196
+ CellIds.d,
197
+ CellIds.e,
176
198
  ]);
177
199
 
178
200
  // Select middle cell
179
201
  actions.select({ cellId: CellIds.c });
180
202
 
181
203
  // Extend to end
182
- actions.extend({ cellId: CellIds.e, allCellIds });
204
+ actions.extend({ cellId: CellIds.e, layout });
183
205
  expect(state.selected).toEqual(new Set([CellIds.c, CellIds.d, CellIds.e]));
184
206
 
185
207
  // Extend to beginning (should reverse)
186
- actions.extend({ cellId: CellIds.a, allCellIds });
208
+ actions.extend({ cellId: CellIds.a, layout });
187
209
  expect(state.selected).toEqual(new Set([CellIds.a, CellIds.b, CellIds.c]));
188
210
  expect(state.selectionStart).toBe(CellIds.c);
189
211
  expect(state.selectionEnd).toBe(CellIds.a);
@@ -3,8 +3,11 @@
3
3
  import useEvent from "react-use-event-hook";
4
4
  import { z } from "zod";
5
5
  import { toast } from "@/components/ui/use-toast";
6
- import { getNotebook, useCellActions } from "@/core/cells/cells";
6
+ import { getNotebook } from "@/core/cells/cells";
7
+ import { useCellActions } from "@/core/cells/actions";
7
8
  import type { CellId } from "@/core/cells/ids";
9
+ import { columnOf, layoutAtom } from "@/core/cells/layout";
10
+ import { store } from "@/core/state/jotai";
8
11
  import {
9
12
  usePendingCutActions,
10
13
  usePendingCutState,
@@ -73,6 +76,7 @@ async function writeCellsToClipboard(
73
76
 
74
77
  export function useCellClipboard() {
75
78
  const actions = useCellActions();
79
+ const { createCell } = actions;
76
80
  const pendingCutActions = usePendingCutActions();
77
81
  const pendingCutState = usePendingCutState();
78
82
 
@@ -138,10 +142,10 @@ export function useCellClipboard() {
138
142
  // Check if we have pending cut cells (internal move)
139
143
  if (pendingCutState.cellIds.size > 0) {
140
144
  const pendingCellIds = [...pendingCutState.cellIds];
141
- const notebook = getNotebook();
145
+ const layout = store.get(layoutAtom);
142
146
  const previousPlacements = pendingCellIds.map((id) => {
143
- const column = notebook.cellIds.findWithId(id);
144
- return { columnId: column.id, index: column.indexOfOrThrow(id) };
147
+ const column = columnOf(layout, id);
148
+ return { columnId: column.id, index: column.ids.indexOf(id) };
145
149
  });
146
150
 
147
151
  actions.moveCellsRelativeTo({
@@ -178,14 +182,15 @@ export function useCellClipboard() {
178
182
  const currentCellId = cellId;
179
183
  const reversedCells = clipboardData.cells.toReversed();
180
184
  for (const cell of reversedCells) {
181
- actions.createNewCell({
182
- cellId: currentCellId,
183
- before,
185
+ // The pasted cell joins the column it is pasted into.
186
+ const { column: _column, ...config } = cell.config ?? {};
187
+ createCell({
188
+ ...(before
189
+ ? { before: currentCellId }
190
+ : { after: currentCellId }),
184
191
  code: cell.code,
185
192
  name: cell.name,
186
- config: cell.config,
187
- hideCode: cell.config?.hide_code,
188
- autoFocus: true,
193
+ config,
189
194
  });
190
195
  }
191
196
 
@@ -199,11 +204,9 @@ export function useCellClipboard() {
199
204
  // Fallback to plain text
200
205
  const text = await navigator.clipboard.readText();
201
206
  if (text.trim()) {
202
- actions.createNewCell({
203
- cellId,
204
- before,
207
+ createCell({
208
+ ...(before ? { before: cellId } : { after: cellId }),
205
209
  code: text,
206
- autoFocus: true,
207
210
  });
208
211
  } else {
209
212
  toastNothingToPaste();