@marimo-team/frontend 0.21.2-dev5 → 0.21.2-dev53

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 (386) hide show
  1. package/dist/assets/{CellStatus-CDSBsjjF.js → CellStatus-DX8MnBMk.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-Buaffg3u.js → ConnectedDataExplorerComponent-7yXYooWG.js} +1 -1
  3. package/dist/assets/{DeferredRequestRegistry-O6RDJKs0.js → DeferredRequestRegistry-B8jPCuU1.js} +1 -1
  4. package/dist/assets/{ImperativeModal-qEtcJ95s.js → ImperativeModal-C3CD5-Aq.js} +1 -1
  5. package/dist/assets/JsonOutput-DqjAyzM8.js +46 -0
  6. package/dist/assets/{LazyAnyLanguageCodeMirror-m8w66E4s.js → LazyAnyLanguageCodeMirror-CcCHIX38.js} +2 -2
  7. package/dist/assets/{MarimoErrorOutput-az74f3Mp.js → MarimoErrorOutput-Dat_S09q.js} +5 -5
  8. package/dist/assets/RenderHTML-C7XM39M2.js +1 -0
  9. package/dist/assets/{add-cell-with-ai-DUn4LN4W.js → add-cell-with-ai-y2xroEGf.js} +9 -9
  10. package/dist/assets/{add-connection-dialog-CBz0AUVX.js → add-connection-dialog-QDBOmil3.js} +23 -23
  11. package/dist/assets/{agent-panel-u83dsDsM.js → agent-panel-DziFrEjJ.js} +6 -6
  12. package/dist/assets/ai-model-dropdown-CiJpv5wN.js +5 -0
  13. package/dist/assets/{alert-dialog-9WfvUF7e.js → alert-dialog-ebk_-wsU.js} +1 -1
  14. package/dist/assets/{any-language-editor-DwQMnAM3.js → any-language-editor-DZYnKlJB.js} +1 -1
  15. package/dist/assets/{app-config-button-rDu-lCIB.js → app-config-button-CpAv9Tiu.js} +1 -1
  16. package/dist/assets/{architectureDiagram-VXUJARFQ-DfMHHFZ3.js → architectureDiagram-VXUJARFQ-DKmk99ac.js} +1 -1
  17. package/dist/assets/{azure-BTXHztTw.js → azure-Dw5gKmUz.js} +1 -1
  18. package/dist/assets/{blockDiagram-VD42YOAC-CuEDwbg7.js → blockDiagram-VD42YOAC-TpAhP5OQ.js} +1 -1
  19. package/dist/assets/{c4Diagram-YG6GDRKO-CD9uz7WG.js → c4Diagram-YG6GDRKO-Dg8hCyKf.js} +1 -1
  20. package/dist/assets/{cache-panel-qIxnndwr.js → cache-panel-D0OsHk_D.js} +1 -1
  21. package/dist/assets/cell-editor-RbAVpSFb.js +22 -0
  22. package/dist/assets/{cell-link-Q_UEP94Z.js → cell-link-CNgO3c-T.js} +1 -1
  23. package/dist/assets/{cells-fq1RMGX_.js → cells-39RE4UzS.js} +77 -76
  24. package/dist/assets/channel-D1wPYhc9.js +1 -0
  25. package/dist/assets/{chat-display-D_Fuuy6r.js → chat-display-BPUVrlA6.js} +1 -1
  26. package/dist/assets/{chat-panel-BO-JoQSp.js → chat-panel-esz5TfF-.js} +2 -2
  27. package/dist/assets/{chunk-5FQGJX7Z-CM1a_K7I.js → chunk-5FQGJX7Z-sGWxL7Ey.js} +3 -3
  28. package/dist/assets/{chunk-ABZYJK2D-D_Wumzom.js → chunk-ABZYJK2D-DXJ7hnjx.js} +1 -1
  29. package/dist/assets/{chunk-ATLVNIR6-BZ0lTgIn.js → chunk-ATLVNIR6-CTEqcLEc.js} +1 -1
  30. package/dist/assets/{chunk-B4BG7PRW-Dw1S6osV.js → chunk-B4BG7PRW-CkAIqtPf.js} +1 -1
  31. package/dist/assets/{chunk-DI55MBZ5-Q63FTCPP.js → chunk-DI55MBZ5-C4F9vu8o.js} +1 -1
  32. package/dist/assets/{chunk-EXTU4WIE-CfkJ_R7W.js → chunk-EXTU4WIE-BT0Py-4P.js} +1 -1
  33. package/dist/assets/{chunk-JA3XYJ7Z-B41fGeoj.js → chunk-JA3XYJ7Z-CGd7jja_.js} +1 -1
  34. package/dist/assets/{chunk-JZLCHNYA-D43EJxQw.js → chunk-JZLCHNYA-CqY-RYTj.js} +1 -1
  35. package/dist/assets/{chunk-N4CR4FBY-DCtw0-ni.js → chunk-N4CR4FBY-aUDjVzN7.js} +2 -2
  36. package/dist/assets/{chunk-QN33PNHL-CLA2rsaS.js → chunk-QN33PNHL-DHnCb5-U.js} +1 -1
  37. package/dist/assets/{chunk-QXUST7PY-De1DpbnL.js → chunk-QXUST7PY-CRO5kYCE.js} +1 -1
  38. package/dist/assets/{chunk-S3R3BYOJ-qrwvlUdq.js → chunk-S3R3BYOJ-CSHQgcuP.js} +1 -1
  39. package/dist/assets/{chunk-TZMSLE5B-C4KcThb0.js → chunk-TZMSLE5B-CE7o9asH.js} +1 -1
  40. package/dist/assets/classDiagram-2ON5EDUG-BDIQSKYv.js +1 -0
  41. package/dist/assets/classDiagram-v2-WZHVMYZB-Cdh4cVOB.js +1 -0
  42. package/dist/assets/{code-block-37QAKDTI-D4FF4cnN.js → code-block-37QAKDTI-DMpe1jNG.js} +1 -1
  43. package/dist/assets/{column-preview-WsubyItX.js → column-preview-BUKHsglA.js} +1 -1
  44. package/dist/assets/{command-rfxSsiHU.js → command-DmzEbs6L.js} +1 -1
  45. package/dist/assets/{command-palette-Bez4BqJF.js → command-palette-BX5gNpUr.js} +1 -1
  46. package/dist/assets/{common-BYwO983A.js → common-B4yshY-H.js} +1 -1
  47. package/dist/assets/{components-Ozq0825a.js → components-DCqJqyys.js} +1 -1
  48. package/dist/assets/{components-Bpgzv_5_.js → components-oKCjx6cN.js} +1 -1
  49. package/dist/assets/{config-3Aq84phF.js → config-DqxNMQDN.js} +1 -1
  50. package/dist/assets/{context-CIAP2NOh.js → context-CRmPPhx9.js} +1 -1
  51. package/dist/assets/{context-aware-panel-CfsfBlhO.js → context-aware-panel-DC0Te9Hj.js} +2 -2
  52. package/dist/assets/copy-KjcPgPw9.js +1 -0
  53. package/dist/assets/{copy-icon-BgmMM9Zg.js → copy-icon-P0kzz1Pr.js} +1 -1
  54. package/dist/assets/{dagre-6UL2VRFP-BhMnPhuU.js → dagre-6UL2VRFP-XqoNLMQ3.js} +1 -1
  55. package/dist/assets/{data-grid-overlay-editor-kbv73SQ7.js → data-grid-overlay-editor-Cus1-BFN.js} +1 -1
  56. package/dist/assets/{datasource-F9sJtuof.js → datasource-DKHG39NV.js} +2 -2
  57. package/dist/assets/{dates-CHaNfieI.js → dates-CTqMeMGY.js} +1 -1
  58. package/dist/assets/{dependency-graph-panel-AOBcX2tP.js → dependency-graph-panel-7GKT3dyD.js} +4 -4
  59. package/dist/assets/{diagram-PSM6KHXK-Cr2t4zul.js → diagram-PSM6KHXK-BuzKNNcN.js} +1 -1
  60. package/dist/assets/{diagram-QEK2KX5R-DLU_hSO4.js → diagram-QEK2KX5R-A5LBQS11.js} +1 -1
  61. package/dist/assets/{diagram-S2PKOQOG-C7EkNAO3.js → diagram-S2PKOQOG-dkJE8SA0.js} +1 -1
  62. package/dist/assets/{dialog-CVN1lcMF.js → dialog-1_jIyAb_.js} +1 -1
  63. package/dist/assets/{dist-DJBpXGro.js → dist-6P6vjf93.js} +1 -1
  64. package/dist/assets/dist-BWGxTsTP.js +1 -0
  65. package/dist/assets/{dist-CblX3KGI.js → dist-B_buFm3B.js} +1 -1
  66. package/dist/assets/{dist-CXLJUPFl.js → dist-BatEf-0f.js} +1 -1
  67. package/dist/assets/dist-C3AnARPE.js +1 -0
  68. package/dist/assets/{dist-BNC_tnlW.js → dist-C6ohaMKU.js} +1 -1
  69. package/dist/assets/{dist-BoDHthoc.js → dist-CO9Pg2Rc.js} +1 -1
  70. package/dist/assets/{dist-By6zhkxZ.js → dist-CSV6H5w_.js} +1 -1
  71. package/dist/assets/{dist-6FIAeDIu.js → dist-CYs1oP7g.js} +1 -1
  72. package/dist/assets/{dist-DbK_4_qo.js → dist-DD9ZJMK5.js} +1 -1
  73. package/dist/assets/{dist-DlTbNRBn.js → dist-DReDpc2z.js} +1 -1
  74. package/dist/assets/dist-DSlq5ZeQ.js +1 -0
  75. package/dist/assets/{dist-DrceDAhM.js → dist-DXyIIB32.js} +1 -1
  76. package/dist/assets/{dist-CcGcwrUD.js → dist-DkaderFA.js} +1 -1
  77. package/dist/assets/{dist-BiZQlfhr.js → dist-Dq3BlK4R.js} +1 -1
  78. package/dist/assets/{dist-ClzRAVN-.js → dist-Dxov2ltb.js} +1 -1
  79. package/dist/assets/{dist-BXXPfIam.js → dist-EtGG9C1A.js} +1 -1
  80. package/dist/assets/{dist-C3MmXcLA.js → dist-NjId5Gdz.js} +1 -1
  81. package/dist/assets/dist-ZM59OWYL.js +1 -0
  82. package/dist/assets/dist-_TwZ4tIe.js +1 -0
  83. package/dist/assets/dist-f9b2H4q_.js +1 -0
  84. package/dist/assets/{dist-mxGLXOFm.js → dist-feWVQ4dq.js} +1 -1
  85. package/dist/assets/{documentation-panel-D28MpqbI.js → documentation-panel-D5d_BbHV.js} +1 -1
  86. package/dist/assets/{download-B9_ToVd4.js → download-B1vXaivj.js} +4 -4
  87. package/dist/assets/{dropdown-menu-DdPu5Kfu.js → dropdown-menu-BehqiLFL.js} +1 -1
  88. package/dist/assets/{edit-page-otS-QvnC.js → edit-page-B5cAZdO7.js} +7 -7
  89. package/dist/assets/{en-US-BO8E69bZ.js → en-US-f8tajDx1.js} +1 -1
  90. package/dist/assets/{erDiagram-Q2GNP2WA-DqlEo_Us.js → erDiagram-Q2GNP2WA-CgH6udOW.js} +1 -1
  91. package/dist/assets/{error-banner-BRG6IPhC.js → error-banner-J5F3weEj.js} +1 -1
  92. package/dist/assets/{error-panel-RRoj_iOR.js → error-panel-DnhKJ5Ou.js} +1 -1
  93. package/dist/assets/{es-CzkousWe.js → es-DYI7U61K.js} +1 -1
  94. package/dist/assets/{esm-CBkHtTOV.js → esm-BC1J92im.js} +1 -1
  95. package/dist/assets/{esm-DhTsVMLM.js → esm-DKLLCu3N.js} +1 -1
  96. package/dist/assets/{field-B1jGbQlH.js → field-B08lvxnl.js} +1 -1
  97. package/dist/assets/file-explorer-panel-BUk69TND.js +26 -0
  98. package/dist/assets/{file-icons-CWLHDa1J.js → file-icons-3DTS8ZM7.js} +1 -1
  99. package/dist/assets/{floating-outline-BvQKiC0F.js → floating-outline-DmugATcB.js} +1 -1
  100. package/dist/assets/{flowDiagram-NV44I4VS-CQlIJ12H.js → flowDiagram-NV44I4VS-D85BL4rA.js} +1 -1
  101. package/dist/assets/{focus-DYwTiH9-.js → focus-DlJH7sfh.js} +1 -1
  102. package/dist/assets/{form-CrQYrsUC.js → form-760_EqmF.js} +2 -2
  103. package/dist/assets/{formats-rhOJovGE.js → formats-wYuh1bqp.js} +1 -1
  104. package/dist/assets/{formatting-B4ZCH3ol.js → formatting-CraOPe94.js} +1 -1
  105. package/dist/assets/{gallery-page-eRea0yic.js → gallery-page--paiPvYX.js} +1 -1
  106. package/dist/assets/{ganttDiagram-JELNMOA3-B3EGIuZL.js → ganttDiagram-JELNMOA3-DzCOXWlF.js} +1 -1
  107. package/dist/assets/{gitGraphDiagram-V2S2FVAM-h5SlguJK.js → gitGraphDiagram-V2S2FVAM-BUHURX6t.js} +1 -1
  108. package/dist/assets/{glide-data-editor-xt5xNZeV.js → glide-data-editor-DYdoQTO5.js} +4 -4
  109. package/dist/assets/{globals-BsV5fVR-.js → globals-7M5DRsIb.js} +1 -1
  110. package/dist/assets/home-page-CxQ1e98h.js +4 -0
  111. package/dist/assets/{hooks-CHx5dUUq.js → hooks-C3jEff2O.js} +1 -1
  112. package/dist/assets/html-to-image-DTFXm6_Z.js +2 -0
  113. package/dist/assets/{index-GjXovVsl.css → index-BmoocKR0.css} +1 -1
  114. package/dist/assets/index-DNchElHl.js +38 -0
  115. package/dist/assets/{infoDiagram-HS3SLOUP-pzpClObZ.js → infoDiagram-HS3SLOUP-GG5r0Y5G.js} +1 -1
  116. package/dist/assets/{input-CUwqpKjd.js → input-CN1ZeRYm.js} +1 -1
  117. package/dist/assets/{isValid-BGe7pJXT.js → isValid-DY4Mgbr7.js} +1 -1
  118. package/dist/assets/{journeyDiagram-XKPGCS4Q-BrdRi92v.js → journeyDiagram-XKPGCS4Q-B1dvnV4D.js} +1 -1
  119. package/dist/assets/{kanban-definition-3W4ZIXB7-B6WqgFqh.js → kanban-definition-3W4ZIXB7-CefbrXQv.js} +1 -1
  120. package/dist/assets/{kiosk-mode-DNjEnIWb.js → kiosk-mode-CyTnrzwK.js} +1 -1
  121. package/dist/assets/{layout-CwFtCyW8.js → layout-3b3tzmbb.js} +3 -3
  122. package/dist/assets/{linear-BP9rwmWK.js → linear-BDnrHGYO.js} +1 -1
  123. package/dist/assets/{links-CIQwYQ48.js → links-CptYD1FP.js} +1 -1
  124. package/dist/assets/{logs-panel-BU1tNEVc.js → logs-panel-C4k_2IHW.js} +1 -1
  125. package/dist/assets/{markdown-renderer-MR9df58W.js → markdown-renderer-DSy5IuAx.js} +1 -1
  126. package/dist/assets/{menu-items-UxKrm8hS.js → menu-items-BpHXKv51.js} +1 -1
  127. package/dist/assets/mermaid-4DMBBIKO-g7AL4SLJ.js +1 -0
  128. package/dist/assets/{mermaid-Djr3jUAB.js → mermaid-C43VbdrM.js} +3 -3
  129. package/dist/assets/{mermaid-parser.core-DR82IMb2.js → mermaid-parser.core-CdM8D_p_.js} +1 -1
  130. package/dist/assets/{mindmap-definition-VGOIOE7T-DAmJpbPM.js → mindmap-definition-VGOIOE7T-CcV7D-wF.js} +1 -1
  131. package/dist/assets/{mode-AcL8c6qH.js → mode-D-iRbN9x.js} +1 -1
  132. package/dist/assets/{multi-map-Pp1P2DOX.js → multi-map-C8RbwBrw.js} +1 -1
  133. package/dist/assets/{name-cell-input-DVFEv_aO.js → name-cell-input-Dyb0ZO4X.js} +1 -1
  134. package/dist/assets/{number-overlay-editor-D__AflXQ.js → number-overlay-editor-BBJO1mf8.js} +1 -1
  135. package/dist/assets/{outline-panel-CP0oIuiU.js → outline-panel-D7CJwO8u.js} +1 -1
  136. package/dist/assets/{packages-panel-CzRELimG.js → packages-panel-Bp1SYjgc.js} +1 -1
  137. package/dist/assets/{panels-wTweRyIv.js → panels-D0aw6jdc.js} +1 -1
  138. package/dist/assets/{pieDiagram-ADFJNKIX-DbGIFRoq.js → pieDiagram-ADFJNKIX-C1fBf15W.js} +1 -1
  139. package/dist/assets/{popover-BPGG2gPG.js → popover-Bvoif-Mg.js} +1 -1
  140. package/dist/assets/{precisionRound-BOmLQIKI.js → precisionRound-CCOoIlcP.js} +1 -1
  141. package/dist/assets/{process-output-CTVsT--B.js → process-output-BxPWHcIi.js} +1 -1
  142. package/dist/assets/{quadrantDiagram-AYHSOK5B-CLAtyple.js → quadrantDiagram-AYHSOK5B-RVooN-fX.js} +1 -1
  143. package/dist/assets/{react-vega-BZav_-2n.js → react-vega-BKRQSy0g.js} +1 -1
  144. package/dist/assets/react-vega-DXESF7qN.js +1 -0
  145. package/dist/assets/{readonly-python-code-DH-1xZGq.js → readonly-python-code-D95oshJa.js} +1 -1
  146. package/dist/assets/{renderShortcut-CnD1Dah5.js → renderShortcut-BYvKm38e.js} +1 -1
  147. package/dist/assets/{request-registry-B-7cIM_I.js → request-registry-XB2EzJHm.js} +1 -1
  148. package/dist/assets/{requirementDiagram-UZGBJVZJ-DDDTB1LD.js → requirementDiagram-UZGBJVZJ-DtqOYJpH.js} +1 -1
  149. package/dist/assets/{run-page-FCvGnICa.js → run-page-B7CASued.js} +1 -1
  150. package/dist/assets/{sankeyDiagram-TZEHDZUN-DAWPOfBw.js → sankeyDiagram-TZEHDZUN-DmcooLA8.js} +1 -1
  151. package/dist/assets/{scratchpad-panel-k9lrm-rC.js → scratchpad-panel-BIVRgYOU.js} +1 -1
  152. package/dist/assets/{secrets-panel-B1Z-6dmz.js → secrets-panel-C24hZEiO.js} +1 -1
  153. package/dist/assets/{select-CxT2Geqr.js → select-Cnd3vm9n.js} +1 -1
  154. package/dist/assets/{sequenceDiagram-WL72ISMW-D_qAidD2.js → sequenceDiagram-WL72ISMW-S2qeLb7J.js} +1 -1
  155. package/dist/assets/{session-panel-WhN0qilM.js → session-panel-CNabBHQm.js} +1 -1
  156. package/dist/assets/{share-BdH_5I58.js → share-NjpZ54PJ.js} +1 -1
  157. package/dist/assets/{snippets-panel-BCDHUuku.js → snippets-panel-D1JAeJj1.js} +1 -1
  158. package/dist/assets/{spec-DbmSqx09.js → spec-DnVBmJUh.js} +1 -1
  159. package/dist/assets/{state-Ce7CVShi.js → state-BagvlaEz.js} +1 -1
  160. package/dist/assets/{state-3V5UxC3B.js → state-Cz_wrzCz.js} +1 -1
  161. package/dist/assets/{state-CBmCYWFH.js → state-DMQXxemS.js} +1 -1
  162. package/dist/assets/{stateDiagram-FKZM4ZOC-C7qgDrGA.js → stateDiagram-FKZM4ZOC-uuQ60pIl.js} +1 -1
  163. package/dist/assets/stateDiagram-v2-4FDKWEC3-D-GWhQTG.js +1 -0
  164. package/dist/assets/stex-CruVQx-P.js +1 -0
  165. package/dist/assets/{switch-CVKxYu_0.js → switch-Bwpd2AFq.js} +1 -1
  166. package/dist/assets/{terminal-Cr7wbEjz.js → terminal-Gl8Fi44y.js} +1 -1
  167. package/dist/assets/{time-D2GKc0U6.js → time-Bw8f15NM.js} +1 -1
  168. package/dist/assets/{timeline-definition-IT6M3QCI-hd6uJKGs.js → timeline-definition-IT6M3QCI-TKWeDnSQ.js} +1 -1
  169. package/dist/assets/{toggle-RCwU-rnE.js → toggle-C_gNjXg8.js} +1 -1
  170. package/dist/assets/{tooltip-D9723Brr.js → tooltip-CR_izE8Q.js} +1 -1
  171. package/dist/assets/tracing-DwAC7DWN.js +1 -0
  172. package/dist/assets/tracing-panel-D1iNgclL.js +2 -0
  173. package/dist/assets/{tree-Ch2-GuhG.js → tree-WVrWjdwv.js} +3 -3
  174. package/dist/assets/{useAddCell-YC7rpcmD.js → useAddCell-D6Q7JziZ.js} +1 -1
  175. package/dist/assets/{useBoolean-m1e6E3Ao.js → useBoolean-CrltYVhE.js} +1 -1
  176. package/dist/assets/{useCellActionButton-GUb2fXU8.js → useCellActionButton-B2G9OaX9.js} +1 -1
  177. package/dist/assets/{useDateFormatter-CpE7XQLs.js → useDateFormatter-DOoVZUts.js} +1 -1
  178. package/dist/assets/{useDeleteCell-DRUDRiy0.js → useDeleteCell-d8veThW7.js} +1 -1
  179. package/dist/assets/{useDependencyPanelTab-nFVMlEx0.js → useDependencyPanelTab-B3iIj3MO.js} +1 -1
  180. package/dist/assets/{useInstallPackage-C9V-on2J.js → useInstallPackage-CQEr5429.js} +1 -1
  181. package/dist/assets/{useNotebookActions-ChLHy-0O.js → useNotebookActions-SAEOWcBo.js} +1 -1
  182. package/dist/assets/{useNumberFormatter-DbDKSvEd.js → useNumberFormatter-BXZcbTzH.js} +1 -1
  183. package/dist/assets/{usePress-BHGkpw8X.js → usePress-alQ5Crny.js} +1 -1
  184. package/dist/assets/{useRunCells-5m6jCnyo.js → useRunCells-Dhl8ZTGh.js} +1 -1
  185. package/dist/assets/{useSplitCell-DGD9smMq.js → useSplitCell-BSnFazbH.js} +1 -1
  186. package/dist/assets/{utils-CdjCA1J8.js → utils-C24l2A1T.js} +1 -1
  187. package/dist/assets/{vega-component-CRbeDmeM.js → vega-component-9Pf4pVZL.js} +1 -1
  188. package/dist/assets/{vega-loader.browser-CZV6_g2i.js → vega-loader.browser-BJ9oKrvH.js} +1 -1
  189. package/dist/assets/{write-secret-modal-BCvuRAFb.js → write-secret-modal-BFCsWMoW.js} +1 -1
  190. package/dist/assets/{xychartDiagram-PRI3JC2R-CXlUBSbQ.js → xychartDiagram-PRI3JC2R-CIp-yeSa.js} +1 -1
  191. package/dist/index.html +125 -125
  192. package/package.json +1 -1
  193. package/src/__mocks__/notebook.ts +9 -9
  194. package/src/__tests__/branded.ts +20 -0
  195. package/src/components/app-config/user-config-form.tsx +5 -4
  196. package/src/components/data-table/__tests__/utils.test.ts +138 -1
  197. package/src/components/data-table/charts/__tests__/storage.test.ts +7 -7
  198. package/src/components/data-table/context-menu.tsx +9 -5
  199. package/src/components/data-table/data-table.tsx +3 -0
  200. package/src/components/data-table/range-focus/__tests__/atoms.test.ts +8 -2
  201. package/src/components/data-table/range-focus/__tests__/test-utils.ts +2 -0
  202. package/src/components/data-table/range-focus/__tests__/utils.test.ts +82 -8
  203. package/src/components/data-table/range-focus/atoms.ts +2 -2
  204. package/src/components/data-table/range-focus/utils.ts +50 -12
  205. package/src/components/data-table/types.ts +7 -0
  206. package/src/components/data-table/utils.ts +87 -0
  207. package/src/components/editor/__tests__/data-attributes.test.tsx +8 -8
  208. package/src/components/editor/ai/__tests__/completion-utils.test.ts +15 -15
  209. package/src/components/editor/navigation/__tests__/clipboard.test.ts +2 -2
  210. package/src/components/editor/navigation/__tests__/selection.test.ts +7 -6
  211. package/src/components/editor/navigation/__tests__/state.test.ts +8 -7
  212. package/src/components/editor/output/MarimoErrorOutput.tsx +7 -7
  213. package/src/components/editor/output/__tests__/traceback.test.tsx +4 -4
  214. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +4 -4
  215. package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +8 -1
  216. package/src/components/storage/storage-file-viewer.tsx +35 -1
  217. package/src/components/storage/storage-inspector.tsx +9 -4
  218. package/src/components/storage/storage-snippets.ts +3 -3
  219. package/src/components/tracing/tracing.tsx +3 -1
  220. package/src/components/ui/range-slider.tsx +108 -1
  221. package/src/core/ai/__tests__/staged-cells.test.ts +9 -8
  222. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +31 -31
  223. package/src/core/ai/context/providers/__tests__/datasource.test.ts +3 -3
  224. package/src/core/ai/context/providers/__tests__/tables.test.ts +3 -2
  225. package/src/core/ai/context/providers/__tests__/variable.test.ts +84 -63
  226. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +10 -9
  227. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +6 -6
  228. package/src/core/ai/tools/edit-notebook-tool.ts +3 -3
  229. package/src/core/cells/__tests__/add-missing-import.test.ts +3 -3
  230. package/src/core/cells/__tests__/cells.test.ts +192 -135
  231. package/src/core/cells/__tests__/focus.test.ts +5 -4
  232. package/src/core/cells/__tests__/logs.test.ts +13 -12
  233. package/src/core/cells/__tests__/pending-delete-service.test.tsx +3 -3
  234. package/src/core/cells/__tests__/runs.test.ts +22 -21
  235. package/src/core/cells/__tests__/scrollCellIntoView.test.ts +8 -7
  236. package/src/core/cells/__tests__/session.test.ts +23 -22
  237. package/src/core/cells/cells.ts +1 -1
  238. package/src/core/cells/ids.ts +5 -5
  239. package/src/core/cells/logs.ts +2 -2
  240. package/src/core/cells/runs.ts +6 -8
  241. package/src/core/codemirror/__tests__/format.test.ts +34 -36
  242. package/src/core/codemirror/__tests__/setup.test.ts +2 -2
  243. package/src/core/codemirror/cells/__tests__/extensions.test.ts +114 -0
  244. package/src/core/codemirror/cells/__tests__/traceback-decorations.test.ts +33 -32
  245. package/src/core/codemirror/cells/extensions.ts +66 -23
  246. package/src/core/codemirror/completion/__tests__/keymap.test.ts +15 -35
  247. package/src/core/codemirror/completion/keymap.ts +14 -4
  248. package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +12 -13
  249. package/src/core/codemirror/language/__tests__/utils.test.ts +3 -3
  250. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +7 -8
  251. package/src/core/codemirror/language/languages/python.ts +4 -0
  252. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +4 -3
  253. package/src/core/codemirror/lsp/notebook-lsp.ts +28 -2
  254. package/src/core/codemirror/reactive-references/__tests__/analyzer.test.ts +7 -6
  255. package/src/core/codemirror/reactive-references/analyzer.ts +2 -2
  256. package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +52 -0
  257. package/src/core/codemirror/rtc/loro/sync.ts +1 -0
  258. package/src/core/datasets/__tests__/data-source.test.ts +5 -6
  259. package/src/core/datasets/state.ts +1 -1
  260. package/src/core/errors/__tests__/errors.test.ts +2 -1
  261. package/src/core/export/__tests__/hooks.test.ts +37 -36
  262. package/src/core/islands/main.ts +2 -7
  263. package/src/core/kernel/__tests__/handlers.test.ts +5 -4
  264. package/src/core/kernel/handlers.ts +7 -4
  265. package/src/core/network/DeferredRequestRegistry.ts +2 -2
  266. package/src/core/network/__tests__/CachingRequestRegistry.test.ts +9 -10
  267. package/src/core/network/__tests__/DeferredRequestRegistry.test.ts +4 -6
  268. package/src/core/static/__tests__/virtual-file-tracker.test.ts +8 -8
  269. package/src/core/static/virtual-file-tracker.ts +1 -1
  270. package/src/core/storage/__tests__/state.test.ts +31 -21
  271. package/src/core/storage/state.ts +1 -1
  272. package/src/core/variables/__tests__/state.test.ts +6 -6
  273. package/src/core/variables/types.ts +2 -2
  274. package/src/core/wasm/__tests__/state.test.ts +8 -8
  275. package/src/core/websocket/useMarimoKernelConnection.tsx +12 -15
  276. package/src/css/md-tooltip.css +4 -39
  277. package/src/css/md.css +7 -0
  278. package/src/plugins/core/RenderHTML.tsx +17 -0
  279. package/src/plugins/core/__test__/RenderHTML.test.ts +45 -0
  280. package/src/plugins/core/sanitize-html.ts +25 -18
  281. package/src/plugins/impl/DataTablePlugin.tsx +23 -2
  282. package/src/plugins/impl/SliderPlugin.tsx +1 -3
  283. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +120 -0
  284. package/src/plugins/impl/anywidget/model.ts +1 -2
  285. package/src/stories/cell.stories.tsx +8 -8
  286. package/src/stories/layout/vertical/one-column.stories.tsx +9 -8
  287. package/src/stories/log-viewer.stories.tsx +8 -8
  288. package/src/stories/variables.stories.tsx +2 -2
  289. package/src/utils/__tests__/download.test.tsx +21 -20
  290. package/src/utils/copy.ts +18 -5
  291. package/src/utils/download.ts +4 -3
  292. package/src/utils/html-to-image.ts +6 -0
  293. package/src/utils/json/base64.ts +3 -3
  294. package/src/utils/traceback.ts +5 -3
  295. package/dist/assets/JsonOutput-DKXKGKvX.js +0 -46
  296. package/dist/assets/RenderHTML-DJ8khuob.js +0 -1
  297. package/dist/assets/ai-model-dropdown-DPTa_EpU.js +0 -5
  298. package/dist/assets/cell-editor-DX7IcqNr.js +0 -23
  299. package/dist/assets/channel-CkT8Qdo2.js +0 -1
  300. package/dist/assets/classDiagram-2ON5EDUG-BhMT_rTz.js +0 -1
  301. package/dist/assets/classDiagram-v2-WZHVMYZB-D-F4WEyb.js +0 -1
  302. package/dist/assets/copy-YwM0Pd7v.js +0 -1
  303. package/dist/assets/dist-BTqMkf4j.js +0 -1
  304. package/dist/assets/dist-DHw9sXeN.js +0 -1
  305. package/dist/assets/dist-Du0qZeXz.js +0 -1
  306. package/dist/assets/dist-a0FfbvMD.js +0 -1
  307. package/dist/assets/dist-cfkfP0ni.js +0 -1
  308. package/dist/assets/dist-pzQ9JG-p.js +0 -1
  309. package/dist/assets/file-explorer-panel-CB8vF5ob.js +0 -26
  310. package/dist/assets/home-page-itW0tRmv.js +0 -4
  311. package/dist/assets/html-to-image-BnSc-Wa0.js +0 -2
  312. package/dist/assets/index-0n92c_W7.js +0 -38
  313. package/dist/assets/mermaid-4DMBBIKO-PoHnhmy8.js +0 -1
  314. package/dist/assets/react-vega-Da-Ps9UW.js +0 -1
  315. package/dist/assets/stateDiagram-v2-4FDKWEC3-CEqeIlM0.js +0 -1
  316. package/dist/assets/stex-BBWVYm-R.js +0 -1
  317. package/dist/assets/tracing-DUVd0jtl.js +0 -1
  318. package/dist/assets/tracing-panel-CuTxPn_x.js +0 -2
  319. /package/dist/assets/{Combination-Cs9nbinQ.js → Combination-CSPK4t6z.js} +0 -0
  320. /package/dist/assets/{Deferred-BMfCOLaw.js → Deferred-CfyqLOPG.js} +0 -0
  321. /package/dist/assets/{SSRProvider-DC7ElCZZ.js → SSRProvider-CwqN9FWV.js} +0 -0
  322. /package/dist/assets/{badge-hTpPIsMT.js → badge-DImLVznf.js} +0 -0
  323. /package/dist/assets/{blob-CObhN-9g.js → blob-DgooIGjS.js} +0 -0
  324. /package/dist/assets/{bot-message-square-CK6eoGWy.js → bot-message-square-Dw41U6lL.js} +0 -0
  325. /package/dist/assets/{chart-no-axes-column-DV8gdCvH.js → chart-no-axes-column-a9XtWmzk.js} +0 -0
  326. /package/dist/assets/{check-BE0hEwVo.js → check-DZA_bRpw.js} +0 -0
  327. /package/dist/assets/{chevron-right-D0GQBpTb.js → chevron-right-CvVxySQk.js} +0 -0
  328. /package/dist/assets/{circle-check-gLIOLu8x.js → circle-check-CbaVeozR.js} +0 -0
  329. /package/dist/assets/{circle-play-DYGULlKZ.js → circle-play-DYn5nR6N.js} +0 -0
  330. /package/dist/assets/{circle-plus-CGG-gArM.js → circle-plus-nCze0-py.js} +0 -0
  331. /package/dist/assets/{clipboard-paste-DoYSN8Sv.js → clipboard-paste-EHXeKq9D.js} +0 -0
  332. /package/dist/assets/{code-xml-DwHPF_nL.js → code-xml-BlrJCgNZ.js} +0 -0
  333. /package/dist/assets/{copy-CkudG0Ej.js → copy-D6N1-xc1.js} +0 -0
  334. /package/dist/assets/{database-zap-DTWCDKdn.js → database-zap-BIGMFOfP.js} +0 -0
  335. /package/dist/assets/{defaultLocale-DK1MWd7f.js → defaultLocale-CGfP-Ye3.js} +0 -0
  336. /package/dist/assets/{defaultLocale-OkOxlkkM.js → defaultLocale-CuYNS33t.js} +0 -0
  337. /package/dist/assets/{dist-8UD0A5sU.js → dist-BF9S272t.js} +0 -0
  338. /package/dist/assets/{dist-apDpadc4.js → dist-Bk1itfBD.js} +0 -0
  339. /package/dist/assets/{dist-CQqv2gQL.js → dist-Dm11d0_A.js} +0 -0
  340. /package/dist/assets/{download-DBW9RXtT.js → download-nLboiTtW.js} +0 -0
  341. /package/dist/assets/{ellipsis-0_zJdF6H.js → ellipsis-d7eaKIFn.js} +0 -0
  342. /package/dist/assets/{ellipsis-vertical-CAB7tdza.js → ellipsis-vertical-DBQ5kWTo.js} +0 -0
  343. /package/dist/assets/{emotion-is-prop-valid.esm-D1keIaYa.js → emotion-is-prop-valid.esm-D7FeWASw.js} +0 -0
  344. /package/dist/assets/{errors-Bfogio62.js → errors-0IrrdfSG.js} +0 -0
  345. /package/dist/assets/{extends-DRbCSry7.js → extends-aq1t6BkR.js} +0 -0
  346. /package/dist/assets/{eye-off-vwi9L975.js → eye-off-CF3GmvXV.js} +0 -0
  347. /package/dist/assets/{file-DzHkbIdO.js → file-C-yMeaec.js} +0 -0
  348. /package/dist/assets/{file-headphone-B5q2Ow55.js → file-headphone-CPAP8asn.js} +0 -0
  349. /package/dist/assets/{file-plus-corner-lLQw9OnR.js → file-plus-corner-ks__N1mr.js} +0 -0
  350. /package/dist/assets/{github-BVtI-3F1.js → github-CRD4USKm.js} +0 -0
  351. /package/dist/assets/{image-DXfkah9d.js → image-CfyJzBP9.js} +0 -0
  352. /package/dist/assets/{link-Cf10mh3t.js → link-_dbp0XNB.js} +0 -0
  353. /package/dist/assets/{maps-OKerBHH8.js → maps-DQsjfyTy.js} +0 -0
  354. /package/dist/assets/{numbers-CYnquDho.js → numbers-Cno6K0UF.js} +0 -0
  355. /package/dist/assets/{objectWithoutPropertiesLoose-DP4vAkvg.js → objectWithoutPropertiesLoose-Dxmp_Bd_.js} +0 -0
  356. /package/dist/assets/{ordinal-BjO5SoTk.js → ordinal-CMAUv8ku.js} +0 -0
  357. /package/dist/assets/{paths-D2lG83Oh.js → paths-BVwhPRFT.js} +0 -0
  358. /package/dist/assets/{play-DKSqmedg.js → play-Bu_0ogGD.js} +0 -0
  359. /package/dist/assets/{plus-dVmh0yTy.js → plus-DJ99CUbx.js} +0 -0
  360. /package/dist/assets/{preload-helper-BW0IMuFq.js → preload-helper-y72bE5iF.js} +0 -0
  361. /package/dist/assets/{prop-types-RrUi-pOT.js → prop-types-DRf51_gT.js} +0 -0
  362. /package/dist/assets/{purify.es-BBn8CPhf.js → purify.es-Cf8RQecB.js} +0 -0
  363. /package/dist/assets/{range-DNqFcYmr.js → range-ClqUI25v.js} +0 -0
  364. /package/dist/assets/{refresh-ccw-DLpfIr8v.js → refresh-ccw-DQ6SJ8UC.js} +0 -0
  365. /package/dist/assets/{refresh-cw-CHAHPgkx.js → refresh-cw-Dg9tCj4k.js} +0 -0
  366. /package/dist/assets/{rotate-ccw-hLlF_82X.js → rotate-ccw-BCkZViUZ.js} +0 -0
  367. /package/dist/assets/{save-8fSvKYJT.js → save-CUdcv5qm.js} +0 -0
  368. /package/dist/assets/{session-BrEm7qNv.js → session-CByuQ-M-.js} +0 -0
  369. /package/dist/assets/{settings-CzQUw9rV.js → settings-B7nhfCat.js} +0 -0
  370. /package/dist/assets/{spinner-C5JoisA7.js → spinner-pCogyRyo.js} +0 -0
  371. /package/dist/assets/{square-CxAsQQ77.js → square-KVNDGpgy.js} +0 -0
  372. /package/dist/assets/{square-function-B006EYFX.js → square-function-BMNCw7Qb.js} +0 -0
  373. /package/dist/assets/{stex-0ac7Aukl.js → stex-C6JeW1YI.js} +0 -0
  374. /package/dist/assets/{table-BCnp9gKC.js → table-Od8PbuV-.js} +0 -0
  375. /package/dist/assets/{toDate-BqKH-Jd9.js → toDate-Cfp9W_O9.js} +0 -0
  376. /package/dist/assets/{trash-2-CAoNMkjq.js → trash-2-Bc_J7TQO.js} +0 -0
  377. /package/dist/assets/{trash-BZMAQneW.js → trash-Cxd189Vw.js} +0 -0
  378. /package/dist/assets/{triangle-alert-qZo1ox6x.js → triangle-alert-CzLrbLGN.js} +0 -0
  379. /package/dist/assets/{types-C1RN112u.js → types-CLOMZuqU.js} +0 -0
  380. /package/dist/assets/{use-toast-Hc8CXlvz.js → use-toast-BtZldTi5.js} +0 -0
  381. /package/dist/assets/{useDebounce-B0dx2Gp0.js → useDebounce-DwTO_rGp.js} +0 -0
  382. /package/dist/assets/{useTheme-BYXBU1of.js → useTheme-KDW4sktg.js} +0 -0
  383. /package/dist/assets/{uuid-ClFZlR7U.js → uuid-BukULOeS.js} +0 -0
  384. /package/dist/assets/{workflow-BmeqNuSH.js → workflow-BqHyyStM.js} +0 -0
  385. /package/dist/assets/{x-BI1M8X_v.js → x-CdLP7-v3.js} +0 -0
  386. /package/dist/assets/{youtube-DE-Ej6FR.js → youtube-CfU-SnDw.js} +0 -0
