@marimo-team/islands 0.25.2 → 0.25.3-dev100

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 (358) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CNSxdKyJ.js → ConnectedDataExplorerComponent-Dhf5EGs5.js} +14 -14
  2. package/dist/{ErrorBoundary-HusVNio-.js → ErrorBoundary-GScQVnJ8.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-DQDjNXt3.js → abnfDiagram-VCTEODGH-Di400kYu.js} +2 -2
  4. package/dist/any-language-editor-k2B8YI3Y.js +75 -0
  5. package/dist/{architectureDiagram-5GKGNRK7-Nmls7Wxn.js → architectureDiagram-5GKGNRK7-BdTJcsNJ.js} +1 -1
  6. package/dist/{arrays-CN1djC4k.js → arrays-R6JsImiT.js} +8 -0
  7. package/dist/assets/__vite-browser-external-35VXYmnw.js +1 -0
  8. package/dist/assets/{worker-HPY9fbhz.js → worker-Dq8y-WM5.js} +2 -2
  9. package/dist/{button-CvjkwdSk.js → button-BxB3RDjN.js} +1 -1
  10. package/dist/{capabilities-CQ5IjhzL.js → capabilities-BgR0osfN.js} +2 -2
  11. package/dist/{chat-ui-BDpymeoe.js → chat-ui-BIgPxfPP.js} +1193 -1194
  12. package/dist/{check-EDwSwP89.js → check-P35dc2dH.js} +1 -1
  13. package/dist/{chunk-IMKFNOWR-CoIFEo-1.js → chunk-IMKFNOWR-mtD7aJBw.js} +1 -1
  14. package/dist/{chunk-SHT3W25Y-lHiGx3ZC.js → chunk-SHT3W25Y-DybB1ShH.js} +1 -1
  15. package/dist/{chunk-SVP7TREG-BvsHIrY_.js → chunk-SVP7TREG-DNhhdCex.js} +1 -1
  16. package/dist/{chunk-TICWLB2K-BC8YIm_n.js → chunk-TICWLB2K-NhAQhlDf.js} +1 -1
  17. package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
  18. package/dist/{classDiagram-ZZMXUADV-Bt98lkkv.js → classDiagram-ZZMXUADV-GTL0l5xS.js} +2 -2
  19. package/dist/{classDiagram-v2-VYDZK3BY-D9bfbcC3.js → classDiagram-v2-VYDZK3BY-BWrM2ruI.js} +2 -2
  20. package/dist/{code-visibility-4aW5326K.js → code-visibility-DnqM5oW_.js} +17 -17
  21. package/dist/{common-Cjo7bjRK.js → common-D2HSo8Gy.js} +6091 -5697
  22. package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-CPoxUG7G.js} +3 -3
  23. package/dist/{cynefinDiagram-5FMLGOSQ-CgWra7wt.js → cynefinDiagram-5FMLGOSQ-CX22wa7c.js} +1 -1
  24. package/dist/{dagre-GXQ25YYZ-CFZ8-35c.js → dagre-GXQ25YYZ-Df6Pp-cl.js} +1 -1
  25. package/dist/{data-grid-overlay-editor-CvdQXfSk.js → data-grid-overlay-editor-BgIMQs9G.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-lCNQrW7d.js → diagram-S7CK7UJ4-CctU9kVx.js} +1 -1
  28. package/dist/{diagram-UQ7AKVKN-CQPQ6pP_.js → diagram-UQ7AKVKN-FVHjCF9j.js} +1 -1
  29. package/dist/{diagram-VX7I27RA-Cf3b0llz.js → diagram-VX7I27RA-BSDbwFFv.js} +1 -1
  30. package/dist/{diagram-Z3DM3KII-Bt4QLrpn.js → diagram-Z3DM3KII-BX8kW7Nc.js} +1 -1
  31. package/dist/{dialog-CEBFZNyc.js → dialog-C1PcpCqX.js} +3 -3
  32. package/dist/{dist-DpBpA_n1.js → dist-Lm-D-Vr6.js} +3 -3
  33. package/dist/{dropdown-menu-CP_qCYHC.js → dropdown-menu-B_7xD2X4.js} +177 -169
  34. package/dist/{ebnfDiagram-PWID7BFC-D3NAyPFY.js → ebnfDiagram-PWID7BFC-DtapdLet.js} +2 -2
  35. package/dist/{erDiagram-RLTQ6QDP-Tlu09_Nm.js → erDiagram-RLTQ6QDP-BAru9jHt.js} +1 -1
  36. package/dist/{error-banner-Da600cwz.js → error-banner-Sl2FlSJ4.js} +12 -7
  37. package/dist/{cells-C8iCYvLU.js → error-entries-TAO6kEhF.js} +1573 -1504
  38. package/dist/{feedback-button-ZuLnINhC.js → feedback-button-BXcB6llx.js} +122 -123
  39. package/dist/{flowDiagram-HODETNUW-CAYbpJmV.js → flowDiagram-HODETNUW-CjaeFeea.js} +2 -2
  40. package/dist/{formats-BGh2thRc.js → formats-V8ifA0Bk.js} +3 -3
  41. package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
  42. package/dist/{glide-data-editor-qM9FSJA9.js → glide-data-editor-S-_J-7SO.js} +370 -368
  43. package/dist/{glide-utils-DJyqh0EM.js → glide-utils-Bt8_pBa2.js} +16 -16
  44. package/dist/{globals-Ci7B9t6C.js → globals-D4vBwcD6.js} +3 -3
  45. package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
  46. package/dist/{html-to-image-CZY1pIZH.js → html-to-image-CWdayGZU.js} +35 -35
  47. package/dist/{infoDiagram-27XIBGKW-XrDxhr0x.js → infoDiagram-27XIBGKW-B1hmUggC.js} +1 -1
  48. package/dist/{ishikawaDiagram-5VMMS53U-CD1muzov.js → ishikawaDiagram-5VMMS53U-DUeT3t-d.js} +1 -1
  49. package/dist/{kanban-definition-UXKFOSKX-Dg9W142_.js → kanban-definition-UXKFOSKX-DEUnNNgc.js} +1 -1
  50. package/dist/{label-BDKF3Afc.js → label-BRnUC0NX.js} +2 -2
  51. package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
  52. package/dist/{loader-BQOfjTIJ.js → loader-Bm8cy3e8.js} +12 -12
  53. package/dist/main.js +3262 -3044
  54. package/dist/{mermaid-CiAXjLpA.js → mermaid-B0fXpsNP.js} +38 -38
  55. package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
  56. package/dist/{mindmap-definition-YA3MSWOX-DgCidgYJ.js → mindmap-definition-YA3MSWOX-CPexlhDQ.js} +1 -1
  57. package/dist/{number-overlay-editor-DunDxAzh.js → number-overlay-editor-CUrUm7Np.js} +3 -3
  58. package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
  59. package/dist/{once-BtE-wKRL.js → once-eG8Vmvjd.js} +1 -1
  60. package/dist/{pegDiagram-XKGWAZYB-coOYYKB6.js → pegDiagram-XKGWAZYB-CMpp1OOQ.js} +2 -2
  61. package/dist/{pieDiagram-E7YTZNPT-BnXTc3bj.js → pieDiagram-E7YTZNPT-DlMWg5t1.js} +1 -1
  62. package/dist/precisionRound-DhAzeRcm.js +49 -0
  63. package/dist/{process-output-e4jj9Ijt.js → process-output-DD-oSvZk.js} +5 -5
  64. package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
  65. package/dist/{railroadDiagram-O6MQD6OU-B28-u83n.js → railroadDiagram-O6MQD6OU-DBJfseeO.js} +2 -2
  66. package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
  67. package/dist/{requirementDiagram-BXWQKSXE-CdYCTMu0.js → requirementDiagram-BXWQKSXE-BC7V639r.js} +1 -1
  68. package/dist/{reveal-component-A7HedxmE.js → reveal-component-CFzdsOg8.js} +23 -23
  69. package/dist/{select-BButFi-d.js → select-B0LRDH0g.js} +4 -4
  70. package/dist/{sequenceDiagram-WJ2MYXX4-CM3aRAe_.js → sequenceDiagram-WJ2MYXX4-CgesU6F-.js} +1 -1
  71. package/dist/{spec-BwarBpUJ.js → spec-CcT0slVc.js} +4 -4
  72. package/dist/{stateDiagram-D77RDMKH-DOZUMVj8.js → stateDiagram-D77RDMKH-lH_BUhs3.js} +2 -2
  73. package/dist/{stateDiagram-v2-MP3YSRHH-CISYxma6.js → stateDiagram-v2-MP3YSRHH-8LL6FrBe.js} +2 -2
  74. package/dist/style.css +1 -1
  75. package/dist/{swimlanes-42K2YHIH-BkSppxp8.js → swimlanes-42K2YHIH-Cuf9B9kE.js} +1 -1
  76. package/dist/{swimlanesDiagram-VR7AAH4N-c8G5pGxC.js → swimlanesDiagram-VR7AAH4N-BoMMtOPh.js} +2 -2
  77. package/dist/{swiper-component-DKntyn8p.js → swiper-component-DfhRvAFi.js} +2 -2
  78. package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
  79. package/dist/{timeline-definition-24CTP7MA-CaMQayqK.js → timeline-definition-24CTP7MA-yzzw4TF4.js} +1 -1
  80. package/dist/{toDate-BNJf01u1.js → toDate-DKH0_kMo.js} +53 -54
  81. package/dist/{toast-B9UMEi8u.js → toast-CFWpihJU.js} +4 -4
  82. package/dist/{tooltip-BO1REbqs.js → tooltip-CKO1pHJo.js} +2 -2
  83. package/dist/{use-restore-focus-BEM7sFWl.js → use-restore-focus-DBCITLeF.js} +1 -1
  84. package/dist/{useAsyncData-Deh5kszT.js → useAsyncData-D0mLJstx.js} +15 -14
  85. package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-c_yJtkAe.js} +2 -2
  86. package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-BpPWi3G3.js} +1 -1
  87. package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-BkdeVdXC.js} +1 -1
  88. package/dist/{useLifecycle-j7D9uD1o.js → useLifecycle-Dum8WSXq.js} +3 -3
  89. package/dist/{useTheme-CRnjkku0.js → useTheme-CfeaVw5D.js} +6 -6
  90. package/dist/{vega-component-DG29TAB7.js → vega-component-DgytCKrL.js} +147 -147
  91. package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container--LYZqguO.js} +2 -2
  92. package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-B9Pz0EGP.js} +298 -507
  93. package/dist/{vennDiagram-4TSXK5OY-CF8pfaK3.js → vennDiagram-4TSXK5OY-eJOrTqqC.js} +1 -1
  94. package/dist/{wardleyDiagram-VM6X3IG4-dGPu39d-.js → wardleyDiagram-VM6X3IG4-TILPvee6.js} +1 -1
  95. package/dist/{xychartDiagram-S5SC5T6Z-CP6-9q56.js → xychartDiagram-S5SC5T6Z-DUPvRwwJ.js} +2 -2
  96. package/package.json +8 -5
  97. package/src/__tests__/fixtures/{pair-preview.ts → pair-config.ts} +3 -2
  98. package/src/__tests__/host-imports.test.ts +101 -0
  99. package/src/__tests__/mount.test.ts +8 -8
  100. package/src/components/app-config/ai-config.tsx +7 -2
  101. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  102. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  103. package/src/components/chat/acp/blocks.tsx +2 -2
  104. package/src/components/chat/chat-components.tsx +2 -0
  105. package/src/components/chat/chat-panel.tsx +9 -8
  106. package/src/components/chat/chat-utils.ts +4 -8
  107. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  108. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  109. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  110. package/src/components/data-table/__tests__/context-menu.test.ts +176 -0
  111. package/src/components/data-table/__tests__/date-filter-inputs.test.tsx +24 -1
  112. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  113. package/src/components/data-table/__tests__/export-actions.test.tsx +434 -6
  114. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  115. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  116. package/src/components/data-table/cell-selection/feature.ts +2 -2
  117. package/src/components/data-table/cell-selection/types.ts +2 -2
  118. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  119. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  120. package/src/components/data-table/charts/charts.tsx +35 -25
  121. package/src/components/data-table/charts/storage.ts +16 -5
  122. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  123. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  124. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  125. package/src/components/data-table/columns.tsx +45 -46
  126. package/src/components/data-table/context-menu.tsx +161 -46
  127. package/src/components/data-table/data-table.tsx +7 -1
  128. package/src/components/data-table/date-filter-inputs.tsx +15 -42
  129. package/src/components/data-table/date-popover.tsx +6 -4
  130. package/src/components/data-table/export-actions.tsx +267 -163
  131. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +2 -2
  132. package/src/components/data-table/schemas.ts +14 -36
  133. package/src/components/data-table/search-highlight.tsx +79 -0
  134. package/src/components/data-table/types.ts +1 -0
  135. package/src/components/data-table/url-detector.tsx +49 -9
  136. package/src/components/data-table/utils.ts +18 -0
  137. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  138. package/src/components/datasources/__tests__/column-preview.test.tsx +63 -2
  139. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  140. package/src/components/datasources/column-preview.tsx +8 -2
  141. package/src/components/datasources/datasources.tsx +47 -35
  142. package/src/components/debugger/debugger-code.tsx +5 -0
  143. package/src/components/dependency-graph/panels.tsx +2 -1
  144. package/src/components/editor/Output.tsx +9 -2
  145. package/src/components/editor/SortableCell.tsx +1 -3
  146. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  147. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +80 -252
  148. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +210 -34
  149. package/src/components/editor/actions/pair-with-agent-commands.ts +42 -51
  150. package/src/components/editor/actions/pair-with-agent-modal.tsx +100 -37
  151. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  152. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  153. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  154. package/src/components/editor/cell/CreateCellButton.tsx +8 -10
  155. package/src/components/editor/cell/DeleteButton.tsx +1 -0
  156. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  157. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  158. package/src/components/editor/cell/code/cell-editor.tsx +1 -1
  159. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  160. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  161. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +30 -1
  162. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  163. package/src/components/editor/chrome/panels/error-panel.tsx +1 -0
  164. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  165. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +366 -0
  166. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
  167. package/src/components/editor/chrome/wrapper/footer-item.tsx +32 -24
  168. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +237 -0
  169. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  170. package/src/components/editor/chrome/wrapper/footer.tsx +2 -0
  171. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  172. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  173. package/src/components/editor/connections/components.tsx +1 -1
  174. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  175. package/src/components/editor/controls/command-palette.tsx +22 -10
  176. package/src/components/editor/dynamic-favicon.tsx +21 -40
  177. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +537 -0
  178. package/src/components/editor/errors/send-error-report-button.tsx +69 -0
  179. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  180. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  181. package/src/components/editor/file-tree/file-explorer.tsx +10 -5
  182. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  183. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  184. package/src/components/editor/notebook-banner.tsx +1 -0
  185. package/src/components/editor/output/MarimoErrorOutput.tsx +21 -5
  186. package/src/components/editor/output/MarimoTracebackOutput.tsx +37 -22
  187. package/src/components/editor/output/__tests__/ansi-reduce.test.ts +18 -0
  188. package/src/components/editor/output/ansi-reduce.ts +12 -0
  189. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  190. package/src/components/editor/package-alert.tsx +6 -4
  191. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  192. package/src/components/home/components.tsx +17 -31
  193. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  194. package/src/components/icons/large-spinner.tsx +3 -14
  195. package/src/components/icons/spinner.tsx +1 -1
  196. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  197. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  198. package/src/components/pages/home-page.tsx +164 -91
  199. package/src/components/scratchpad/scratchpad.tsx +2 -2
  200. package/src/components/slides/reveal-component.tsx +4 -2
  201. package/src/components/slides/slide-cell-view.tsx +1 -1
  202. package/src/components/slides/slide-form.tsx +1 -0
  203. package/src/components/tracing/tracing.tsx +2 -2
  204. package/src/components/ui/alert-dialog.tsx +1 -1
  205. package/src/core/ai/context/providers/datasource.ts +6 -2
  206. package/src/core/attachments/__tests__/toast.test.tsx +58 -0
  207. package/src/core/attachments/state.ts +18 -0
  208. package/src/core/attachments/toast.ts +15 -0
  209. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
  210. package/src/core/cells/__tests__/cell.test.ts +39 -0
  211. package/src/core/cells/__tests__/cells.test.ts +55 -1
  212. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  213. package/src/core/cells/__tests__/error-report.test.ts +139 -0
  214. package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
  215. package/src/core/cells/__tests__/session.test.ts +50 -1
  216. package/src/core/cells/cell.ts +14 -3
  217. package/src/core/cells/cells.ts +3 -1
  218. package/src/core/cells/error-report.ts +63 -0
  219. package/src/core/cells/pending-delete-service.ts +2 -6
  220. package/src/core/cells/session.ts +29 -2
  221. package/src/core/cells/types.ts +10 -1
  222. package/src/core/codemirror/__tests__/setup.test.ts +1 -1
  223. package/src/core/codemirror/keymaps/vim.ts +2 -6
  224. package/src/core/codemirror/language/languages/markdown.ts +1 -1
  225. package/src/core/codemirror/language/languages/python.ts +3 -3
  226. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  227. package/src/core/config/pair.ts +5 -3
  228. package/src/core/datasets/__tests__/data-source-discovery.test.ts +4 -4
  229. package/src/core/datasets/data-source-discovery.ts +4 -6
  230. package/src/core/document/__tests__/draft.test.ts +322 -0
  231. package/src/core/document/__tests__/fixtures.ts +92 -0
  232. package/src/core/document/__tests__/model.test.ts +483 -0
  233. package/src/core/document/__tests__/state.test.ts +446 -0
  234. package/src/core/document/__tests__/submission.test.ts +346 -0
  235. package/src/core/document/draft.ts +472 -0
  236. package/src/core/document/index.ts +10 -0
  237. package/src/core/document/model.ts +53 -0
  238. package/src/core/document/state.ts +401 -0
  239. package/src/core/document/sync.ts +359 -0
  240. package/src/core/edit-app.tsx +2 -2
  241. package/src/core/host/AGENTS.md +16 -0
  242. package/src/core/host/__tests__/attachments.test.ts +56 -0
  243. package/src/core/host/__tests__/document.test.ts +126 -0
  244. package/src/core/host/__tests__/fixtures.ts +41 -0
  245. package/src/core/host/__tests__/notebook-client.test.ts +570 -0
  246. package/src/core/host/connection.ts +42 -0
  247. package/src/core/host/notebook-client.ts +297 -0
  248. package/src/core/host/resources/attachments.ts +22 -0
  249. package/src/core/host/resources/document.ts +101 -0
  250. package/src/core/hotkeys/actions.ts +2 -4
  251. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  252. package/src/core/network/connection.ts +4 -2
  253. package/src/core/network/useConnectionNotice.ts +8 -2
  254. package/src/core/run-app.tsx +2 -2
  255. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  256. package/src/core/runtime/__tests__/runtime.test.ts +18 -17
  257. package/src/core/runtime/runtime.ts +26 -30
  258. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  259. package/src/core/state/jotai.ts +1 -1
  260. package/src/core/static/files.ts +2 -0
  261. package/src/core/wasm/bridge.ts +2 -10
  262. package/src/core/wasm/store.ts +3 -3
  263. package/src/core/wasm/worker/bootstrap.ts +1 -1
  264. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  265. package/src/core/websocket/__tests__/{useMarimoKernelConnection.test.ts → connection-state.test.ts} +15 -29
  266. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +223 -0
  267. package/src/core/websocket/__tests__/{useMarimoKernelConnection.hook.test.tsx → useNotebookSession.hook.test.tsx} +194 -184
  268. package/src/core/websocket/connection-state.ts +60 -0
  269. package/src/core/websocket/state.ts +7 -0
  270. package/src/core/websocket/transports/__tests__/notebook.test.ts +502 -0
  271. package/src/core/websocket/transports/notebook.ts +213 -0
  272. package/src/core/websocket/types.ts +9 -39
  273. package/src/core/websocket/useNotebookClient.ts +89 -0
  274. package/src/core/websocket/{useMarimoKernelConnection.tsx → useNotebookSession.tsx} +53 -224
  275. package/src/css/globals.css +5 -0
  276. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  277. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  278. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  279. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  280. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  281. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  282. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  283. package/src/hooks/useAsyncData.ts +3 -3
  284. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  285. package/src/hooks/useDebounce.ts +5 -8
  286. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  287. package/src/hooks/useDelayElapsed.ts +14 -10
  288. package/src/hooks/useElapsedTime.ts +3 -3
  289. package/src/hooks/useInputHistory.ts +4 -7
  290. package/src/hooks/useInternalStateWithSync.ts +6 -6
  291. package/src/hooks/useResizeObserver.ts +4 -7
  292. package/src/hooks/useScript.ts +67 -70
  293. package/src/hooks/useStateForKey.ts +93 -0
  294. package/src/mount.tsx +3 -3
  295. package/src/plugins/core/registerReactComponent.tsx +1 -1
  296. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  297. package/src/plugins/impl/DataTablePlugin.tsx +14 -15
  298. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  299. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  300. package/src/plugins/impl/FormPlugin.tsx +1 -1
  301. package/src/plugins/impl/RangeSliderPlugin.tsx +0 -1
  302. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  303. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  304. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +201 -1
  305. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  306. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  307. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +2 -0
  308. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  309. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  310. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  311. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  312. package/src/plugins/impl/chat/chat-ui.tsx +12 -10
  313. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  314. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  315. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  316. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  317. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  318. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +0 -1
  319. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  320. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  321. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  322. package/src/plugins/impl/panel/utils.ts +17 -0
  323. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  324. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  325. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  326. package/src/stories/button.stories.tsx +1 -0
  327. package/src/stories/editor.stories.tsx +24 -17
  328. package/src/stories/form-wrapper.stories.tsx +2 -2
  329. package/src/stories/select.stories.tsx +2 -2
  330. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  331. package/src/utils/__tests__/arrays.test.ts +35 -0
  332. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  333. package/src/utils/__tests__/dates.test.ts +116 -0
  334. package/src/utils/__tests__/numbers.test.ts +48 -1
  335. package/src/utils/__tests__/objects.test.ts +21 -0
  336. package/src/utils/arrays.ts +10 -0
  337. package/src/utils/blob.ts +1 -1
  338. package/src/utils/dates.ts +94 -0
  339. package/src/utils/numbers.ts +28 -17
  340. package/src/utils/objects.ts +3 -7
  341. package/src/utils/once.ts +19 -19
  342. package/src/utils/zod-utils.ts +1 -3
  343. package/dist/any-language-editor-B9REGlD9.js +0 -76
  344. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  345. package/dist/error-entries-CzoYkIQZ.js +0 -56
  346. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
  347. package/dist/precisionRound-DMIVQrt2.js +0 -97
  348. package/src/core/state/__tests__/jotai.test.ts +0 -25
  349. package/src/core/websocket/__tests__/useWebSocket.test.ts +0 -49
  350. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  351. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -338
  352. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  353. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  354. package/src/core/websocket/transports/basic.ts +0 -102
  355. package/src/core/websocket/transports/sse.ts +0 -308
  356. package/src/core/websocket/transports/transport.ts +0 -61
  357. package/src/core/websocket/transports/ws.ts +0 -98
  358. package/src/core/websocket/useWebSocket.tsx +0 -88
