@marimo-team/frontend 0.24.1-dev99 → 0.24.2-dev129
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{CellStatus-wvvZkEPY.js → CellStatus-LoTwk7fR.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-Dkqk66Mv.js → ConnectedDataExplorerComponent-DW6cJ-Lr.js} +1 -1
- package/dist/assets/{ErrorBoundary-npvnLp9x.js → ErrorBoundary-CDVGFYfr.js} +1 -1
- package/dist/assets/JsonOutput-CzIGPEZQ.js +50 -0
- package/dist/assets/{LazyAnyLanguageCodeMirror-zSwE3dvU.js → LazyAnyLanguageCodeMirror-LboTfNDv.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-CeUo5oka.js → MarimoErrorOutput-DqpoYOvw.js} +1 -1
- package/dist/assets/RenderHTML-DwhMAd9l.js +1 -0
- package/dist/assets/{RunButton-BaV8A-z4.js → RunButton-BlpbweyH.js} +1 -1
- package/dist/assets/{VisuallyHidden-SChAyKIQ.js → VisuallyHidden-CBMDmozt.js} +1 -1
- package/dist/assets/{add-cell-with-ai-DoLkfzYn.js → add-cell-with-ai-R-3DS79K.js} +1 -1
- package/dist/assets/{add-connection-dialog-C1IF1nR0.js → add-connection-dialog-BGfpw5lC.js} +1 -1
- package/dist/assets/{agent-panel-CG154QrU.js → agent-panel-Cgt_K0tD.js} +1 -1
- package/dist/assets/ai-model-dropdown-DCmiuk7x.js +3 -0
- package/dist/assets/alert-dialog-CA-2mBs3.js +11 -0
- package/dist/assets/any-language-editor-DflLjPSQ.js +1 -0
- package/dist/assets/{app-config-button-ktBH1pEB.js → app-config-button-DUJC6b6x.js} +1 -1
- package/dist/assets/badge-BSgtkC2e.js +1 -0
- package/dist/assets/{blob-DVtvZmWH.js → blob-B2d_dHwI.js} +1 -1
- package/dist/assets/button-Dh8EwhsF.js +1 -0
- package/dist/assets/{cache-panel-C7jsiqCa.js → cache-panel-DqgtC98s.js} +1 -1
- package/dist/assets/{capabilities-LWzb3E3M.js → capabilities-D8kPgMKr.js} +1 -1
- package/dist/assets/{cell-editor-DoDqaCZp.js → cell-editor-Dw09J9yD.js} +6 -6
- package/dist/assets/{cell-link-Dqqt6Rgs.js → cell-link-6burT2XF.js} +1 -1
- package/dist/assets/{cells-D4RwofRx.js → cells-Cp-G34Rz.js} +56 -56
- package/dist/assets/{chat-display-COmzHgx5.js → chat-display-Bu405iyc.js} +1 -1
- package/dist/assets/{chat-panel-B2tyEfGW.js → chat-panel-BlUwNY5j.js} +1 -1
- package/dist/assets/{chat-ui-B5bsr-7V.js → chat-ui-DGiVDzNh.js} +1 -1
- package/dist/assets/{circle--ysFeW9z.js → circle-ByJdIf5p.js} +1 -1
- package/dist/assets/{column-preview-CW5DPFvy.js → column-preview-riSXbYe_.js} +1 -1
- package/dist/assets/{command-palette-B9dyvMvJ.js → command-palette-CCVzJcyf.js} +1 -1
- package/dist/assets/{common-CC3tuCpi.js → common-CHR7w7aQ.js} +1 -1
- package/dist/assets/{components-D02ZZZMP.js → components-C7mWrmXr.js} +1 -1
- package/dist/assets/{components-CBlGIIAX.js → components-DUYCXngU.js} +1 -1
- package/dist/assets/config-B-r81uZ6.js +1 -0
- package/dist/assets/{config-D4frVGQ4.js → config-BlNM0caL.js} +1 -1
- package/dist/assets/{copy-Cg05mM3C.js → copy-DlEomWzI.js} +1 -1
- package/dist/assets/{copy-icon-CRxVZTJ9.js → copy-icon-z8fuTE3w.js} +1 -1
- package/dist/assets/{createReducer-Bq-nQJiK.js → createReducer-B_XmHROl.js} +1 -1
- package/dist/assets/{datasource-Do8f2hFf.js → datasource-DrODSIs0.js} +1 -1
- package/dist/assets/{dates-DK5JikJo.js → dates-B58T85Jq.js} +1 -1
- package/dist/assets/dependency-graph-panel-AY5BEVH2.js +5 -0
- package/dist/assets/{dist-7qdHLg-L.js → dist-B0RXffUm.js} +1 -1
- package/dist/assets/dist-B0qYy1Ye.js +1 -0
- package/dist/assets/{dist-B97dKQGP.js → dist-B8pdsUrS.js} +1 -1
- package/dist/assets/{dist-BcfF-rkl.js → dist-BF7Lrekv.js} +1 -1
- package/dist/assets/dist-BL8RjfvI.js +1 -0
- package/dist/assets/dist-BVZxge7j.js +1 -0
- package/dist/assets/{dist-fxnYzq-R.js → dist-BaRNSaca.js} +1 -1
- package/dist/assets/dist-Bk2yQtw4.js +1 -0
- package/dist/assets/dist-BsfiiKoy.js +1 -0
- package/dist/assets/dist-BskmVd3B.js +1 -0
- package/dist/assets/{dist-DL1Thauf.js → dist-Bsu3h9O7.js} +1 -1
- package/dist/assets/{dist-PIe1xcZo.js → dist-BtC9ym6k.js} +7 -7
- package/dist/assets/{dist-DeuWxYVk.js → dist-Bv0S1RlZ.js} +1 -1
- package/dist/assets/{dist-CidBzUqR.js → dist-C--ZICxQ.js} +1 -1
- package/dist/assets/dist-C-2fD3XY.js +1 -0
- package/dist/assets/{dist-DzAWvPVK.js → dist-CKUpxYGQ.js} +1 -1
- package/dist/assets/dist-CMFMfBm1.js +1 -0
- package/dist/assets/dist-CZNULd6Z.js +2 -0
- package/dist/assets/dist-CjFduPiC.js +1 -0
- package/dist/assets/{dist-DoAjHgMj.js → dist-CmImLjus.js} +1 -1
- package/dist/assets/{dist-BKx0MLbb.js → dist-Cq8NOszX.js} +1 -1
- package/dist/assets/{dist-DCc0VfiO.js → dist-Cx4BE7jC.js} +3 -3
- package/dist/assets/dist-D45ScydS.js +1 -0
- package/dist/assets/dist-D6dg87r7.js +1 -0
- package/dist/assets/dist-DEjfQLz0.js +1 -0
- package/dist/assets/{dist-BcYW-EJk.js → dist-DJOWOALB.js} +1 -1
- package/dist/assets/{dist-CxxZaSme.js → dist-DPoYlxSC.js} +1 -1
- package/dist/assets/dist-DR-Y-nl3.js +1 -0
- package/dist/assets/dist-Dahlp9JQ.js +1 -0
- package/dist/assets/{dist-DIkuvChK.js → dist-Db-HC93w.js} +1 -1
- package/dist/assets/{dist-DTM7BAUu.js → dist-DdOlZ6mj.js} +1 -1
- package/dist/assets/{dist-Dz_04liz.js → dist-DiYjQAhI.js} +1 -1
- package/dist/assets/{dist-BO5c5n_b.js → dist-DkPPv0FB.js} +1 -1
- package/dist/assets/{dist-DkCO0b-0.js → dist-DmGtPaVM.js} +1 -1
- package/dist/assets/{dist-CXmhxecl.js → dist-DnxYYyU7.js} +1 -1
- package/dist/assets/{dist-CO1Hfv5H.js → dist-Dw9YRsCU.js} +1 -1
- package/dist/assets/dist-Dwx3KdUP.js +1 -0
- package/dist/assets/{dist-BgL43w5r.js → dist-DzCQtGkt.js} +1 -1
- package/dist/assets/dist-JweaDt6P.js +1 -0
- package/dist/assets/{dist-Dbu5sPgR.js → dist-gELFCfHH.js} +1 -1
- package/dist/assets/dist-kGDJ0AWF.js +1 -0
- package/dist/assets/{dist-Cqm1W-Zm.js → dist-kaLvV_d4.js} +1 -1
- package/dist/assets/{dist-CEeRVpMD.js → dist-qvk3g06H.js} +1 -1
- package/dist/assets/dist-wCw2twuB.js +1 -0
- package/dist/assets/dist-wF42tUcr.js +1 -0
- package/dist/assets/dist-wY2yia-1.js +3 -0
- package/dist/assets/{documentation-panel-DvHjxlli.js → documentation-panel-CaJF7e-j.js} +1 -1
- package/dist/assets/{download-BP8MrprC.js → download-DMxOzI7b.js} +1 -1
- package/dist/assets/dropdown-menu-C40jM9o4.js +1 -0
- package/dist/assets/{edit-page-71cK-Nhe.js → edit-page-Vqd9NedM.js} +6 -6
- package/dist/assets/{error-banner-BYN8YUMe.js → error-banner-Dw5YY9wq.js} +1 -1
- package/dist/assets/{error-entries-DOZ1u97X.js → error-entries-Cv2m1yhc.js} +1 -1
- package/dist/assets/{error-panel-CINcf76Z.js → error-panel-Bhlvt6_H.js} +1 -1
- package/dist/assets/{es-BuMFDpR4.js → es-CrFhA96G.js} +1 -1
- package/dist/assets/{esm-Dw0vvSg2.js → esm-BHMOvJzM.js} +1 -1
- package/dist/assets/{esm-BGpfQNhD.js → esm-DmqQGMel.js} +1 -1
- package/dist/assets/file-explorer-panel-6HvNfCrJ.js +1 -0
- package/dist/assets/{file-icons-DgKj9mrV.js → file-icons-DdGYuADJ.js} +1 -1
- package/dist/assets/file-name-input-K4MKESI_.js +3 -0
- package/dist/assets/{floating-outline-CRXIsrPm.js → floating-outline-DaUHnl_e.js} +1 -1
- package/dist/assets/{formats-DSzGCKeO.js → formats-C6s96nu2.js} +1 -1
- package/dist/assets/{formatting-BJlT1s_3.js → formatting-BWZH2nBg.js} +1 -1
- package/dist/assets/{fullscreen-0EEPR7uc.js → fullscreen-BH2jz-F4.js} +5 -5
- package/dist/assets/{gallery-page-TqnFYECu.js → gallery-page-C3pBpHlY.js} +1 -1
- package/dist/assets/{glide-data-editor-DcY3nXI8.js → glide-data-editor-sICUMEhk.js} +1 -1
- package/dist/assets/{glide-utils-CR1sWLZU.js → glide-utils-UGsrRHYj.js} +1 -1
- package/dist/assets/home-page-BLd6rnbk.js +4 -0
- package/dist/assets/{html-to-image-DMn_7CCA.js → html-to-image-D6GUC5q6.js} +1 -1
- package/dist/assets/index-BGT7have.css +2 -0
- package/dist/assets/index-ipFYAeCF.js +29 -0
- package/dist/assets/{input-Daz6sk8l.js → input-DEbY281O.js} +2 -2
- package/dist/assets/{kiosk-mode-CzGt3mc2.js → kiosk-mode-mxgb5lWf.js} +1 -1
- package/dist/assets/{layout-KJMQADEj.js → layout-DWnrxIo2.js} +5 -5
- package/dist/assets/links-DLvOXyO_.js +1 -0
- package/dist/assets/{logs-panel-DFibPeCT.js → logs-panel-BGS2v3ba.js} +1 -1
- package/dist/assets/lua-1tNpM92n.js +1 -0
- package/dist/assets/{lua-CRIS5afH.js → lua-DXBxhmso.js} +1 -1
- package/dist/assets/{markdown-renderer-CdZX2MvM.js → markdown-renderer-BZKlbm2Q.js} +1 -1
- package/dist/assets/menu-items-BSRA2YI9.js +1 -0
- package/dist/assets/{mermaid-CeseGGnS.js → mermaid-l6lQkCib.js} +1 -1
- package/dist/assets/{name-cell-input-B-d5Jwh4.js → name-cell-input-BMCdK-el.js} +1 -1
- package/dist/assets/{numbers-DKurV_vq.js → numbers-Bc-r3jsC.js} +1 -1
- package/dist/assets/{outline-panel-D2Wk10hY.js → outline-panel-Dr5u73V6.js} +1 -1
- package/dist/assets/{packages-panel-CQsbxIlG.js → packages-panel-BdpRg9tX.js} +1 -1
- package/dist/assets/{pair-with-agent-modal-CNxmIMFM.js → pair-with-agent-modal-CbUFKJHP.js} +1 -1
- package/dist/assets/{panel-accordion-state-D6-FMXE2.js → panel-accordion-state-DjUTN7i5.js} +1 -1
- package/dist/assets/{panels-BgcK_4M7.js → panels-CWn0Yh1D.js} +1 -1
- package/dist/assets/process-output-Ck7-P_xp.js +1 -0
- package/dist/assets/{readonly-code-display-BvqLeUsJ.js → readonly-code-display--S2daDa6.js} +1 -1
- package/dist/assets/{readonly-python-code-GSN4D4sb.js → readonly-python-code-DpIyjHqY.js} +1 -1
- package/dist/assets/{renderShortcut-DK_OucLT.js → renderShortcut-X-CJUSM8.js} +1 -1
- package/dist/assets/{reveal-component-u9ED2diI.js → reveal-component-nZIAapoD.js} +1 -1
- package/dist/assets/{run-page-U5iuhyz8.js → run-page-9pl8qhQR.js} +1 -1
- package/dist/assets/{runs-BQTlv6Ja.js → runs-euHSzlw_.js} +1 -1
- package/dist/assets/{scratchpad-panel--YOR0kUB.js → scratchpad-panel-BleGt2KM.js} +1 -1
- package/dist/assets/{scroll-to-bottom-button-xua0e9rA.js → scroll-to-bottom-button-DufiYUD7.js} +1 -1
- package/dist/assets/{secrets-panel-CZPbFAZH.js → secrets-panel-D3BpDIgg.js} +1 -1
- package/dist/assets/select-nLt2y0Sw.js +1 -0
- package/dist/assets/{session-CEdta5_Q.js → session-Sz5nSFku.js} +1 -1
- package/dist/assets/session-panel-DRGPlL5J.js +1 -0
- package/dist/assets/{share-C2MPy_VX.js → share-CPtBiNgr.js} +1 -1
- package/dist/assets/{skeleton-CsceCAjw.js → skeleton-BKeh8hf3.js} +1 -1
- package/dist/assets/{snippets-panel-BxwHsPmW.js → snippets-panel-D5yy7kj0.js} +1 -1
- package/dist/assets/{spec-CUFquO6R.js → spec-DKsAmLTi.js} +1 -1
- package/dist/assets/{state-BqrF--O0.js → state-B6AklCzD.js} +1 -1
- package/dist/assets/{state-C2c3_VuY.js → state-B8XRqyFg.js} +1 -1
- package/dist/assets/{state-CHplO0zn.js → state-Di9TbuV9.js} +1 -1
- package/dist/assets/{strings-CpYReX2Q.js → strings-CReV1AYG.js} +1 -1
- package/dist/assets/{swiper-component-Bot7ehYH.js → swiper-component-5Kdi1-Gn.js} +1 -1
- package/dist/assets/{switch-CtH5Ct94.js → switch-DjXr9Y9D.js} +1 -1
- package/dist/assets/{tabs-c6mpccpH.js → tabs-Cy1qXLzH.js} +1 -1
- package/dist/assets/{terminal-C73iz1fU.js → terminal-CQAFGBfN.js} +1 -1
- package/dist/assets/{tooltip-Cwltdez8.js → tooltip-BG35uS_N.js} +1 -1
- package/dist/assets/{tooltip-D7dq6bnc.js → tooltip-BUtPzKB4.js} +1 -1
- package/dist/assets/{tracing-Dhq121dR.js → tracing-DNk3gmWv.js} +1 -1
- package/dist/assets/{tracing-panel-IKt1933_.js → tracing-panel-Yqazr6w_.js} +2 -2
- package/dist/assets/{tree-actions-DIfWonCA.js → tree-actions-CG5g7aUQ.js} +1 -1
- package/dist/assets/{useAddCell-BYrVaYfZ.js → useAddCell-DdB_uBif.js} +1 -1
- package/dist/assets/{useBoolean-ZU5StAbr.js → useBoolean-BXC4CItZ.js} +1 -1
- package/dist/assets/{useCellActionButton-DbXDs0MA.js → useCellActionButton-B31neI3m.js} +1 -1
- package/dist/assets/{useDebounce-Dulm61-t.js → useDebounce-DgpSQhrP.js} +1 -1
- package/dist/assets/{useDeleteCell-Wgcl3CRG.js → useDeleteCell-Bz49_cFj.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-C5AU8GKL.js → useDependencyPanelTab-C_ps0r--.js} +1 -1
- package/dist/assets/{useEventListener-D27Dii_l.js → useEventListener-92uWqz-P.js} +1 -1
- package/dist/assets/{useIframeCapabilities-DEpTCh1Q.js → useIframeCapabilities-C7Di8f2y.js} +1 -1
- package/dist/assets/{useInstallPackage-u7d0wo79.js → useInstallPackage-DsD08SLK.js} +1 -1
- package/dist/assets/{useInterval-B1_J4wdT.js → useInterval-B4v7_zd0.js} +1 -1
- package/dist/assets/{useNotebookActions-FuMERtHq.js → useNotebookActions-CQtbk9CB.js} +2 -2
- package/dist/assets/{useRunCells-DTdMRbkE.js → useRunCells-CX7oW5zy.js} +1 -1
- package/dist/assets/{useSplitCell-2z0zEB8X.js → useSplitCell-Dy2_DmJR.js} +1 -1
- package/dist/assets/{useTheme-CF-zG9YH.js → useTheme-C-ri8BtY.js} +1 -1
- package/dist/assets/utils-D5Ywm7-q.js +1 -0
- package/dist/assets/{vega-component-BSXJcTJb.js → vega-component-C7TCzyaU.js} +1 -1
- package/dist/assets/write-secret-modal-D6zoZgLY.js +2 -0
- package/dist/index.html +73 -73
- package/package.json +26 -26
- package/src/components/ai/ai-provider-icon.tsx +2 -2
- package/src/components/ai/ai-utils.ts +1 -1
- package/src/components/app-config/ai-config.tsx +33 -37
- package/src/components/app-config/user-config-form.tsx +1 -1
- package/src/components/data-table/__tests__/column-explorer.test.tsx +64 -4
- package/src/components/data-table/__tests__/column-visibility-dropdown.test.tsx +137 -4
- package/src/components/data-table/__tests__/url-detector.test.tsx +1 -1
- package/src/components/data-table/__tests__/useColumnVisibility.test.ts +153 -1
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +54 -25
- package/src/components/data-table/column-visibility-dropdown.tsx +62 -14
- package/src/components/data-table/date-popover.tsx +2 -1
- package/src/components/data-table/hooks/use-column-visibility.ts +76 -0
- package/src/components/data-table/renderers.tsx +4 -8
- package/src/components/data-table/show-only-column-button.tsx +58 -0
- package/src/components/dependency-graph/__tests__/elements.test.ts +151 -0
- package/src/components/dependency-graph/custom-edge.tsx +68 -0
- package/src/components/dependency-graph/custom-node.tsx +54 -26
- package/src/components/dependency-graph/dependency-graph-tree.tsx +110 -21
- package/src/components/dependency-graph/elements.ts +225 -31
- package/src/components/dependency-graph/panels.tsx +23 -2
- package/src/components/dependency-graph/utils/__tests__/layout.test.ts +78 -0
- package/src/components/dependency-graph/utils/layout.ts +108 -18
- package/src/components/editor/Output.tsx +40 -0
- package/src/components/editor/__tests__/Output.test.tsx +85 -2
- package/src/components/editor/connections/secret-combobox.tsx +3 -1
- package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +832 -0
- package/src/components/editor/file-tree/__tests__/file-viewer.test.tsx +27 -0
- package/src/components/editor/file-tree/__tests__/requesting-tree.test.ts +130 -0
- package/src/components/editor/file-tree/file-browser-row.tsx +82 -0
- package/src/components/editor/file-tree/file-explorer.tsx +377 -159
- package/src/components/editor/file-tree/file-operations.tsx +1 -1
- package/src/components/editor/file-tree/file-search-results.tsx +142 -0
- package/src/components/editor/file-tree/file-tree-row.tsx +40 -0
- package/src/components/editor/file-tree/file-viewer.tsx +2 -1
- package/src/components/editor/file-tree/renderers.tsx +4 -2
- package/src/components/editor/file-tree/requesting-tree.tsx +162 -32
- package/src/components/editor/file-tree/use-file-search.ts +142 -0
- package/src/components/editor/file-tree/use-hover-expand.ts +34 -0
- package/src/components/editor/navigation/__tests__/navigation.test.ts +30 -0
- package/src/components/editor/navigation/navigation.ts +20 -0
- package/src/components/forms/form.tsx +6 -4
- package/src/components/home/components.tsx +1 -0
- package/src/components/static-html/share-modal.tsx +3 -2
- package/src/components/ui/__tests__/badge.test.ts +63 -0
- package/src/components/ui/__tests__/button.test.ts +19 -0
- package/src/components/ui/__tests__/fullscreen.test.tsx +88 -0
- package/src/components/ui/__tests__/menu-items.test.ts +31 -0
- package/src/components/ui/badge.tsx +9 -7
- package/src/components/ui/button.tsx +1 -0
- package/src/components/ui/combobox.tsx +1 -1
- package/src/components/ui/date-input.tsx +1 -1
- package/src/components/ui/dialog.tsx +3 -1
- package/src/components/ui/fullscreen.tsx +43 -1
- package/src/components/ui/input.tsx +5 -1
- package/src/components/ui/links.tsx +2 -1
- package/src/components/ui/menu-items.tsx +9 -9
- package/src/components/ui/native-select.tsx +2 -2
- package/src/components/ui/navigation.tsx +1 -1
- package/src/components/ui/range-slider.tsx +5 -3
- package/src/components/ui/select.tsx +1 -1
- package/src/components/ui/sheet.tsx +1 -1
- package/src/components/ui/toast.tsx +8 -5
- package/src/components/ui/toaster.tsx +2 -2
- package/src/core/ai/ids/__tests__/ids.test.ts +0 -8
- package/src/core/ai/ids/ids.ts +1 -1
- package/src/core/cells/__tests__/add-missing-import.test.ts +20 -0
- package/src/core/codemirror/language/__tests__/utils.test.ts +1 -1
- package/src/core/config/config-schema.ts +1 -0
- package/src/core/hotkeys/hotkeys.ts +5 -0
- package/src/core/network/__tests__/requests-toasting.test.tsx +14 -0
- package/src/core/network/requests-toasting.tsx +1 -1
- package/src/css/globals.css +28 -0
- package/src/hooks/useEventListener.ts +1 -1
- package/src/plugins/core/RenderHTML.tsx +6 -4
- package/src/plugins/impl/MatrixPlugin.tsx +1 -1
- package/src/plugins/impl/code/any-language-editor.tsx +7 -4
- package/src/plugins/impl/data-frames/__tests__/schema.test.ts +34 -1
- package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +25 -25
- package/src/plugins/impl/data-frames/schema.ts +5 -11
- package/src/plugins/impl/panel/__tests__/utils.test.ts +4 -4
- package/src/plugins/impl/vega/__tests__/vega.test.ts +1 -1
- package/src/stories/cell.stories.tsx +15 -11
- package/src/utils/__tests__/events.test.ts +1 -1
- package/dist/assets/JsonOutput-CRLQQVKf.js +0 -50
- package/dist/assets/RenderHTML-YkwVPe9V.js +0 -1
- package/dist/assets/ai-model-dropdown-CrSrb8Zz.js +0 -3
- package/dist/assets/alert-dialog-BVi_GyOB.js +0 -11
- package/dist/assets/any-language-editor-BL8H-DwB.js +0 -1
- package/dist/assets/badge-D_-uqy2N.js +0 -1
- package/dist/assets/button-Btj6GXNy.js +0 -1
- package/dist/assets/config-ycxJQP2b.js +0 -1
- package/dist/assets/dependency-graph-panel-Dg-tUB9T.js +0 -5
- package/dist/assets/dist-2oRmY-BC.js +0 -1
- package/dist/assets/dist-8lhGoJ54.js +0 -3
- package/dist/assets/dist-B4QaGCvF.js +0 -1
- package/dist/assets/dist-B_ABJVTW.js +0 -1
- package/dist/assets/dist-Bke0Ybxy.js +0 -1
- package/dist/assets/dist-Bw8CAY5i.js +0 -1
- package/dist/assets/dist-BwmO3SSk.js +0 -1
- package/dist/assets/dist-C3KxgR0m.js +0 -1
- package/dist/assets/dist-CLE562nZ.js +0 -1
- package/dist/assets/dist-CLi0j3bw.js +0 -1
- package/dist/assets/dist-CMIyXejt.js +0 -1
- package/dist/assets/dist-CbQrIaPV.js +0 -2
- package/dist/assets/dist-CpgfIIzU.js +0 -1
- package/dist/assets/dist-D7aYPqs9.js +0 -1
- package/dist/assets/dist-DKCF5R0T.js +0 -1
- package/dist/assets/dist-DbFa9cik.js +0 -1
- package/dist/assets/dist-DdPuhs_-.js +0 -1
- package/dist/assets/dist-DkfdZExz.js +0 -1
- package/dist/assets/dist-hOh6JBwi.js +0 -1
- package/dist/assets/dist-mY1j_5eA.js +0 -1
- package/dist/assets/dist-tg3aVnpD.js +0 -1
- package/dist/assets/dropdown-menu-CqNabM1f.js +0 -1
- package/dist/assets/file-explorer-panel-cflxW8a7.js +0 -1
- package/dist/assets/file-name-input-CQF4Ovwx.js +0 -3
- package/dist/assets/home-page-DPRHPAQM.js +0 -4
- package/dist/assets/index-BkIXRAbi.css +0 -2
- package/dist/assets/index-p49fbIlR.js +0 -29
- package/dist/assets/links-DPh7yoP-.js +0 -1
- package/dist/assets/lua-_4wuYo1j.js +0 -1
- package/dist/assets/menu-items-BSVrMleU.js +0 -1
- package/dist/assets/process-output-DvTtgoMs.js +0 -1
- package/dist/assets/select-czJLm6jf.js +0 -1
- package/dist/assets/session-panel-C_N3WGWQ.js +0 -1
- package/dist/assets/utils-CWSZQEjr.js +0 -1
- package/dist/assets/write-secret-modal-lNU_7c2x.js +0 -2
|
@@ -12,6 +12,7 @@ import { MockRequestClient } from "@/__mocks__/requests";
|
|
|
12
12
|
import { aiCompletionCellAtom } from "@/core/ai/state";
|
|
13
13
|
import type { CellActions } from "@/core/cells/cells";
|
|
14
14
|
import { notebookAtom } from "@/core/cells/cells";
|
|
15
|
+
import { LanguageAdapters } from "@/core/codemirror/language/LanguageAdapters";
|
|
15
16
|
import { signatureHintField } from "@/core/codemirror/completion/signature-hint";
|
|
16
17
|
import {
|
|
17
18
|
configOverridesAtom,
|
|
@@ -20,6 +21,8 @@ import {
|
|
|
20
21
|
} from "@/core/config/config";
|
|
21
22
|
import { requestClientAtom } from "@/core/network/requests";
|
|
22
23
|
import { store } from "@/core/state/jotai";
|
|
24
|
+
import { variablesAtom } from "@/core/variables/state";
|
|
25
|
+
import type { Variables } from "@/core/variables/types";
|
|
23
26
|
import type { CellActionsDropdownHandle } from "../../cell/cell-actions";
|
|
24
27
|
import {
|
|
25
28
|
useCellEditorNavigationProps,
|
|
@@ -421,6 +424,33 @@ describe("useCellNavigationProps", () => {
|
|
|
421
424
|
});
|
|
422
425
|
});
|
|
423
426
|
|
|
427
|
+
it("should add an import before and a SQL cell after when 'q' is pressed", () => {
|
|
428
|
+
store.set(variablesAtom, {} as Variables);
|
|
429
|
+
|
|
430
|
+
const { result } = renderWithProvider(() =>
|
|
431
|
+
useCellNavigationProps(mockCellId, options),
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
act(() => {
|
|
435
|
+
result.current.onKeyDown?.(Mocks.keyboardEvent({ key: "q" }));
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
expect(mockCellActions.createNewCell).toHaveBeenNthCalledWith(
|
|
439
|
+
1,
|
|
440
|
+
expect.objectContaining({
|
|
441
|
+
cellId: mockCellId,
|
|
442
|
+
before: true,
|
|
443
|
+
code: "import marimo as mo",
|
|
444
|
+
}),
|
|
445
|
+
);
|
|
446
|
+
expect(mockCellActions.createNewCell).toHaveBeenNthCalledWith(2, {
|
|
447
|
+
cellId: mockCellId,
|
|
448
|
+
before: false,
|
|
449
|
+
autoFocus: true,
|
|
450
|
+
code: LanguageAdapters.sql.defaultCode,
|
|
451
|
+
});
|
|
452
|
+
});
|
|
453
|
+
|
|
424
454
|
it("should move to top cell when Cmd+ArrowUp is pressed (or Ctrl)", () => {
|
|
425
455
|
const { result } = renderWithProvider(() =>
|
|
426
456
|
useCellNavigationProps(mockCellId, options),
|
|
@@ -12,6 +12,7 @@ import { useMemo } from "react";
|
|
|
12
12
|
import { mergeProps, useFocusWithin, useKeyboard } from "react-aria";
|
|
13
13
|
import { DATA_FOR_CELL_ID } from "@/components/data-table/cell-utils";
|
|
14
14
|
import { aiCompletionCellAtom } from "@/core/ai/state";
|
|
15
|
+
import { maybeAddMarimoImport } from "@/core/cells/add-missing-import";
|
|
15
16
|
import { cellIdsAtom, notebookAtom, useCellActions } from "@/core/cells/cells";
|
|
16
17
|
import { useCellFocusActions } from "@/core/cells/focus";
|
|
17
18
|
import type { CellId } from "@/core/cells/ids";
|
|
@@ -26,6 +27,7 @@ import {
|
|
|
26
27
|
closeSignatureHint,
|
|
27
28
|
signatureHintField,
|
|
28
29
|
} from "@/core/codemirror/completion/signature-hint";
|
|
30
|
+
import { LanguageAdapters } from "@/core/codemirror/language/LanguageAdapters";
|
|
29
31
|
import {
|
|
30
32
|
hotkeysAtom,
|
|
31
33
|
isAiFeatureEnabled,
|
|
@@ -551,6 +553,24 @@ export function useCellNavigationProps(
|
|
|
551
553
|
actions.createNewCell({ cellId, before: false, autoFocus: true });
|
|
552
554
|
return true;
|
|
553
555
|
},
|
|
556
|
+
"command.createSqlCellAfter": (cellId) => {
|
|
557
|
+
if (Events.hasModifier(evt)) {
|
|
558
|
+
return false;
|
|
559
|
+
}
|
|
560
|
+
maybeAddMarimoImport({
|
|
561
|
+
autoInstantiate: true,
|
|
562
|
+
createNewCell: actions.createNewCell,
|
|
563
|
+
fromCellId: cellId,
|
|
564
|
+
before: true,
|
|
565
|
+
});
|
|
566
|
+
actions.createNewCell({
|
|
567
|
+
cellId,
|
|
568
|
+
before: false,
|
|
569
|
+
autoFocus: true,
|
|
570
|
+
code: LanguageAdapters.sql.defaultCode,
|
|
571
|
+
});
|
|
572
|
+
return true;
|
|
573
|
+
},
|
|
554
574
|
"cell.delete": () => {
|
|
555
575
|
// Only handle if destructive_delete is enabled
|
|
556
576
|
if (!userConfig.keymap.destructive_delete) {
|
|
@@ -60,15 +60,17 @@ interface Props<T extends FieldValues> {
|
|
|
60
60
|
form: UseFormReturn<T>;
|
|
61
61
|
schema: z.ZodType;
|
|
62
62
|
path?: Path<T>;
|
|
63
|
-
renderers: FormRenderer<T>[] | undefined;
|
|
63
|
+
renderers: readonly FormRenderer<T>[] | undefined;
|
|
64
64
|
children?: React.ReactNode;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
const EMPTY_RENDERERS: readonly never[] = [];
|
|
68
|
+
|
|
67
69
|
export const ZodForm = <T extends FieldValues>({
|
|
68
70
|
schema,
|
|
69
71
|
form,
|
|
70
72
|
path = "" as Path<T>,
|
|
71
|
-
renderers =
|
|
73
|
+
renderers = EMPTY_RENDERERS,
|
|
72
74
|
children,
|
|
73
75
|
}: Props<T>) => {
|
|
74
76
|
return (
|
|
@@ -83,7 +85,7 @@ export interface RenderZodSchemaOptions<T extends FieldValues, S> {
|
|
|
83
85
|
schema: z.ZodType<S>;
|
|
84
86
|
form: UseFormReturn<T>;
|
|
85
87
|
path: Path<T>;
|
|
86
|
-
renderers: FormRenderer<T>[];
|
|
88
|
+
renderers: readonly FormRenderer<T>[];
|
|
87
89
|
}
|
|
88
90
|
|
|
89
91
|
export function renderZodSchema<T extends FieldValues, S>({
|
|
@@ -516,7 +518,7 @@ const FormArray = ({
|
|
|
516
518
|
schema: z.ZodType;
|
|
517
519
|
form: UseFormReturn<any>;
|
|
518
520
|
path: Path<any>;
|
|
519
|
-
renderers: FormRenderer[];
|
|
521
|
+
renderers: readonly FormRenderer[];
|
|
520
522
|
minLength?: number;
|
|
521
523
|
}) => {
|
|
522
524
|
const { label, description } = FieldOptions.parse(schema.description || "");
|
|
@@ -169,6 +169,7 @@ export const ResourceLinks: React.FC = () => {
|
|
|
169
169
|
key={resource.title}
|
|
170
170
|
href={resource.url}
|
|
171
171
|
target="_blank"
|
|
172
|
+
aria-label={`${resource.title}: ${resource.description}`}
|
|
172
173
|
className="flex items-start gap-3 py-3 px-3 rounded-lg border hover:bg-accent/20 transition-colors shadow-xs"
|
|
173
174
|
>
|
|
174
175
|
<resource.icon className="w-5 h-5 mt-1.5 text-primary" />
|
|
@@ -21,13 +21,14 @@ import { Input } from "../ui/input";
|
|
|
21
21
|
import { Tooltip } from "../ui/tooltip";
|
|
22
22
|
|
|
23
23
|
const BASE_URL = "https://static.marimo.app";
|
|
24
|
-
|
|
25
24
|
export const ShareStaticNotebookModal: React.FC<{
|
|
26
25
|
onClose: () => void;
|
|
27
26
|
}> = ({ onClose }) => {
|
|
28
27
|
const [slug, setSlug] = useState("");
|
|
29
28
|
const { exportAsHTML } = useRequestClient();
|
|
30
|
-
|
|
29
|
+
|
|
30
|
+
// Keep one random suffix for the lifetime of the modal.
|
|
31
|
+
// oxlint-disable-next-line react/purity
|
|
31
32
|
const randomHash = useMemo(() => Math.random().toString(36).slice(2, 6), []);
|
|
32
33
|
|
|
33
34
|
// Globally unique path
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { badgeVariants } from "../badge";
|
|
5
|
+
|
|
6
|
+
describe("badgeVariants", () => {
|
|
7
|
+
it.each([
|
|
8
|
+
{
|
|
9
|
+
variant: "default" as const,
|
|
10
|
+
expected: [
|
|
11
|
+
"forced-colors:bg-[Highlight]",
|
|
12
|
+
"forced-colors:border-[Highlight]",
|
|
13
|
+
"forced-colors:text-[HighlightText]",
|
|
14
|
+
"forced-colors:hover:bg-[Highlight]",
|
|
15
|
+
"forced-colors:hover:text-[HighlightText]",
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
variant: "defaultOutline" as const,
|
|
20
|
+
expected: [
|
|
21
|
+
"forced-colors:bg-[Canvas]",
|
|
22
|
+
"forced-colors:border-[Highlight]",
|
|
23
|
+
"forced-colors:text-[CanvasText]",
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
variant: "secondary" as const,
|
|
28
|
+
expected: [
|
|
29
|
+
"forced-colors:bg-[ButtonFace]",
|
|
30
|
+
"forced-colors:border-[ButtonText]",
|
|
31
|
+
"forced-colors:text-[ButtonText]",
|
|
32
|
+
"forced-colors:hover:bg-[Highlight]",
|
|
33
|
+
"forced-colors:hover:text-[HighlightText]",
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
])("uses system colors for $variant", ({ variant, expected }) => {
|
|
37
|
+
const classes = badgeVariants({ variant });
|
|
38
|
+
|
|
39
|
+
expect(classes).toEqual(expect.stringContaining(expected.join(" ")));
|
|
40
|
+
expect(classes).toContain("forced-color-adjust-none");
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it.each(["destructive", "success", "outline"] as const)(
|
|
44
|
+
"keeps the %s variant visible without semantic colors",
|
|
45
|
+
(variant) => {
|
|
46
|
+
const classes = badgeVariants({ variant });
|
|
47
|
+
|
|
48
|
+
expect(classes).toEqual(
|
|
49
|
+
expect.stringContaining(
|
|
50
|
+
[
|
|
51
|
+
"forced-colors:bg-[Canvas]",
|
|
52
|
+
"forced-colors:border-[ButtonText]",
|
|
53
|
+
"forced-colors:text-[CanvasText]",
|
|
54
|
+
].join(" "),
|
|
55
|
+
),
|
|
56
|
+
);
|
|
57
|
+
if (variant !== "outline") {
|
|
58
|
+
expect(classes).toContain("forced-colors:hover:bg-[Highlight]");
|
|
59
|
+
expect(classes).toContain("forced-colors:hover:text-[HighlightText]");
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
);
|
|
63
|
+
});
|
|
@@ -39,4 +39,23 @@ describe("buttonVariants", () => {
|
|
|
39
39
|
expect(classes).not.toMatch(/--(?:red|grass|yellow)-/);
|
|
40
40
|
expect(classes).not.toContain("dark:");
|
|
41
41
|
});
|
|
42
|
+
|
|
43
|
+
it("uses system colors in forced-color mode", () => {
|
|
44
|
+
const classes = buttonVariants({ variant: "default" });
|
|
45
|
+
|
|
46
|
+
expect(classes).toEqual(
|
|
47
|
+
expect.stringContaining(
|
|
48
|
+
[
|
|
49
|
+
"forced-color-adjust-none",
|
|
50
|
+
"forced-colors:border-[ButtonText]",
|
|
51
|
+
"forced-colors:bg-[ButtonFace]",
|
|
52
|
+
"forced-colors:text-[ButtonText]",
|
|
53
|
+
"forced-colors:hover:bg-[Highlight]",
|
|
54
|
+
"forced-colors:hover:text-[HighlightText]",
|
|
55
|
+
"forced-colors:disabled:border-[GrayText]",
|
|
56
|
+
"forced-colors:disabled:text-[GrayText]",
|
|
57
|
+
].join(" "),
|
|
58
|
+
),
|
|
59
|
+
);
|
|
60
|
+
});
|
|
42
61
|
});
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { act, render } from "@testing-library/react";
|
|
3
|
+
import { useRef } from "react";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { useIsFullScreen } from "../fullscreen";
|
|
6
|
+
|
|
7
|
+
const FullScreenFlag = ({ label }: { label: string }) => {
|
|
8
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
9
|
+
const isFullScreen = useIsFullScreen(ref);
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<div ref={ref} data-testid={label}>
|
|
13
|
+
{String(isFullScreen)}
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
describe("useIsFullScreen", () => {
|
|
19
|
+
let fullscreenElement: Element | null = null;
|
|
20
|
+
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
fullscreenElement = null;
|
|
23
|
+
Object.defineProperty(document, "fullscreenElement", {
|
|
24
|
+
configurable: true,
|
|
25
|
+
get: () => fullscreenElement,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
Reflect.deleteProperty(document, "fullscreenElement");
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const countFullScreenListeners = (calls: unknown[][]) =>
|
|
34
|
+
calls.filter((call) => call[0] === "fullscreenchange").length;
|
|
35
|
+
|
|
36
|
+
it("adds one document listener for many subscribers", () => {
|
|
37
|
+
const addEventListener = vi.spyOn(document, "addEventListener");
|
|
38
|
+
|
|
39
|
+
render(
|
|
40
|
+
<>
|
|
41
|
+
<FullScreenFlag label="first" />
|
|
42
|
+
<FullScreenFlag label="second" />
|
|
43
|
+
<FullScreenFlag label="third" />
|
|
44
|
+
</>,
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
expect(countFullScreenListeners(addEventListener.mock.calls)).toBe(1);
|
|
48
|
+
addEventListener.mockRestore();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("removes the listener when the last subscriber unmounts", () => {
|
|
52
|
+
const removeEventListener = vi.spyOn(document, "removeEventListener");
|
|
53
|
+
|
|
54
|
+
const { unmount } = render(
|
|
55
|
+
<>
|
|
56
|
+
<FullScreenFlag label="first" />
|
|
57
|
+
<FullScreenFlag label="second" />
|
|
58
|
+
</>,
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
expect(countFullScreenListeners(removeEventListener.mock.calls)).toBe(0);
|
|
62
|
+
|
|
63
|
+
unmount();
|
|
64
|
+
|
|
65
|
+
expect(countFullScreenListeners(removeEventListener.mock.calls)).toBe(1);
|
|
66
|
+
removeEventListener.mockRestore();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("reports true for the full screen element only", () => {
|
|
70
|
+
const { getByTestId } = render(
|
|
71
|
+
<>
|
|
72
|
+
<FullScreenFlag label="first" />
|
|
73
|
+
<FullScreenFlag label="second" />
|
|
74
|
+
</>,
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
expect(getByTestId("first")).toHaveTextContent("false");
|
|
78
|
+
expect(getByTestId("second")).toHaveTextContent("false");
|
|
79
|
+
|
|
80
|
+
fullscreenElement = getByTestId("second");
|
|
81
|
+
act(() => {
|
|
82
|
+
document.dispatchEvent(new Event("fullscreenchange"));
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
expect(getByTestId("first")).toHaveTextContent("false");
|
|
86
|
+
expect(getByTestId("second")).toHaveTextContent("true");
|
|
87
|
+
});
|
|
88
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import {
|
|
5
|
+
menuControlVariants,
|
|
6
|
+
menuItemVariants,
|
|
7
|
+
menuSubTriggerVariants,
|
|
8
|
+
} from "../menu-items";
|
|
9
|
+
|
|
10
|
+
describe("menu item variants", () => {
|
|
11
|
+
it.each([
|
|
12
|
+
menuSubTriggerVariants(),
|
|
13
|
+
menuControlVariants(),
|
|
14
|
+
menuItemVariants(),
|
|
15
|
+
])("styles Radix highlighted state", (classes) => {
|
|
16
|
+
expect(classes).toContain("data-[highlighted]:bg-accent");
|
|
17
|
+
expect(classes).toContain(
|
|
18
|
+
"forced-colors:data-[highlighted]:bg-[Highlight]",
|
|
19
|
+
);
|
|
20
|
+
expect(classes).toContain(
|
|
21
|
+
"forced-colors:data-[highlighted]:text-[HighlightText]",
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("keeps the command item selected state", () => {
|
|
26
|
+
const classes = menuItemVariants();
|
|
27
|
+
|
|
28
|
+
expect(classes).toContain("aria-selected:bg-accent");
|
|
29
|
+
expect(classes).toContain("forced-colors:aria-selected:bg-[Highlight]");
|
|
30
|
+
});
|
|
31
|
+
});
|
|
@@ -6,20 +6,22 @@ import * as React from "react";
|
|
|
6
6
|
import { cn } from "@/utils/cn";
|
|
7
7
|
|
|
8
8
|
const badgeVariants = cva(
|
|
9
|
-
"inline-flex items-center border rounded-full px-2 py-0.5 text-xs font-semibold transition-colors focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
9
|
+
"inline-flex items-center border rounded-full px-2 py-0.5 text-xs font-semibold transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 forced-color-adjust-none",
|
|
10
10
|
{
|
|
11
11
|
variants: {
|
|
12
12
|
variant: {
|
|
13
13
|
default:
|
|
14
|
-
"bg-primary hover:bg-primary/60 border-transparent text-primary-foreground",
|
|
15
|
-
defaultOutline:
|
|
14
|
+
"bg-primary hover:bg-primary/60 border-transparent text-primary-foreground forced-colors:bg-[Highlight] forced-colors:border-[Highlight] forced-colors:text-[HighlightText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
|
|
15
|
+
defaultOutline:
|
|
16
|
+
"bg-(--blue-2) border-(--blue-8) text-(--blue-11) forced-colors:bg-[Canvas] forced-colors:border-[Highlight] forced-colors:text-[CanvasText]",
|
|
16
17
|
secondary:
|
|
17
|
-
"bg-secondary hover:bg-secondary/80 border-transparent text-secondary-foreground",
|
|
18
|
+
"bg-secondary hover:bg-secondary/80 border-transparent text-secondary-foreground forced-colors:bg-[ButtonFace] forced-colors:border-[ButtonText] forced-colors:text-[ButtonText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
|
|
18
19
|
destructive:
|
|
19
|
-
"bg-(--red-2) border-(--red-6) text-(--red-9) hover:bg-(--red-3)",
|
|
20
|
+
"bg-(--red-2) border-(--red-6) text-(--red-9) hover:bg-(--red-3) forced-colors:bg-[Canvas] forced-colors:border-[ButtonText] forced-colors:text-[CanvasText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
|
|
20
21
|
success:
|
|
21
|
-
"bg-(--grass-2) border-(--grass-5) text-(--grass-9) hover:bg-(--grass-3)",
|
|
22
|
-
outline:
|
|
22
|
+
"bg-(--grass-2) border-(--grass-5) text-(--grass-9) hover:bg-(--grass-3) forced-colors:bg-[Canvas] forced-colors:border-[ButtonText] forced-colors:text-[CanvasText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
|
|
23
|
+
outline:
|
|
24
|
+
"text-foreground forced-colors:bg-[Canvas] forced-colors:border-[ButtonText] forced-colors:text-[CanvasText]",
|
|
23
25
|
},
|
|
24
26
|
},
|
|
25
27
|
defaultVariants: {
|
|
@@ -14,6 +14,7 @@ const buttonVariants = cva(
|
|
|
14
14
|
cn(
|
|
15
15
|
"disabled:opacity-50 disabled:pointer-events-none",
|
|
16
16
|
"inline-flex items-center justify-center rounded-md text-sm font-medium focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 ring-offset-background",
|
|
17
|
+
"forced-color-adjust-none forced-colors:border-[ButtonText] forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText] forced-colors:disabled:border-[GrayText] forced-colors:disabled:text-[GrayText]",
|
|
17
18
|
),
|
|
18
19
|
{
|
|
19
20
|
variants: {
|
|
@@ -201,7 +201,7 @@ export const Combobox = <TValue,>({
|
|
|
201
201
|
id={id}
|
|
202
202
|
type="button"
|
|
203
203
|
className={cn(
|
|
204
|
-
"flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid",
|
|
204
|
+
"flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:border-primary focus-visible:shadow-md-solid",
|
|
205
205
|
disabled && "cursor-not-allowed opacity-50",
|
|
206
206
|
className,
|
|
207
207
|
)}
|
|
@@ -29,7 +29,7 @@ const DateSegment = ({ className, ...props }: AriaDateSegmentProps) => {
|
|
|
29
29
|
/* Disabled */
|
|
30
30
|
"data-disabled:cursor-not-allowed data-disabled:opacity-50",
|
|
31
31
|
/* Focused */
|
|
32
|
-
"data-focused:bg-accent data-focused:text-accent-foreground focus:bg-accent focus:text-accent-foreground",
|
|
32
|
+
"data-focused:bg-accent data-focused:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground",
|
|
33
33
|
/* Invalid */
|
|
34
34
|
"data-invalid:data-focused:bg-destructive data-invalid:data-focused:data-placeholder:text-destructive-foreground data-invalid:data-focused:text-destructive-foreground data-invalid:data-placeholder:text-destructive data-invalid:text-destructive",
|
|
35
35
|
className,
|
|
@@ -42,6 +42,7 @@ const DialogOverlay = React.forwardRef<
|
|
|
42
42
|
ref={ref}
|
|
43
43
|
className={cn(
|
|
44
44
|
"fixed inset-0 z-50 bg-background/80 backdrop-blur-xs transition-all duration-100 data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=open]:fade-in",
|
|
45
|
+
"forced-color-adjust-none forced-colors:bg-[CanvasText] forced-colors:opacity-50",
|
|
45
46
|
className,
|
|
46
47
|
)}
|
|
47
48
|
{...props}
|
|
@@ -63,13 +64,14 @@ const DialogContent = React.forwardRef<
|
|
|
63
64
|
ref={ref}
|
|
64
65
|
className={cn(
|
|
65
66
|
"fixed z-50 grid w-full gap-4 rounded-b-lg border bg-background p-6 shadow-sm animate-in data-[state=open]:fade-in-90 data-[state=open]:slide-in-from-bottom-10 sm:max-w-2xl sm:mx-4 sm:rounded-lg sm:zoom-in-90 sm:data-[state=open]:slide-in-from-bottom-0",
|
|
67
|
+
"forced-color-adjust-none forced-colors:border-[CanvasText] forced-colors:bg-[Canvas] forced-colors:text-[CanvasText]",
|
|
66
68
|
className,
|
|
67
69
|
)}
|
|
68
70
|
{...restoreFocus}
|
|
69
71
|
{...props}
|
|
70
72
|
>
|
|
71
73
|
{children}
|
|
72
|
-
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
|
|
74
|
+
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
|
|
73
75
|
<X className="h-4 w-4" />
|
|
74
76
|
<span className="sr-only">Close</span>
|
|
75
77
|
</DialogPrimitive.Close>
|
|
@@ -4,7 +4,7 @@ import type { Popover } from "radix-ui";
|
|
|
4
4
|
|
|
5
5
|
type PopoverContentProps = Popover.PopoverContentProps;
|
|
6
6
|
|
|
7
|
-
import React, { useState } from "react";
|
|
7
|
+
import React, { type RefObject, useState, useSyncExternalStore } from "react";
|
|
8
8
|
import { isInVscodeExtension } from "@/core/vscode/is-in-vscode";
|
|
9
9
|
import { useEventListener } from "@/hooks/useEventListener";
|
|
10
10
|
|
|
@@ -27,6 +27,48 @@ export function useFullScreenElement() {
|
|
|
27
27
|
return fullScreenElement;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
const fullScreenSubscribers = new Set<() => void>();
|
|
31
|
+
|
|
32
|
+
function notifyFullScreenSubscribers() {
|
|
33
|
+
for (const subscriber of fullScreenSubscribers) {
|
|
34
|
+
subscriber();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* One document listener serves every subscriber, so the cost of a full screen
|
|
40
|
+
* transition does not grow with the number of mounted components.
|
|
41
|
+
*/
|
|
42
|
+
function subscribeToFullScreen(onStoreChange: () => void) {
|
|
43
|
+
if (fullScreenSubscribers.size === 0) {
|
|
44
|
+
document.addEventListener("fullscreenchange", notifyFullScreenSubscribers);
|
|
45
|
+
}
|
|
46
|
+
fullScreenSubscribers.add(onStoreChange);
|
|
47
|
+
|
|
48
|
+
return () => {
|
|
49
|
+
fullScreenSubscribers.delete(onStoreChange);
|
|
50
|
+
if (fullScreenSubscribers.size === 0) {
|
|
51
|
+
document.removeEventListener(
|
|
52
|
+
"fullscreenchange",
|
|
53
|
+
notifyFullScreenSubscribers,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Whether the given element is the full screen element.
|
|
61
|
+
*
|
|
62
|
+
* The hook returns a boolean, so a component re-renders only when its own
|
|
63
|
+
* element enters or leaves full screen.
|
|
64
|
+
*/
|
|
65
|
+
export function useIsFullScreen(ref: RefObject<Element | null>): boolean {
|
|
66
|
+
return useSyncExternalStore(subscribeToFullScreen, () => {
|
|
67
|
+
const fullScreenElement = document.fullscreenElement;
|
|
68
|
+
return fullScreenElement !== null && fullScreenElement === ref.current;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
30
72
|
/**
|
|
31
73
|
* HOC wrapping a Portal component to use the
|
|
32
74
|
* full screen element as the container if we are in full screen mode
|
|
@@ -17,6 +17,10 @@ export type InputProps = React.InputHTMLAttributes<HTMLInputElement> & {
|
|
|
17
17
|
endAdornment?: React.ReactNode;
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
+
const DEFAULT_SEARCH_ICON = (
|
|
21
|
+
<SearchIcon className="mr-2 h-4 w-4 shrink-0 opacity-50" />
|
|
22
|
+
);
|
|
23
|
+
|
|
20
24
|
const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
21
25
|
({ className, type, endAdornment, ...props }, ref) => {
|
|
22
26
|
const icon = props.icon;
|
|
@@ -120,7 +124,7 @@ export const SearchInput = React.forwardRef<
|
|
|
120
124
|
{
|
|
121
125
|
className,
|
|
122
126
|
rootClassName,
|
|
123
|
-
icon =
|
|
127
|
+
icon = DEFAULT_SEARCH_ICON,
|
|
124
128
|
clearable = true,
|
|
125
129
|
...props
|
|
126
130
|
},
|
|
@@ -16,7 +16,8 @@ export const ExternalLink = ({
|
|
|
16
16
|
| `https://links.marimo.app/${string}`
|
|
17
17
|
| `https://wandb.ai/${string}`
|
|
18
18
|
| `https://portal.azure.com/${string}`
|
|
19
|
-
| `https://opencode.ai/${string}
|
|
19
|
+
| `https://opencode.ai/${string}`
|
|
20
|
+
| `https://pydantic.dev/${string}`;
|
|
20
21
|
children: React.ReactNode;
|
|
21
22
|
}) => {
|
|
22
23
|
return (
|
|
@@ -5,7 +5,7 @@ import React from "react";
|
|
|
5
5
|
import { cn } from "@/utils/cn";
|
|
6
6
|
|
|
7
7
|
export const menuContentCommon = cva(
|
|
8
|
-
"z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
|
|
8
|
+
"z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md forced-color-adjust-none forced-colors:border-[CanvasText] forced-colors:bg-[Canvas] forced-colors:text-[CanvasText]",
|
|
9
9
|
{
|
|
10
10
|
variants: {
|
|
11
11
|
subcontent: {
|
|
@@ -16,7 +16,7 @@ export const menuContentCommon = cva(
|
|
|
16
16
|
);
|
|
17
17
|
|
|
18
18
|
export const menuSubTriggerVariants = cva(
|
|
19
|
-
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden
|
|
19
|
+
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground forced-color-adjust-none forced-colors:data-[highlighted]:bg-[Highlight] forced-colors:data-[highlighted]:text-[HighlightText] forced-colors:data-[state=open]:bg-[Highlight] forced-colors:data-[state=open]:text-[HighlightText]",
|
|
20
20
|
{
|
|
21
21
|
variants: {
|
|
22
22
|
inset: {
|
|
@@ -27,11 +27,11 @@ export const menuSubTriggerVariants = cva(
|
|
|
27
27
|
);
|
|
28
28
|
|
|
29
29
|
export const MENU_ITEM_DISABLED =
|
|
30
|
-
"data-disabled:pointer-events-none data-disabled:opacity-50";
|
|
30
|
+
"data-disabled:pointer-events-none data-disabled:opacity-50 forced-colors:data-disabled:text-[GrayText]";
|
|
31
31
|
|
|
32
32
|
export const menuControlVariants = cva(
|
|
33
33
|
cn(
|
|
34
|
-
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors
|
|
34
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground forced-color-adjust-none forced-colors:data-[highlighted]:bg-[Highlight] forced-colors:data-[highlighted]:text-[HighlightText]",
|
|
35
35
|
MENU_ITEM_DISABLED,
|
|
36
36
|
),
|
|
37
37
|
{ variants: {} },
|
|
@@ -54,7 +54,7 @@ export const menuLabelVariants = cva("px-2 py-1.5 text-sm font-semibold", {
|
|
|
54
54
|
|
|
55
55
|
export const menuItemVariants = cva(
|
|
56
56
|
cn(
|
|
57
|
-
"menu-item relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden",
|
|
57
|
+
"menu-item relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden forced-color-adjust-none forced-colors:data-[highlighted]:bg-[Highlight] forced-colors:data-[highlighted]:text-[HighlightText] forced-colors:aria-selected:bg-[Highlight] forced-colors:aria-selected:text-[HighlightText]",
|
|
58
58
|
MENU_ITEM_DISABLED,
|
|
59
59
|
),
|
|
60
60
|
{
|
|
@@ -64,13 +64,13 @@ export const menuItemVariants = cva(
|
|
|
64
64
|
},
|
|
65
65
|
variant: {
|
|
66
66
|
default:
|
|
67
|
-
"
|
|
67
|
+
"data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",
|
|
68
68
|
danger:
|
|
69
|
-
"
|
|
69
|
+
"data-[highlighted]:bg-(--red-5) data-[highlighted]:text-(--red-12) aria-selected:bg-(--red-5) aria-selected:text-(--red-12)",
|
|
70
70
|
muted:
|
|
71
|
-
"
|
|
71
|
+
"data-[highlighted]:bg-muted/70 data-[highlighted]:text-muted-foreground aria-selected:bg-muted/70 aria-selected:text-muted-foreground",
|
|
72
72
|
success:
|
|
73
|
-
"
|
|
73
|
+
"data-[highlighted]:bg-(--grass-3) data-[highlighted]:text-(--grass-11) aria-selected:bg-(--grass-3) aria-selected:text-(--grass-11)",
|
|
74
74
|
disabled: "text-muted-foreground",
|
|
75
75
|
},
|
|
76
76
|
},
|
|
@@ -6,12 +6,12 @@ import { cn } from "@/utils/cn";
|
|
|
6
6
|
import { Events } from "@/utils/events";
|
|
7
7
|
|
|
8
8
|
export const selectStyles = cva(
|
|
9
|
-
"flex h-6 w-fit mb-1 items-center justify-between rounded-sm bg-background px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground focus:outline-hidden focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer",
|
|
9
|
+
"flex h-6 w-fit mb-1 items-center justify-between rounded-sm bg-background px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer forced-color-adjust-none forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText] forced-colors:disabled:text-[GrayText]",
|
|
10
10
|
{
|
|
11
11
|
variants: {
|
|
12
12
|
variant: {
|
|
13
13
|
default:
|
|
14
|
-
"shadow-xs-solid border border-input hover:shadow-sm-solid focus:border-primary focus:shadow-md-solid disabled:hover:shadow-xs-solid",
|
|
14
|
+
"shadow-xs-solid border border-input hover:shadow-sm-solid focus-visible:border-primary focus-visible:shadow-md-solid disabled:hover:shadow-xs-solid forced-colors:border-[ButtonText] forced-colors:disabled:border-[GrayText]",
|
|
15
15
|
ghost: "opacity-70 hover:opacity-100 focus:opacity-100",
|
|
16
16
|
},
|
|
17
17
|
},
|
|
@@ -56,7 +56,7 @@ NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
|
|
|
56
56
|
const NavigationMenuItem = NavigationMenuPrimitive.Item;
|
|
57
57
|
|
|
58
58
|
const navigationMenuTriggerStyle = cva(
|
|
59
|
-
"group inline-flex rounded-md bg-background px-4 py-2 text-lg font-medium text-(--slate-12) transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-hidden disabled:pointer-events-none disabled:opacity-50 data-active:bg-accent/50 data-[state=open]:bg-accent/50",
|
|
59
|
+
"group inline-flex rounded-md bg-background px-4 py-2 text-lg font-medium text-(--slate-12) transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50 data-active:bg-accent/50 data-[state=open]:bg-accent/50",
|
|
60
60
|
{
|
|
61
61
|
variants: {
|
|
62
62
|
orientation: {
|