@marimo-team/islands 0.25.3-dev141 → 0.25.3-dev142
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-CNSxdKyJ.js → ConnectedDataExplorerComponent-BAiSVaHj.js} +17 -15
- package/dist/{ErrorBoundary-Cg59O3xL.js → ErrorBoundary-DxdeETpm.js} +16 -16
- package/dist/{abnfDiagram-VCTEODGH-DQDjNXt3.js → abnfDiagram-VCTEODGH-BBHN92-F.js} +2 -2
- package/dist/any-language-editor-3E24SnCV.js +75 -0
- package/dist/{architectureDiagram-5GKGNRK7-Nmls7Wxn.js → architectureDiagram-5GKGNRK7-C0Rd64qh.js} +1 -1
- package/dist/{arrays-CN1djC4k.js → arrays-R6JsImiT.js} +8 -0
- package/dist/assets/__vite-browser-external-BgQNn4dS.js +1 -0
- package/dist/assets/worker-FKe3RHT4.js +113 -0
- package/dist/{button-CvjkwdSk.js → button-BQRdqQi1.js} +199 -192
- package/dist/{capabilities-CQ5IjhzL.js → capabilities-CI4xUPsp.js} +2 -2
- package/dist/{chat-ui-BDpymeoe.js → chat-ui-CvB8Map3.js} +1195 -1195
- package/dist/{check-EDwSwP89.js → check-SpOMoCLP.js} +1 -1
- package/dist/{chunk-IMKFNOWR-CoIFEo-1.js → chunk-IMKFNOWR-hJXey5p2.js} +1 -1
- package/dist/{chunk-SHT3W25Y-lHiGx3ZC.js → chunk-SHT3W25Y-JMzTmmVW.js} +1 -1
- package/dist/{chunk-SVP7TREG-BvsHIrY_.js → chunk-SVP7TREG-BIyoHTXi.js} +1 -1
- package/dist/{chunk-TICWLB2K-BC8YIm_n.js → chunk-TICWLB2K-CCzH2Uwa.js} +1 -1
- package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
- package/dist/{classDiagram-ZZMXUADV-Bt98lkkv.js → classDiagram-ZZMXUADV-DB1kOPS6.js} +2 -2
- package/dist/{classDiagram-v2-VYDZK3BY-D9bfbcC3.js → classDiagram-v2-VYDZK3BY-CPaFL0OB.js} +2 -2
- package/dist/{code-visibility-Da3iitn_.js → code-visibility-CO8abjLo.js} +17 -17
- package/dist/{common-C6FHcu5p.js → common-CbFJQhaI.js} +6341 -5870
- package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-C1trdvVt.js} +3 -3
- package/dist/{cynefinDiagram-5FMLGOSQ-CgWra7wt.js → cynefinDiagram-5FMLGOSQ-CF93uliH.js} +1 -1
- package/dist/{dagre-GXQ25YYZ-CFZ8-35c.js → dagre-GXQ25YYZ-BBB-_p9D.js} +1 -1
- package/dist/{data-grid-overlay-editor-mJt3Pg4S.js → data-grid-overlay-editor-DBjVUS2K.js} +5 -5
- package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-0PJ-9N5n.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-lCNQrW7d.js → diagram-S7CK7UJ4-BynCnbyt.js} +1 -1
- package/dist/{diagram-UQ7AKVKN-CQPQ6pP_.js → diagram-UQ7AKVKN-svOxikMa.js} +1 -1
- package/dist/{diagram-VX7I27RA-Cf3b0llz.js → diagram-VX7I27RA-BVQSnPx0.js} +1 -1
- package/dist/{diagram-Z3DM3KII-Bt4QLrpn.js → diagram-Z3DM3KII-nR1J0BH5.js} +1 -1
- package/dist/{dialog-CEBFZNyc.js → dialog-DgeqyrEZ.js} +3 -3
- package/dist/{dist-DpBpA_n1.js → dist-Lm-D-Vr6.js} +3 -3
- package/dist/{dropdown-menu-CP_qCYHC.js → dropdown-menu-GWcGCcxE.js} +1277 -1229
- package/dist/{ebnfDiagram-PWID7BFC-D3NAyPFY.js → ebnfDiagram-PWID7BFC-C9tq9-Qo.js} +2 -2
- package/dist/{erDiagram-RLTQ6QDP-Tlu09_Nm.js → erDiagram-RLTQ6QDP-BiaeB7Fi.js} +1 -1
- package/dist/{error-banner-Da600cwz.js → error-banner-D40pmfQQ.js} +86 -81
- package/dist/{cells-C8iCYvLU.js → error-entries-CmFDQ9CA.js} +1718 -1621
- package/dist/{feedback-button-DaPwHIdM.js → feedback-button-CWQoIUKQ.js} +122 -123
- package/dist/{flowDiagram-HODETNUW-CAYbpJmV.js → flowDiagram-HODETNUW-f-sLm87k.js} +2 -2
- package/dist/{formats-BGh2thRc.js → formats-CCxaLPNs.js} +3 -3
- package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
- package/dist/{glide-data-editor-Ctz2mH6k.js → glide-data-editor-BxT8eGip.js} +370 -368
- package/dist/{glide-utils-DJyqh0EM.js → glide-utils-Dz_F4pAY.js} +16 -16
- package/dist/{globals-EpFoRj_E.js → globals-f0UxWZkr.js} +3 -3
- package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
- package/dist/{html-to-image-CZY1pIZH.js → html-to-image-BrC8OJcj.js} +634 -597
- package/dist/{infoDiagram-27XIBGKW-XrDxhr0x.js → infoDiagram-27XIBGKW-BHrWywBe.js} +1 -1
- package/dist/{ishikawaDiagram-5VMMS53U-CD1muzov.js → ishikawaDiagram-5VMMS53U-Da4s0Reg.js} +1 -1
- package/dist/{kanban-definition-UXKFOSKX-Dg9W142_.js → kanban-definition-UXKFOSKX-DDf1GVLj.js} +1 -1
- package/dist/{label-BDKF3Afc.js → label-D9_-zSg-.js} +3 -3
- package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
- package/dist/{loader-BQOfjTIJ.js → loader-DOVB0Syl.js} +12 -12
- package/dist/main.js +7548 -7226
- package/dist/{mermaid-CiAXjLpA.js → mermaid-ClwTt7OD.js} +38 -38
- package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
- package/dist/{mindmap-definition-YA3MSWOX-DgCidgYJ.js → mindmap-definition-YA3MSWOX-D60oMZtT.js} +1 -1
- package/dist/{number-overlay-editor-CtxrummL.js → number-overlay-editor-Dso2H7DV.js} +3 -3
- package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
- package/dist/{once-BtE-wKRL.js → once-eG8Vmvjd.js} +1 -1
- package/dist/{pegDiagram-XKGWAZYB-coOYYKB6.js → pegDiagram-XKGWAZYB-B9wFpMga.js} +2 -2
- package/dist/{pieDiagram-E7YTZNPT-BnXTc3bj.js → pieDiagram-E7YTZNPT-BZwvMuBT.js} +1 -1
- package/dist/precisionRound-DhAzeRcm.js +49 -0
- package/dist/{process-output-e4jj9Ijt.js → process-output-Bw-vzyoy.js} +4 -4
- package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
- package/dist/{railroadDiagram-O6MQD6OU-B28-u83n.js → railroadDiagram-O6MQD6OU-DqhZGsN2.js} +2 -2
- package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
- package/dist/{requirementDiagram-BXWQKSXE-CdYCTMu0.js → requirementDiagram-BXWQKSXE-CL5dYARV.js} +1 -1
- package/dist/{reveal-component-DrIXvR_7.js → reveal-component-DMglhlng.js} +14 -14
- package/dist/{select-BButFi-d.js → select-CkF_GBxO.js} +537 -458
- package/dist/{sequenceDiagram-WJ2MYXX4-CM3aRAe_.js → sequenceDiagram-WJ2MYXX4-BSUCRd2x.js} +1 -1
- package/dist/{spec-BwarBpUJ.js → spec-DiSh_qJC.js} +41 -11
- package/dist/{stateDiagram-D77RDMKH-DOZUMVj8.js → stateDiagram-D77RDMKH-B-1Hvyb0.js} +2 -2
- package/dist/{stateDiagram-v2-MP3YSRHH-CISYxma6.js → stateDiagram-v2-MP3YSRHH--HtiR4yB.js} +2 -2
- package/dist/style.css +1 -1
- package/dist/{swimlanes-42K2YHIH-BkSppxp8.js → swimlanes-42K2YHIH-Bdfhrd-2.js} +1 -1
- package/dist/{swimlanesDiagram-VR7AAH4N-c8G5pGxC.js → swimlanesDiagram-VR7AAH4N-BJIfxSz0.js} +2 -2
- package/dist/{swiper-component-DKntyn8p.js → swiper-component-BkCm-kLg.js} +2 -2
- package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
- package/dist/{timeline-definition-24CTP7MA-CaMQayqK.js → timeline-definition-24CTP7MA-Cs4EfFD3.js} +1 -1
- package/dist/{toDate-BNJf01u1.js → toDate-DGvRHwTk.js} +57 -54
- package/dist/{toast-B9UMEi8u.js → toast-Btbve3Lm.js} +231 -213
- package/dist/{tooltip-BO1REbqs.js → tooltip-CJ4Rqasp.js} +327 -303
- package/dist/{use-restore-focus-BEM7sFWl.js → use-restore-focus-CmGwRNId.js} +1482 -1433
- package/dist/{useAsyncData-Deh5kszT.js → useAsyncData-BmVgnMP5.js} +15 -14
- package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-eCL_SdeG.js} +2 -2
- package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-Ch_AeGu6.js} +1 -1
- package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-CSdWn6NP.js} +1 -1
- package/dist/{useLifecycle-j7D9uD1o.js → useLifecycle-B5BX921H.js} +3 -3
- package/dist/{useTheme-CRnjkku0.js → useTheme-Bq9pi_vz.js} +6 -6
- package/dist/{vega-component-DG29TAB7.js → vega-component-BgyZ-COt.js} +147 -147
- package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container--LYZqguO.js} +2 -2
- package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-B9Pz0EGP.js} +298 -507
- package/dist/{vennDiagram-4TSXK5OY-CF8pfaK3.js → vennDiagram-4TSXK5OY-DRu0vRjO.js} +1 -1
- package/dist/{wardleyDiagram-VM6X3IG4-dGPu39d-.js → wardleyDiagram-VM6X3IG4-DzbDxwDY.js} +1 -1
- package/dist/{xychartDiagram-S5SC5T6Z-CP6-9q56.js → xychartDiagram-S5SC5T6Z-CLWj6ZFQ.js} +2 -2
- package/package.json +15 -12
- package/src/__tests__/fixtures/{pair-preview.ts → pair-config.ts} +3 -2
- package/src/__tests__/host-imports.test.ts +101 -0
- package/src/__tests__/module-entry.test.ts +32 -0
- package/src/__tests__/mount.test.ts +8 -8
- package/src/components/ai/__tests__/ai-model-dropdown.test.tsx +63 -0
- package/src/components/ai/ai-model-dropdown.tsx +11 -6
- package/src/components/app-config/ai-config.tsx +7 -2
- package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
- package/src/components/chat/acp/__tests__/session-tabs.test.tsx +43 -0
- package/src/components/chat/acp/__tests__/state.test.ts +2 -2
- package/src/components/chat/acp/blocks.tsx +3 -2
- package/src/components/chat/acp/session-tabs.tsx +8 -3
- package/src/components/chat/chat-components.tsx +2 -0
- package/src/components/chat/chat-panel.tsx +9 -8
- package/src/components/chat/chat-utils.ts +4 -8
- package/src/components/data-table/TableTopBar.tsx +2 -0
- package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
- package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
- package/src/components/data-table/__tests__/columns.test.tsx +105 -0
- package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
- package/src/components/data-table/__tests__/context-menu.test.ts +176 -0
- package/src/components/data-table/__tests__/data-table.test.tsx +1 -0
- package/src/components/data-table/__tests__/date-filter-inputs.test.tsx +24 -1
- package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
- package/src/components/data-table/__tests__/export-actions.test.tsx +434 -6
- package/src/components/data-table/__tests__/keyboard-selection.test.tsx +188 -0
- package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
- package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
- package/src/components/data-table/cell-selection/feature.ts +2 -2
- package/src/components/data-table/cell-selection/types.ts +2 -2
- package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
- package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
- package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
- package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
- package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
- package/src/components/data-table/charts/charts.tsx +40 -30
- package/src/components/data-table/charts/storage.ts +16 -5
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
- package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
- package/src/components/data-table/column-summary/column-summary.tsx +2 -4
- package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
- package/src/components/data-table/columns.tsx +45 -46
- package/src/components/data-table/context-menu.tsx +161 -46
- package/src/components/data-table/data-table.tsx +13 -1
- package/src/components/data-table/date-filter-inputs.tsx +15 -42
- package/src/components/data-table/date-popover.tsx +6 -4
- package/src/components/data-table/export-actions.tsx +267 -163
- package/src/components/data-table/range-focus/atoms.ts +4 -6
- package/src/components/data-table/range-focus/use-cell-range-selection.ts +65 -38
- package/src/components/data-table/range-focus/use-scroll-into-view.ts +21 -2
- package/src/components/data-table/renderers.tsx +16 -7
- package/src/components/data-table/row-viewer-panel/__tests__/row-viewer.test.tsx +24 -1
- package/src/components/data-table/row-viewer-panel/row-viewer.tsx +4 -4
- package/src/components/data-table/schemas.ts +14 -36
- package/src/components/data-table/search-highlight.tsx +79 -0
- package/src/components/data-table/types.ts +1 -0
- package/src/components/data-table/url-detector.tsx +49 -9
- package/src/components/data-table/utils.ts +18 -0
- package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
- package/src/components/datasources/__tests__/column-preview.test.tsx +98 -5
- package/src/components/datasources/__tests__/datasources-interactions.test.tsx +181 -0
- package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
- package/src/components/datasources/__tests__/utils.test.ts +57 -6
- package/src/components/datasources/column-preview.tsx +13 -4
- package/src/components/datasources/datasources.tsx +51 -39
- package/src/components/datasources/utils.ts +32 -23
- package/src/components/debugger/debugger-code.tsx +5 -0
- package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
- package/src/components/dependency-graph/elements.ts +24 -21
- package/src/components/dependency-graph/panels.tsx +2 -1
- package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
- package/src/components/editor/Output.tsx +9 -2
- package/src/components/editor/SortableCell.tsx +1 -3
- package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
- package/src/components/editor/__tests__/package-alert.test.tsx +22 -1
- package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +80 -252
- package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +210 -34
- package/src/components/editor/actions/pair-with-agent-commands.ts +42 -51
- package/src/components/editor/actions/pair-with-agent-modal.tsx +100 -37
- package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
- package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
- package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
- package/src/components/editor/cell/CreateCellButton.tsx +8 -10
- package/src/components/editor/cell/DeleteButton.tsx +1 -0
- package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
- package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
- package/src/components/editor/cell/code/cell-editor.tsx +1 -1
- package/src/components/editor/cell/code/language-toggle.tsx +8 -7
- package/src/components/editor/cell/collapse.tsx +5 -3
- package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
- package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +30 -1
- package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
- package/src/components/editor/chrome/panels/error-panel.tsx +1 -0
- package/src/components/editor/chrome/panels/outline/__tests__/outline-keyboard.test.tsx +84 -0
- package/src/components/editor/chrome/panels/outline/floating-outline.tsx +39 -14
- package/src/components/editor/chrome/panels/outline/useActiveOutline.tsx +3 -2
- package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
- package/src/components/editor/chrome/panels/secrets-panel.tsx +1 -0
- package/src/components/editor/chrome/panels/snippets-panel.tsx +5 -1
- package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +366 -0
- package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
- package/src/components/editor/chrome/wrapper/footer-item.tsx +32 -24
- package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +237 -0
- package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
- package/src/components/editor/chrome/wrapper/footer.tsx +2 -0
- package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
- package/src/components/editor/chrome/wrapper/storage.ts +1 -1
- package/src/components/editor/connections/components.tsx +1 -1
- package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
- package/src/components/editor/controls/__tests__/keyboard-shortcuts.test.tsx +61 -0
- package/src/components/editor/controls/command-palette.tsx +22 -10
- package/src/components/editor/controls/keyboard-shortcuts.tsx +14 -5
- package/src/components/editor/dynamic-favicon.tsx +21 -40
- package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +537 -0
- package/src/components/editor/errors/send-error-report-button.tsx +69 -0
- package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
- package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +47 -0
- package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
- package/src/components/editor/file-tree/file-explorer.tsx +45 -8
- package/src/components/editor/file-tree/file-name-input.tsx +1 -0
- package/src/components/editor/file-tree/file-viewer.tsx +4 -2
- package/src/components/editor/file-tree/use-file-search.ts +35 -21
- package/src/components/editor/header/status.tsx +28 -5
- package/src/components/editor/links/__tests__/cell-link.test.tsx +146 -0
- package/src/components/editor/links/cell-link.tsx +14 -5
- package/src/components/editor/navigation/focus-utils.ts +4 -4
- package/src/components/editor/notebook-banner.tsx +1 -0
- package/src/components/editor/notebook-cell.tsx +11 -2
- package/src/components/editor/output/MarimoErrorOutput.tsx +21 -5
- package/src/components/editor/output/MarimoTracebackOutput.tsx +54 -37
- package/src/components/editor/output/__tests__/ansi-reduce.test.ts +18 -0
- package/src/components/editor/output/__tests__/traceback.test.tsx +27 -1
- package/src/components/editor/output/ansi-reduce.ts +36 -17
- package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
- package/src/components/editor/package-alert.tsx +14 -7
- package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
- package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
- package/src/components/home/components.tsx +17 -31
- package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
- package/src/components/icons/large-spinner.tsx +3 -14
- package/src/components/icons/spinner.tsx +1 -1
- package/src/components/mcp/mcp-status-indicator.tsx +1 -1
- package/src/components/pages/__tests__/home-page.test.tsx +116 -0
- package/src/components/pages/home-page.tsx +164 -91
- package/src/components/scratchpad/scratchpad.test.tsx +95 -0
- package/src/components/scratchpad/scratchpad.tsx +16 -3
- package/src/components/slides/reveal-component.tsx +4 -2
- package/src/components/slides/slide-cell-view.tsx +1 -1
- package/src/components/slides/slide-form.tsx +1 -0
- package/src/components/tracing/tracing-keyboard.test.tsx +85 -0
- package/src/components/tracing/tracing.tsx +45 -41
- package/src/components/ui/__tests__/draggable-popover.test.tsx +24 -0
- package/src/components/ui/__tests__/range-slider.test.tsx +165 -0
- package/src/components/ui/alert-dialog.tsx +1 -1
- package/src/components/ui/draggable-popover.tsx +24 -2
- package/src/components/ui/range-slider.tsx +22 -9
- package/src/core/ai/context/providers/datasource.ts +6 -2
- package/src/core/ai/tools/base.ts +16 -7
- package/src/core/ai/tools/edit-notebook-tool.ts +47 -45
- package/src/core/ai/tools/registry.ts +13 -8
- package/src/core/ai/tools/sample-tool.ts +6 -7
- package/src/core/attachments/__tests__/toast.test.tsx +58 -0
- package/src/core/attachments/state.ts +18 -0
- package/src/core/attachments/toast.ts +15 -0
- package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
- package/src/core/cells/__tests__/cell.test.ts +39 -0
- package/src/core/cells/__tests__/cells.test.ts +55 -1
- package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
- package/src/core/cells/__tests__/error-report.test.ts +139 -0
- package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
- package/src/core/cells/__tests__/session.test.ts +167 -37
- package/src/core/cells/cell.ts +14 -3
- package/src/core/cells/cells.ts +3 -1
- package/src/core/cells/error-report.ts +63 -0
- package/src/core/cells/pending-delete-service.ts +2 -6
- package/src/core/cells/session.ts +29 -2
- package/src/core/cells/types.ts +10 -1
- package/src/core/codemirror/__tests__/setup.test.ts +29 -29
- package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -0
- package/src/core/codemirror/cells/extensions.ts +7 -3
- package/src/core/codemirror/keymaps/vim.ts +2 -6
- package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
- package/src/core/codemirror/language/extension.ts +8 -8
- package/src/core/codemirror/language/languages/markdown.ts +8 -6
- package/src/core/codemirror/language/languages/python.ts +16 -10
- package/src/core/codemirror/language/languages/sql/sql.ts +9 -7
- package/src/core/codemirror/language/panel/panel.tsx +1 -0
- package/src/core/codemirror/language/types.ts +7 -7
- package/src/core/codemirror/rtc/extension.ts +24 -12
- package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
- package/src/core/codemirror/rtc/loro/sync.ts +1 -0
- package/src/core/codemirror/utils.ts +1 -0
- package/src/core/config/pair.ts +5 -3
- package/src/core/datasets/__tests__/data-source-discovery.test.ts +4 -4
- package/src/core/datasets/data-source-discovery.ts +4 -6
- package/src/core/document/__tests__/codemirror.test.ts +485 -0
- package/src/core/document/__tests__/draft.test.ts +322 -0
- package/src/core/document/__tests__/fixtures.ts +92 -0
- package/src/core/document/__tests__/hooks.test.tsx +386 -0
- package/src/core/document/__tests__/lifecycle-scenarios.test.ts +61 -0
- package/src/core/document/__tests__/model.test.ts +191 -0
- package/src/core/document/__tests__/protocol-fixtures.ts +38 -0
- package/src/core/document/__tests__/recovery-scenarios.test.ts +230 -0
- package/src/core/document/__tests__/scenario-fixture.ts +43 -0
- package/src/core/document/__tests__/scenarios.test.ts +205 -0
- package/src/core/document/__tests__/state.test.ts +438 -0
- package/src/core/document/__tests__/submission.test.ts +203 -0
- package/src/core/document/__tests__/test-host.test.ts +92 -0
- package/src/core/document/__tests__/test-host.ts +247 -0
- package/src/core/document/__tests__/test-notebook.ts +149 -0
- package/src/core/document/__tests__/user.ts +61 -0
- package/src/core/document/codemirror.ts +311 -0
- package/src/core/document/draft.ts +472 -0
- package/src/core/document/hooks.tsx +118 -0
- package/src/core/document/index.ts +15 -0
- package/src/core/document/model.ts +55 -0
- package/src/core/document/select.ts +41 -0
- package/src/core/document/state.ts +374 -0
- package/src/core/document/sync.ts +369 -0
- package/src/core/edit-app.tsx +2 -2
- package/src/core/host/AGENTS.md +12 -0
- package/src/core/host/__tests__/attachments.test.ts +56 -0
- package/src/core/host/__tests__/document.test.ts +126 -0
- package/src/core/host/__tests__/fixtures.ts +79 -0
- package/src/core/host/__tests__/replica.test.ts +550 -0
- package/src/core/host/__tests__/static.test.ts +175 -0
- package/src/core/host/__tests__/wasm.test.ts +166 -0
- package/src/core/host/backend.ts +19 -0
- package/src/core/host/connection.ts +42 -0
- package/src/core/host/index.ts +14 -0
- package/src/core/host/replica.ts +286 -0
- package/src/core/host/resources/attachments.ts +22 -0
- package/src/core/host/resources/document.ts +101 -0
- package/src/core/host/static.ts +77 -0
- package/src/core/host/wasm.ts +97 -0
- package/src/core/hotkeys/actions.ts +2 -4
- package/src/core/islands/__tests__/bootstrap.test.ts +17 -17
- package/src/core/islands/__tests__/bridge.test.ts +31 -26
- package/src/core/islands/bootstrap.ts +22 -51
- package/src/core/islands/bridge.ts +31 -20
- package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
- package/src/core/islands/worker/__tests__/controller.test.ts +62 -4
- package/src/core/islands/worker/controller.ts +4 -10
- package/src/core/islands/worker/worker.tsx +33 -33
- package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
- package/src/core/network/connection.ts +4 -2
- package/src/core/network/useConnectionNotice.ts +8 -2
- package/src/core/run-app.tsx +2 -2
- package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
- package/src/core/runtime/__tests__/runtime.test.ts +33 -15
- package/src/core/runtime/runtime.ts +39 -30
- package/src/core/saving/save-component.tsx +12 -3
- package/src/core/state/__tests__/jotai.test.tsx +108 -0
- package/src/core/state/jotai.ts +1 -1
- package/src/core/static/__tests__/files.test.ts +38 -10
- package/src/core/static/files.ts +2 -0
- package/src/core/wasm/__tests__/bridge.test.ts +213 -50
- package/src/core/wasm/__tests__/worker.test.ts +187 -0
- package/src/core/wasm/bridge.ts +81 -52
- package/src/core/wasm/rpc.ts +15 -3
- package/src/core/wasm/store.ts +3 -3
- package/src/core/wasm/worker/bootstrap.ts +55 -51
- package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
- package/src/core/wasm/worker/save-worker.ts +9 -10
- package/src/core/wasm/worker/types.ts +29 -18
- package/src/core/wasm/worker/worker.ts +97 -44
- package/src/core/websocket/__tests__/backend.test.ts +235 -0
- package/src/core/websocket/__tests__/{useMarimoKernelConnection.test.ts → connection-state.test.ts} +15 -29
- package/src/core/websocket/__tests__/useNotebookReplica.hook.test.tsx +141 -0
- package/src/core/websocket/__tests__/{useMarimoKernelConnection.hook.test.tsx → useNotebookSession.hook.test.tsx} +197 -184
- package/src/core/websocket/backend.ts +129 -0
- package/src/core/websocket/connection-state.ts +60 -0
- package/src/core/websocket/state.ts +7 -0
- package/src/core/websocket/transports/__tests__/notebook.test.ts +405 -0
- package/src/core/websocket/transports/notebook.ts +159 -0
- package/src/core/websocket/types.ts +9 -39
- package/src/core/websocket/useNotebookReplica.ts +69 -0
- package/src/core/websocket/{useMarimoKernelConnection.tsx → useNotebookSession.tsx} +63 -228
- package/src/css/globals.css +5 -0
- package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
- package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
- package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
- package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
- package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
- package/src/hooks/__tests__/useScript.test.tsx +77 -0
- package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
- package/src/hooks/useAsyncData.ts +3 -3
- package/src/hooks/useDataSourceDiscovery.ts +6 -4
- package/src/hooks/useDebounce.ts +6 -10
- package/src/hooks/useDeepCompareMemoize.ts +1 -1
- package/src/hooks/useDelayElapsed.ts +14 -10
- package/src/hooks/useElapsedTime.ts +3 -3
- package/src/hooks/useEventListener.ts +1 -2
- package/src/hooks/useInputHistory.ts +4 -7
- package/src/hooks/useInternalStateWithSync.ts +6 -6
- package/src/hooks/useResizeObserver.ts +4 -7
- package/src/hooks/useScript.ts +67 -70
- package/src/hooks/useStateForKey.ts +93 -0
- package/src/mount.tsx +3 -3
- package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
- package/src/plugins/core/registerReactComponent.tsx +1 -1
- package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
- package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
- package/src/plugins/impl/DataTablePlugin.tsx +29 -33
- package/src/plugins/impl/DropdownPlugin.tsx +2 -6
- package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
- package/src/plugins/impl/FormPlugin.tsx +1 -1
- package/src/plugins/impl/RangeSliderPlugin.tsx +16 -2
- package/src/plugins/impl/RefreshPlugin.tsx +1 -0
- package/src/plugins/impl/SliderPlugin.tsx +6 -8
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +201 -1
- package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
- package/src/plugins/impl/__tests__/RangeSliderPlugin.test.tsx +109 -0
- package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
- package/src/plugins/impl/anywidget/__tests__/registry.test.ts +2 -0
- package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
- package/src/plugins/impl/anywidget/runtime.ts +21 -9
- package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
- package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
- package/src/plugins/impl/chat/chat-ui.tsx +14 -11
- package/src/plugins/impl/code/any-language-editor.tsx +2 -2
- package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
- package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
- package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
- package/src/plugins/impl/data-explorer/components/column-summary.tsx +4 -2
- package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
- package/src/plugins/impl/data-frames/__tests__/sidebar.test.tsx +160 -0
- package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
- package/src/plugins/impl/data-frames/panel.tsx +43 -16
- package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
- package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
- package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
- package/src/plugins/impl/panel/utils.ts +17 -0
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
- package/src/plugins/impl/plotly/selection.ts +25 -19
- package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
- package/src/plugins/impl/vega/make-selectable.ts +4 -7
- package/src/plugins/layout/RoutesPlugin.tsx +1 -1
- package/src/stories/__tests__/editor-story.test.tsx +33 -0
- package/src/stories/button.stories.tsx +1 -0
- package/src/stories/editor.stories.tsx +24 -17
- package/src/stories/form-wrapper.stories.tsx +2 -2
- package/src/stories/select.stories.tsx +2 -2
- package/src/stories/switchable-multi-select.stories.tsx +1 -1
- package/src/utils/__tests__/arrays.test.ts +35 -0
- package/src/utils/__tests__/batch-requests.test.ts +3 -3
- package/src/utils/__tests__/dates.test.ts +116 -0
- package/src/utils/__tests__/numbers.test.ts +105 -1
- package/src/utils/__tests__/objects.test.ts +21 -0
- package/src/utils/arrays.ts +10 -0
- package/src/utils/blob.ts +1 -1
- package/src/utils/dates.ts +94 -0
- package/src/utils/numbers.ts +79 -18
- package/src/utils/objects.ts +3 -7
- package/src/utils/once.ts +19 -19
- package/src/utils/tracer.ts +9 -5
- package/src/utils/zod-utils.ts +1 -3
- package/dist/any-language-editor-B9REGlD9.js +0 -76
- package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
- package/dist/assets/worker-HPY9fbhz.js +0 -114
- package/dist/error-entries-CzoYkIQZ.js +0 -56
- package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
- package/dist/precisionRound-DMIVQrt2.js +0 -97
- package/src/core/state/__tests__/jotai.test.ts +0 -25
- package/src/core/wasm/worker/message-buffer.ts +0 -33
- package/src/core/websocket/__tests__/useWebSocket.test.ts +0 -49
- package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
- package/src/core/websocket/transports/__tests__/sse.test.ts +0 -338
- package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
- package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
- package/src/core/websocket/transports/basic.ts +0 -102
- package/src/core/websocket/transports/sse.ts +0 -308
- package/src/core/websocket/transports/transport.ts +0 -61
- package/src/core/websocket/transports/ws.ts +0 -98
- package/src/core/websocket/useWebSocket.tsx +0 -88
|
@@ -52,6 +52,7 @@ export const Tracing: React.FC = () => {
|
|
|
52
52
|
|
|
53
53
|
const { theme } = useTheme();
|
|
54
54
|
const [chartPosition, setChartPosition] = useState<ChartPosition>("above");
|
|
55
|
+
const chartPositionId = React.useId();
|
|
55
56
|
const panelSection = usePanelSection();
|
|
56
57
|
|
|
57
58
|
const toggleChartPosition = () => {
|
|
@@ -76,11 +77,12 @@ export const Tracing: React.FC = () => {
|
|
|
76
77
|
<div className="py-1 px-2 overflow-y-scroll h-full">
|
|
77
78
|
<div className="flex flex-row justify-start gap-3">
|
|
78
79
|
<div className="flex flex-row gap-1 items-center">
|
|
79
|
-
<label htmlFor=
|
|
80
|
+
<label htmlFor={chartPositionId} className="text-xs">
|
|
80
81
|
Inline chart
|
|
81
82
|
</label>
|
|
82
83
|
<input
|
|
83
84
|
type="checkbox"
|
|
85
|
+
id={chartPositionId}
|
|
84
86
|
name="chartPosition"
|
|
85
87
|
data-testid="chartPosition"
|
|
86
88
|
onClick={toggleChartPosition}
|
|
@@ -145,11 +147,11 @@ const TraceBlock: React.FC<{
|
|
|
145
147
|
isMostRecentRun: boolean;
|
|
146
148
|
chartPosition: ChartPosition;
|
|
147
149
|
theme: ResolvedTheme;
|
|
148
|
-
}> = ({ run, isMostRecentRun, chartPosition, isExpanded, theme }) => {
|
|
150
|
+
}> = ({ run, isMostRecentRun, chartPosition, isExpanded: expanded, theme }) => {
|
|
149
151
|
const setExpandedRuns = useSetAtom(expandedRunsAtom);
|
|
150
152
|
// We prefer the user's last click, but if they haven't clicked on this run,
|
|
151
153
|
// we expand the most recent run by default, otherwise we collapse it.
|
|
152
|
-
isExpanded =
|
|
154
|
+
const isExpanded = expanded ?? isMostRecentRun;
|
|
153
155
|
|
|
154
156
|
const onToggleExpanded = () => {
|
|
155
157
|
setExpandedRuns((prev) => {
|
|
@@ -163,28 +165,31 @@ const TraceBlock: React.FC<{
|
|
|
163
165
|
const chevron = <Icon height={16} className="inline" />;
|
|
164
166
|
|
|
165
167
|
const traceTitle = (
|
|
166
|
-
<
|
|
168
|
+
<button
|
|
169
|
+
type="button"
|
|
170
|
+
aria-expanded={isExpanded}
|
|
171
|
+
className="text-sm cursor-pointer"
|
|
172
|
+
onClick={onToggleExpanded}
|
|
173
|
+
>
|
|
167
174
|
Run - {formatLogTimestamp(run.runStartTime)}
|
|
168
175
|
{chevron}
|
|
169
|
-
</
|
|
176
|
+
</button>
|
|
170
177
|
);
|
|
171
178
|
|
|
172
|
-
if (!isExpanded) {
|
|
173
|
-
return (
|
|
174
|
-
<div key={run.runId} className="flex flex-col">
|
|
175
|
-
<pre className="font-mono font-semibold">{traceTitle}</pre>
|
|
176
|
-
</div>
|
|
177
|
-
);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
179
|
return (
|
|
181
|
-
<
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
180
|
+
<div
|
|
181
|
+
className={cn(
|
|
182
|
+
"grid grid-cols-1",
|
|
183
|
+
isExpanded &&
|
|
184
|
+
chartPosition === "sideBySide" &&
|
|
185
|
+
"grid-cols-[auto_minmax(0,1fr)] grid-rows-[auto_1fr]",
|
|
186
|
+
)}
|
|
187
|
+
>
|
|
188
|
+
<pre className="font-mono font-semibold">{traceTitle}</pre>
|
|
189
|
+
{isExpanded && (
|
|
190
|
+
<TraceBlockBody run={run} chartPosition={chartPosition} theme={theme} />
|
|
191
|
+
)}
|
|
192
|
+
</div>
|
|
188
193
|
);
|
|
189
194
|
};
|
|
190
195
|
|
|
@@ -192,8 +197,7 @@ const TraceBlockBody: React.FC<{
|
|
|
192
197
|
run: Run;
|
|
193
198
|
chartPosition: ChartPosition;
|
|
194
199
|
theme: ResolvedTheme;
|
|
195
|
-
|
|
196
|
-
}> = ({ run, chartPosition, theme, title }) => {
|
|
200
|
+
}> = ({ run, chartPosition, theme }) => {
|
|
197
201
|
const [hoveredCellId, setHoveredCellId] = useState<CellId | null>();
|
|
198
202
|
const vegaRef = useRef<HTMLDivElement>(null);
|
|
199
203
|
const { ref, width = 300 } = useResizeObserver<HTMLDivElement>();
|
|
@@ -264,16 +268,22 @@ const TraceBlockBody: React.FC<{
|
|
|
264
268
|
}, [embed]);
|
|
265
269
|
|
|
266
270
|
const traceRows = (
|
|
267
|
-
<
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
271
|
+
<div className="font-mono font-semibold">
|
|
272
|
+
<TraceRows
|
|
273
|
+
run={run}
|
|
274
|
+
hoveredCellId={hoveredCellId}
|
|
275
|
+
hiddenInputElementId={hiddenInputElementId}
|
|
276
|
+
/>
|
|
277
|
+
</div>
|
|
272
278
|
);
|
|
273
279
|
|
|
274
280
|
const chartElement = (
|
|
275
281
|
<div
|
|
276
|
-
className={
|
|
282
|
+
className={
|
|
283
|
+
chartPosition === "sideBySide"
|
|
284
|
+
? "-mt-0.5 col-start-2 row-start-1 row-span-2 min-w-0"
|
|
285
|
+
: "min-w-0"
|
|
286
|
+
}
|
|
277
287
|
ref={ref}
|
|
278
288
|
>
|
|
279
289
|
<Suspense>
|
|
@@ -284,24 +294,18 @@ const TraceBlockBody: React.FC<{
|
|
|
284
294
|
|
|
285
295
|
if (chartPosition === "above") {
|
|
286
296
|
return (
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
{traceRows}
|
|
292
|
-
</pre>
|
|
293
|
-
</div>
|
|
297
|
+
<>
|
|
298
|
+
{chartElement}
|
|
299
|
+
{traceRows}
|
|
300
|
+
</>
|
|
294
301
|
);
|
|
295
302
|
}
|
|
296
303
|
|
|
297
304
|
return (
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
{title}
|
|
301
|
-
{traceRows}
|
|
302
|
-
</pre>
|
|
305
|
+
<>
|
|
306
|
+
{traceRows}
|
|
303
307
|
{chartElement}
|
|
304
|
-
|
|
308
|
+
</>
|
|
305
309
|
);
|
|
306
310
|
};
|
|
307
311
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { fireEvent, render, screen } from "@testing-library/react";
|
|
4
|
+
import { expect, it } from "vitest";
|
|
5
|
+
import { DraggablePopover } from "../draggable-popover";
|
|
6
|
+
|
|
7
|
+
it("moves from the keyboard handle without intercepting child input arrows", () => {
|
|
8
|
+
render(
|
|
9
|
+
<DraggablePopover open={true}>
|
|
10
|
+
<input aria-label="Filter" />
|
|
11
|
+
</DraggablePopover>,
|
|
12
|
+
);
|
|
13
|
+
const handle = screen.getByRole("button", {
|
|
14
|
+
name: "Move popup with arrow keys",
|
|
15
|
+
});
|
|
16
|
+
const popup = screen.getByRole("dialog");
|
|
17
|
+
fireEvent.keyDown(handle, { key: "ArrowRight" });
|
|
18
|
+
fireEvent.keyDown(handle, { key: "ArrowDown" });
|
|
19
|
+
expect(popup).toHaveStyle({ left: "10px", top: "10px" });
|
|
20
|
+
expect(
|
|
21
|
+
fireEvent.keyDown(screen.getByRole("textbox"), { key: "ArrowLeft" }),
|
|
22
|
+
).toBe(true);
|
|
23
|
+
expect(popup).toHaveStyle({ left: "10px", top: "10px" });
|
|
24
|
+
});
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { render } from "@testing-library/react";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { RangeSlider } from "../range-slider";
|
|
7
|
+
|
|
8
|
+
vi.mock("react-aria", () => ({
|
|
9
|
+
useLocale: () => ({ locale: "en-US" }),
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
vi.mock("../tooltip", () => {
|
|
13
|
+
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
|
14
|
+
<div>{children}</div>
|
|
15
|
+
);
|
|
16
|
+
const Content = ({ children }: { children: React.ReactNode }) => (
|
|
17
|
+
<div>{children}</div>
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
TooltipContent: Content,
|
|
22
|
+
TooltipPortal: Wrapper,
|
|
23
|
+
TooltipProvider: Wrapper,
|
|
24
|
+
TooltipRoot: Wrapper,
|
|
25
|
+
TooltipTrigger: Wrapper,
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
vi.mock("radix-ui", () => {
|
|
30
|
+
const Primitive = React.forwardRef<
|
|
31
|
+
HTMLDivElement,
|
|
32
|
+
React.HTMLAttributes<HTMLDivElement>
|
|
33
|
+
>(({ children, ...props }, ref) => (
|
|
34
|
+
<div ref={ref} {...props}>
|
|
35
|
+
{children}
|
|
36
|
+
</div>
|
|
37
|
+
));
|
|
38
|
+
Primitive.displayName = "Primitive";
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
Slider: {
|
|
42
|
+
Root: Primitive,
|
|
43
|
+
Track: Primitive,
|
|
44
|
+
Range: Primitive,
|
|
45
|
+
Thumb: Primitive,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe("RangeSlider", () => {
|
|
51
|
+
it("formats both tooltip values without floating-point artifacts", () => {
|
|
52
|
+
const { getAllByText, queryByText } = render(
|
|
53
|
+
<RangeSlider
|
|
54
|
+
aria-label="Range"
|
|
55
|
+
min={0}
|
|
56
|
+
max={10}
|
|
57
|
+
step={0.01}
|
|
58
|
+
value={[1.2, 1.500000000000001]}
|
|
59
|
+
valueMap={(value) => value}
|
|
60
|
+
/>,
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
expect(getAllByText("1.2")).toHaveLength(1);
|
|
64
|
+
expect(getAllByText("1.5")).toHaveLength(1);
|
|
65
|
+
expect(queryByText("1.500000000000001")).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("keeps the legacy precision when no step is supplied", () => {
|
|
69
|
+
const { getAllByText, queryByText } = render(
|
|
70
|
+
<RangeSlider
|
|
71
|
+
aria-label="Range"
|
|
72
|
+
min={0}
|
|
73
|
+
max={10}
|
|
74
|
+
value={[1.2, 1.500000000000001]}
|
|
75
|
+
valueMap={(value) => value}
|
|
76
|
+
/>,
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
expect(getAllByText("1.2")).toHaveLength(1);
|
|
80
|
+
expect(getAllByText("1.5")).toHaveLength(1);
|
|
81
|
+
expect(queryByText("1.500000000000001")).toBeNull();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("retains value precision when no step is supplied", () => {
|
|
85
|
+
const { getByText } = render(
|
|
86
|
+
<RangeSlider
|
|
87
|
+
aria-label="Range"
|
|
88
|
+
min={0}
|
|
89
|
+
max={10}
|
|
90
|
+
value={[1.2345, 1.500000000000001]}
|
|
91
|
+
valueMap={(value) => value}
|
|
92
|
+
/>,
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
expect(getByText("1.2345")).toBeDefined();
|
|
96
|
+
expect(getByText("1.5")).toBeDefined();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("preserves precision from finer-grained steps", () => {
|
|
100
|
+
const { getAllByText, queryByText } = render(
|
|
101
|
+
<RangeSlider
|
|
102
|
+
aria-label="Range"
|
|
103
|
+
min={0}
|
|
104
|
+
max={10}
|
|
105
|
+
step={0.001}
|
|
106
|
+
value={[1.234, 1.235000000000001]}
|
|
107
|
+
valueMap={(value) => value}
|
|
108
|
+
/>,
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
expect(getAllByText("1.234")).toHaveLength(1);
|
|
112
|
+
expect(getAllByText("1.235")).toHaveLength(1);
|
|
113
|
+
expect(queryByText("1.23")).toBeNull();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("preserves precision for small tooltip values", () => {
|
|
117
|
+
const { getByText } = render(
|
|
118
|
+
<RangeSlider
|
|
119
|
+
aria-label="Range"
|
|
120
|
+
min={0}
|
|
121
|
+
max={0.01}
|
|
122
|
+
step={0.00001}
|
|
123
|
+
value={[0.00123, 0.0012400000000000002]}
|
|
124
|
+
valueMap={(value) => value}
|
|
125
|
+
/>,
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
expect(getByText("1.23e-3")).toBeDefined();
|
|
129
|
+
expect(getByText("1.24e-3")).toBeDefined();
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("infers precision from custom mapped steps", () => {
|
|
133
|
+
const steps = [1, 1.234, 2];
|
|
134
|
+
const { getAllByText } = render(
|
|
135
|
+
<RangeSlider
|
|
136
|
+
aria-label="Range"
|
|
137
|
+
min={0}
|
|
138
|
+
max={steps.length - 1}
|
|
139
|
+
step={1}
|
|
140
|
+
steps={steps}
|
|
141
|
+
value={[0, 1]}
|
|
142
|
+
valueMap={(value) => steps[value]}
|
|
143
|
+
/>,
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
expect(getAllByText("1")).toHaveLength(1);
|
|
147
|
+
expect(getAllByText("1.234")).toHaveLength(1);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("preserves decimals from the slider origin", () => {
|
|
151
|
+
const { getAllByText } = render(
|
|
152
|
+
<RangeSlider
|
|
153
|
+
aria-label="Range"
|
|
154
|
+
min={0.5}
|
|
155
|
+
max={10.5}
|
|
156
|
+
step={1}
|
|
157
|
+
value={[0.5, 1.5]}
|
|
158
|
+
valueMap={(value) => value}
|
|
159
|
+
/>,
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
expect(getAllByText("0.5")).toHaveLength(1);
|
|
163
|
+
expect(getAllByText("1.5")).toHaveLength(1);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
@@ -28,7 +28,7 @@ AlertDialogPortal.displayName = AlertDialogPrimitive.Portal.displayName;
|
|
|
28
28
|
const AlertDialogOverlay = React.forwardRef<
|
|
29
29
|
React.ElementRef<typeof AlertDialogPrimitive.Overlay>,
|
|
30
30
|
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>
|
|
31
|
-
>(({ className, children, ...props }, ref) => (
|
|
31
|
+
>(({ className, children: _children, ...props }, ref) => (
|
|
32
32
|
<AlertDialogPrimitive.Overlay
|
|
33
33
|
className={cn(
|
|
34
34
|
"fixed inset-0 z-50 bg-background/80 backdrop-blur-xs transition-opacity animate-in fade-in",
|
|
@@ -53,14 +53,36 @@ export const DraggablePopover = ({
|
|
|
53
53
|
top: position.y,
|
|
54
54
|
}}
|
|
55
55
|
>
|
|
56
|
-
<
|
|
56
|
+
<button
|
|
57
|
+
type="button"
|
|
58
|
+
aria-label="Move popup with arrow keys"
|
|
57
59
|
onMouseDown={handleMouseDown}
|
|
60
|
+
onKeyDown={(e) => {
|
|
61
|
+
const directions: Record<
|
|
62
|
+
string,
|
|
63
|
+
{ x: number; y: number } | undefined
|
|
64
|
+
> = {
|
|
65
|
+
ArrowLeft: { x: -10, y: 0 },
|
|
66
|
+
ArrowRight: { x: 10, y: 0 },
|
|
67
|
+
ArrowUp: { x: 0, y: -10 },
|
|
68
|
+
ArrowDown: { x: 0, y: 10 },
|
|
69
|
+
};
|
|
70
|
+
const offset = directions[e.key];
|
|
71
|
+
if (offset) {
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
e.stopPropagation();
|
|
74
|
+
setPosition((previous) => ({
|
|
75
|
+
x: previous.x + offset.x,
|
|
76
|
+
y: previous.y + offset.y,
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
}}
|
|
58
80
|
className={`flex items-center justify-center absolute top-0 left-1/2 -translate-x-1/2 ${
|
|
59
81
|
isDragging ? "cursor-grabbing" : "cursor-grab"
|
|
60
82
|
}`}
|
|
61
83
|
>
|
|
62
84
|
<GripHorizontalIcon className="h-5 w-5 mt-1 text-muted-foreground/40" />
|
|
63
|
-
</
|
|
85
|
+
</button>
|
|
64
86
|
{children}
|
|
65
87
|
</PopoverContent>
|
|
66
88
|
</Popover>
|
|
@@ -4,7 +4,10 @@ import { Slider as SliderPrimitive } from "radix-ui";
|
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
import { useLocale } from "react-aria";
|
|
6
6
|
import { cn } from "@/utils/cn";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
fractionDigitsForSlider,
|
|
9
|
+
prettyScientificNumber,
|
|
10
|
+
} from "@/utils/numbers";
|
|
8
11
|
import { useBoolean } from "../../hooks/useBoolean";
|
|
9
12
|
import {
|
|
10
13
|
TooltipContent,
|
|
@@ -20,9 +23,15 @@ const RangeSlider = React.forwardRef<
|
|
|
20
23
|
valueMap: (sliderValue: number) => number;
|
|
21
24
|
steps?: number[];
|
|
22
25
|
}
|
|
23
|
-
>(({ className, valueMap, ...props }, ref) => {
|
|
26
|
+
>(({ className, steps, valueMap, ...props }, ref) => {
|
|
24
27
|
const [open, openActions] = useBoolean(false);
|
|
25
28
|
const { locale } = useLocale();
|
|
29
|
+
const fractionDigits = fractionDigitsForSlider(
|
|
30
|
+
props.step,
|
|
31
|
+
steps,
|
|
32
|
+
props.min,
|
|
33
|
+
props.value?.map(valueMap),
|
|
34
|
+
);
|
|
26
35
|
|
|
27
36
|
const isDraggingRange = React.useRef(false);
|
|
28
37
|
const dragStartX = React.useRef(0);
|
|
@@ -94,11 +103,9 @@ const RangeSlider = React.forwardRef<
|
|
|
94
103
|
const [origLeft, origRight] = dragStartValue.current;
|
|
95
104
|
const rangeWidth = origRight - origLeft;
|
|
96
105
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
? Math.min(...steps.slice(1).map((s, i) => s - steps[i]))
|
|
101
|
-
: (props.step ?? 1);
|
|
106
|
+
// `steps` contains mapped display values, while pointer movement happens
|
|
107
|
+
// in the slider's index/value space. Use the Radix step for snapping.
|
|
108
|
+
const step = props.step ?? 1;
|
|
102
109
|
const snappedDelta = Math.round(delta / step) * step;
|
|
103
110
|
|
|
104
111
|
const clampedDelta = Math.max(
|
|
@@ -177,7 +184,10 @@ const RangeSlider = React.forwardRef<
|
|
|
177
184
|
<TooltipPortal>
|
|
178
185
|
{props.value != null && props.value.length === 2 && (
|
|
179
186
|
<TooltipContent key={props.value[0]}>
|
|
180
|
-
{prettyScientificNumber(valueMap(props.value[0]), {
|
|
187
|
+
{prettyScientificNumber(valueMap(props.value[0]), {
|
|
188
|
+
maximumFractionDigits: fractionDigits,
|
|
189
|
+
locale,
|
|
190
|
+
})}
|
|
181
191
|
</TooltipContent>
|
|
182
192
|
)}
|
|
183
193
|
</TooltipPortal>
|
|
@@ -198,7 +208,10 @@ const RangeSlider = React.forwardRef<
|
|
|
198
208
|
<TooltipPortal>
|
|
199
209
|
{props.value != null && props.value.length === 2 && (
|
|
200
210
|
<TooltipContent key={props.value[1]}>
|
|
201
|
-
{prettyScientificNumber(valueMap(props.value[1]), {
|
|
211
|
+
{prettyScientificNumber(valueMap(props.value[1]), {
|
|
212
|
+
maximumFractionDigits: fractionDigits,
|
|
213
|
+
locale,
|
|
214
|
+
})}
|
|
202
215
|
</TooltipContent>
|
|
203
216
|
)}
|
|
204
217
|
</TooltipPortal>
|
|
@@ -98,8 +98,12 @@ export class DatasourceContextProvider extends AIContextProvider<DatasourceConte
|
|
|
98
98
|
public formatContext(item: DatasourceContextItem): string {
|
|
99
99
|
const data = item.data;
|
|
100
100
|
// Remove certain fields that are not needed in the context
|
|
101
|
-
const {
|
|
102
|
-
|
|
101
|
+
const {
|
|
102
|
+
name,
|
|
103
|
+
display_name: _displayName,
|
|
104
|
+
source: _source,
|
|
105
|
+
...filteredDatasource
|
|
106
|
+
} = data.connection;
|
|
103
107
|
|
|
104
108
|
let datasource = filteredDatasource;
|
|
105
109
|
const isInternalEngine = INTERNAL_SQL_ENGINES.has(name as ConnectionName);
|
|
@@ -20,9 +20,11 @@ export type StatusValue = "success" | "error" | "warning";
|
|
|
20
20
|
* @example
|
|
21
21
|
* throw new ToolExecutionError(
|
|
22
22
|
* "Failed to fetch data",
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
23
|
+
* {
|
|
24
|
+
* code: "FETCH_ERROR",
|
|
25
|
+
* isRetryable: true,
|
|
26
|
+
* suggestedFix: "Check your network connection",
|
|
27
|
+
* }
|
|
26
28
|
* );
|
|
27
29
|
*/
|
|
28
30
|
export class ToolExecutionError extends Error {
|
|
@@ -33,10 +35,17 @@ export class ToolExecutionError extends Error {
|
|
|
33
35
|
|
|
34
36
|
public constructor(
|
|
35
37
|
message: string,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
{
|
|
39
|
+
code = "TOOL_ERROR",
|
|
40
|
+
isRetryable = false,
|
|
41
|
+
suggestedFix,
|
|
42
|
+
meta,
|
|
43
|
+
}: {
|
|
44
|
+
code?: string;
|
|
45
|
+
isRetryable?: boolean;
|
|
46
|
+
suggestedFix?: string;
|
|
47
|
+
meta?: Record<string, unknown>;
|
|
48
|
+
} = {},
|
|
40
49
|
) {
|
|
41
50
|
super(message);
|
|
42
51
|
this.name = "ToolExecutionError";
|
|
@@ -94,19 +94,17 @@ export class EditNotebookTool implements AiTool<
|
|
|
94
94
|
const cellId = position.cellId as CellId | undefined;
|
|
95
95
|
|
|
96
96
|
if (!cellId) {
|
|
97
|
-
throw new ToolExecutionError(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
);
|
|
97
|
+
throw new ToolExecutionError("Cell ID is required for update_cell", {
|
|
98
|
+
code: "CELL_ID_REQUIRED_FOR_UPDATE_CELL",
|
|
99
|
+
isRetryable: true,
|
|
100
|
+
suggestedFix: "Provide a cell ID to update",
|
|
101
|
+
});
|
|
103
102
|
} else if (!code) {
|
|
104
|
-
throw new ToolExecutionError(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
);
|
|
103
|
+
throw new ToolExecutionError("Code is required for update_cell", {
|
|
104
|
+
code: "CODE_REQUIRED_FOR_UPDATE_CELL",
|
|
105
|
+
isRetryable: true,
|
|
106
|
+
suggestedFix: "Provide the new code to update the cell",
|
|
107
|
+
});
|
|
110
108
|
}
|
|
111
109
|
|
|
112
110
|
const notebook = store.get(notebookAtom);
|
|
@@ -157,18 +155,22 @@ export class EditNotebookTool implements AiTool<
|
|
|
157
155
|
if (!cellId) {
|
|
158
156
|
throw new ToolExecutionError(
|
|
159
157
|
"Cell ID is required for add_cell with relative position",
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
158
|
+
{
|
|
159
|
+
code: "TOOL_ERROR",
|
|
160
|
+
isRetryable: true,
|
|
161
|
+
suggestedFix: "Provide a cell ID to add the cell before",
|
|
162
|
+
},
|
|
163
163
|
);
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
if (position.before === undefined) {
|
|
167
167
|
throw new ToolExecutionError(
|
|
168
168
|
"Before is required for add_cell with relative position",
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
169
|
+
{
|
|
170
|
+
code: "TOOL_ERROR",
|
|
171
|
+
isRetryable: true,
|
|
172
|
+
suggestedFix: `Provide a boolean value for before, true to add before cell ${cellId}, false to add after the cell`,
|
|
173
|
+
},
|
|
172
174
|
);
|
|
173
175
|
}
|
|
174
176
|
|
|
@@ -181,9 +183,12 @@ export class EditNotebookTool implements AiTool<
|
|
|
181
183
|
if (!position.columnIndex) {
|
|
182
184
|
throw new ToolExecutionError(
|
|
183
185
|
"Column index is required for add_cell with column_end position",
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
186
|
+
{
|
|
187
|
+
code: "TOOL_ERROR",
|
|
188
|
+
isRetryable: true,
|
|
189
|
+
suggestedFix:
|
|
190
|
+
"Provide a column index to add the cell at the end of",
|
|
191
|
+
},
|
|
187
192
|
);
|
|
188
193
|
}
|
|
189
194
|
|
|
@@ -218,12 +223,11 @@ export class EditNotebookTool implements AiTool<
|
|
|
218
223
|
const cellId = position.cellId as CellId | undefined;
|
|
219
224
|
|
|
220
225
|
if (!cellId) {
|
|
221
|
-
throw new ToolExecutionError(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
);
|
|
226
|
+
throw new ToolExecutionError("Cell ID is required for delete_cell", {
|
|
227
|
+
code: "CELL_ID_REQUIRED_FOR_DELETE_CELL",
|
|
228
|
+
isRetryable: true,
|
|
229
|
+
suggestedFix: "Provide a cell ID to delete",
|
|
230
|
+
});
|
|
227
231
|
}
|
|
228
232
|
|
|
229
233
|
const notebook = store.get(notebookAtom);
|
|
@@ -255,12 +259,11 @@ export class EditNotebookTool implements AiTool<
|
|
|
255
259
|
private validateCellIdExists(cellId: CellId, notebook: NotebookState) {
|
|
256
260
|
const cellIds = notebook.cellIds;
|
|
257
261
|
if (!cellIds.getColumns().some((column) => column.idSet.has(cellId))) {
|
|
258
|
-
throw new ToolExecutionError(
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
);
|
|
262
|
+
throw new ToolExecutionError("Cell not found", {
|
|
263
|
+
code: "CELL_NOT_FOUND",
|
|
264
|
+
isRetryable: false,
|
|
265
|
+
suggestedFix: "Check which cells exist in the notebook",
|
|
266
|
+
});
|
|
264
267
|
}
|
|
265
268
|
}
|
|
266
269
|
|
|
@@ -272,12 +275,12 @@ export class EditNotebookTool implements AiTool<
|
|
|
272
275
|
const columns = cellIds.getColumns();
|
|
273
276
|
|
|
274
277
|
if (columnIndex < 0 || columnIndex >= columns.length) {
|
|
275
|
-
throw new ToolExecutionError(
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
);
|
|
278
|
+
throw new ToolExecutionError("Column index is out of range", {
|
|
279
|
+
code: "COLUMN_INDEX_OUT_OF_RANGE",
|
|
280
|
+
isRetryable: true,
|
|
281
|
+
suggestedFix:
|
|
282
|
+
"Choose a column index between 0 and the number of columns in the notebook (0-based)",
|
|
283
|
+
});
|
|
281
284
|
}
|
|
282
285
|
return columns[columnIndex].id;
|
|
283
286
|
}
|
|
@@ -289,12 +292,11 @@ export class EditNotebookTool implements AiTool<
|
|
|
289
292
|
const cellHandles = notebook.cellHandles;
|
|
290
293
|
const cellHandle = cellHandles[cellId].current;
|
|
291
294
|
if (!cellHandle?.editorView) {
|
|
292
|
-
throw new ToolExecutionError(
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
);
|
|
295
|
+
throw new ToolExecutionError("Cell editor not found", {
|
|
296
|
+
code: "CELL_EDITOR_NOT_FOUND",
|
|
297
|
+
isRetryable: false,
|
|
298
|
+
suggestedFix: "Internal error, ask the user to report this error",
|
|
299
|
+
});
|
|
298
300
|
}
|
|
299
301
|
return cellHandle.editorView;
|
|
300
302
|
}
|