@marimo-team/islands 0.22.1-dev4 → 0.22.1-dev40
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/{ConnectedDataExplorerComponent-Dl1grr8z.js → ConnectedDataExplorerComponent-DuD8BVl6.js} +54 -54
- package/dist/{Plot-WhbJAbBh.js → Plot-BxlSHo0G.js} +47 -38
- package/dist/_basePickBy-Sow3pJjS.js +41 -0
- package/dist/{_baseUniq-B4eL5sTC.js → _baseUniq-C87CckHL.js} +15 -54
- package/dist/{any-language-editor-CT_9yBde.js → any-language-editor-BHH_pQ6M.js} +21 -21
- package/dist/architecture-7HQA4BMR-BHdkAMvZ.js +6 -0
- package/dist/{architectureDiagram-VXUJARFQ-vxgYGIMP.js → architectureDiagram-VXUJARFQ-B3YQo9At.js} +15 -15
- package/dist/{arrays-Du-jRBAy.js → arrays-beUWo8RF.js} +1 -1
- package/dist/assets/__vite-browser-external-WSlCcXn_.js +1 -0
- package/dist/assets/{worker-D10K3OOz.js → worker-DUYMdbtA.js} +2 -2
- package/dist/{blockDiagram-VD42YOAC-C7x6YTH7.js → blockDiagram-VD42YOAC-CpQ3TKEN.js} +7 -7
- package/dist/{button-qsiIHncQ.js → button-DNlNlZY_.js} +82 -84
- package/dist/{c4Diagram-YG6GDRKO-Cx4oseGg.js → c4Diagram-YG6GDRKO-CZSU4uqU.js} +4 -4
- package/dist/{capabilities-26mwv03y.js → capabilities-Coe9eM9T.js} +2 -2
- package/dist/{channel-C_50jIAn.js → channel-X3JKk8gE.js} +1 -1
- package/dist/{chat-ui-CtqUthFR.js → chat-ui-Cel1kBfc.js} +147 -146
- package/dist/{check-D_YwHEgY.js → check-CWUkiHmb.js} +1 -1
- package/dist/{chunk-4F5CHEZ2-Dvo_CFnR.js → chunk-4F5CHEZ2-D5mClyDv.js} +1 -1
- package/dist/{chunk-ABZYJK2D-D5YIs71w.js → chunk-ABZYJK2D-CZYCCtLy.js} +1 -1
- package/dist/{chunk-ATLVNIR6-CyOjzOcf.js → chunk-ATLVNIR6-DaOzLLgN.js} +1 -1
- package/dist/{chunk-B2363JML-BzZqINRO.js → chunk-B2363JML-Br0eA2T3.js} +1 -1
- package/dist/{chunk-B4BG7PRW-ZJeV3KdD.js → chunk-B4BG7PRW-4BjV11Br.js} +4 -4
- package/dist/{chunk-DI55MBZ5-Dx_wwX6l.js → chunk-DI55MBZ5-DITY3EyP.js} +4 -4
- package/dist/{chunk-EXTU4WIE-CgefpSXQ.js → chunk-EXTU4WIE-jUPSAk3i.js} +1 -1
- package/dist/{chunk-FRFDVMJY-Derq8UzY.js → chunk-FRFDVMJY-DnEvEFRR.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-CcIOIFpc.js → chunk-JA3XYJ7Z-BcPEfxk_.js} +2 -2
- package/dist/{chunk-JZLCHNYA-CgO0GG1p.js → chunk-JZLCHNYA-2bnLL3xL.js} +4 -4
- package/dist/{chunk-N4CR4FBY-2qzGzAxT.js → chunk-N4CR4FBY-CpZSuGSU.js} +5 -5
- package/dist/{chunk-PL6DKKU2-KoG71Zin.js → chunk-PL6DKKU2-DnId6G-x.js} +1 -1
- package/dist/{chunk-QN33PNHL-Dp1qBo28.js → chunk-QN33PNHL-B9p5ojHB.js} +1 -1
- package/dist/{chunk-QXUST7PY-BxmmeIwf.js → chunk-QXUST7PY-Ch6F5Obl.js} +5 -5
- package/dist/{chunk-S3R3BYOJ-D3Rys9ZW.js → chunk-S3R3BYOJ-B0UOFJwq.js} +3 -3
- package/dist/{chunk-SJTYNZTY-Co-DhKAG.js → chunk-SJTYNZTY-BsBZnJUj.js} +1 -1
- package/dist/{chunk-TCCFYFTB-BAhzIqBO.js → chunk-TCCFYFTB-Clbl-fTg.js} +8 -7
- package/dist/{chunk-TQ3KTPDO-DxYI735Z.js → chunk-TQ3KTPDO-CFkSQ30e.js} +1 -1
- package/dist/{chunk-TZMSLE5B-Dxumt0wv.js → chunk-TZMSLE5B-D45397J2.js} +1 -1
- package/dist/{chunk-UMXZTB3W-CuahpKin.js → chunk-UMXZTB3W-D-A834Bq.js} +1 -1
- package/dist/{classDiagram-v2-WZHVMYZB-CYoFMQKE.js → classDiagram-2ON5EDUG-C8-zE3Zv.js} +10 -10
- package/dist/{classDiagram-2ON5EDUG-DkOvXRlx.js → classDiagram-v2-WZHVMYZB-DrmbGANl.js} +10 -10
- package/dist/{clone-DDndUqI0.js → clone-DZFQCtFJ.js} +1 -1
- package/dist/{constants-D1Am36hX.js → constants-CvyfaCvs.js} +3 -3
- package/dist/{copy-CBo9JcJW.js → copy-B7781WJ3.js} +2 -2
- package/dist/{dagre-6UL2VRFP-BXBaU8PB.js → dagre-6UL2VRFP-OMItEBnY.js} +12 -12
- package/dist/{dagre-D3dlYz-r.js → dagre-QVd-lCXU.js} +13 -23
- package/dist/{data-grid-overlay-editor-nZux6_d2.js → data-grid-overlay-editor-lKF301ME.js} +1 -1
- package/dist/{diagram-PSM6KHXK-CJxjk4LG.js → diagram-PSM6KHXK-CkKbohWI.js} +16 -16
- package/dist/{diagram-QEK2KX5R-IMILPh_p.js → diagram-QEK2KX5R-DjUMpVcx.js} +14 -14
- package/dist/{diagram-S2PKOQOG-6O0g6Boj.js → diagram-S2PKOQOG-b-c0d-wZ.js} +14 -14
- package/dist/{dist-BkXs8bw0.js → dist--6TSlp8H.js} +1 -1
- package/dist/dist-7K5doRvB.js +6 -0
- package/dist/{dist-CQidOwep.js → dist-B43sbpd0.js} +3 -3
- package/dist/dist-B6I_A2-E.js +8 -0
- package/dist/dist-BEQsmaZY.js +5 -0
- package/dist/dist-BasY2RHp.js +8 -0
- package/dist/{dist-BemtTYzN.js → dist-Bfp1XXWt.js} +5 -5
- package/dist/{dist-v-1kgqZ3.js → dist-BjDuO5JW.js} +1 -1
- package/dist/dist-Bosc00dY.js +5 -0
- package/dist/{dist-DLNKBPsk.js → dist-BrxqmS9Q.js} +4 -4
- package/dist/{dist-DBYL08Lu.js → dist-BvhGByxL.js} +4 -4
- package/dist/{dist-CVqlhD3M.js → dist-C4bq5Ioy.js} +2 -2
- package/dist/{dist-DwmxBUOe.js → dist-CFKdzOIu.js} +2 -2
- package/dist/{dist-5nTQE2yt.js → dist-CIB8w0Fl.js} +2 -2
- package/dist/{dist-C-EcLtO9.js → dist-CNF0QBLR.js} +1 -1
- package/dist/dist-CQMZOn-_.js +8 -0
- package/dist/dist-CViQhWZ8.js +5 -0
- package/dist/{dist-Dg65j0em.js → dist-CcMfr7jD.js} +1 -1
- package/dist/{dist-C0XYIHKJ.js → dist-Ci0CXEFt.js} +1 -1
- package/dist/dist-Cz6rLfwY.js +5 -0
- package/dist/dist-D8eq8st3.js +6 -0
- package/dist/{dist-qoCY8giM.js → dist-DAfcmt-d.js} +2 -2
- package/dist/{dist-B6Op2ogv.js → dist-DD_cYHOl.js} +2 -2
- package/dist/{dist-BUSLKXcu.js → dist-DFK94vuS.js} +2 -2
- package/dist/{dist-DBXPlQ0D.js → dist-DGNtjMZu.js} +1 -1
- package/dist/{dist-C9qF7MRB.js → dist-DJ9F1eHs.js} +2 -2
- package/dist/{dist-Ci_jEudG.js → dist-DJKubHDd.js} +1 -1
- package/dist/{dist-CnFp2Kcl.js → dist-DLafRu9s.js} +2 -2
- package/dist/dist-DM1UDXdl.js +5 -0
- package/dist/dist-DNrtWPgS.js +5 -0
- package/dist/dist-D_UjpfOY.js +1381 -0
- package/dist/{dist-DmFS6KZW.js → dist-DbnBiLNH.js} +3 -3
- package/dist/{dist-BiZZAo22.js → dist-DlSUOIm9.js} +1 -1
- package/dist/{dist-DStU8He1.js → dist-Doy0mQDg.js} +2 -2
- package/dist/{dist-CxAX99oC.js → dist-DpkJHKB8.js} +2 -2
- package/dist/{dist-DjaZNkZ7.js → dist-LhQNUe5A.js} +3 -3
- package/dist/dist-V7q2qnpA.js +5 -0
- package/dist/{dist-BJ3fhRYu.js → dist-VqF3W_ue.js} +2 -2
- package/dist/dist-a5_hPgu2.js +8 -0
- package/dist/{dist-B9KLrfoh.js → dist-ej6AQKaS.js} +1 -1
- package/dist/{dist-Brb6VNc4.js → dist-m9tsXsFf.js} +2 -2
- package/dist/{dist-CBwMSFDu.js → dist-tGk0aZ--.js} +2 -2
- package/dist/dist-uVyZcV1-.js +5 -0
- package/dist/{erDiagram-Q2GNP2WA-sho7Cl9f.js → erDiagram-Q2GNP2WA-CDhLaOZ1.js} +10 -10
- package/dist/{error-banner-Bx9kIgrs.js → error-banner-Cjf0RU9I.js} +79 -79
- package/dist/{esm-CMg2ABu6.js → esm-4wmsH2lp.js} +6 -6
- package/dist/{esm-cqK9POGH.js → esm-CD1iby2n.js} +23 -23
- package/dist/{flowDiagram-NV44I4VS-C4nY4Fbz.js → flowDiagram-NV44I4VS-BDi4O4CL.js} +10 -10
- package/dist/{ganttDiagram-JELNMOA3-CtxNcCM2.js → ganttDiagram-JELNMOA3-BpZE6kVp.js} +3 -3
- package/dist/{gitGraph-G5XIXVHT-SL6TDof6.js → gitGraph-G5XIXVHT-B_c6xFJv.js} +3 -3
- package/dist/{gitGraphDiagram-V2S2FVAM-D9885mxd.js → gitGraphDiagram-V2S2FVAM-iQnXzbPM.js} +13 -13
- package/dist/{glide-data-editor-CkVEV-Gk.js → glide-data-editor-BqnvTmDo.js} +1739 -1708
- package/dist/{graphlib-CxWdvYQt.js → graphlib-BV1_gi0C.js} +4 -3
- package/dist/hasIn-DnfJcYpY.js +108 -0
- package/dist/{info-VBDWY6EO-6MXPTSmi.js → info-VBDWY6EO-BTyzxmhr.js} +3 -3
- package/dist/{infoDiagram-HS3SLOUP-Bw2FlRwF.js → infoDiagram-HS3SLOUP-OYrX6uO3.js} +13 -13
- package/dist/{input-BSde8uV4.js → input-CFY9gApZ.js} +5055 -5055
- package/dist/{isEmpty-BQtUinxJ.js → isEmpty-B7FX9wKt.js} +1 -1
- package/dist/{isSymbol-DFp8040B.js → isSymbol-DCbjQG_U.js} +1 -1
- package/dist/{journeyDiagram-XKPGCS4Q-BXlCEth8.js → journeyDiagram-XKPGCS4Q-ClPC94aN.js} +3 -3
- package/dist/{kanban-definition-3W4ZIXB7-CorxzSYm.js → kanban-definition-3W4ZIXB7-DHEAKdZt.js} +7 -7
- package/dist/{label-DTNqw9tv.js → label-DbZGAoCH.js} +538 -569
- package/dist/{loader-3c9hT4kT.js → loader-Bd1kgLn7.js} +19 -16
- package/dist/main.js +3203 -3105
- package/dist/{memoize-CuHciEBb.js → memoize-CSTI9eOX.js} +1 -1
- package/dist/{merge-CA_buyY3.js → merge-CVhG7q_o.js} +1 -1
- package/dist/{mermaid-CEKslOkI.js → mermaid-B2HDLx2g.js} +54 -54
- package/dist/{mermaid-parser.core-cq4YDee-.js → mermaid-parser.core-ntCgyx0x.js} +8 -8
- package/dist/min-Ds3gG0Ff.js +96 -0
- package/dist/{mindmap-definition-VGOIOE7T-DRsT8UaN.js → mindmap-definition-VGOIOE7T-CxEUZZvY.js} +9 -9
- package/dist/{now-CXAdKY5k.js → now-nrrrOr01.js} +1 -1
- package/dist/{once-CZno0h-b.js → once-C_TIu-kR.js} +1 -1
- package/dist/{packet-DYOGHKS2-Dw08gMaZ.js → packet-DYOGHKS2-BhvnpoGi.js} +3 -3
- package/dist/{pie-VRWISCQL-C5SPSvT8.js → pie-VRWISCQL-dILuA3iG.js} +3 -3
- package/dist/{pieDiagram-ADFJNKIX-DhJ1Cx2O.js → pieDiagram-ADFJNKIX-U3LrUqAS.js} +14 -14
- package/dist/{process-output-KyzWazB-.js → process-output-DC1TOnIl.js} +3184 -3207
- package/dist/{quadrantDiagram-AYHSOK5B-DXUFIWlz.js → quadrantDiagram-AYHSOK5B-BVWuq-3R.js} +2 -2
- package/dist/{radar-ZZBFDIW7-BvY0bgSg.js → radar-ZZBFDIW7-DwFrOJDj.js} +3 -3
- package/dist/range-fJeId9Ri.js +30 -0
- package/dist/{requirementDiagram-UZGBJVZJ-DO_gtQIb.js → requirementDiagram-UZGBJVZJ-D0zpQnKC.js} +9 -9
- package/dist/{sankeyDiagram-TZEHDZUN-OZzXEkuG.js → sankeyDiagram-TZEHDZUN-CExy1joT.js} +2 -2
- package/dist/{sequenceDiagram-WL72ISMW-K7nZRifV.js → sequenceDiagram-WL72ISMW-D1BJxLjH.js} +4 -4
- package/dist/{slides-component-CIcSvFh7.js → slides-component-CX2JC-Ws.js} +2 -2
- package/dist/{spec-DYaR1rJh.js → spec-CD7QaCV-.js} +3 -3
- package/dist/{stateDiagram-FKZM4ZOC-DzXJZAq7.js → stateDiagram-FKZM4ZOC-B1S8jGMn.js} +12 -12
- package/dist/{stateDiagram-v2-4FDKWEC3-BZBPUmyF.js → stateDiagram-v2-4FDKWEC3-BH5ozUbc.js} +10 -10
- package/dist/stex-CQDv3aS8.js +4 -0
- package/dist/style.css +1 -1
- package/dist/{timeline-definition-IT6M3QCI-DNoLAh-i.js → timeline-definition-IT6M3QCI-BDT9JAmn.js} +2 -2
- package/dist/{toDate-D6VXexnV.js → toDate-CUqpEbBS.js} +5 -5
- package/dist/{toNumber-xFPoy1OI.js → toNumber-55tjPCWr.js} +2 -2
- package/dist/tooltip-BXEpXV3R.js +404 -0
- package/dist/{treemap-GDKQZRPO-C5OoxpmV.js → treemap-GDKQZRPO-bx2ngsgN.js} +3 -3
- package/dist/{types-CQ-RbYxp.js → types-D_ntCXg0.js} +3 -3
- package/dist/{useAsyncData-Cd4Urlww.js → useAsyncData-rN1nzPaS.js} +2 -2
- package/dist/{useDeepCompareMemoize-X7clcrcQ.js → useDeepCompareMemoize-Ch-7Rk2x.js} +4 -4
- package/dist/{useIframeCapabilities-BVQrlRBd.js → useIframeCapabilities-CqhrVue6.js} +1 -1
- package/dist/useLifecycle-4fA1pHoh.js +177 -0
- package/dist/{useTheme-Dm1WaAGy.js → useTheme-MWfxn4oz.js} +4 -5
- package/dist/{vega-component-A6unyUJS.js → vega-component-CPhNLfZZ.js} +25 -25
- package/dist/{xychartDiagram-PRI3JC2R-ehVeySMW.js → xychartDiagram-PRI3JC2R-CuAZiqHS.js} +5 -5
- package/dist/{Combination-B--d1_LV.js → zod-C6UGQ3fz.js} +8085 -8151
- package/package.json +8 -41
- package/src/__mocks__/common.ts +4 -4
- package/src/__tests__/main.test.tsx +12 -14
- package/src/components/ai/ai-provider-icon.tsx +3 -2
- package/src/components/app-config/user-config-form.tsx +0 -27
- package/src/components/chat/acp/agent-docs.tsx +3 -3
- package/src/components/chat/acp/agent-panel.tsx +71 -24
- package/src/components/chat/acp/agent-selector.tsx +2 -11
- package/src/components/chat/acp/state.ts +15 -3
- package/src/components/chat/chat-history-popover.tsx +1 -1
- package/src/components/chat/chat-panel.tsx +2 -1
- package/src/components/data-table/TableBottomBar.tsx +12 -1
- package/src/components/data-table/TableTopBar.tsx +31 -35
- package/src/components/data-table/__tests__/columns.test.tsx +7 -7
- package/src/components/data-table/cell-hover-template/types.ts +1 -1
- package/src/components/data-table/cell-hover-text/types.ts +1 -1
- package/src/components/data-table/cell-selection/__tests__/feature.test.ts +1 -1
- package/src/components/data-table/cell-selection/types.ts +4 -3
- package/src/components/data-table/cell-styling/types.ts +1 -1
- package/src/components/data-table/charts/chart-spec/altair-generator.ts +2 -2
- package/src/components/data-table/charts/charts.tsx +42 -13
- package/src/components/data-table/charts/components/chart-items.tsx +1 -1
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
- package/src/components/data-table/column-formatting/types.ts +5 -4
- package/src/components/data-table/column-header.tsx +4 -2
- package/src/components/data-table/column-summary/legacy-chart-spec.ts +1 -1
- package/src/components/data-table/column-wrapping/types.ts +4 -3
- package/src/components/data-table/columns.tsx +4 -1
- package/src/components/data-table/copy-column/types.ts +4 -3
- package/src/components/data-table/data-table.tsx +16 -11
- package/src/components/data-table/focus-row/types.ts +4 -3
- package/src/components/data-table/loading-table.tsx +5 -2
- package/src/components/data-table/pagination.tsx +1 -1
- package/src/components/data-table/range-focus/__tests__/atoms.test.ts +13 -13
- package/src/components/data-table/range-focus/__tests__/use-cell-range-selection.test.ts +9 -11
- package/src/components/data-table/range-focus/atoms.ts +2 -2
- package/src/components/data-table/range-focus/cell-selection-stats.tsx +3 -1
- package/src/components/data-table/row-viewer-panel/row-viewer.tsx +1 -1
- package/src/components/data-table/table-explorer-panel/table-explorer-panel.tsx +2 -2
- package/src/components/dependency-graph/dependency-graph-tree.tsx +1 -1
- package/src/components/editor/__tests__/data-attributes.test.tsx +93 -94
- package/src/components/editor/__tests__/dynamic-favicon.test.tsx +1 -1
- package/src/components/editor/actions/name-cell-input.tsx +4 -2
- package/src/components/editor/actions/pair-with-agent-modal.tsx +142 -0
- package/src/components/editor/actions/useCellActionButton.tsx +4 -2
- package/src/components/editor/actions/useNotebookActions.tsx +10 -0
- package/src/components/editor/ai/add-cell-with-ai.tsx +2 -1
- package/src/components/editor/ai/ai-completion-editor.tsx +1 -1
- package/src/components/editor/app-container.tsx +1 -1
- package/src/components/editor/cell/CellStatus.tsx +4 -5
- package/src/components/editor/cell/cell-context-menu.tsx +4 -2
- package/src/components/editor/cell/code/cell-editor.tsx +3 -2
- package/src/components/editor/cell/toolbar.tsx +2 -1
- package/src/components/editor/chrome/components/contribute-snippet-button.tsx +4 -1
- package/src/components/editor/chrome/components/feedback-button.tsx +4 -1
- package/src/components/editor/chrome/panels/context-aware-panel/context-aware-panel.tsx +1 -1
- package/src/components/editor/chrome/panels/empty-state.tsx +1 -0
- package/src/components/editor/chrome/panels/file-explorer-panel.tsx +0 -10
- package/src/components/editor/chrome/panels/snippets-panel.tsx +1 -1
- package/src/components/editor/chrome/panels/write-secret-modal.tsx +1 -1
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +4 -1
- package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +2 -1
- package/src/components/editor/chrome/wrapper/storage.ts +2 -2
- package/src/components/editor/connections/database/as-code.ts +1 -1
- package/src/components/editor/connections/form-renderers.tsx +1 -1
- package/src/components/editor/connections/storage/as-code.ts +1 -1
- package/src/components/editor/controls/keyboard-shortcuts.tsx +1 -1
- package/src/components/editor/header/filename-input.tsx +4 -1
- package/src/components/editor/links/cell-link-list.tsx +1 -1
- package/src/components/editor/navigation/__tests__/navigation.test.ts +1 -1
- package/src/components/editor/navigation/clipboard.ts +1 -1
- package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +2 -2
- package/src/components/editor/navigation/navigation.ts +3 -3
- package/src/components/editor/notebook-cell.tsx +1 -1
- package/src/components/editor/output/JsonOutput.tsx +6 -6
- package/src/components/editor/output/ansi-reduce.ts +2 -2
- package/src/components/editor/output/console/ConsoleOutput.tsx +2 -2
- package/src/components/editor/renderers/cells-renderer.tsx +1 -1
- package/src/components/editor/renderers/grid-layout/grid-layout.tsx +1 -1
- package/src/components/editor/renderers/plugins.ts +1 -1
- package/src/components/editor/renderers/slides-layout/types.ts +2 -2
- package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +2 -2
- package/src/components/editor/renderers/vertical-layout/__tests__/vertical-layout.test.ts +1 -1
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +12 -13
- package/src/components/find-replace/find-replace.tsx +3 -1
- package/src/components/forms/form.tsx +1 -1
- package/src/components/forms/options.ts +1 -1
- package/src/components/pages/gallery-page.tsx +1 -1
- package/src/components/static-html/static-banner.tsx +2 -2
- package/src/components/storage/__tests__/storage-snippets.test.ts +4 -6
- package/src/components/terminal/terminal.tsx +4 -4
- package/src/components/tracing/tracing.test.tsx +30 -30
- package/src/components/ui/accordion.tsx +1 -1
- package/src/components/ui/alert-dialog.tsx +1 -1
- package/src/components/ui/badge.tsx +2 -1
- package/src/components/ui/button.tsx +5 -4
- package/src/components/ui/calendar.tsx +3 -2
- package/src/components/ui/checkbox.tsx +1 -1
- package/src/components/ui/combobox.tsx +2 -1
- package/src/components/ui/command.tsx +5 -2
- package/src/components/ui/context-menu.tsx +1 -1
- package/src/components/ui/date-input.tsx +7 -6
- package/src/components/ui/date-picker.tsx +6 -4
- package/src/components/ui/dialog.tsx +1 -1
- package/src/components/ui/draggable-popover.tsx +1 -1
- package/src/components/ui/dropdown-menu.tsx +2 -1
- package/src/components/ui/field.tsx +1 -2
- package/src/components/ui/form.tsx +4 -5
- package/src/components/ui/fullscreen.tsx +4 -1
- package/src/components/ui/label.tsx +1 -1
- package/src/components/ui/navigation.tsx +1 -1
- package/src/components/ui/popover.tsx +1 -1
- package/src/components/ui/progress.tsx +4 -3
- package/src/components/ui/query-param-preserving-link.tsx +4 -2
- package/src/components/ui/radio-group.tsx +1 -1
- package/src/components/ui/range-slider.tsx +1 -1
- package/src/components/ui/scroll-area.tsx +1 -1
- package/src/components/ui/select.tsx +1 -1
- package/src/components/ui/sheet.tsx +3 -2
- package/src/components/ui/slider.tsx +1 -1
- package/src/components/ui/switch.tsx +1 -1
- package/src/components/ui/tabs.tsx +1 -1
- package/src/components/ui/textarea.tsx +1 -2
- package/src/components/ui/toast.tsx +1 -1
- package/src/components/ui/toggle.tsx +1 -1
- package/src/components/ui/tooltip.tsx +1 -1
- package/src/components/variables/variables-table.tsx +1 -1
- package/src/core/ai/context/providers/__tests__/datasource.test.ts +1 -1
- package/src/core/ai/context/providers/__tests__/error.test.ts +1 -1
- package/src/core/ai/context/providers/__tests__/variable.test.ts +1 -1
- package/src/core/ai/context/providers/cell-output.ts +1 -2
- package/src/core/ai/context/registry.ts +2 -2
- package/src/core/ai/tools/edit-notebook-tool.ts +4 -3
- package/src/core/ai/tools/registry.ts +1 -1
- package/src/core/ai/tools/run-cells-tool.ts +4 -3
- package/src/core/cells/__tests__/add-missing-import.test.ts +23 -22
- package/src/core/cells/__tests__/cell.test.ts +14 -13
- package/src/core/cells/__tests__/cells.test.ts +2 -2
- package/src/core/cells/__tests__/scrollCellIntoView.test.ts +1 -1
- package/src/core/cells/__tests__/session.test.ts +1 -1
- package/src/core/cells/__tests__/utils.test.ts +1 -1
- package/src/core/cells/cells.ts +2 -2
- package/src/core/cells/ids.ts +1 -1
- package/src/core/cells/logs.ts +1 -1
- package/src/core/codemirror/ai/request.ts +1 -1
- package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -17
- package/src/core/codemirror/cells/traceback-decorations.ts +1 -1
- package/src/core/codemirror/copilot/__tests__/language-server.test.ts +1 -1
- package/src/core/codemirror/copilot/__tests__/transport.test.ts +129 -3
- package/src/core/codemirror/copilot/client.ts +9 -2
- package/src/core/codemirror/copilot/getCodes.ts +1 -1
- package/src/core/codemirror/copilot/language-server.ts +12 -1
- package/src/core/codemirror/copilot/transport.ts +34 -8
- package/src/core/codemirror/copilot/types.ts +1 -1
- package/src/core/codemirror/facet.ts +1 -1
- package/src/core/codemirror/language/__tests__/sql.test.ts +4 -4
- package/src/core/codemirror/language/languages/markdown.ts +1 -3
- package/src/core/codemirror/language/languages/python.ts +4 -0
- package/src/core/codemirror/language/languages/sql/completion-builder.ts +1 -1
- package/src/core/codemirror/language/languages/sql/completion-sources.tsx +4 -6
- package/src/core/codemirror/language/languages/sql/sql.ts +1 -3
- package/src/core/codemirror/language/metadata.ts +1 -1
- package/src/core/codemirror/language/panel/sql.tsx +4 -1
- package/src/core/codemirror/language/types.ts +1 -1
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -1
- package/src/core/codemirror/lsp/notebook-lsp.ts +1 -1
- package/src/core/codemirror/misc/__tests__/dnd.test.ts +1 -1
- package/src/core/codemirror/reactive-references/__tests__/analyzer.test.ts +28 -42
- package/src/core/codemirror/rtc/loro/awareness.ts +1 -1
- package/src/core/config/__tests__/config-schema.test.ts +2 -6
- package/src/core/config/config-schema.ts +0 -1
- package/src/core/config/feature-flag.tsx +1 -3
- package/src/core/datasets/data-source-connections.ts +4 -2
- package/src/core/datasets/state.ts +1 -1
- package/src/core/dom/__tests__/htmlUtils.test.ts +8 -14
- package/src/core/dom/__tests__/outline.test.ts +2 -3
- package/src/core/dom/outline.ts +1 -1
- package/src/core/edit-app.tsx +4 -1
- package/src/core/export/__tests__/hooks.test.ts +1 -1
- package/src/core/hotkeys/__tests__/hotkeys.test.ts +1 -1
- package/src/core/hotkeys/shortcuts.ts +1 -1
- package/src/core/islands/__tests__/bridge.test.ts +2 -2
- package/src/core/islands/__tests__/parse.test.ts +8 -7
- package/src/core/islands/bridge.ts +2 -2
- package/src/core/islands/components/output-wrapper.tsx +1 -1
- package/src/core/islands/parse.ts +1 -1
- package/src/core/lsp/__tests__/transport.test.ts +1 -1
- package/src/core/network/CachingRequestRegistry.ts +1 -1
- package/src/core/network/DeferredRequestRegistry.ts +1 -1
- package/src/core/network/__tests__/requests-network.test.ts +1 -1
- package/src/core/network/api.ts +2 -2
- package/src/core/network/requests-lazy.ts +1 -1
- package/src/core/network/requests-toasting.tsx +1 -1
- package/src/core/runtime/runtime.ts +1 -0
- package/src/core/saving/__tests__/filename.test.ts +7 -6
- package/src/core/static/__tests__/download-html.test.ts +16 -15
- package/src/core/static/__tests__/files.test.ts +30 -28
- package/src/core/static/files.ts +1 -1
- package/src/core/vscode/vscode-bindings.ts +1 -1
- package/src/core/wasm/bridge.ts +3 -3
- package/src/core/wasm/worker/tracer.ts +1 -1
- package/src/core/websocket/useWebSocket.tsx +5 -3
- package/src/css/app/Cell.css +25 -1
- package/src/css/globals.css +18 -16
- package/src/css/table.css +17 -0
- package/src/custom.d.ts +1 -1
- package/src/hooks/__tests__/useDuplicateShortcuts.test.ts +3 -3
- package/src/hooks/debug.ts +3 -3
- package/src/hooks/useDebounce.ts +1 -1
- package/src/hooks/useEventListener.ts +1 -1
- package/src/hooks/useHotkey.ts +1 -1
- package/src/hooks/useLifecycle.ts +2 -2
- package/src/hooks/useNonce.ts +1 -1
- package/src/hooks/useResizeObserver.ts +2 -2
- package/src/main.tsx +1 -1
- package/src/plugins/core/BadPlugin.tsx +7 -6
- package/src/plugins/core/RenderHTML.tsx +3 -3
- package/src/plugins/core/__test__/registerReactComponent.test.ts +1 -1
- package/src/plugins/core/registerReactComponent.tsx +4 -4
- package/src/plugins/core/rpc.ts +1 -1
- package/src/plugins/impl/CheckboxPlugin.tsx +4 -1
- package/src/plugins/impl/DataEditorPlugin.tsx +8 -3
- package/src/plugins/impl/DataTablePlugin.tsx +6 -2
- package/src/plugins/impl/FileBrowserPlugin.tsx +1 -1
- package/src/plugins/impl/FormPlugin.tsx +2 -3
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +4 -1
- package/src/plugins/impl/__tests__/MatrixPlugin.test.tsx +1 -1
- package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +43 -15
- package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +3 -12
- package/src/plugins/impl/anywidget/__tests__/model.test.ts +2 -2
- package/src/plugins/impl/anywidget/model.ts +1 -1
- package/src/plugins/impl/anywidget/types.ts +2 -2
- package/src/plugins/impl/anywidget/widget-binding.ts +1 -1
- package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
- package/src/plugins/impl/chat/chat-ui.tsx +5 -2
- package/src/plugins/impl/data-editor/glide-data-editor.tsx +2 -2
- package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +2 -2
- package/src/plugins/impl/data-explorer/components/query-form.tsx +1 -1
- package/src/plugins/impl/data-explorer/functions/function.ts +1 -1
- package/src/plugins/impl/data-explorer/queries/types.ts +1 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -1
- package/src/plugins/impl/data-frames/forms/__tests__/form.test.tsx +7 -9
- package/src/plugins/impl/data-frames/forms/renderers.tsx +1 -1
- package/src/plugins/impl/data-frames/utils/operators.ts +1 -1
- package/src/plugins/impl/matplotlib/MatplotlibPlugin.tsx +1 -1
- package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +1 -1
- package/src/plugins/impl/panel/PanelPlugin.tsx +2 -2
- package/src/plugins/impl/plotly/Plot.tsx +3 -3
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +65 -103
- package/src/plugins/impl/plotly/__tests__/PlotlyPlugin.test.tsx +114 -0
- package/src/plugins/impl/plotly/__tests__/selection.test.ts +199 -0
- package/src/plugins/impl/plotly/selection.ts +333 -0
- package/src/plugins/impl/vega/__tests__/make-selectable.test.ts +13 -14
- package/src/plugins/impl/vega/__tests__/utils.test.ts +68 -0
- package/src/plugins/impl/vega/batched.ts +1 -1
- package/src/plugins/impl/vega/make-selectable.ts +3 -3
- package/src/plugins/impl/vega/types.ts +1 -1
- package/src/plugins/impl/vega/utils.ts +14 -5
- package/src/plugins/impl/vega/vega.css +2 -1
- package/src/plugins/layout/DownloadPlugin.tsx +1 -1
- package/src/plugins/layout/ImageComparisonPlugin.tsx +1 -3
- package/src/plugins/layout/LazyPlugin.tsx +1 -1
- package/src/plugins/layout/RoutesPlugin.tsx +1 -1
- package/src/plugins/layout/mermaid/mermaid.tsx +1 -1
- package/src/plugins/plugins.ts +1 -1
- package/src/plugins/stateless-plugin.ts +4 -2
- package/src/stories/data-explorer.stories.tsx +1 -1
- package/src/stories/dataframe.stories.tsx +1 -1
- package/src/stories/editor.stories.tsx +1 -1
- package/src/stories/select.stories.tsx +1 -1
- package/src/stories/switchable-multi-select.stories.tsx +1 -1
- package/src/utils/Logger.ts +1 -1
- package/src/utils/__tests__/arrays.test.ts +1 -1
- package/src/utils/__tests__/blob.test.ts +1 -1
- package/src/utils/__tests__/cell-urls.test.ts +24 -21
- package/src/utils/__tests__/dates.test.ts +1 -1
- package/src/utils/__tests__/errors.test.ts +1 -1
- package/src/utils/__tests__/filenames.test.ts +15 -14
- package/src/utils/__tests__/json-parser.test.ts +14 -21
- package/src/utils/__tests__/multi-map.test.ts +3 -3
- package/src/utils/__tests__/objects.test.ts +3 -3
- package/src/utils/__tests__/path.test.ts +34 -31
- package/src/utils/__tests__/urls.test.ts +19 -18
- package/src/utils/__tests__/versions.test.ts +5 -5
- package/src/utils/__tests__/waitForWs.test.ts +1 -1
- package/src/utils/arrays.ts +2 -2
- package/src/utils/assertNever.ts +1 -1
- package/src/utils/batch-requests.ts +2 -2
- package/src/utils/createReducer.ts +2 -2
- package/src/utils/id-tree.tsx +2 -2
- package/src/utils/idle.ts +1 -1
- package/src/utils/invariant.ts +1 -2
- package/src/utils/json/base64.ts +2 -5
- package/src/utils/maps.ts +1 -1
- package/src/utils/math.ts +0 -1
- package/src/utils/mime-types.ts +1 -1
- package/src/utils/multi-map.ts +1 -1
- package/src/utils/objects.ts +1 -1
- package/src/utils/once.ts +2 -2
- package/src/utils/staticImplements.ts +1 -1
- package/src/utils/storage/jotai.ts +1 -1
- package/src/utils/tracer.ts +3 -2
- package/dist/_basePickBy-QjOmBDRE.js +0 -110
- package/dist/_baseSet-xgn1IbGV.js +0 -27
- package/dist/architecture-7HQA4BMR-BRyVh_Za.js +0 -6
- package/dist/assets/__vite-browser-external-Us1ds95c.js +0 -1
- package/dist/dist-B0R_ZM4-.js +0 -6
- package/dist/dist-B4a9_9pj.js +0 -5
- package/dist/dist-BCSUKEwO.js +0 -5
- package/dist/dist-BONIDQq6.js +0 -5
- package/dist/dist-BYeRx2hb.js +0 -5
- package/dist/dist-D2Rk1j4R.js +0 -1381
- package/dist/dist-DZjX5TYv.js +0 -5
- package/dist/dist-Dkw9x6kc.js +0 -5
- package/dist/dist-Ds6UaXGR.js +0 -6
- package/dist/dist-KuEJ1Q53.js +0 -8
- package/dist/dist-S72WNyTZ.js +0 -5
- package/dist/dist-bTG-yssT.js +0 -5
- package/dist/dist-diF0sguc.js +0 -8
- package/dist/dist-mJ84BIgu.js +0 -8
- package/dist/dist-wSIhFWQz.js +0 -8
- package/dist/get-CqrzlV1v.js +0 -68
- package/dist/range-CYz5jI--.js +0 -17
- package/dist/stex-CZyTRGVB.js +0 -4
- package/dist/tooltip-DGHTbHl5.js +0 -404
- package/dist/useLifecycle-Dids8BPm.js +0 -173
- /package/dist/{dist-KZI_BHqV.js → dist-CxZvoNao.js} +0 -0
- /package/dist/{invariant-D4hPsZFI.js → invariant-e8eBgdux.js} +0 -0
- /package/dist/{isArrayLikeObject-C-hFPChh.js → isArrayLikeObject-LXbTYiBa.js} +0 -0
- /package/dist/{main-CvkAPtaq.js → main-XimWhSi_.js} +0 -0
- /package/dist/{purify.es-ukiMXY-F.js → purify.es-hTCfRGdl.js} +0 -0
- /package/dist/{react-dom-BKwCWYPW.js → react-dom-BSUuJjCR.js} +0 -0
- /package/dist/{stex-Ze8D4R_5.js → stex-D887Ylhf.js} +0 -0
|
@@ -34,7 +34,9 @@ export const CellSelectionStats = <TData,>({
|
|
|
34
34
|
if (dataCellCount < 2) {
|
|
35
35
|
return (
|
|
36
36
|
<Tooltip content="Select multiple cells to see stats">
|
|
37
|
-
<span
|
|
37
|
+
<span
|
|
38
|
+
className={cn("text-xs text-muted-foreground/80 italic", className)}
|
|
39
|
+
>
|
|
38
40
|
No selection
|
|
39
41
|
</span>
|
|
40
42
|
</Tooltip>
|
|
@@ -247,7 +247,7 @@ export const RowViewerPanel: React.FC<RowViewerPanelProps> = ({
|
|
|
247
247
|
|
|
248
248
|
return (
|
|
249
249
|
<div
|
|
250
|
-
className="flex flex-col gap-3
|
|
250
|
+
className="flex flex-col gap-3 focus:outline-hidden"
|
|
251
251
|
ref={panelRef}
|
|
252
252
|
tabIndex={-1}
|
|
253
253
|
onKeyDown={handleKeyDown}
|
|
@@ -42,7 +42,7 @@ export interface TableExplorerPanelProps {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
const tabTriggerClassName =
|
|
45
|
-
"text-
|
|
45
|
+
"text-[13px] uppercase tracking-wide font-semibold cursor-pointer transition-colors";
|
|
46
46
|
const activeClassName = "text-primary";
|
|
47
47
|
const inactiveClassName = "hover:text-foreground";
|
|
48
48
|
|
|
@@ -110,7 +110,7 @@ export const TableExplorerPanel: React.FC<TableExplorerPanelProps> = ({
|
|
|
110
110
|
<Tabs
|
|
111
111
|
value={resolvedTab}
|
|
112
112
|
onValueChange={(value) => onTabChange(value as PanelType)}
|
|
113
|
-
className="
|
|
113
|
+
className="flex flex-col min-w-[350px]"
|
|
114
114
|
>
|
|
115
115
|
<Fill name={SlotNames.CONTEXT_AWARE_PANEL_HEADER}>
|
|
116
116
|
<div className="flex items-center gap-1">
|
|
@@ -51,7 +51,7 @@ export const DependencyGraphTree: React.FC<PropsWithChildren<Props>> = ({
|
|
|
51
51
|
layoutDirection,
|
|
52
52
|
settings,
|
|
53
53
|
}) => {
|
|
54
|
-
//
|
|
54
|
+
// oxlint-disable-next-line react/hook-use-state
|
|
55
55
|
const [initial] = useState(() => {
|
|
56
56
|
let elements = elementsBuilder.createElements(
|
|
57
57
|
cellIds,
|
|
@@ -33,108 +33,107 @@ beforeAll(() => {
|
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
describe("Cell data attributes", () => {
|
|
36
|
-
it.each([
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const cid = cellId("test");
|
|
43
|
-
const cellName = "test_cell";
|
|
36
|
+
it.each(["edit", "read", "present"])(
|
|
37
|
+
"should render cell with data-cell-id and data-cell-name in %s mode",
|
|
38
|
+
(mode) => {
|
|
39
|
+
const { store, wrapper } = createTestWrapper();
|
|
40
|
+
const cid = cellId("test");
|
|
41
|
+
const cellName = "test_cell";
|
|
44
42
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
43
|
+
const userConfig: UserConfig = {
|
|
44
|
+
display: {
|
|
45
|
+
cell_output: "below",
|
|
46
|
+
code_editor_font_size: 14,
|
|
47
|
+
dataframes: "rich",
|
|
48
|
+
default_table_page_size: 10,
|
|
49
|
+
default_table_max_columns: 10,
|
|
50
|
+
default_width: "normal",
|
|
51
|
+
theme: "light",
|
|
52
|
+
reference_highlighting: false,
|
|
53
|
+
},
|
|
54
|
+
keymap: { preset: "default" },
|
|
55
|
+
completion: {
|
|
56
|
+
activate_on_typing: true,
|
|
57
|
+
signature_hint_on_typing: false,
|
|
58
|
+
copilot: false,
|
|
59
|
+
},
|
|
60
|
+
formatting: { line_length: 88 },
|
|
61
|
+
package_management: { manager: "pip" },
|
|
62
|
+
runtime: {
|
|
63
|
+
auto_instantiate: false,
|
|
64
|
+
default_sql_output: "native",
|
|
65
|
+
auto_reload: "off",
|
|
66
|
+
on_cell_change: "lazy",
|
|
67
|
+
watcher_on_save: "lazy",
|
|
68
|
+
reactive_tests: true,
|
|
69
|
+
output_max_bytes: 1_000_000,
|
|
70
|
+
std_stream_max_bytes: 1_000_000,
|
|
71
|
+
pythonpath: [],
|
|
72
|
+
dotenv: [".env"],
|
|
73
|
+
},
|
|
74
|
+
server: {
|
|
75
|
+
browser: "default",
|
|
76
|
+
follow_symlink: false,
|
|
77
|
+
},
|
|
78
|
+
save: { autosave: "off", autosave_delay: 1000, format_on_save: false },
|
|
79
|
+
ai: {},
|
|
80
|
+
} as UserConfig;
|
|
83
81
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
82
|
+
const notebook = MockNotebook.notebookState({
|
|
83
|
+
cellData: {
|
|
84
|
+
[cid]: {
|
|
85
|
+
code: "",
|
|
86
|
+
name: cellName,
|
|
87
|
+
edited: false,
|
|
88
|
+
serializedEditorState: null,
|
|
89
|
+
config: {
|
|
90
|
+
disabled: false,
|
|
91
|
+
hide_code: false,
|
|
92
|
+
column: null,
|
|
93
|
+
},
|
|
95
94
|
},
|
|
96
95
|
},
|
|
97
|
-
}
|
|
98
|
-
});
|
|
96
|
+
});
|
|
99
97
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
98
|
+
notebook.cellRuntime[cid] = createCellRuntimeState({
|
|
99
|
+
status: "idle",
|
|
100
|
+
output: null,
|
|
101
|
+
consoleOutputs: [],
|
|
102
|
+
interrupted: false,
|
|
103
|
+
errored: false,
|
|
104
|
+
stopped: false,
|
|
105
|
+
staleInputs: false,
|
|
106
|
+
runStartTimestamp: null,
|
|
107
|
+
lastRunStartTimestamp: null,
|
|
108
|
+
runElapsedTimeMs: null,
|
|
109
|
+
debuggerActive: false,
|
|
110
|
+
outline: null,
|
|
111
|
+
});
|
|
114
112
|
|
|
115
|
-
|
|
113
|
+
store.set(notebookAtom, notebook);
|
|
116
114
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
115
|
+
const { container } = render(
|
|
116
|
+
<TooltipProvider>
|
|
117
|
+
<Cell
|
|
118
|
+
cellId={cid}
|
|
119
|
+
mode={mode as AppMode}
|
|
120
|
+
canDelete={true}
|
|
121
|
+
userConfig={userConfig}
|
|
122
|
+
isCollapsed={false}
|
|
123
|
+
collapseCount={0}
|
|
124
|
+
canMoveX={false}
|
|
125
|
+
theme="light"
|
|
126
|
+
showPlaceholder={false}
|
|
127
|
+
/>
|
|
128
|
+
</TooltipProvider>,
|
|
129
|
+
{ wrapper },
|
|
130
|
+
);
|
|
133
131
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
132
|
+
const cellElement = container.querySelector(`[data-cell-id="${cid}"]`);
|
|
133
|
+
expect(cellElement).toBeTruthy();
|
|
134
|
+
expect(cellElement?.getAttribute("data-cell-name")).toBe(cellName);
|
|
135
|
+
},
|
|
136
|
+
);
|
|
138
137
|
});
|
|
139
138
|
|
|
140
139
|
describe("Output data attributes", () => {
|
|
@@ -176,7 +176,7 @@ describe("DynamicFavicon", () => {
|
|
|
176
176
|
const { rerender } = render(<DynamicFavicon isRunning={true} />);
|
|
177
177
|
rerender(<DynamicFavicon isRunning={false} />);
|
|
178
178
|
|
|
179
|
-
//
|
|
179
|
+
// oxlint-disable-next-line typescript/unbound-method
|
|
180
180
|
expect(Notification.requestPermission).toHaveBeenCalled();
|
|
181
181
|
});
|
|
182
182
|
});
|
|
@@ -14,8 +14,10 @@ import { useOnMount } from "@/hooks/useLifecycle";
|
|
|
14
14
|
import { cn } from "@/utils/cn";
|
|
15
15
|
import { Events } from "@/utils/events";
|
|
16
16
|
|
|
17
|
-
interface Props
|
|
18
|
-
|
|
17
|
+
interface Props extends Omit<
|
|
18
|
+
React.InputHTMLAttributes<HTMLInputElement>,
|
|
19
|
+
"onChange"
|
|
20
|
+
> {
|
|
19
21
|
value: string;
|
|
20
22
|
onChange: (newName: string) => void;
|
|
21
23
|
placeholder?: string;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { useAtomValue } from "jotai";
|
|
4
|
+
import { CheckIcon, CopyIcon } from "lucide-react";
|
|
5
|
+
import React, { useState } from "react";
|
|
6
|
+
import { Button } from "@/components/ui/button";
|
|
7
|
+
import {
|
|
8
|
+
DialogContent,
|
|
9
|
+
DialogDescription,
|
|
10
|
+
DialogFooter,
|
|
11
|
+
DialogHeader,
|
|
12
|
+
DialogTitle,
|
|
13
|
+
} from "@/components/ui/dialog";
|
|
14
|
+
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
|
15
|
+
import { runtimeConfigAtom } from "@/core/runtime/config";
|
|
16
|
+
import { copyToClipboard } from "@/utils/copy";
|
|
17
|
+
import { Events } from "@/utils/events";
|
|
18
|
+
import { Tooltip } from "@/components/ui/tooltip";
|
|
19
|
+
import type { RuntimeConfig } from "@/core/runtime/types";
|
|
20
|
+
|
|
21
|
+
type AgentTab = "claude" | "codex" | "opencode";
|
|
22
|
+
|
|
23
|
+
function buildRemoteUrl(config: RuntimeConfig) {
|
|
24
|
+
const url = new URL(config.url);
|
|
25
|
+
if (config.authToken) {
|
|
26
|
+
url.searchParams.set("auth", config.authToken);
|
|
27
|
+
}
|
|
28
|
+
return url.toString();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function getPromptCommand(agent: AgentTab, remoteUrl: string): string {
|
|
32
|
+
const command = import.meta.env.DEV ? "uv run marimo" : "uvx marimo@latest";
|
|
33
|
+
const base = `${command} pair prompt --url '${remoteUrl}'`;
|
|
34
|
+
switch (agent) {
|
|
35
|
+
case "claude":
|
|
36
|
+
return `claude "$(${base} --claude)"`;
|
|
37
|
+
case "codex":
|
|
38
|
+
return `codex "$(${base} --codex)"`;
|
|
39
|
+
case "opencode":
|
|
40
|
+
return `opencode "$(${base} --opencode)"`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const SKILL_INSTALL = "npx skills add marimo-team/marimo-pair";
|
|
45
|
+
|
|
46
|
+
export const PairWithAgentModal: React.FC<{
|
|
47
|
+
onClose: () => void;
|
|
48
|
+
}> = ({ onClose }) => {
|
|
49
|
+
const [activeTab, setActiveTab] = useState<AgentTab>("claude");
|
|
50
|
+
const runtimeConfig = useAtomValue(runtimeConfigAtom);
|
|
51
|
+
const remoteUrl = buildRemoteUrl(runtimeConfig);
|
|
52
|
+
const promptCommand = getPromptCommand(activeTab, remoteUrl);
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<DialogContent className="sm:max-w-lg">
|
|
56
|
+
<DialogHeader>
|
|
57
|
+
<DialogTitle>Pair with an agent</DialogTitle>
|
|
58
|
+
<DialogDescription>
|
|
59
|
+
Use an AI coding agent to pair-program on this notebook.{" "}
|
|
60
|
+
<a
|
|
61
|
+
href="https://links.marimo.app/marimo-pair"
|
|
62
|
+
target="_blank"
|
|
63
|
+
rel="noopener noreferrer"
|
|
64
|
+
className="underline"
|
|
65
|
+
>
|
|
66
|
+
Learn more
|
|
67
|
+
</a>
|
|
68
|
+
.
|
|
69
|
+
</DialogDescription>
|
|
70
|
+
</DialogHeader>
|
|
71
|
+
|
|
72
|
+
<div className="flex flex-col gap-4 py-2">
|
|
73
|
+
<div className="flex flex-col gap-2">
|
|
74
|
+
<span className="text-sm font-medium">1. Install the skill</span>
|
|
75
|
+
<CommandBlock command={SKILL_INSTALL} />
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<div className="flex flex-col gap-2">
|
|
79
|
+
<span className="text-sm font-medium">2. Run in your terminal</span>
|
|
80
|
+
<Tabs
|
|
81
|
+
value={activeTab}
|
|
82
|
+
onValueChange={(v) => setActiveTab(v as AgentTab)}
|
|
83
|
+
>
|
|
84
|
+
<TabsList className="w-full">
|
|
85
|
+
<TabsTrigger value="claude" className="flex-1">
|
|
86
|
+
Claude
|
|
87
|
+
</TabsTrigger>
|
|
88
|
+
<TabsTrigger value="codex" className="flex-1">
|
|
89
|
+
Codex
|
|
90
|
+
</TabsTrigger>
|
|
91
|
+
<TabsTrigger value="opencode" className="flex-1">
|
|
92
|
+
OpenCode
|
|
93
|
+
</TabsTrigger>
|
|
94
|
+
</TabsList>
|
|
95
|
+
|
|
96
|
+
<TabsContent value="claude" className="mt-3">
|
|
97
|
+
<CommandBlock command={promptCommand} />
|
|
98
|
+
</TabsContent>
|
|
99
|
+
<TabsContent value="codex" className="mt-3">
|
|
100
|
+
<CommandBlock command={promptCommand} />
|
|
101
|
+
</TabsContent>
|
|
102
|
+
<TabsContent value="opencode" className="mt-3">
|
|
103
|
+
<CommandBlock command={promptCommand} />
|
|
104
|
+
</TabsContent>
|
|
105
|
+
</Tabs>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<DialogFooter>
|
|
110
|
+
<Button variant="secondary" onClick={onClose}>
|
|
111
|
+
Close
|
|
112
|
+
</Button>
|
|
113
|
+
</DialogFooter>
|
|
114
|
+
</DialogContent>
|
|
115
|
+
);
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const CommandBlock: React.FC<{ command: string }> = ({ command }) => {
|
|
119
|
+
const [copied, setCopied] = useState(false);
|
|
120
|
+
|
|
121
|
+
const copy = Events.stopPropagation(async (e) => {
|
|
122
|
+
e.preventDefault();
|
|
123
|
+
await copyToClipboard(command);
|
|
124
|
+
setCopied(true);
|
|
125
|
+
setTimeout(() => setCopied(false), 2000);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
return (
|
|
129
|
+
<div className="flex items-center gap-2 rounded-md bg-muted px-3 py-2 font-mono text-xs">
|
|
130
|
+
<code className="flex-1 select-all break-words">{command}</code>
|
|
131
|
+
<Tooltip content="Copied!" open={copied}>
|
|
132
|
+
<Button onClick={copy} size="xs" variant="ghost">
|
|
133
|
+
{copied ? (
|
|
134
|
+
<CheckIcon size={14} strokeWidth={1.5} />
|
|
135
|
+
) : (
|
|
136
|
+
<CopyIcon size={14} strokeWidth={1.5} />
|
|
137
|
+
)}
|
|
138
|
+
</Button>
|
|
139
|
+
</Tooltip>
|
|
140
|
+
</div>
|
|
141
|
+
);
|
|
142
|
+
};
|
|
@@ -65,8 +65,10 @@ import { useSplitCellCallback } from "../cell/useSplitCell";
|
|
|
65
65
|
import { NameCellInput } from "./name-cell-input";
|
|
66
66
|
import type { ActionButton } from "./types";
|
|
67
67
|
|
|
68
|
-
export interface CellActionButtonProps
|
|
69
|
-
|
|
68
|
+
export interface CellActionButtonProps extends Pick<
|
|
69
|
+
CellData,
|
|
70
|
+
"name" | "config"
|
|
71
|
+
> {
|
|
70
72
|
cellId: CellId;
|
|
71
73
|
status: RuntimeState;
|
|
72
74
|
hasOutput: boolean;
|
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
PresentationIcon,
|
|
37
37
|
SettingsIcon,
|
|
38
38
|
Share2Icon,
|
|
39
|
+
SparklesIcon,
|
|
39
40
|
Undo2Icon,
|
|
40
41
|
XCircleIcon,
|
|
41
42
|
YoutubeIcon,
|
|
@@ -45,6 +46,7 @@ import { settingDialogAtom } from "@/components/app-config/state";
|
|
|
45
46
|
import { MarkdownIcon } from "@/components/editor/cell/code/icons";
|
|
46
47
|
import { useImperativeModal } from "@/components/modal/ImperativeModal";
|
|
47
48
|
import { renderShortcut } from "@/components/shortcuts/renderShortcut";
|
|
49
|
+
import { PairWithAgentModal } from "@/components/editor/actions/pair-with-agent-modal";
|
|
48
50
|
import { ShareStaticNotebookModal } from "@/components/static-html/share-modal";
|
|
49
51
|
import { toast } from "@/components/ui/use-toast";
|
|
50
52
|
import {
|
|
@@ -343,6 +345,14 @@ export function useNotebookActions() {
|
|
|
343
345
|
],
|
|
344
346
|
},
|
|
345
347
|
|
|
348
|
+
{
|
|
349
|
+
icon: <SparklesIcon size={14} strokeWidth={1.5} />,
|
|
350
|
+
label: "Pair with an agent",
|
|
351
|
+
handle: async () => {
|
|
352
|
+
openModal(<PairWithAgentModal onClose={closeModal} />);
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
|
|
346
356
|
{
|
|
347
357
|
icon: <Share2Icon size={14} strokeWidth={1.5} />,
|
|
348
358
|
label: "Share",
|
|
@@ -122,7 +122,7 @@ export const AddCellWithAI: React.FC<{
|
|
|
122
122
|
transport: new StreamingChunkTransport(
|
|
123
123
|
{
|
|
124
124
|
api: runtimeManager.getAiURL("completion").toString(),
|
|
125
|
-
headers: runtimeManager.headers(),
|
|
125
|
+
headers: () => runtimeManager.headers(),
|
|
126
126
|
prepareSendMessagesRequest: async (options) => {
|
|
127
127
|
const completionBody = await buildCompletionRequestBody(
|
|
128
128
|
options.messages,
|
|
@@ -136,6 +136,7 @@ export const AddCellWithAI: React.FC<{
|
|
|
136
136
|
};
|
|
137
137
|
|
|
138
138
|
return {
|
|
139
|
+
api: runtimeManager.getAiURL("completion").toString(),
|
|
139
140
|
body: body,
|
|
140
141
|
};
|
|
141
142
|
},
|
|
@@ -156,7 +156,7 @@ export const AiCompletionEditor: React.FC<Props> = ({
|
|
|
156
156
|
// Use complete to pass the prompt directly, else input might be empty
|
|
157
157
|
complete(initialPrompt);
|
|
158
158
|
}
|
|
159
|
-
//
|
|
159
|
+
// oxlint-disable-next-line react-hooks/exhaustive-deps
|
|
160
160
|
}, [triggerImmediately]);
|
|
161
161
|
|
|
162
162
|
// Focus the input
|
|
@@ -31,7 +31,7 @@ export const AppContainer: React.FC<PropsWithChildren<Props>> = ({
|
|
|
31
31
|
<StatusOverlay connection={connection} isRunning={isRunning} />
|
|
32
32
|
<PyodideLoader>
|
|
33
33
|
<WrappedWithSidebar>
|
|
34
|
-
{/**
|
|
34
|
+
{/** oxlint-ignore-next-line -- ID is used by other components to grab the DOM element */}
|
|
35
35
|
<div
|
|
36
36
|
id="App"
|
|
37
37
|
data-config-width={width}
|
|
@@ -16,11 +16,10 @@ import "./cell-status.css";
|
|
|
16
16
|
import { formatDistanceToNow } from "date-fns";
|
|
17
17
|
import { Time } from "@/utils/time";
|
|
18
18
|
|
|
19
|
-
export interface CellStatusComponentProps
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
> {
|
|
19
|
+
export interface CellStatusComponentProps extends Pick<
|
|
20
|
+
CellRuntimeState,
|
|
21
|
+
"status" | "runStartTimestamp" | "interrupted" | "lastRunStartTimestamp"
|
|
22
|
+
> {
|
|
24
23
|
editing: boolean;
|
|
25
24
|
edited: boolean;
|
|
26
25
|
disabled: boolean;
|
|
@@ -34,8 +34,10 @@ import {
|
|
|
34
34
|
useCellActionButtons,
|
|
35
35
|
} from "../actions/useCellActionButton";
|
|
36
36
|
|
|
37
|
-
interface Props
|
|
38
|
-
|
|
37
|
+
interface Props extends Pick<
|
|
38
|
+
CellActionButtonProps,
|
|
39
|
+
"cellId" | "getEditorView"
|
|
40
|
+
> {
|
|
39
41
|
children: React.ReactNode;
|
|
40
42
|
}
|
|
41
43
|
|
|
@@ -47,7 +47,8 @@ import { useSplitCellCallback } from "../useSplitCell";
|
|
|
47
47
|
import { LanguageToggles } from "./language-toggle";
|
|
48
48
|
|
|
49
49
|
export interface CellEditorProps
|
|
50
|
-
extends
|
|
50
|
+
extends
|
|
51
|
+
Pick<CellRuntimeState, "status">,
|
|
51
52
|
Pick<CellData, "id" | "code" | "serializedEditorState" | "config"> {
|
|
52
53
|
runCell: () => void;
|
|
53
54
|
theme: Theme;
|
|
@@ -185,7 +186,7 @@ const CellEditorInternal = ({
|
|
|
185
186
|
deleteCell: handleDelete,
|
|
186
187
|
saveNotebook: saveOrNameNotebook,
|
|
187
188
|
createManyBelow: (cells) => {
|
|
188
|
-
for (const code of
|
|
189
|
+
for (const code of cells.toReversed()) {
|
|
189
190
|
cellActions.createNewCell({
|
|
190
191
|
code,
|
|
191
192
|
before: false,
|
|
@@ -27,7 +27,8 @@ const toolbarItemVariants = cva(
|
|
|
27
27
|
);
|
|
28
28
|
|
|
29
29
|
interface ToolbarItemProps
|
|
30
|
-
extends
|
|
30
|
+
extends
|
|
31
|
+
VariantProps<typeof toolbarItemVariants>,
|
|
31
32
|
React.HTMLAttributes<HTMLButtonElement> {
|
|
32
33
|
tooltip: React.ReactNode;
|
|
33
34
|
disabled?: boolean;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import { Slot } from "
|
|
3
|
+
import { Slot as SlotPrimitive } from "radix-ui";
|
|
4
|
+
|
|
5
|
+
const Slot = SlotPrimitive.Slot;
|
|
6
|
+
|
|
4
7
|
import React, { type PropsWithChildren } from "react";
|
|
5
8
|
import { useImperativeModal } from "@/components/modal/ImperativeModal";
|
|
6
9
|
import { Button } from "@/components/ui/button";
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import { Slot } from "
|
|
3
|
+
import { Slot as SlotPrimitive } from "radix-ui";
|
|
4
|
+
|
|
5
|
+
const Slot = SlotPrimitive.Slot;
|
|
6
|
+
|
|
4
7
|
import React, { type PropsWithChildren } from "react";
|
|
5
8
|
import { useImperativeModal } from "@/components/modal/ImperativeModal";
|
|
6
9
|
import {
|
|
@@ -101,7 +101,7 @@ export const ContextAwarePanel: React.FC = () => {
|
|
|
101
101
|
const renderBody = () => {
|
|
102
102
|
return (
|
|
103
103
|
<div className="pb-7 mb-4 h-full overflow-auto">
|
|
104
|
-
<div className="
|
|
104
|
+
<div className="px-3 py-2 border-b flex justify-between items-center">
|
|
105
105
|
{renderModeToggle()}
|
|
106
106
|
<Slot name={SlotNames.CONTEXT_AWARE_PANEL_HEADER} />
|
|
107
107
|
<Button
|
|
@@ -18,6 +18,7 @@ export const PanelEmptyState = ({
|
|
|
18
18
|
<div className="mx-6 my-6 flex flex-col gap-2">
|
|
19
19
|
<div className="flex flex-row gap-2 items-center">
|
|
20
20
|
{icon &&
|
|
21
|
+
// oxlint-disable-next-line react/no-clone-element
|
|
21
22
|
React.cloneElement(icon, {
|
|
22
23
|
className: "text-accent-foreground flex-shrink-0",
|
|
23
24
|
})}
|
|
@@ -7,7 +7,6 @@ import React, { useCallback, useMemo } from "react";
|
|
|
7
7
|
import useResizeObserver from "use-resize-observer";
|
|
8
8
|
import { StorageInspector } from "@/components/storage/storage-inspector";
|
|
9
9
|
import { Accordion } from "@/components/ui/accordion";
|
|
10
|
-
import { getFeatureFlag } from "@/core/config/feature-flag";
|
|
11
10
|
import { storageNamespacesAtom } from "@/core/storage/state";
|
|
12
11
|
import { cn } from "@/utils/cn";
|
|
13
12
|
import { jotaiJsonStorage } from "@/utils/storage/jotai";
|
|
@@ -103,15 +102,6 @@ const FileExplorerPanel: React.FC = () => {
|
|
|
103
102
|
bothOpen ? availableContent - storageMaxHeight : availableContent,
|
|
104
103
|
);
|
|
105
104
|
|
|
106
|
-
const storageInspectorEnabled = getFeatureFlag("storage_inspector");
|
|
107
|
-
if (!storageInspectorEnabled) {
|
|
108
|
-
return (
|
|
109
|
-
<div ref={panelRef} className="h-full overflow-auto">
|
|
110
|
-
<FileExplorerComponent height={panelHeight} />
|
|
111
|
-
</div>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
105
|
return (
|
|
116
106
|
<div ref={panelRef} className="h-full overflow-auto">
|
|
117
107
|
<Accordion
|
|
@@ -125,7 +125,7 @@ const SnippetViewer: React.FC<{ snippet: Snippet; onClose: () => void }> = ({
|
|
|
125
125
|
|
|
126
126
|
const handleInsertSnippet = () => {
|
|
127
127
|
// Add below last focused cell in reverse order
|
|
128
|
-
for (const section of
|
|
128
|
+
for (const section of snippet.sections.toReversed()) {
|
|
129
129
|
if (section.code) {
|
|
130
130
|
createNewCell({
|
|
131
131
|
code: section.code,
|
|
@@ -25,7 +25,7 @@ import type { ListSecretKeysResponse } from "@/core/network/types";
|
|
|
25
25
|
|
|
26
26
|
// dotenv providers should be at the top
|
|
27
27
|
export function sortProviders(providers: ListSecretKeysResponse["keys"]) {
|
|
28
|
-
return providers.
|
|
28
|
+
return providers.toSorted((a, b) => {
|
|
29
29
|
if (a.provider === "env") {
|
|
30
30
|
return 1;
|
|
31
31
|
}
|