@marimo-team/frontend 0.21.2-dev5 → 0.21.2-dev52
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.
- package/dist/assets/{CellStatus-CDSBsjjF.js → CellStatus-DX8MnBMk.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-Buaffg3u.js → ConnectedDataExplorerComponent-7yXYooWG.js} +1 -1
- package/dist/assets/{DeferredRequestRegistry-O6RDJKs0.js → DeferredRequestRegistry-B8jPCuU1.js} +1 -1
- package/dist/assets/{ImperativeModal-qEtcJ95s.js → ImperativeModal-C3CD5-Aq.js} +1 -1
- package/dist/assets/JsonOutput-DqjAyzM8.js +46 -0
- package/dist/assets/{LazyAnyLanguageCodeMirror-m8w66E4s.js → LazyAnyLanguageCodeMirror-CcCHIX38.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-az74f3Mp.js → MarimoErrorOutput-Dat_S09q.js} +5 -5
- package/dist/assets/RenderHTML-C7XM39M2.js +1 -0
- package/dist/assets/{add-cell-with-ai-DUn4LN4W.js → add-cell-with-ai-y2xroEGf.js} +9 -9
- package/dist/assets/{add-connection-dialog-CBz0AUVX.js → add-connection-dialog-QDBOmil3.js} +23 -23
- package/dist/assets/{agent-panel-u83dsDsM.js → agent-panel-DziFrEjJ.js} +6 -6
- package/dist/assets/ai-model-dropdown-CiJpv5wN.js +5 -0
- package/dist/assets/{alert-dialog-9WfvUF7e.js → alert-dialog-ebk_-wsU.js} +1 -1
- package/dist/assets/{any-language-editor-DwQMnAM3.js → any-language-editor-DZYnKlJB.js} +1 -1
- package/dist/assets/{app-config-button-rDu-lCIB.js → app-config-button-CpAv9Tiu.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-DfMHHFZ3.js → architectureDiagram-VXUJARFQ-DKmk99ac.js} +1 -1
- package/dist/assets/{azure-BTXHztTw.js → azure-Dw5gKmUz.js} +1 -1
- package/dist/assets/{blockDiagram-VD42YOAC-CuEDwbg7.js → blockDiagram-VD42YOAC-TpAhP5OQ.js} +1 -1
- package/dist/assets/{c4Diagram-YG6GDRKO-CD9uz7WG.js → c4Diagram-YG6GDRKO-Dg8hCyKf.js} +1 -1
- package/dist/assets/{cache-panel-qIxnndwr.js → cache-panel-D0OsHk_D.js} +1 -1
- package/dist/assets/cell-editor-RbAVpSFb.js +22 -0
- package/dist/assets/{cell-link-Q_UEP94Z.js → cell-link-CNgO3c-T.js} +1 -1
- package/dist/assets/{cells-fq1RMGX_.js → cells-39RE4UzS.js} +77 -76
- package/dist/assets/channel-D1wPYhc9.js +1 -0
- package/dist/assets/{chat-display-D_Fuuy6r.js → chat-display-BPUVrlA6.js} +1 -1
- package/dist/assets/{chat-panel-BO-JoQSp.js → chat-panel-esz5TfF-.js} +2 -2
- package/dist/assets/{chunk-5FQGJX7Z-CM1a_K7I.js → chunk-5FQGJX7Z-sGWxL7Ey.js} +3 -3
- package/dist/assets/{chunk-ABZYJK2D-D_Wumzom.js → chunk-ABZYJK2D-DXJ7hnjx.js} +1 -1
- package/dist/assets/{chunk-ATLVNIR6-BZ0lTgIn.js → chunk-ATLVNIR6-CTEqcLEc.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-Dw1S6osV.js → chunk-B4BG7PRW-CkAIqtPf.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-Q63FTCPP.js → chunk-DI55MBZ5-C4F9vu8o.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-CfkJ_R7W.js → chunk-EXTU4WIE-BT0Py-4P.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-B41fGeoj.js → chunk-JA3XYJ7Z-CGd7jja_.js} +1 -1
- package/dist/assets/{chunk-JZLCHNYA-D43EJxQw.js → chunk-JZLCHNYA-CqY-RYTj.js} +1 -1
- package/dist/assets/{chunk-N4CR4FBY-DCtw0-ni.js → chunk-N4CR4FBY-aUDjVzN7.js} +2 -2
- package/dist/assets/{chunk-QN33PNHL-CLA2rsaS.js → chunk-QN33PNHL-DHnCb5-U.js} +1 -1
- package/dist/assets/{chunk-QXUST7PY-De1DpbnL.js → chunk-QXUST7PY-CRO5kYCE.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-qrwvlUdq.js → chunk-S3R3BYOJ-CSHQgcuP.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-C4KcThb0.js → chunk-TZMSLE5B-CE7o9asH.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-BDIQSKYv.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-Cdh4cVOB.js +1 -0
- package/dist/assets/{code-block-37QAKDTI-D4FF4cnN.js → code-block-37QAKDTI-DMpe1jNG.js} +1 -1
- package/dist/assets/{column-preview-WsubyItX.js → column-preview-BUKHsglA.js} +1 -1
- package/dist/assets/{command-rfxSsiHU.js → command-DmzEbs6L.js} +1 -1
- package/dist/assets/{command-palette-Bez4BqJF.js → command-palette-BX5gNpUr.js} +1 -1
- package/dist/assets/{common-BYwO983A.js → common-B4yshY-H.js} +1 -1
- package/dist/assets/{components-Ozq0825a.js → components-DCqJqyys.js} +1 -1
- package/dist/assets/{components-Bpgzv_5_.js → components-oKCjx6cN.js} +1 -1
- package/dist/assets/{config-3Aq84phF.js → config-DqxNMQDN.js} +1 -1
- package/dist/assets/{context-CIAP2NOh.js → context-CRmPPhx9.js} +1 -1
- package/dist/assets/{context-aware-panel-CfsfBlhO.js → context-aware-panel-DC0Te9Hj.js} +2 -2
- package/dist/assets/copy-KjcPgPw9.js +1 -0
- package/dist/assets/{copy-icon-BgmMM9Zg.js → copy-icon-P0kzz1Pr.js} +1 -1
- package/dist/assets/{dagre-6UL2VRFP-BhMnPhuU.js → dagre-6UL2VRFP-XqoNLMQ3.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-kbv73SQ7.js → data-grid-overlay-editor-Cus1-BFN.js} +1 -1
- package/dist/assets/{datasource-F9sJtuof.js → datasource-DKHG39NV.js} +2 -2
- package/dist/assets/{dates-CHaNfieI.js → dates-CTqMeMGY.js} +1 -1
- package/dist/assets/{dependency-graph-panel-AOBcX2tP.js → dependency-graph-panel-7GKT3dyD.js} +4 -4
- package/dist/assets/{diagram-PSM6KHXK-Cr2t4zul.js → diagram-PSM6KHXK-BuzKNNcN.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-DLU_hSO4.js → diagram-QEK2KX5R-A5LBQS11.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-C7EkNAO3.js → diagram-S2PKOQOG-dkJE8SA0.js} +1 -1
- package/dist/assets/{dialog-CVN1lcMF.js → dialog-1_jIyAb_.js} +1 -1
- package/dist/assets/{dist-DJBpXGro.js → dist-6P6vjf93.js} +1 -1
- package/dist/assets/dist-BWGxTsTP.js +1 -0
- package/dist/assets/{dist-CblX3KGI.js → dist-B_buFm3B.js} +1 -1
- package/dist/assets/{dist-CXLJUPFl.js → dist-BatEf-0f.js} +1 -1
- package/dist/assets/dist-C3AnARPE.js +1 -0
- package/dist/assets/{dist-BNC_tnlW.js → dist-C6ohaMKU.js} +1 -1
- package/dist/assets/{dist-BoDHthoc.js → dist-CO9Pg2Rc.js} +1 -1
- package/dist/assets/{dist-By6zhkxZ.js → dist-CSV6H5w_.js} +1 -1
- package/dist/assets/{dist-6FIAeDIu.js → dist-CYs1oP7g.js} +1 -1
- package/dist/assets/{dist-DbK_4_qo.js → dist-DD9ZJMK5.js} +1 -1
- package/dist/assets/{dist-DlTbNRBn.js → dist-DReDpc2z.js} +1 -1
- package/dist/assets/dist-DSlq5ZeQ.js +1 -0
- package/dist/assets/{dist-DrceDAhM.js → dist-DXyIIB32.js} +1 -1
- package/dist/assets/{dist-CcGcwrUD.js → dist-DkaderFA.js} +1 -1
- package/dist/assets/{dist-BiZQlfhr.js → dist-Dq3BlK4R.js} +1 -1
- package/dist/assets/{dist-ClzRAVN-.js → dist-Dxov2ltb.js} +1 -1
- package/dist/assets/{dist-BXXPfIam.js → dist-EtGG9C1A.js} +1 -1
- package/dist/assets/{dist-C3MmXcLA.js → dist-NjId5Gdz.js} +1 -1
- package/dist/assets/dist-ZM59OWYL.js +1 -0
- package/dist/assets/dist-_TwZ4tIe.js +1 -0
- package/dist/assets/dist-f9b2H4q_.js +1 -0
- package/dist/assets/{dist-mxGLXOFm.js → dist-feWVQ4dq.js} +1 -1
- package/dist/assets/{documentation-panel-D28MpqbI.js → documentation-panel-D5d_BbHV.js} +1 -1
- package/dist/assets/{download-B9_ToVd4.js → download-B1vXaivj.js} +4 -4
- package/dist/assets/{dropdown-menu-DdPu5Kfu.js → dropdown-menu-BehqiLFL.js} +1 -1
- package/dist/assets/{edit-page-otS-QvnC.js → edit-page-B5cAZdO7.js} +7 -7
- package/dist/assets/{en-US-BO8E69bZ.js → en-US-f8tajDx1.js} +1 -1
- package/dist/assets/{erDiagram-Q2GNP2WA-DqlEo_Us.js → erDiagram-Q2GNP2WA-CgH6udOW.js} +1 -1
- package/dist/assets/{error-banner-BRG6IPhC.js → error-banner-J5F3weEj.js} +1 -1
- package/dist/assets/{error-panel-RRoj_iOR.js → error-panel-DnhKJ5Ou.js} +1 -1
- package/dist/assets/{es-CzkousWe.js → es-DYI7U61K.js} +1 -1
- package/dist/assets/{esm-CBkHtTOV.js → esm-BC1J92im.js} +1 -1
- package/dist/assets/{esm-DhTsVMLM.js → esm-DKLLCu3N.js} +1 -1
- package/dist/assets/{field-B1jGbQlH.js → field-B08lvxnl.js} +1 -1
- package/dist/assets/file-explorer-panel-BUk69TND.js +26 -0
- package/dist/assets/{file-icons-CWLHDa1J.js → file-icons-3DTS8ZM7.js} +1 -1
- package/dist/assets/{floating-outline-BvQKiC0F.js → floating-outline-DmugATcB.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-CQlIJ12H.js → flowDiagram-NV44I4VS-D85BL4rA.js} +1 -1
- package/dist/assets/{focus-DYwTiH9-.js → focus-DlJH7sfh.js} +1 -1
- package/dist/assets/{form-CrQYrsUC.js → form-760_EqmF.js} +2 -2
- package/dist/assets/{formats-rhOJovGE.js → formats-wYuh1bqp.js} +1 -1
- package/dist/assets/{formatting-B4ZCH3ol.js → formatting-CraOPe94.js} +1 -1
- package/dist/assets/{gallery-page-eRea0yic.js → gallery-page--paiPvYX.js} +1 -1
- package/dist/assets/{ganttDiagram-JELNMOA3-B3EGIuZL.js → ganttDiagram-JELNMOA3-DzCOXWlF.js} +1 -1
- package/dist/assets/{gitGraphDiagram-V2S2FVAM-h5SlguJK.js → gitGraphDiagram-V2S2FVAM-BUHURX6t.js} +1 -1
- package/dist/assets/{glide-data-editor-xt5xNZeV.js → glide-data-editor-DYdoQTO5.js} +4 -4
- package/dist/assets/{globals-BsV5fVR-.js → globals-7M5DRsIb.js} +1 -1
- package/dist/assets/home-page-CxQ1e98h.js +4 -0
- package/dist/assets/{hooks-CHx5dUUq.js → hooks-C3jEff2O.js} +1 -1
- package/dist/assets/html-to-image-DTFXm6_Z.js +2 -0
- package/dist/assets/{index-GjXovVsl.css → index-BmoocKR0.css} +1 -1
- package/dist/assets/index-DNchElHl.js +38 -0
- package/dist/assets/{infoDiagram-HS3SLOUP-pzpClObZ.js → infoDiagram-HS3SLOUP-GG5r0Y5G.js} +1 -1
- package/dist/assets/{input-CUwqpKjd.js → input-CN1ZeRYm.js} +1 -1
- package/dist/assets/{isValid-BGe7pJXT.js → isValid-DY4Mgbr7.js} +1 -1
- package/dist/assets/{journeyDiagram-XKPGCS4Q-BrdRi92v.js → journeyDiagram-XKPGCS4Q-B1dvnV4D.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-B6WqgFqh.js → kanban-definition-3W4ZIXB7-CefbrXQv.js} +1 -1
- package/dist/assets/{kiosk-mode-DNjEnIWb.js → kiosk-mode-CyTnrzwK.js} +1 -1
- package/dist/assets/{layout-CwFtCyW8.js → layout-3b3tzmbb.js} +3 -3
- package/dist/assets/{linear-BP9rwmWK.js → linear-BDnrHGYO.js} +1 -1
- package/dist/assets/{links-CIQwYQ48.js → links-CptYD1FP.js} +1 -1
- package/dist/assets/{logs-panel-BU1tNEVc.js → logs-panel-C4k_2IHW.js} +1 -1
- package/dist/assets/{markdown-renderer-MR9df58W.js → markdown-renderer-DSy5IuAx.js} +1 -1
- package/dist/assets/{menu-items-UxKrm8hS.js → menu-items-BpHXKv51.js} +1 -1
- package/dist/assets/mermaid-4DMBBIKO-g7AL4SLJ.js +1 -0
- package/dist/assets/{mermaid-Djr3jUAB.js → mermaid-C43VbdrM.js} +3 -3
- package/dist/assets/{mermaid-parser.core-DR82IMb2.js → mermaid-parser.core-CdM8D_p_.js} +1 -1
- package/dist/assets/{mindmap-definition-VGOIOE7T-DAmJpbPM.js → mindmap-definition-VGOIOE7T-CcV7D-wF.js} +1 -1
- package/dist/assets/{mode-AcL8c6qH.js → mode-D-iRbN9x.js} +1 -1
- package/dist/assets/{multi-map-Pp1P2DOX.js → multi-map-C8RbwBrw.js} +1 -1
- package/dist/assets/{name-cell-input-DVFEv_aO.js → name-cell-input-Dyb0ZO4X.js} +1 -1
- package/dist/assets/{number-overlay-editor-D__AflXQ.js → number-overlay-editor-BBJO1mf8.js} +1 -1
- package/dist/assets/{outline-panel-CP0oIuiU.js → outline-panel-D7CJwO8u.js} +1 -1
- package/dist/assets/{packages-panel-CzRELimG.js → packages-panel-Bp1SYjgc.js} +1 -1
- package/dist/assets/{panels-wTweRyIv.js → panels-D0aw6jdc.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-DbGIFRoq.js → pieDiagram-ADFJNKIX-C1fBf15W.js} +1 -1
- package/dist/assets/{popover-BPGG2gPG.js → popover-Bvoif-Mg.js} +1 -1
- package/dist/assets/{precisionRound-BOmLQIKI.js → precisionRound-CCOoIlcP.js} +1 -1
- package/dist/assets/{process-output-CTVsT--B.js → process-output-BxPWHcIi.js} +1 -1
- package/dist/assets/{quadrantDiagram-AYHSOK5B-CLAtyple.js → quadrantDiagram-AYHSOK5B-RVooN-fX.js} +1 -1
- package/dist/assets/{react-vega-BZav_-2n.js → react-vega-BKRQSy0g.js} +1 -1
- package/dist/assets/react-vega-DXESF7qN.js +1 -0
- package/dist/assets/{readonly-python-code-DH-1xZGq.js → readonly-python-code-D95oshJa.js} +1 -1
- package/dist/assets/{renderShortcut-CnD1Dah5.js → renderShortcut-BYvKm38e.js} +1 -1
- package/dist/assets/{request-registry-B-7cIM_I.js → request-registry-XB2EzJHm.js} +1 -1
- package/dist/assets/{requirementDiagram-UZGBJVZJ-DDDTB1LD.js → requirementDiagram-UZGBJVZJ-DtqOYJpH.js} +1 -1
- package/dist/assets/{run-page-FCvGnICa.js → run-page-B7CASued.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-DAWPOfBw.js → sankeyDiagram-TZEHDZUN-DmcooLA8.js} +1 -1
- package/dist/assets/{scratchpad-panel-k9lrm-rC.js → scratchpad-panel-BIVRgYOU.js} +1 -1
- package/dist/assets/{secrets-panel-B1Z-6dmz.js → secrets-panel-C24hZEiO.js} +1 -1
- package/dist/assets/{select-CxT2Geqr.js → select-Cnd3vm9n.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-D_qAidD2.js → sequenceDiagram-WL72ISMW-S2qeLb7J.js} +1 -1
- package/dist/assets/{session-panel-WhN0qilM.js → session-panel-CNabBHQm.js} +1 -1
- package/dist/assets/{share-BdH_5I58.js → share-NjpZ54PJ.js} +1 -1
- package/dist/assets/{snippets-panel-BCDHUuku.js → snippets-panel-D1JAeJj1.js} +1 -1
- package/dist/assets/{spec-DbmSqx09.js → spec-DnVBmJUh.js} +1 -1
- package/dist/assets/{state-Ce7CVShi.js → state-BagvlaEz.js} +1 -1
- package/dist/assets/{state-3V5UxC3B.js → state-Cz_wrzCz.js} +1 -1
- package/dist/assets/{state-CBmCYWFH.js → state-DMQXxemS.js} +1 -1
- package/dist/assets/{stateDiagram-FKZM4ZOC-C7qgDrGA.js → stateDiagram-FKZM4ZOC-uuQ60pIl.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-D-GWhQTG.js +1 -0
- package/dist/assets/stex-CruVQx-P.js +1 -0
- package/dist/assets/{switch-CVKxYu_0.js → switch-Bwpd2AFq.js} +1 -1
- package/dist/assets/{terminal-Cr7wbEjz.js → terminal-Gl8Fi44y.js} +1 -1
- package/dist/assets/{time-D2GKc0U6.js → time-Bw8f15NM.js} +1 -1
- package/dist/assets/{timeline-definition-IT6M3QCI-hd6uJKGs.js → timeline-definition-IT6M3QCI-TKWeDnSQ.js} +1 -1
- package/dist/assets/{toggle-RCwU-rnE.js → toggle-C_gNjXg8.js} +1 -1
- package/dist/assets/{tooltip-D9723Brr.js → tooltip-CR_izE8Q.js} +1 -1
- package/dist/assets/tracing-DwAC7DWN.js +1 -0
- package/dist/assets/tracing-panel-D1iNgclL.js +2 -0
- package/dist/assets/{tree-Ch2-GuhG.js → tree-WVrWjdwv.js} +3 -3
- package/dist/assets/{useAddCell-YC7rpcmD.js → useAddCell-D6Q7JziZ.js} +1 -1
- package/dist/assets/{useBoolean-m1e6E3Ao.js → useBoolean-CrltYVhE.js} +1 -1
- package/dist/assets/{useCellActionButton-GUb2fXU8.js → useCellActionButton-B2G9OaX9.js} +1 -1
- package/dist/assets/{useDateFormatter-CpE7XQLs.js → useDateFormatter-DOoVZUts.js} +1 -1
- package/dist/assets/{useDeleteCell-DRUDRiy0.js → useDeleteCell-d8veThW7.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-nFVMlEx0.js → useDependencyPanelTab-B3iIj3MO.js} +1 -1
- package/dist/assets/{useInstallPackage-C9V-on2J.js → useInstallPackage-CQEr5429.js} +1 -1
- package/dist/assets/{useNotebookActions-ChLHy-0O.js → useNotebookActions-SAEOWcBo.js} +1 -1
- package/dist/assets/{useNumberFormatter-DbDKSvEd.js → useNumberFormatter-BXZcbTzH.js} +1 -1
- package/dist/assets/{usePress-BHGkpw8X.js → usePress-alQ5Crny.js} +1 -1
- package/dist/assets/{useRunCells-5m6jCnyo.js → useRunCells-Dhl8ZTGh.js} +1 -1
- package/dist/assets/{useSplitCell-DGD9smMq.js → useSplitCell-BSnFazbH.js} +1 -1
- package/dist/assets/{utils-CdjCA1J8.js → utils-C24l2A1T.js} +1 -1
- package/dist/assets/{vega-component-CRbeDmeM.js → vega-component-9Pf4pVZL.js} +1 -1
- package/dist/assets/{vega-loader.browser-CZV6_g2i.js → vega-loader.browser-BJ9oKrvH.js} +1 -1
- package/dist/assets/{write-secret-modal-BCvuRAFb.js → write-secret-modal-BFCsWMoW.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-CXlUBSbQ.js → xychartDiagram-PRI3JC2R-CIp-yeSa.js} +1 -1
- package/dist/index.html +125 -125
- package/package.json +1 -1
- package/src/__mocks__/notebook.ts +9 -9
- package/src/__tests__/branded.ts +20 -0
- package/src/components/app-config/user-config-form.tsx +5 -4
- package/src/components/data-table/__tests__/utils.test.ts +138 -1
- package/src/components/data-table/charts/__tests__/storage.test.ts +7 -7
- package/src/components/data-table/context-menu.tsx +9 -5
- package/src/components/data-table/data-table.tsx +3 -0
- package/src/components/data-table/range-focus/__tests__/atoms.test.ts +8 -2
- package/src/components/data-table/range-focus/__tests__/test-utils.ts +2 -0
- package/src/components/data-table/range-focus/__tests__/utils.test.ts +82 -8
- package/src/components/data-table/range-focus/atoms.ts +2 -2
- package/src/components/data-table/range-focus/utils.ts +50 -12
- package/src/components/data-table/types.ts +7 -0
- package/src/components/data-table/utils.ts +87 -0
- package/src/components/editor/__tests__/data-attributes.test.tsx +8 -8
- package/src/components/editor/ai/__tests__/completion-utils.test.ts +15 -15
- package/src/components/editor/navigation/__tests__/clipboard.test.ts +2 -2
- package/src/components/editor/navigation/__tests__/selection.test.ts +7 -6
- package/src/components/editor/navigation/__tests__/state.test.ts +8 -7
- package/src/components/editor/output/MarimoErrorOutput.tsx +7 -7
- package/src/components/editor/output/__tests__/traceback.test.tsx +4 -4
- package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +4 -4
- package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +8 -1
- package/src/components/storage/storage-file-viewer.tsx +35 -1
- package/src/components/storage/storage-inspector.tsx +9 -4
- package/src/components/storage/storage-snippets.ts +3 -3
- package/src/components/tracing/tracing.tsx +3 -1
- package/src/components/ui/range-slider.tsx +108 -1
- package/src/core/ai/__tests__/staged-cells.test.ts +9 -8
- package/src/core/ai/context/providers/__tests__/cell-output.test.ts +31 -31
- package/src/core/ai/context/providers/__tests__/datasource.test.ts +3 -3
- package/src/core/ai/context/providers/__tests__/tables.test.ts +3 -2
- package/src/core/ai/context/providers/__tests__/variable.test.ts +84 -63
- package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +10 -9
- package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +6 -6
- package/src/core/ai/tools/edit-notebook-tool.ts +3 -3
- package/src/core/cells/__tests__/add-missing-import.test.ts +3 -3
- package/src/core/cells/__tests__/cells.test.ts +192 -135
- package/src/core/cells/__tests__/focus.test.ts +5 -4
- package/src/core/cells/__tests__/logs.test.ts +13 -12
- package/src/core/cells/__tests__/pending-delete-service.test.tsx +3 -3
- package/src/core/cells/__tests__/runs.test.ts +22 -21
- package/src/core/cells/__tests__/scrollCellIntoView.test.ts +8 -7
- package/src/core/cells/__tests__/session.test.ts +23 -22
- package/src/core/cells/cells.ts +1 -1
- package/src/core/cells/ids.ts +5 -5
- package/src/core/cells/logs.ts +2 -2
- package/src/core/cells/runs.ts +6 -8
- package/src/core/codemirror/__tests__/format.test.ts +34 -36
- package/src/core/codemirror/__tests__/setup.test.ts +2 -2
- package/src/core/codemirror/cells/__tests__/extensions.test.ts +114 -0
- package/src/core/codemirror/cells/__tests__/traceback-decorations.test.ts +33 -32
- package/src/core/codemirror/cells/extensions.ts +66 -23
- package/src/core/codemirror/completion/__tests__/keymap.test.ts +15 -35
- package/src/core/codemirror/completion/keymap.ts +14 -4
- package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +12 -13
- package/src/core/codemirror/language/__tests__/utils.test.ts +3 -3
- package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +7 -8
- package/src/core/codemirror/language/languages/python.ts +4 -0
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +4 -3
- package/src/core/codemirror/lsp/notebook-lsp.ts +28 -2
- package/src/core/codemirror/reactive-references/__tests__/analyzer.test.ts +7 -6
- package/src/core/codemirror/reactive-references/analyzer.ts +2 -2
- package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +52 -0
- package/src/core/codemirror/rtc/loro/sync.ts +1 -0
- package/src/core/datasets/__tests__/data-source.test.ts +5 -6
- package/src/core/datasets/state.ts +1 -1
- package/src/core/errors/__tests__/errors.test.ts +2 -1
- package/src/core/export/__tests__/hooks.test.ts +37 -36
- package/src/core/islands/main.ts +2 -7
- package/src/core/kernel/__tests__/handlers.test.ts +5 -4
- package/src/core/kernel/handlers.ts +7 -4
- package/src/core/network/DeferredRequestRegistry.ts +2 -2
- package/src/core/network/__tests__/CachingRequestRegistry.test.ts +9 -10
- package/src/core/network/__tests__/DeferredRequestRegistry.test.ts +4 -6
- package/src/core/static/__tests__/virtual-file-tracker.test.ts +8 -8
- package/src/core/static/virtual-file-tracker.ts +1 -1
- package/src/core/storage/__tests__/state.test.ts +31 -21
- package/src/core/storage/state.ts +1 -1
- package/src/core/variables/__tests__/state.test.ts +6 -6
- package/src/core/variables/types.ts +2 -2
- package/src/core/wasm/__tests__/state.test.ts +8 -8
- package/src/core/websocket/useMarimoKernelConnection.tsx +12 -15
- package/src/css/md-tooltip.css +4 -39
- package/src/css/md.css +7 -0
- package/src/plugins/core/RenderHTML.tsx +17 -0
- package/src/plugins/core/__test__/RenderHTML.test.ts +45 -0
- package/src/plugins/core/sanitize-html.ts +25 -18
- package/src/plugins/impl/DataTablePlugin.tsx +23 -2
- package/src/plugins/impl/SliderPlugin.tsx +1 -3
- package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +120 -0
- package/src/plugins/impl/anywidget/model.ts +1 -2
- package/src/stories/cell.stories.tsx +8 -8
- package/src/stories/layout/vertical/one-column.stories.tsx +9 -8
- package/src/stories/log-viewer.stories.tsx +8 -8
- package/src/stories/variables.stories.tsx +2 -2
- package/src/utils/__tests__/download.test.tsx +21 -20
- package/src/utils/copy.ts +18 -5
- package/src/utils/download.ts +4 -3
- package/src/utils/html-to-image.ts +6 -0
- package/src/utils/json/base64.ts +3 -3
- package/src/utils/traceback.ts +5 -3
- package/dist/assets/JsonOutput-DKXKGKvX.js +0 -46
- package/dist/assets/RenderHTML-DJ8khuob.js +0 -1
- package/dist/assets/ai-model-dropdown-DPTa_EpU.js +0 -5
- package/dist/assets/cell-editor-DX7IcqNr.js +0 -23
- package/dist/assets/channel-CkT8Qdo2.js +0 -1
- package/dist/assets/classDiagram-2ON5EDUG-BhMT_rTz.js +0 -1
- package/dist/assets/classDiagram-v2-WZHVMYZB-D-F4WEyb.js +0 -1
- package/dist/assets/copy-YwM0Pd7v.js +0 -1
- package/dist/assets/dist-BTqMkf4j.js +0 -1
- package/dist/assets/dist-DHw9sXeN.js +0 -1
- package/dist/assets/dist-Du0qZeXz.js +0 -1
- package/dist/assets/dist-a0FfbvMD.js +0 -1
- package/dist/assets/dist-cfkfP0ni.js +0 -1
- package/dist/assets/dist-pzQ9JG-p.js +0 -1
- package/dist/assets/file-explorer-panel-CB8vF5ob.js +0 -26
- package/dist/assets/home-page-itW0tRmv.js +0 -4
- package/dist/assets/html-to-image-BnSc-Wa0.js +0 -2
- package/dist/assets/index-0n92c_W7.js +0 -38
- package/dist/assets/mermaid-4DMBBIKO-PoHnhmy8.js +0 -1
- package/dist/assets/react-vega-Da-Ps9UW.js +0 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-CEqeIlM0.js +0 -1
- package/dist/assets/stex-BBWVYm-R.js +0 -1
- package/dist/assets/tracing-DUVd0jtl.js +0 -1
- package/dist/assets/tracing-panel-CuTxPn_x.js +0 -2
- /package/dist/assets/{Combination-Cs9nbinQ.js → Combination-CSPK4t6z.js} +0 -0
- /package/dist/assets/{Deferred-BMfCOLaw.js → Deferred-CfyqLOPG.js} +0 -0
- /package/dist/assets/{SSRProvider-DC7ElCZZ.js → SSRProvider-CwqN9FWV.js} +0 -0
- /package/dist/assets/{badge-hTpPIsMT.js → badge-DImLVznf.js} +0 -0
- /package/dist/assets/{blob-CObhN-9g.js → blob-DgooIGjS.js} +0 -0
- /package/dist/assets/{bot-message-square-CK6eoGWy.js → bot-message-square-Dw41U6lL.js} +0 -0
- /package/dist/assets/{chart-no-axes-column-DV8gdCvH.js → chart-no-axes-column-a9XtWmzk.js} +0 -0
- /package/dist/assets/{check-BE0hEwVo.js → check-DZA_bRpw.js} +0 -0
- /package/dist/assets/{chevron-right-D0GQBpTb.js → chevron-right-CvVxySQk.js} +0 -0
- /package/dist/assets/{circle-check-gLIOLu8x.js → circle-check-CbaVeozR.js} +0 -0
- /package/dist/assets/{circle-play-DYGULlKZ.js → circle-play-DYn5nR6N.js} +0 -0
- /package/dist/assets/{circle-plus-CGG-gArM.js → circle-plus-nCze0-py.js} +0 -0
- /package/dist/assets/{clipboard-paste-DoYSN8Sv.js → clipboard-paste-EHXeKq9D.js} +0 -0
- /package/dist/assets/{code-xml-DwHPF_nL.js → code-xml-BlrJCgNZ.js} +0 -0
- /package/dist/assets/{copy-CkudG0Ej.js → copy-D6N1-xc1.js} +0 -0
- /package/dist/assets/{database-zap-DTWCDKdn.js → database-zap-BIGMFOfP.js} +0 -0
- /package/dist/assets/{defaultLocale-DK1MWd7f.js → defaultLocale-CGfP-Ye3.js} +0 -0
- /package/dist/assets/{defaultLocale-OkOxlkkM.js → defaultLocale-CuYNS33t.js} +0 -0
- /package/dist/assets/{dist-8UD0A5sU.js → dist-BF9S272t.js} +0 -0
- /package/dist/assets/{dist-apDpadc4.js → dist-Bk1itfBD.js} +0 -0
- /package/dist/assets/{dist-CQqv2gQL.js → dist-Dm11d0_A.js} +0 -0
- /package/dist/assets/{download-DBW9RXtT.js → download-nLboiTtW.js} +0 -0
- /package/dist/assets/{ellipsis-0_zJdF6H.js → ellipsis-d7eaKIFn.js} +0 -0
- /package/dist/assets/{ellipsis-vertical-CAB7tdza.js → ellipsis-vertical-DBQ5kWTo.js} +0 -0
- /package/dist/assets/{emotion-is-prop-valid.esm-D1keIaYa.js → emotion-is-prop-valid.esm-D7FeWASw.js} +0 -0
- /package/dist/assets/{errors-Bfogio62.js → errors-0IrrdfSG.js} +0 -0
- /package/dist/assets/{extends-DRbCSry7.js → extends-aq1t6BkR.js} +0 -0
- /package/dist/assets/{eye-off-vwi9L975.js → eye-off-CF3GmvXV.js} +0 -0
- /package/dist/assets/{file-DzHkbIdO.js → file-C-yMeaec.js} +0 -0
- /package/dist/assets/{file-headphone-B5q2Ow55.js → file-headphone-CPAP8asn.js} +0 -0
- /package/dist/assets/{file-plus-corner-lLQw9OnR.js → file-plus-corner-ks__N1mr.js} +0 -0
- /package/dist/assets/{github-BVtI-3F1.js → github-CRD4USKm.js} +0 -0
- /package/dist/assets/{image-DXfkah9d.js → image-CfyJzBP9.js} +0 -0
- /package/dist/assets/{link-Cf10mh3t.js → link-_dbp0XNB.js} +0 -0
- /package/dist/assets/{maps-OKerBHH8.js → maps-DQsjfyTy.js} +0 -0
- /package/dist/assets/{numbers-CYnquDho.js → numbers-Cno6K0UF.js} +0 -0
- /package/dist/assets/{objectWithoutPropertiesLoose-DP4vAkvg.js → objectWithoutPropertiesLoose-Dxmp_Bd_.js} +0 -0
- /package/dist/assets/{ordinal-BjO5SoTk.js → ordinal-CMAUv8ku.js} +0 -0
- /package/dist/assets/{paths-D2lG83Oh.js → paths-BVwhPRFT.js} +0 -0
- /package/dist/assets/{play-DKSqmedg.js → play-Bu_0ogGD.js} +0 -0
- /package/dist/assets/{plus-dVmh0yTy.js → plus-DJ99CUbx.js} +0 -0
- /package/dist/assets/{preload-helper-BW0IMuFq.js → preload-helper-y72bE5iF.js} +0 -0
- /package/dist/assets/{prop-types-RrUi-pOT.js → prop-types-DRf51_gT.js} +0 -0
- /package/dist/assets/{purify.es-BBn8CPhf.js → purify.es-Cf8RQecB.js} +0 -0
- /package/dist/assets/{range-DNqFcYmr.js → range-ClqUI25v.js} +0 -0
- /package/dist/assets/{refresh-ccw-DLpfIr8v.js → refresh-ccw-DQ6SJ8UC.js} +0 -0
- /package/dist/assets/{refresh-cw-CHAHPgkx.js → refresh-cw-Dg9tCj4k.js} +0 -0
- /package/dist/assets/{rotate-ccw-hLlF_82X.js → rotate-ccw-BCkZViUZ.js} +0 -0
- /package/dist/assets/{save-8fSvKYJT.js → save-CUdcv5qm.js} +0 -0
- /package/dist/assets/{session-BrEm7qNv.js → session-CByuQ-M-.js} +0 -0
- /package/dist/assets/{settings-CzQUw9rV.js → settings-B7nhfCat.js} +0 -0
- /package/dist/assets/{spinner-C5JoisA7.js → spinner-pCogyRyo.js} +0 -0
- /package/dist/assets/{square-CxAsQQ77.js → square-KVNDGpgy.js} +0 -0
- /package/dist/assets/{square-function-B006EYFX.js → square-function-BMNCw7Qb.js} +0 -0
- /package/dist/assets/{stex-0ac7Aukl.js → stex-C6JeW1YI.js} +0 -0
- /package/dist/assets/{table-BCnp9gKC.js → table-Od8PbuV-.js} +0 -0
- /package/dist/assets/{toDate-BqKH-Jd9.js → toDate-Cfp9W_O9.js} +0 -0
- /package/dist/assets/{trash-2-CAoNMkjq.js → trash-2-Bc_J7TQO.js} +0 -0
- /package/dist/assets/{trash-BZMAQneW.js → trash-Cxd189Vw.js} +0 -0
- /package/dist/assets/{triangle-alert-qZo1ox6x.js → triangle-alert-CzLrbLGN.js} +0 -0
- /package/dist/assets/{types-C1RN112u.js → types-CLOMZuqU.js} +0 -0
- /package/dist/assets/{use-toast-Hc8CXlvz.js → use-toast-BtZldTi5.js} +0 -0
- /package/dist/assets/{useDebounce-B0dx2Gp0.js → useDebounce-DwTO_rGp.js} +0 -0
- /package/dist/assets/{useTheme-BYXBU1of.js → useTheme-KDW4sktg.js} +0 -0
- /package/dist/assets/{uuid-ClFZlR7U.js → uuid-BukULOeS.js} +0 -0
- /package/dist/assets/{workflow-BmeqNuSH.js → workflow-BqHyyStM.js} +0 -0
- /package/dist/assets/{x-BI1M8X_v.js → x-CdLP7-v3.js} +0 -0
- /package/dist/assets/{youtube-DE-Ej6FR.js → youtube-CfU-SnDw.js} +0 -0
|
@@ -18,14 +18,116 @@ const RangeSlider = React.forwardRef<
|
|
|
18
18
|
React.ElementRef<typeof SliderPrimitive.Root>,
|
|
19
19
|
React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> & {
|
|
20
20
|
valueMap: (sliderValue: number) => number;
|
|
21
|
+
steps?: number[];
|
|
21
22
|
}
|
|
22
23
|
>(({ className, valueMap, ...props }, ref) => {
|
|
23
24
|
const [open, openActions] = useBoolean(false);
|
|
24
25
|
const { locale } = useLocale();
|
|
25
26
|
|
|
27
|
+
const isDraggingRange = React.useRef(false);
|
|
28
|
+
const dragStartX = React.useRef(0);
|
|
29
|
+
const dragStartY = React.useRef(0);
|
|
30
|
+
const dragStartValue = React.useRef<number[]>([]);
|
|
31
|
+
const currentDragValue = React.useRef<number[]>([]);
|
|
32
|
+
const rootRef =
|
|
33
|
+
React.useRef<React.ElementRef<typeof SliderPrimitive.Root>>(null);
|
|
34
|
+
const trackRef = React.useRef<HTMLSpanElement>(null);
|
|
35
|
+
const dragTrackRect = React.useRef<DOMRect | null>(null);
|
|
36
|
+
|
|
37
|
+
const mergedRef = React.useCallback(
|
|
38
|
+
(node: React.ElementRef<typeof SliderPrimitive.Root>) => {
|
|
39
|
+
rootRef.current = node;
|
|
40
|
+
if (typeof ref === "function") {
|
|
41
|
+
ref(node);
|
|
42
|
+
} else if (ref) {
|
|
43
|
+
ref.current = node;
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
[ref],
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const handleRangePointerDown = (e: React.PointerEvent<HTMLSpanElement>) => {
|
|
50
|
+
if (!props.value || props.value.length !== 2) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (props.disabled) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
e.preventDefault();
|
|
57
|
+
e.stopPropagation();
|
|
58
|
+
|
|
59
|
+
isDraggingRange.current = true;
|
|
60
|
+
dragStartX.current = e.clientX;
|
|
61
|
+
dragStartY.current = e.clientY;
|
|
62
|
+
dragStartValue.current = [...props.value];
|
|
63
|
+
currentDragValue.current = [...props.value];
|
|
64
|
+
dragTrackRect.current = trackRef.current?.getBoundingClientRect() ?? null;
|
|
65
|
+
|
|
66
|
+
(e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const handleRangePointerMove = (e: React.PointerEvent<HTMLSpanElement>) => {
|
|
70
|
+
if (!isDraggingRange.current) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
e.stopPropagation();
|
|
74
|
+
|
|
75
|
+
const trackRect = dragTrackRect.current;
|
|
76
|
+
if (!trackRect) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const isVertical = props.orientation === "vertical";
|
|
81
|
+
const min = props.min ?? 0;
|
|
82
|
+
const max = props.max ?? 100;
|
|
83
|
+
const totalRange = max - min;
|
|
84
|
+
|
|
85
|
+
let delta: number;
|
|
86
|
+
if (isVertical) {
|
|
87
|
+
const trackLength = trackRect.height;
|
|
88
|
+
delta = -((e.clientY - dragStartY.current) / trackLength) * totalRange;
|
|
89
|
+
} else {
|
|
90
|
+
const trackLength = trackRect.width;
|
|
91
|
+
delta = ((e.clientX - dragStartX.current) / trackLength) * totalRange;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const [origLeft, origRight] = dragStartValue.current;
|
|
95
|
+
const rangeWidth = origRight - origLeft;
|
|
96
|
+
|
|
97
|
+
const steps = props.steps;
|
|
98
|
+
const step: number =
|
|
99
|
+
steps && steps.length > 1
|
|
100
|
+
? Math.min(...steps.slice(1).map((s, i) => s - steps[i]))
|
|
101
|
+
: (props.step ?? 1);
|
|
102
|
+
const snappedDelta = Math.round(delta / step) * step;
|
|
103
|
+
|
|
104
|
+
const clampedDelta = Math.max(
|
|
105
|
+
min - origLeft,
|
|
106
|
+
Math.min(max - origRight, snappedDelta),
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const newLeft = origLeft + clampedDelta;
|
|
110
|
+
const newRight = newLeft + rangeWidth;
|
|
111
|
+
|
|
112
|
+
currentDragValue.current = [newLeft, newRight];
|
|
113
|
+
props.onValueChange?.([newLeft, newRight]);
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const handleRangePointerUp = (e: React.PointerEvent<HTMLSpanElement>) => {
|
|
117
|
+
if (!isDraggingRange.current) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
(e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);
|
|
121
|
+
isDraggingRange.current = false;
|
|
122
|
+
|
|
123
|
+
if (currentDragValue.current.length === 2) {
|
|
124
|
+
props.onValueCommit?.(currentDragValue.current);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
26
128
|
return (
|
|
27
129
|
<SliderPrimitive.Root
|
|
28
|
-
ref={
|
|
130
|
+
ref={mergedRef}
|
|
29
131
|
className={cn(
|
|
30
132
|
"relative flex touch-none select-none hover:cursor-pointer",
|
|
31
133
|
"data-[orientation=horizontal]:w-full data-[orientation=horizontal]:items-center",
|
|
@@ -36,6 +138,7 @@ const RangeSlider = React.forwardRef<
|
|
|
36
138
|
{...props}
|
|
37
139
|
>
|
|
38
140
|
<SliderPrimitive.Track
|
|
141
|
+
ref={trackRef}
|
|
39
142
|
data-testid="track"
|
|
40
143
|
className={cn(
|
|
41
144
|
"relative grow overflow-hidden rounded-full bg-slate-200 dark:bg-accent/60",
|
|
@@ -50,7 +153,11 @@ const RangeSlider = React.forwardRef<
|
|
|
50
153
|
"data-[orientation=horizontal]:h-full",
|
|
51
154
|
"data-[orientation=vertical]:w-full",
|
|
52
155
|
"data-disabled:opacity-50",
|
|
156
|
+
"hover:cursor-grab active:cursor-grabbing",
|
|
53
157
|
)}
|
|
158
|
+
onPointerDown={handleRangePointerDown}
|
|
159
|
+
onPointerMove={handleRangePointerMove}
|
|
160
|
+
onPointerUp={handleRangePointerUp}
|
|
54
161
|
/>
|
|
55
162
|
</SliderPrimitive.Track>
|
|
56
163
|
<TooltipProvider>
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { renderHook } from "@testing-library/react";
|
|
4
4
|
import { getDefaultStore } from "jotai";
|
|
5
5
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { cellId } from "@/__tests__/branded";
|
|
6
7
|
import { CellId } from "@/core/cells/ids";
|
|
7
8
|
import { updateEditorCodeFromPython } from "../../codemirror/language/utils";
|
|
8
9
|
import {
|
|
@@ -61,8 +62,8 @@ describe("staged-cells", () => {
|
|
|
61
62
|
|
|
62
63
|
beforeEach(() => {
|
|
63
64
|
store = getDefaultStore();
|
|
64
|
-
cellId1 = "cell-1"
|
|
65
|
-
cellId2 = "cell-2"
|
|
65
|
+
cellId1 = cellId("cell-1");
|
|
66
|
+
cellId2 = cellId("cell-2");
|
|
66
67
|
|
|
67
68
|
// Reset mocks
|
|
68
69
|
vi.clearAllMocks();
|
|
@@ -213,7 +214,7 @@ describe("staged-cells", () => {
|
|
|
213
214
|
const testCode = "print('hello world')";
|
|
214
215
|
|
|
215
216
|
// Mock CellId.create to return a predictable ID
|
|
216
|
-
const mockCellId = "mock-cell-id"
|
|
217
|
+
const mockCellId = cellId("mock-cell-id");
|
|
217
218
|
vi.mocked(CellId.create).mockReturnValue(mockCellId);
|
|
218
219
|
|
|
219
220
|
const returnedCellId = result.current.createStagedCell(testCode);
|
|
@@ -229,7 +230,7 @@ describe("staged-cells", () => {
|
|
|
229
230
|
|
|
230
231
|
it("should delete a staged cell", () => {
|
|
231
232
|
const { result } = renderHook(() => useStagedCells(store));
|
|
232
|
-
const testCellId = "test-cell-id"
|
|
233
|
+
const testCellId = cellId("test-cell-id");
|
|
233
234
|
|
|
234
235
|
result.current.deleteStagedCell(testCellId);
|
|
235
236
|
|
|
@@ -330,7 +331,7 @@ describe("staged-cells", () => {
|
|
|
330
331
|
const { result } = renderHook(() => useStagedCells(store));
|
|
331
332
|
|
|
332
333
|
// Create a staged cell
|
|
333
|
-
const mockCellId = "mock-cell-id"
|
|
334
|
+
const mockCellId = cellId("mock-cell-id");
|
|
334
335
|
vi.mocked(CellId.create).mockReturnValue(mockCellId);
|
|
335
336
|
|
|
336
337
|
const createdCellId = result.current.createStagedCell("test code");
|
|
@@ -341,7 +342,7 @@ describe("staged-cells", () => {
|
|
|
341
342
|
|
|
342
343
|
let state = store.get(stagedAICellsAtom);
|
|
343
344
|
expect(state.has(mockCellId)).toBe(true);
|
|
344
|
-
expect(state.get(mockCellId)).toEqual({ type: "add_cell" });
|
|
345
|
+
expect(state.get(mockCellId)).toEqual({ type: cellId("add_cell") });
|
|
345
346
|
|
|
346
347
|
// Delete the staged cell
|
|
347
348
|
result.current.deleteStagedCell(mockCellId);
|
|
@@ -423,7 +424,7 @@ describe("onStream", () => {
|
|
|
423
424
|
result.current.onStream({ type: "text-start", id: "test-id" });
|
|
424
425
|
|
|
425
426
|
// Mock CellId.create to return a predictable ID
|
|
426
|
-
const mockCellId = "mock-cell-id"
|
|
427
|
+
const mockCellId = cellId("mock-cell-id");
|
|
427
428
|
vi.mocked(CellId.create).mockReturnValue(mockCellId);
|
|
428
429
|
|
|
429
430
|
result.current.onStream({
|
|
@@ -444,7 +445,7 @@ describe("onStream", () => {
|
|
|
444
445
|
const { result } = renderHook(() => useStagedCells(store));
|
|
445
446
|
result.current.onStream({ type: "text-start", id: "test-id" });
|
|
446
447
|
|
|
447
|
-
const mockCellId = "mock-cell-id"
|
|
448
|
+
const mockCellId = cellId("mock-cell-id");
|
|
448
449
|
vi.mocked(CellId.create).mockReturnValue(mockCellId);
|
|
449
450
|
|
|
450
451
|
result.current.onStream({
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
4
|
import { Mocks } from "@/__mocks__/common";
|
|
5
|
+
import { cellId } from "@/__tests__/branded";
|
|
5
6
|
|
|
6
7
|
// Mock the external dependencies
|
|
7
8
|
vi.mock("html-to-image", () => ({
|
|
@@ -13,7 +14,6 @@ vi.mock("@/utils/Logger", () => ({
|
|
|
13
14
|
}));
|
|
14
15
|
|
|
15
16
|
import type { NotebookState } from "@/core/cells/cells";
|
|
16
|
-
import type { CellId } from "@/core/cells/ids";
|
|
17
17
|
import type { OutputMessage } from "@/core/kernel/messages";
|
|
18
18
|
import type { JotaiStore } from "@/core/state/jotai";
|
|
19
19
|
import { CellOutputContextProvider, getCellContextData } from "../cell-output";
|
|
@@ -35,21 +35,21 @@ describe("CellOutputContextProvider", () => {
|
|
|
35
35
|
// Create a basic mock notebook state
|
|
36
36
|
mockNotebook = {
|
|
37
37
|
cellIds: {
|
|
38
|
-
inOrderIds: ["cell1"
|
|
38
|
+
inOrderIds: ["cell1", "cell2", "cell3"],
|
|
39
39
|
},
|
|
40
40
|
cellData: {
|
|
41
41
|
cell1: {
|
|
42
|
-
id: "cell1"
|
|
42
|
+
id: "cell1",
|
|
43
43
|
name: "My Cell",
|
|
44
44
|
code: "print('hello world')",
|
|
45
45
|
},
|
|
46
46
|
cell2: {
|
|
47
|
-
id: "cell2"
|
|
47
|
+
id: "cell2",
|
|
48
48
|
name: "",
|
|
49
49
|
code: "import matplotlib.pyplot as plt\nplt.plot([1,2,3])",
|
|
50
50
|
},
|
|
51
51
|
cell3: {
|
|
52
|
-
id: "cell3"
|
|
52
|
+
id: "cell3",
|
|
53
53
|
name: "Empty Cell",
|
|
54
54
|
code: "# no output",
|
|
55
55
|
},
|
|
@@ -226,9 +226,9 @@ describe("Cell output utility functions", () => {
|
|
|
226
226
|
|
|
227
227
|
for (const testCase of testCases) {
|
|
228
228
|
mockStore = createMockStore({
|
|
229
|
-
cellIds: { inOrderIds: ["test"
|
|
229
|
+
cellIds: { inOrderIds: ["test"] },
|
|
230
230
|
cellData: {
|
|
231
|
-
test: { id: "test"
|
|
231
|
+
test: { id: "test", name: "", code: "" },
|
|
232
232
|
},
|
|
233
233
|
cellRuntime: {
|
|
234
234
|
test: {
|
|
@@ -261,9 +261,9 @@ describe("Cell output utility functions", () => {
|
|
|
261
261
|
|
|
262
262
|
for (const testCase of testCases) {
|
|
263
263
|
mockStore = createMockStore({
|
|
264
|
-
cellIds: { inOrderIds: ["test"
|
|
264
|
+
cellIds: { inOrderIds: ["test"] },
|
|
265
265
|
cellData: {
|
|
266
|
-
test: { id: "test"
|
|
266
|
+
test: { id: "test", name: "", code: "" },
|
|
267
267
|
},
|
|
268
268
|
cellRuntime: {
|
|
269
269
|
test: {
|
|
@@ -295,9 +295,9 @@ describe("Cell output utility functions", () => {
|
|
|
295
295
|
|
|
296
296
|
for (const testCase of testCases) {
|
|
297
297
|
mockStore = createMockStore({
|
|
298
|
-
cellIds: { inOrderIds: ["test"
|
|
298
|
+
cellIds: { inOrderIds: ["test"] },
|
|
299
299
|
cellData: {
|
|
300
|
-
test: { id: "test"
|
|
300
|
+
test: { id: "test", name: "", code: "" },
|
|
301
301
|
},
|
|
302
302
|
cellRuntime: {
|
|
303
303
|
test: {
|
|
@@ -369,9 +369,9 @@ describe("Cell output utility functions", () => {
|
|
|
369
369
|
).mockReturnValue(mockDiv);
|
|
370
370
|
|
|
371
371
|
mockStore = createMockStore({
|
|
372
|
-
cellIds: { inOrderIds: ["test"
|
|
372
|
+
cellIds: { inOrderIds: ["test"] },
|
|
373
373
|
cellData: {
|
|
374
|
-
test: { id: "test"
|
|
374
|
+
test: { id: "test", name: "", code: "" },
|
|
375
375
|
},
|
|
376
376
|
cellRuntime: {
|
|
377
377
|
test: {
|
|
@@ -396,16 +396,16 @@ describe("Cell output utility functions", () => {
|
|
|
396
396
|
beforeEach(() => {
|
|
397
397
|
mockNotebook = {
|
|
398
398
|
cellIds: {
|
|
399
|
-
inOrderIds: ["cell1"
|
|
399
|
+
inOrderIds: ["cell1", "cell2"],
|
|
400
400
|
},
|
|
401
401
|
cellData: {
|
|
402
402
|
cell1: {
|
|
403
|
-
id: "cell1"
|
|
403
|
+
id: "cell1",
|
|
404
404
|
name: "My Named Cell",
|
|
405
405
|
code: "x = 42",
|
|
406
406
|
},
|
|
407
407
|
cell2: {
|
|
408
|
-
id: "cell2"
|
|
408
|
+
id: "cell2",
|
|
409
409
|
name: "",
|
|
410
410
|
code: "y = x * 2",
|
|
411
411
|
},
|
|
@@ -432,7 +432,7 @@ describe("Cell output utility functions", () => {
|
|
|
432
432
|
});
|
|
433
433
|
|
|
434
434
|
it("should extract basic cell data", () => {
|
|
435
|
-
const result = getCellContextData("cell1"
|
|
435
|
+
const result = getCellContextData(cellId("cell1"), mockNotebook);
|
|
436
436
|
|
|
437
437
|
expect(result.cellId).toBe("cell1");
|
|
438
438
|
expect(result.cellName).toBe("My Named Cell");
|
|
@@ -440,13 +440,13 @@ describe("Cell output utility functions", () => {
|
|
|
440
440
|
});
|
|
441
441
|
|
|
442
442
|
it("should generate cell name for unnamed cells", () => {
|
|
443
|
-
const result = getCellContextData("cell2"
|
|
443
|
+
const result = getCellContextData(cellId("cell2"), mockNotebook);
|
|
444
444
|
|
|
445
445
|
expect(result.cellName).toBe("cell-1"); // 0-indexed, so cell2 is at index 1
|
|
446
446
|
});
|
|
447
447
|
|
|
448
448
|
it("should include cell output when present", () => {
|
|
449
|
-
const result = getCellContextData("cell1"
|
|
449
|
+
const result = getCellContextData(cellId("cell1"), mockNotebook);
|
|
450
450
|
|
|
451
451
|
expect(result.cellOutput).toBeDefined();
|
|
452
452
|
expect(result.cellOutput?.outputType).toBe("text");
|
|
@@ -454,19 +454,19 @@ describe("Cell output utility functions", () => {
|
|
|
454
454
|
});
|
|
455
455
|
|
|
456
456
|
it("should not include cell output when not present", () => {
|
|
457
|
-
const result = getCellContextData("cell2"
|
|
457
|
+
const result = getCellContextData(cellId("cell2"), mockNotebook);
|
|
458
458
|
|
|
459
459
|
expect(result.cellOutput).toBeUndefined();
|
|
460
460
|
});
|
|
461
461
|
|
|
462
462
|
it("should not include console outputs by default", () => {
|
|
463
|
-
const result = getCellContextData("cell2"
|
|
463
|
+
const result = getCellContextData(cellId("cell2"), mockNotebook);
|
|
464
464
|
|
|
465
465
|
expect(result.consoleOutputs).toBeUndefined();
|
|
466
466
|
});
|
|
467
467
|
|
|
468
468
|
it("should include console outputs when opted in", () => {
|
|
469
|
-
const result = getCellContextData("cell2"
|
|
469
|
+
const result = getCellContextData(cellId("cell2"), mockNotebook, {
|
|
470
470
|
includeConsoleOutput: true,
|
|
471
471
|
});
|
|
472
472
|
|
|
@@ -478,7 +478,7 @@ describe("Cell output utility functions", () => {
|
|
|
478
478
|
});
|
|
479
479
|
|
|
480
480
|
it("should filter out empty console outputs", () => {
|
|
481
|
-
const cell2Runtime = mockNotebook.cellRuntime["cell2"
|
|
481
|
+
const cell2Runtime = mockNotebook.cellRuntime[cellId("cell2")];
|
|
482
482
|
if (cell2Runtime) {
|
|
483
483
|
(cell2Runtime as { consoleOutputs: OutputMessage[] }).consoleOutputs = [
|
|
484
484
|
{
|
|
@@ -492,7 +492,7 @@ describe("Cell output utility functions", () => {
|
|
|
492
492
|
];
|
|
493
493
|
}
|
|
494
494
|
|
|
495
|
-
const result = getCellContextData("cell2"
|
|
495
|
+
const result = getCellContextData(cellId("cell2"), mockNotebook, {
|
|
496
496
|
includeConsoleOutput: true,
|
|
497
497
|
});
|
|
498
498
|
|
|
@@ -501,7 +501,7 @@ describe("Cell output utility functions", () => {
|
|
|
501
501
|
});
|
|
502
502
|
|
|
503
503
|
it("should handle cells with both cell output and console outputs", () => {
|
|
504
|
-
const cell1Runtime = mockNotebook.cellRuntime["cell1"
|
|
504
|
+
const cell1Runtime = mockNotebook.cellRuntime[cellId("cell1")];
|
|
505
505
|
if (cell1Runtime) {
|
|
506
506
|
(cell1Runtime as { consoleOutputs: OutputMessage[] }).consoleOutputs = [
|
|
507
507
|
{
|
|
@@ -511,7 +511,7 @@ describe("Cell output utility functions", () => {
|
|
|
511
511
|
];
|
|
512
512
|
}
|
|
513
513
|
|
|
514
|
-
const result = getCellContextData("cell1"
|
|
514
|
+
const result = getCellContextData(cellId("cell1"), mockNotebook, {
|
|
515
515
|
includeConsoleOutput: true,
|
|
516
516
|
});
|
|
517
517
|
|
|
@@ -524,7 +524,7 @@ describe("Cell output utility functions", () => {
|
|
|
524
524
|
});
|
|
525
525
|
|
|
526
526
|
it("should handle empty console outputs array", () => {
|
|
527
|
-
const result = getCellContextData("cell1"
|
|
527
|
+
const result = getCellContextData(cellId("cell1"), mockNotebook, {
|
|
528
528
|
includeConsoleOutput: true,
|
|
529
529
|
});
|
|
530
530
|
|
|
@@ -532,7 +532,7 @@ describe("Cell output utility functions", () => {
|
|
|
532
532
|
});
|
|
533
533
|
|
|
534
534
|
it("should handle media outputs in cell output", () => {
|
|
535
|
-
const cell1Runtime = mockNotebook.cellRuntime["cell1"
|
|
535
|
+
const cell1Runtime = mockNotebook.cellRuntime[cellId("cell1")];
|
|
536
536
|
if (cell1Runtime) {
|
|
537
537
|
(cell1Runtime as { output: OutputMessage | null }).output = {
|
|
538
538
|
mimetype: "image/png",
|
|
@@ -540,7 +540,7 @@ describe("Cell output utility functions", () => {
|
|
|
540
540
|
} as OutputMessage;
|
|
541
541
|
}
|
|
542
542
|
|
|
543
|
-
const result = getCellContextData("cell1"
|
|
543
|
+
const result = getCellContextData(cellId("cell1"), mockNotebook);
|
|
544
544
|
|
|
545
545
|
expect(result.cellOutput).toBeDefined();
|
|
546
546
|
expect(result.cellOutput?.outputType).toBe("media");
|
|
@@ -548,7 +548,7 @@ describe("Cell output utility functions", () => {
|
|
|
548
548
|
});
|
|
549
549
|
|
|
550
550
|
it("should handle media outputs in console outputs", () => {
|
|
551
|
-
const cell2Runtime = mockNotebook.cellRuntime["cell2"
|
|
551
|
+
const cell2Runtime = mockNotebook.cellRuntime[cellId("cell2")];
|
|
552
552
|
if (cell2Runtime) {
|
|
553
553
|
(cell2Runtime as { consoleOutputs: OutputMessage[] }).consoleOutputs = [
|
|
554
554
|
{
|
|
@@ -558,7 +558,7 @@ describe("Cell output utility functions", () => {
|
|
|
558
558
|
];
|
|
559
559
|
}
|
|
560
560
|
|
|
561
|
-
const result = getCellContextData("cell2"
|
|
561
|
+
const result = getCellContextData(cellId("cell2"), mockNotebook, {
|
|
562
562
|
includeConsoleOutput: true,
|
|
563
563
|
});
|
|
564
564
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
3
|
|
|
4
4
|
import { beforeEach, describe, expect, it } from "vitest";
|
|
5
|
-
import
|
|
5
|
+
import { cellId, variableName } from "@/__tests__/branded";
|
|
6
6
|
import type {
|
|
7
7
|
ConnectionsMap,
|
|
8
8
|
DatasetTablesMap,
|
|
@@ -88,7 +88,7 @@ const createMockDataTable = (
|
|
|
88
88
|
source_type: "local",
|
|
89
89
|
num_rows: 100,
|
|
90
90
|
num_columns: 3,
|
|
91
|
-
variable_name: name, // This makes it a dataframe
|
|
91
|
+
variable_name: variableName(name), // This makes it a dataframe
|
|
92
92
|
columns: [
|
|
93
93
|
{
|
|
94
94
|
name: "id",
|
|
@@ -634,7 +634,7 @@ describe("DatasourceContextProvider", () => {
|
|
|
634
634
|
|
|
635
635
|
describe("getDatasourceContext", () => {
|
|
636
636
|
it("should return null if no cell ID is found", () => {
|
|
637
|
-
const context = getDatasourceContext("1"
|
|
637
|
+
const context = getDatasourceContext(cellId("1"));
|
|
638
638
|
expect(context).toBeNull();
|
|
639
639
|
});
|
|
640
640
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { variableName } from "@/__tests__/branded";
|
|
4
5
|
import type { DatasetTablesMap } from "@/core/datasets/data-source-connections";
|
|
5
6
|
import type { DataTable, DataTableColumn } from "@/core/kernel/messages";
|
|
6
7
|
import { type TableContextItem, TableContextProvider } from "../tables";
|
|
@@ -86,7 +87,7 @@ describe("TableContextProvider", () => {
|
|
|
86
87
|
|
|
87
88
|
it("should handle dataframe tables with variable names", () => {
|
|
88
89
|
const dfTable = createMockTable("df_analysis", {
|
|
89
|
-
variable_name: "df_analysis",
|
|
90
|
+
variable_name: variableName("df_analysis"),
|
|
90
91
|
source: "pandas",
|
|
91
92
|
source_type: "local",
|
|
92
93
|
columns: [
|
|
@@ -180,7 +181,7 @@ describe("TableContextProvider", () => {
|
|
|
180
181
|
const table = createMockTable("remote_table", {
|
|
181
182
|
source: "postgresql://localhost:5432/mydb",
|
|
182
183
|
source_type: "connection",
|
|
183
|
-
engine: "postgresql",
|
|
184
|
+
engine: variableName("postgresql"),
|
|
184
185
|
columns: [
|
|
185
186
|
createMockColumn("uuid", "string", "uuid"),
|
|
186
187
|
createMockColumn("created_at", "string", "timestamp with time zone"),
|