@@ -6,6 +6,7 @@ import { EditorView } from "@codemirror/view";
6
6
  import { atom } from "jotai";
7
7
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
8
8
  import { MockRequestClient } from "@/__mocks__/requests";
9
+ import { cellId } from "@/__tests__/branded";
9
10
  import type { NotebookState } from "@/core/cells/cells";
10
11
  import { getNotebook } from "@/core/cells/cells";
11
12
  import type { CellId } from "@/core/cells/ids";
@@ -99,11 +100,11 @@ afterEach(() => {
99
100
  describe("format", () => {
100
101
  describe("formatEditorViews", () => {
101
102
  it("should format code in editor views", async () => {
102
- const cellId1 = "1" as CellId;
103
- const cellId2 = "2" as CellId;
103
+ const cid1 = cellId("1");
104
+ const cid2 = cellId("2");
104
105
  const views = {
105
- [cellId1]: createEditor("import numpy as np", cellId1),
106
- [cellId2]: createEditor("import pandas as pd", cellId2),
106
+ [cid1]: createEditor("import numpy as np", cid1),
107
+ [cid2]: createEditor("import pandas as pd", cid2),
107
108
  };
108
109
 
109
110
  const formattedCode1 = "import numpy as np";
@@ -111,8 +112,8 @@ describe("format", () => {
111
112
 
112
113
  mockRequestClient.sendFormat.mockResolvedValueOnce({
113
114
  codes: {
114
- [cellId1]: formattedCode1,
115
- [cellId2]: formattedCode2,
115
+ [cid1]: formattedCode1,
116
+ [cid2]: formattedCode2,
116
117
  },
117
118
  });
118
119
 
@@ -122,36 +123,36 @@ describe("format", () => {
122
123
 
123
124
  expect(mockRequestClient.sendFormat).toHaveBeenCalledWith({
124
125
  codes: {
125
- [cellId1]: "import numpy as np",
126
- [cellId2]: "import pandas as pd",
126
+ [cid1]: "import numpy as np",
127
+ [cid2]: "import pandas as pd",
127
128
  },
128
129
  lineLength: 88,
129
130
  });
130
131
 
131
- expect(views[cellId1].state.doc.toString()).toBe(formattedCode1);
132
- expect(views[cellId2].state.doc.toString()).toBe(formattedCode2);
132
+ expect(views[cid1].state.doc.toString()).toBe(formattedCode1);
133
+ expect(views[cid2].state.doc.toString()).toBe(formattedCode2);
133
134
  expect(updateCellCode).toHaveBeenCalledWith({
134
- cellId: cellId1,
135
+ cellId: cid1,
135
136
  code: formattedCode1,
136
137
  formattingChange: true,
137
138
  });
138
139
  expect(updateCellCode).toHaveBeenCalledWith({
139
- cellId: cellId2,
140
+ cellId: cid2,
140
141
  code: formattedCode2,
141
142
  formattingChange: true,
142
143
  });
143
144
  });
144
145
 
145
146
  it("should not update editor if formatted code is same as original", async () => {
146
- const cellId = "1" as CellId;
147
+ const cid = cellId("1");
147
148
  const originalCode = "import numpy as np";
148
149
  const views = {
149
- [cellId]: createEditor(originalCode, cellId),
150
+ [cid]: createEditor(originalCode, cid),
150
151
  };
151
152
 
152
153
  mockRequestClient.sendFormat.mockResolvedValueOnce({
153
154
  codes: {
154
- [cellId]: originalCode,
155
+ [cid]: originalCode,
155
156
  },
156
157
  });
157
158
 
@@ -159,26 +160,26 @@ describe("format", () => {
159
160
 
160
161
  await formatEditorViews(views);
161
162
 
162
- expect(views[cellId].state.doc.toString()).toBe(originalCode);
163
+ expect(views[cid].state.doc.toString()).toBe(originalCode);
163
164
  expect(updateCellCode).not.toHaveBeenCalled();
164
165
  });
165
166
  });
166
167
 
167
168
  describe("formatAll", () => {
168
169
  it("should format all cells in notebook", async () => {
169
- const cellId1 = "1" as CellId;
170
- const cellId2 = "2" as CellId;
170
+ const cid1 = cellId("1");
171
+ const cid2 = cellId("2");
171
172
  const views = {
172
- [cellId1]: createEditor("import numpy as np", cellId1),
173
- [cellId2]: createEditor("import pandas as pd", cellId2),
173
+ [cid1]: createEditor("import numpy as np", cid1),
174
+ [cid2]: createEditor("import pandas as pd", cid2),
174
175
  };
175
176
 
176
177
  vi.mocked(getNotebook).mockReturnValueOnce({} as NotebookState);
177
178
  vi.mocked(notebookCellEditorViews).mockReturnValueOnce(views);
178
179
  mockRequestClient.sendFormat.mockResolvedValueOnce({
179
180
  codes: {
180
- [cellId1]: "import numpy as np",
181
- [cellId2]: "import pandas as pd",
181
+ [cid1]: "import numpy as np",
182
+ [cid2]: "import pandas as pd",
182
183
  },
183
184
  });
184
185
 
@@ -188,14 +189,14 @@ describe("format", () => {
188
189
 
189
190
  expect(mockRequestClient.sendFormat).toHaveBeenCalledWith({
190
191
  codes: {
191
- [cellId1]: "import numpy as np",
192
- [cellId2]: "import pandas as pd",
192
+ [cid1]: "import numpy as np",
193
+ [cid2]: "import pandas as pd",
193
194
  },
194
195
  lineLength: 88,
195
196
  });
196
197
 
197
198
  expect(updateCellCode).toHaveBeenCalledWith({
198
- cellId: cellId1,
199
+ cellId: cid1,
199
200
  code: "import numpy as np",
200
201
  formattingChange: true,
201
202
  });
@@ -204,8 +205,8 @@ describe("format", () => {
204
205
 
205
206
  describe("formatSQL", () => {
206
207
  it("should format SQL code", async () => {
207
- const cellId = "1" as CellId;
208
- const editor = createEditor("SELECT * FROM table WHERE id = 1", cellId);
208
+ const cid = cellId("1");
209
+ const editor = createEditor("SELECT * FROM table WHERE id = 1", cid);
209
210
  switchLanguage(editor, { language: "sql" });
210
211
 
211
212
  await formatSQL(editor, "duckdb" as ConnectionName);
@@ -220,15 +221,15 @@ describe("format", () => {
220
221
  id = 1"
221
222
  `);
222
223
  expect(updateCellCode).toHaveBeenCalledWith({
223
- cellId: cellId,
224
+ cellId: cid,
224
225
  code: editor.state.doc.toString(),
225
226
  formattingChange: true,
226
227
  });
227
228
  });
228
229
 
229
230
  it("should not format if language adapter is not SQL", async () => {
230
- const cellId = "1" as CellId;
231
- const editor = createEditor("SELECT * FROM table WHERE id = 1", cellId);
231
+ const cid = cellId("1");
232
+ const editor = createEditor("SELECT * FROM table WHERE id = 1", cid);
232
233
  switchLanguage(editor, { language: "python" });
233
234
 
234
235
  await formatSQL(editor, "duckdb" as ConnectionName);
@@ -242,11 +243,8 @@ describe("format", () => {
242
243
  });
243
244
 
244
245
  it("should format SQL code with different dialect", async () => {
245
- const cellId = "1" as CellId;
246
- const editor = createEditor(
247
- "SELECT * FROM `table.dot` WHERE id = 1",
248
- cellId,
249
- );
246
+ const cid = cellId("1");
247
+ const editor = createEditor("SELECT * FROM `table.dot` WHERE id = 1", cid);
250
248
  switchLanguage(editor, { language: "sql" });
251
249
 
252
250
  await formatSQL(editor, "mysql" as ConnectionName); // mysql uses backticks for identifiers
@@ -260,7 +258,7 @@ describe("format", () => {
260
258
  id = 1"
261
259
  `);
262
260
  expect(updateCellCode).toHaveBeenCalledWith({
263
- cellId: cellId,
261
+ cellId: cid,
264
262
  code: editor.state.doc.toString(),
265
263
  formattingChange: true,
266
264
  });
@@ -3,7 +3,7 @@
3
3
  import { EditorState, type Extension } from "@codemirror/state";
4
4
  import { keymap } from "@codemirror/view";
5
5
  import { describe, expect, test, vi } from "vitest";
6
- import type { CellId } from "@/core/cells/ids";
6
+ import { cellId } from "@/__tests__/branded";
7
7
  import { OverridingHotkeyProvider } from "@/core/hotkeys/hotkeys";
8
8
  import { Objects } from "@/utils/objects";
9
9
  import type { CodemirrorCellActions } from "../cells/state";
@@ -35,7 +35,7 @@ function namedFunction(name: string) {
35
35
 
36
36
  function getOpts() {
37
37
  return {
38
- cellId: "0" as CellId,
38
+ cellId: cellId("0"),
39
39
  showPlaceholder: false,
40
40
  enableAI: false,
41
41
  cellActions: {
@@ -0,0 +1,114 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ // @vitest-environment jsdom
3
+
4
+ import {
5
+ EditorState,
6
+ Transaction,
7
+ type TransactionSpec,
8
+ } from "@codemirror/state";
9
+ import { describe, expect, it } from "vitest";
10
+ import { formattingChangeEffect } from "../../format";
11
+ import { loroSyncAnnotation } from "../../rtc/loro/sync";
12
+ import { exportedForTesting } from "../extensions";
13
+
14
+ const { shouldAutorunMarkdownUpdate } = exportedForTesting;
15
+
16
+ function createTransaction(spec: TransactionSpec) {
17
+ return EditorState.create({ doc: "" }).update(spec);
18
+ }
19
+
20
+ describe("shouldAutorunMarkdownUpdate", () => {
21
+ it.each([
22
+ "input.type",
23
+ "delete.backward",
24
+ "undo",
25
+ "redo",
26
+ ])("accepts local %s transactions", (userEvent) => {
27
+ const transaction = createTransaction({
28
+ changes: { from: 0, insert: "#" },
29
+ annotations: [Transaction.userEvent.of(userEvent)],
30
+ });
31
+
32
+ expect(
33
+ shouldAutorunMarkdownUpdate({
34
+ docChanged: transaction.docChanged,
35
+ transactions: [transaction],
36
+ }),
37
+ ).toBe(true);
38
+ });
39
+
40
+ it("ignores formatting changes", () => {
41
+ const transaction = createTransaction({
42
+ changes: { from: 0, insert: "#" },
43
+ annotations: [Transaction.userEvent.of("input.type")],
44
+ effects: [formattingChangeEffect.of(true)],
45
+ });
46
+
47
+ expect(
48
+ shouldAutorunMarkdownUpdate({
49
+ docChanged: transaction.docChanged,
50
+ transactions: [transaction],
51
+ }),
52
+ ).toBe(false);
53
+ });
54
+
55
+ it("ignores RTC sync transactions", () => {
56
+ const transaction = createTransaction({
57
+ changes: { from: 0, insert: "#" },
58
+ annotations: [
59
+ Transaction.userEvent.of("input.type"),
60
+ loroSyncAnnotation.of(true),
61
+ ],
62
+ });
63
+
64
+ expect(
65
+ shouldAutorunMarkdownUpdate({
66
+ docChanged: transaction.docChanged,
67
+ transactions: [transaction],
68
+ hasFocus: true,
69
+ }),
70
+ ).toBe(false);
71
+ });
72
+
73
+ it("ignores programmatic doc changes without a user event", () => {
74
+ const transaction = createTransaction({
75
+ changes: { from: 0, insert: "#" },
76
+ });
77
+
78
+ expect(
79
+ shouldAutorunMarkdownUpdate({
80
+ docChanged: transaction.docChanged,
81
+ transactions: [transaction],
82
+ }),
83
+ ).toBe(false);
84
+ });
85
+
86
+ it("allows focused local doc changes without user event annotations", () => {
87
+ const transaction = createTransaction({
88
+ changes: { from: 0, insert: "#" },
89
+ });
90
+
91
+ expect(
92
+ shouldAutorunMarkdownUpdate({
93
+ docChanged: transaction.docChanged,
94
+ transactions: [transaction],
95
+ hasFocus: true,
96
+ }),
97
+ ).toBe(true);
98
+ });
99
+
100
+ it("honors the predicate gate", () => {
101
+ const transaction = createTransaction({
102
+ changes: { from: 0, insert: "#" },
103
+ annotations: [Transaction.userEvent.of("input.type")],
104
+ });
105
+
106
+ expect(
107
+ shouldAutorunMarkdownUpdate({
108
+ docChanged: transaction.docChanged,
109
+ transactions: [transaction],
110
+ predicate: () => false,
111
+ }),
112
+ ).toBe(false);
113
+ });
114
+ });
@@ -5,6 +5,7 @@ import { foldCode, foldedRanges, foldGutter } from "@codemirror/language";
5
5
  import { EditorState } from "@codemirror/state";
6
6
  import { EditorView } from "@codemirror/view";
7
7
  import { afterEach, describe, expect, it } from "vitest";
8
+ import { cellId } from "@/__tests__/branded";
8
9
  import type { CellId } from "@/core/cells/ids";
9
10
  import { createMockObservable } from "@/core/state/__mocks__/mocks";
10
11
  import type { Observable } from "@/core/state/observable";
@@ -48,7 +49,7 @@ describe("traceback-decorations", () => {
48
49
 
49
50
  describe("unfoldErrorLines", () => {
50
51
  it("should unfold folded regions containing error lines", () => {
51
- const cellId = "cell1" as CellId;
52
+ const cid = cellId("cell1");
52
53
  const code = `def my_function():
53
54
  x = 1
54
55
  y = 2
@@ -60,7 +61,7 @@ result = my_function()`;
60
61
  const errorsObservable = createMockObservable<
61
62
  TracebackInfo[] | undefined
62
63
  >(undefined);
63
- view = createEditor(code, cellId, errorsObservable);
64
+ view = createEditor(code, cid, errorsObservable);
64
65
 
65
66
  // Fold the function body (lines 2-5)
66
67
  // @ts-expect-error - foldCode accepts position as second arg at runtime
@@ -82,7 +83,7 @@ result = my_function()`;
82
83
  mockObservable.set([
83
84
  {
84
85
  kind: "cell",
85
- cellId,
86
+ cellId: cid,
86
87
  lineNumber: 3,
87
88
  },
88
89
  ]);
@@ -100,7 +101,7 @@ result = my_function()`;
100
101
  });
101
102
 
102
103
  it("should not unfold folded regions when error is outside the region", () => {
103
- const cellId = "cell1" as CellId;
104
+ const cid = cellId("cell1");
104
105
  const code = `def my_function():
105
106
  x = 1
106
107
  y = 2
@@ -111,7 +112,7 @@ result = my_function()`;
111
112
  const errorsObservable = createMockObservable<
112
113
  TracebackInfo[] | undefined
113
114
  >(undefined);
114
- view = createEditor(code, cellId, errorsObservable);
115
+ view = createEditor(code, cid, errorsObservable);
115
116
 
116
117
  // Fold the function body (lines 2-4)
117
118
  // @ts-expect-error - foldCode accepts position as second arg at runtime
@@ -133,7 +134,7 @@ result = my_function()`;
133
134
  mockObservable.set([
134
135
  {
135
136
  kind: "cell",
136
- cellId,
137
+ cellId: cid,
137
138
  lineNumber: 6,
138
139
  },
139
140
  ]);
@@ -151,8 +152,8 @@ result = my_function()`;
151
152
  });
152
153
 
153
154
  it("should not unfold regions for errors in different cells", () => {
154
- const cellId1 = "cell1" as CellId;
155
- const cellId2 = "cell2" as CellId;
155
+ const cellId1 = cellId("cell1");
156
+ const cellId2 = cellId("cell2");
156
157
  const code = `def my_function():
157
158
  x = 1
158
159
  y = 2
@@ -201,7 +202,7 @@ result = my_function()`;
201
202
  });
202
203
 
203
204
  it("should handle multiple errors in the same folded region", () => {
204
- const cellId = "cell1" as CellId;
205
+ const cid = cellId("cell1");
205
206
  const code = `def my_function():
206
207
  x = 1
207
208
  y = 2
@@ -213,7 +214,7 @@ result = my_function()`;
213
214
  const errorsObservable = createMockObservable<
214
215
  TracebackInfo[] | undefined
215
216
  >(undefined);
216
- view = createEditor(code, cellId, errorsObservable);
217
+ view = createEditor(code, cid, errorsObservable);
217
218
 
218
219
  // Fold the function body
219
220
  // @ts-expect-error - foldCode accepts position as second arg at runtime
@@ -235,12 +236,12 @@ result = my_function()`;
235
236
  mockObservable.set([
236
237
  {
237
238
  kind: "cell",
238
- cellId,
239
+ cellId: cid,
239
240
  lineNumber: 2, // Inside folded region
240
241
  },
241
242
  {
242
243
  kind: "cell",
243
- cellId,
244
+ cellId: cid,
244
245
  lineNumber: 4, // Also inside folded region
245
246
  },
246
247
  ]);
@@ -258,7 +259,7 @@ result = my_function()`;
258
259
  });
259
260
 
260
261
  it("should handle invalid line numbers gracefully in unfoldErrorLines", () => {
261
- const cellId = "cell1" as CellId;
262
+ const cid = cellId("cell1");
262
263
  const code = `def my_function():
263
264
  x = 1
264
265
  return x`;
@@ -266,7 +267,7 @@ result = my_function()`;
266
267
  const errorsObservable = createMockObservable<
267
268
  TracebackInfo[] | undefined
268
269
  >(undefined);
269
- view = createEditor(code, cellId, errorsObservable);
270
+ view = createEditor(code, cid, errorsObservable);
270
271
 
271
272
  // Fold the function
272
273
  // @ts-expect-error - foldCode accepts position as second arg at runtime
@@ -284,7 +285,7 @@ result = my_function()`;
284
285
  mockObservable.set([
285
286
  {
286
287
  kind: "cell",
287
- cellId,
288
+ cellId: cid,
288
289
  lineNumber: 2, // Valid line number inside folded region
289
290
  },
290
291
  ]);
@@ -310,7 +311,7 @@ result = my_function()`;
310
311
  });
311
312
 
312
313
  it("should handle file errors (not cell errors)", () => {
313
- const cellId = "cell1" as CellId;
314
+ const cid = cellId("cell1");
314
315
  const code = `def my_function():
315
316
  x = 1
316
317
  return x`;
@@ -318,7 +319,7 @@ result = my_function()`;
318
319
  const errorsObservable = createMockObservable<
319
320
  TracebackInfo[] | undefined
320
321
  >(undefined);
321
- view = createEditor(code, cellId, errorsObservable);
322
+ view = createEditor(code, cid, errorsObservable);
322
323
 
323
324
  // Fold the function
324
325
  // @ts-expect-error - foldCode accepts position as second arg at runtime
@@ -350,7 +351,7 @@ result = my_function()`;
350
351
  });
351
352
 
352
353
  it("should handle empty or undefined errors", () => {
353
- const cellId = "cell1" as CellId;
354
+ const cid = cellId("cell1");
354
355
  const code = `def my_function():
355
356
  x = 1
356
357
  return x`;
@@ -358,7 +359,7 @@ result = my_function()`;
358
359
  const errorsObservable = createMockObservable<
359
360
  TracebackInfo[] | undefined
360
361
  >(undefined);
361
- view = createEditor(code, cellId, errorsObservable);
362
+ view = createEditor(code, cid, errorsObservable);
362
363
 
363
364
  // Fold the function
364
365
  // @ts-expect-error - foldCode accepts position as second arg at runtime
@@ -392,7 +393,7 @@ result = my_function()`;
392
393
  });
393
394
 
394
395
  it("should handle invalid line numbers gracefully", () => {
395
- const cellId = "cell1" as CellId;
396
+ const cid = cellId("cell1");
396
397
  const code = `def my_function():
397
398
  x = 1
398
399
  return x`;
@@ -400,7 +401,7 @@ result = my_function()`;
400
401
  const errorsObservable = createMockObservable<
401
402
  TracebackInfo[] | undefined
402
403
  >(undefined);
403
- view = createEditor(code, cellId, errorsObservable);
404
+ view = createEditor(code, cid, errorsObservable);
404
405
 
405
406
  // Fold the function
406
407
  // @ts-expect-error - foldCode accepts position as second arg at runtime
@@ -415,7 +416,7 @@ result = my_function()`;
415
416
  mockObservable.set([
416
417
  {
417
418
  kind: "cell",
418
- cellId,
419
+ cellId: cid,
419
420
  lineNumber: maxLine + 100, // Invalid line number
420
421
  },
421
422
  ]);
@@ -438,7 +439,7 @@ result = my_function()`;
438
439
  });
439
440
 
440
441
  it("should unfold nested structures when error is inside", () => {
441
- const cellId = "cell1" as CellId;
442
+ const cid = cellId("cell1");
442
443
  const code = `def outer_function():
443
444
  def inner_function():
444
445
  x = 1
@@ -452,7 +453,7 @@ final = outer_function()`;
452
453
  const errorsObservable = createMockObservable<
453
454
  TracebackInfo[] | undefined
454
455
  >(undefined);
455
- view = createEditor(code, cellId, errorsObservable);
456
+ view = createEditor(code, cid, errorsObservable);
456
457
 
457
458
  // Fold the outer function (which contains the inner function)
458
459
  // @ts-expect-error - foldCode accepts position as second arg at runtime
@@ -474,7 +475,7 @@ final = outer_function()`;
474
475
  mockObservable.set([
475
476
  {
476
477
  kind: "cell",
477
- cellId,
478
+ cellId: cid,
478
479
  lineNumber: 4,
479
480
  },
480
481
  ]);
@@ -492,7 +493,7 @@ final = outer_function()`;
492
493
  });
493
494
 
494
495
  it("should handle errors being cleared and then re-added", () => {
495
- const cellId = "cell1" as CellId;
496
+ const cid = cellId("cell1");
496
497
  const code = `def my_function():
497
498
  x = 1
498
499
  y = 2
@@ -503,7 +504,7 @@ result = my_function()`;
503
504
  const errorsObservable = createMockObservable<
504
505
  TracebackInfo[] | undefined
505
506
  >(undefined);
506
- view = createEditor(code, cellId, errorsObservable);
507
+ view = createEditor(code, cid, errorsObservable);
507
508
 
508
509
  // Fold the function
509
510
  // @ts-expect-error - foldCode accepts position as second arg at runtime
@@ -517,7 +518,7 @@ result = my_function()`;
517
518
  mockObservable.set([
518
519
  {
519
520
  kind: "cell",
520
- cellId,
521
+ cellId: cid,
521
522
  lineNumber: 2,
522
523
  },
523
524
  ]);
@@ -545,7 +546,7 @@ result = my_function()`;
545
546
  mockObservable.set([
546
547
  {
547
548
  kind: "cell",
548
- cellId,
549
+ cellId: cid,
549
550
  lineNumber: 3,
550
551
  },
551
552
  ]);
@@ -562,7 +563,7 @@ result = my_function()`;
562
563
  });
563
564
 
564
565
  it("should unfold immediately when errors are set", () => {
565
- const cellId = "cell1" as CellId;
566
+ const cid = cellId("cell1");
566
567
  const code = `def my_function():
567
568
  x = 1
568
569
  y = 2
@@ -573,7 +574,7 @@ result = my_function()`;
573
574
  const errorsObservable = createMockObservable<
574
575
  TracebackInfo[] | undefined
575
576
  >(undefined);
576
- view = createEditor(code, cellId, errorsObservable);
577
+ view = createEditor(code, cid, errorsObservable);
577
578
 
578
579
  // Fold the function
579
580
  // @ts-expect-error - foldCode accepts position as second arg at runtime
@@ -595,7 +596,7 @@ result = my_function()`;
595
596
  mockObservable.set([
596
597
  {
597
598
  kind: "cell",
598
- cellId,
599
+ cellId: cid,
599
600
  lineNumber: 2,
600
601
  },
601
602
  ]);