@@ -162,6 +162,7 @@ export const DebuggerControls: React.FC<{
162
162
  <div className="flex">
163
163
  <Tooltip content="Next line">
164
164
  <Button
165
+ aria-label="Next line"
165
166
  variant="text"
166
167
  size="icon"
167
168
  data-testid="debugger-next-button"
@@ -173,6 +174,7 @@ export const DebuggerControls: React.FC<{
173
174
  </Tooltip>
174
175
  <Tooltip content="Continue execution">
175
176
  <Button
177
+ aria-label="Continue execution"
176
178
  variant="text"
177
179
  size="icon"
178
180
  data-testid="debugger-continue-button"
@@ -187,6 +189,7 @@ export const DebuggerControls: React.FC<{
187
189
  </Tooltip>
188
190
  <Tooltip content="Print stack trace">
189
191
  <Button
192
+ aria-label="Print stack trace"
190
193
  variant="text"
191
194
  size="icon"
192
195
  data-testid="debugger-stack-button"
@@ -198,6 +201,7 @@ export const DebuggerControls: React.FC<{
198
201
  </Tooltip>
199
202
  <Tooltip content="Help">
200
203
  <Button
204
+ aria-label="Debugger help"
201
205
  variant="text"
202
206
  size="icon"
203
207
  data-testid="debugger-help-button"
@@ -210,6 +214,7 @@ export const DebuggerControls: React.FC<{
210
214
  {onClear && (
211
215
  <Tooltip content="Quit and clear">
212
216
  <Button
217
+ aria-label="Quit and clear debugger"
213
218
  variant="text"
214
219
  size="icon"
215
220
  data-testid="debugger-clear-button"
@@ -216,11 +216,12 @@ export const GraphSelectionPanel: React.FC<{
216
216
  </Button>
217
217
  </Tooltip>
218
218
  <ConnectionCellActionsDropdown cellId={selection.id}>
219
- <Button variant="ghost" size="icon">
219
+ <Button aria-label="Cell actions" variant="ghost" size="icon">
220
220
  <MoreVerticalIcon className="w-4 h-4" />
221
221
  </Button>
222
222
  </ConnectionCellActionsDropdown>
223
223
  <Button
224
+ aria-label="Close cell details"
224
225
  variant="text"
225
226
  size="icon"
226
227
  onClick={() => {
@@ -66,7 +66,10 @@ export type OnRefactorWithAI = (opts: {
66
66
  * Renders an output based on an OutputMessage.
67
67
  */
68
68
  export const OutputRenderer: React.FC<{
69
- message: Pick<OutputMessage, "channel" | "data" | "mimetype">;
69
+ message: Pick<
70
+ OutputMessage,
71
+ "channel" | "data" | "mimetype" | "code" | "traceback_format"
72
+ >;
70
73
  cellId?: CellId;
71
74
  onRefactorWithAI?: OnRefactorWithAI;
72
75
  wrapText?: boolean;
@@ -172,7 +175,9 @@ export const OutputRenderer: React.FC<{
172
175
 
173
176
  case "application/vnd.marimo+error":
174
177
  invariant(Array.isArray(data), "Expected array data");
175
- return <MarimoErrorOutput cellId={cellId} errors={data} />;
178
+ return (
179
+ <MarimoErrorOutput cellId={cellId} errors={data} code={message.code} />
180
+ );
176
181
 
177
182
  case "application/vnd.marimo+traceback":
178
183
  invariant(
@@ -183,6 +188,8 @@ export const OutputRenderer: React.FC<{
183
188
  <MarimoTracebackOutput
184
189
  onRefactorWithAI={onRefactorWithAI}
185
190
  traceback={data}
191
+ tracebackFormat={message.traceback_format}
192
+ code={message.code}
186
193
  cellId={cellId}
187
194
  />
188
195
  );
@@ -71,7 +71,6 @@ export const SortableCell = React.forwardRef(
71
71
  return (
72
72
  <SortableCellInternal
73
73
  ref={ref}
74
- cellId={cellId}
75
74
  canMoveX={canMoveX}
76
75
  {...props}
77
76
  attributes={attributes}
@@ -86,7 +85,7 @@ export const SortableCell = React.forwardRef(
86
85
  );
87
86
  SortableCell.displayName = "SortableCell";
88
87
 
89
- interface SortableCellInternalProps extends Props {
88
+ interface SortableCellInternalProps extends Omit<Props, "cellId"> {
90
89
  children: React.ReactNode;
91
90
  attributes: DraggableAttributes;
92
91
  listeners: SyntheticListenerMap | undefined;
@@ -99,7 +98,6 @@ interface SortableCellInternalProps extends Props {
99
98
  const SortableCellInternal = React.forwardRef(
100
99
  (
101
100
  {
102
- cellId,
103
101
  canMoveX,
104
102
  children,
105
103
  attributes,
@@ -1,17 +1,41 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { render, waitFor } from "@testing-library/react";
3
+ import {
4
+ act,
5
+ render as renderComponent,
6
+ waitFor,
7
+ } from "@testing-library/react";
4
8
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
- import { useCellErrors } from "@/core/cells/cells";
9
+ import { Provider, createStore } from "jotai";
10
+ import type { ReactNode } from "react";
11
+ import { MockNotebook } from "@/__mocks__/notebook";
12
+ import { cellId } from "@/__tests__/branded";
13
+ import { notebookAtom } from "@/core/cells/cells";
6
14
  import { DynamicFavicon } from "../dynamic-favicon";
7
15
 
8
- // Mock useCellErrors hook
9
- vi.mock("@/core/cells/cells", () => ({
10
- useCellErrors: vi.fn(),
11
- }));
12
-
13
16
  describe("DynamicFavicon", () => {
14
17
  let favicon: HTMLLinkElement;
18
+ let store: ReturnType<typeof createStore>;
19
+ const id = cellId("cell");
20
+
21
+ function render(ui: ReactNode) {
22
+ return renderComponent(ui, {
23
+ wrapper: ({ children }) => <Provider store={store}>{children}</Provider>,
24
+ });
25
+ }
26
+
27
+ function setErrors() {
28
+ store.set(
29
+ notebookAtom,
30
+ MockNotebook.notebookStateWithErrors([
31
+ {
32
+ cellId: id,
33
+ cellName: "cell",
34
+ errorData: [MockNotebook.errors.syntax("Invalid syntax")],
35
+ },
36
+ ]),
37
+ );
38
+ }
15
39
 
16
40
  beforeEach(() => {
17
41
  document
@@ -27,15 +51,20 @@ describe("DynamicFavicon", () => {
27
51
  // Mock document.hasFocus
28
52
  vi.spyOn(document, "hasFocus").mockReturnValue(true);
29
53
 
30
- // Mock useCellErrors to return no errors by default
31
- (useCellErrors as ReturnType<typeof vi.fn>).mockReturnValue([]);
54
+ store = createStore();
55
+ store.set(
56
+ notebookAtom,
57
+ MockNotebook.notebookState({
58
+ cellData: { [id]: { code: "x = 1" } },
59
+ }),
60
+ );
32
61
  });
33
62
 
34
63
  afterEach(() => {
35
64
  document
36
65
  .querySelectorAll("link[rel~='icon']")
37
66
  .forEach((element) => element.remove());
38
- vi.clearAllMocks();
67
+ vi.restoreAllMocks();
39
68
  vi.useRealTimers();
40
69
  });
41
70
 
@@ -67,9 +96,7 @@ describe("DynamicFavicon", () => {
67
96
  });
68
97
 
69
98
  it("should show error favicon when run completes with errors", async () => {
70
- (useCellErrors as ReturnType<typeof vi.fn>).mockReturnValue([
71
- { error: "mock error" },
72
- ]);
99
+ setErrors();
73
100
 
74
101
  const { rerender } = render(<DynamicFavicon isRunning={true} />);
75
102
 
@@ -147,6 +174,72 @@ describe("DynamicFavicon", () => {
147
174
  });
148
175
  });
149
176
 
177
+ it("does not look up or rewrite the favicon when code changes", async () => {
178
+ const { rerender } = render(<DynamicFavicon isRunning={true} />);
179
+ await waitFor(() => expect(favicon.href).toContain("circle-play.ico"));
180
+ rerender(<DynamicFavicon isRunning={false} />);
181
+ await waitFor(() => expect(favicon.href).toContain("circle-check.ico"));
182
+ const lookup = vi.spyOn(document, "querySelector");
183
+ const write = vi.spyOn(favicon, "href", "set");
184
+
185
+ await act(async () => {
186
+ store.set(notebookAtom, (state) => ({
187
+ ...state,
188
+ cellData: {
189
+ ...state.cellData,
190
+ [id]: { ...state.cellData[id], code: "x = 2" },
191
+ },
192
+ }));
193
+ });
194
+
195
+ expect(
196
+ lookup.mock.calls.filter(
197
+ ([selector]) => selector === "link[rel~='icon']",
198
+ ),
199
+ ).toEqual([]);
200
+ expect(write).not.toHaveBeenCalled();
201
+ lookup.mockRestore();
202
+ write.mockRestore();
203
+ });
204
+
205
+ it("updates the favicon when the error count changes", async () => {
206
+ const { rerender } = render(<DynamicFavicon isRunning={true} />);
207
+ await waitFor(() => expect(favicon.href).toContain("circle-play.ico"));
208
+ rerender(<DynamicFavicon isRunning={false} />);
209
+ await waitFor(() => expect(favicon.href).toContain("circle-check.ico"));
210
+
211
+ act(() => setErrors());
212
+ await waitFor(() => expect(favicon.href).toContain("circle-x.ico"));
213
+
214
+ act(() =>
215
+ store.set(
216
+ notebookAtom,
217
+ MockNotebook.notebookState({ cellData: { [id]: {} } }),
218
+ ),
219
+ );
220
+ await waitFor(() => expect(favicon.href).toContain("circle-check.ico"));
221
+ });
222
+
223
+ it("keeps the completion icon until its own reset timer expires", async () => {
224
+ vi.useFakeTimers();
225
+ const { rerender } = render(<DynamicFavicon isRunning={true} />);
226
+ await act(() => vi.advanceTimersByTimeAsync(1000));
227
+ rerender(<DynamicFavicon isRunning={false} />);
228
+ await act(() => vi.advanceTimersByTimeAsync(2000));
229
+ expect(favicon.href).toContain("circle-check.ico");
230
+ await act(() => vi.advanceTimersByTimeAsync(1000));
231
+ expect(favicon.href).toContain("favicon.ico");
232
+ });
233
+
234
+ it("cancels the reset timer when unmounted", async () => {
235
+ vi.useFakeTimers();
236
+ const { unmount } = render(<DynamicFavicon isRunning={true} />);
237
+ await act(() => vi.advanceTimersByTimeAsync(0));
238
+ expect(vi.getTimerCount()).toBe(1);
239
+ unmount();
240
+ expect(vi.getTimerCount()).toBe(0);
241
+ });
242
+
150
243
  describe("notifications", () => {
151
244
  beforeEach(() => {
152
245
  vi.spyOn(document, "visibilityState", "get").mockReturnValue("hidden");
@@ -156,7 +249,7 @@ describe("DynamicFavicon", () => {
156
249
  global.Notification.permission = "granted";
157
250
  });
158
251
 
159
- it("should send success notification when run completes without errors", () => {
252
+ it("should send success notification when run completes without errors", async () => {
160
253
  // @ts-expect-error ok in tests
161
254
  global.Notification = vi
162
255
  .fn()
@@ -172,12 +265,11 @@ describe("DynamicFavicon", () => {
172
265
 
173
266
  const { rerender } = render(<DynamicFavicon isRunning={true} />);
174
267
  rerender(<DynamicFavicon isRunning={false} />);
268
+ await waitFor(() => expect(Notification).toHaveBeenCalledOnce());
175
269
  });
176
270
 
177
- it("should send error notification when run completes with errors", () => {
178
- (useCellErrors as ReturnType<typeof vi.fn>).mockReturnValue([
179
- { error: "mock error" },
180
- ]);
271
+ it("should send error notification when run completes with errors", async () => {
272
+ setErrors();
181
273
 
182
274
  // @ts-expect-error ok in tests
183
275
  global.Notification = vi
@@ -194,6 +286,7 @@ describe("DynamicFavicon", () => {
194
286
 
195
287
  const { rerender } = render(<DynamicFavicon isRunning={true} />);
196
288
  rerender(<DynamicFavicon isRunning={false} />);
289
+ await waitFor(() => expect(Notification).toHaveBeenCalledOnce());
197
290
  });
198
291
 
199
292
  it("should not send notification when document is visible", () => {