diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3f2b1b0cc20..a016cd7aa24 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,7 +31,7 @@ repos: pass_filenames: false - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.13 + rev: v0.12.0 hooks: # Run the linter - id: ruff @@ -40,7 +40,7 @@ repos: - id: ruff-format - repo: https://github.com/biomejs/pre-commit - rev: v2.0.0-beta.5 + rev: v2.0.2 hooks: - id: biome-check args: [--config-path, biome.jsonc, --diagnostic-level, warn] diff --git a/docs/guides/apps.md b/docs/guides/apps.md index 9c559b797ec..0ce22635a34 100644 --- a/docs/guides/apps.md +++ b/docs/guides/apps.md @@ -62,7 +62,7 @@ can reconstruct your layout. If you prefer a slideshow-like experience, you can use the slides layout. Enable the slides layout in the app preview, via the same dropdown as above. !!! info "See slides layout in action" - Check out this [example notebook](https://marimo.io/p/@gvarnavides/stem-probes) that runs in slides mode, powered by our [Community Cloud](./publishing/community_cloud/). + Check out this [example notebook](https://marimo.io/p/@gvarnavides/stem-probes) that runs in slides mode, powered by our [Community Cloud](publishing/community_cloud/index.md). Unlike the grid layout, the slides are much less customizable: diff --git a/docs/guides/exporting.md b/docs/guides/exporting.md index 3234bd2c994..ff050c7913b 100644 --- a/docs/guides/exporting.md +++ b/docs/guides/exporting.md @@ -168,7 +168,7 @@ You can also use other tools that work with Jupyter notebooks: ## Export to WASM-powered HTML -Export your notebook to a self-contained HTML file that runs using WebAssembly: +Export your notebook to a self-contained HTML file that runs using [WebAssembly](wasm.md): ```bash # export as readonly, with code locked @@ -187,6 +187,9 @@ Options: - `--watch/--no-watch`: Watch the notebook for changes and automatically export - `--include-cloudflare`: Write configuration files necessary for deploying to Cloudflare +Note that WebAssembly notebooks have [limitations](wasm.md#limitations); in particular, +[many but not all packages work](wasm.md#packages). + !!! note "Note" The exported file must be served over HTTP to function correctly - it diff --git a/docs/guides/wasm.md b/docs/guides/wasm.md index 3fbeb0dffd1..c131badb0c8 100644 --- a/docs/guides/wasm.md +++ b/docs/guides/wasm.md @@ -138,6 +138,15 @@ amount of data, and also lets you sync notebooks (and their data) from GitHub. While WASM notebooks let you share marimo notebooks seamlessly, they have some limitations. +**Packages.** Many but not all packages are supported. All packages with pure +Python wheels on PyPI are supported, as well as additional packages like NumPy, +SciPy, scikit-learn, duckdb, polars, and more. For a full list of supported +packages, see [Pyodide's documentation on supported +packages.](https://pyodide.org/en/stable/usage/packages-in-pyodide.html) + +If you want a package to be supported, consider [filing an +issue](https://github.com/pyodide/pyodide/issues/new?assignees=&labels=new+package+request&projects=&template=package_request.md&title=). + **PDB.** PDB is not currently supported. **Threading and multi-processing.** WASM notebooks do not support multithreading diff --git a/frontend/islands/vite.config.mts b/frontend/islands/vite.config.mts index 00f521e049a..6bdb5b529a6 100644 --- a/frontend/islands/vite.config.mts +++ b/frontend/islands/vite.config.mts @@ -40,7 +40,6 @@ export default defineConfig({ "process.env": { NODE_ENV: JSON.stringify(process.env.NODE_ENV), }, - "import.meta.env.VITE_MARIMO_ISLANDS": JSON.stringify(true), // Precedence: VITE_MARIMO_VERSION > package.json version > "latest" "import.meta.env.VITE_MARIMO_VERSION": process.env.VITE_MARIMO_VERSION ? JSON.stringify(process.env.VITE_MARIMO_VERSION) diff --git a/frontend/package.json b/frontend/package.json index 55251ee0744..8ca43dde926 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -150,7 +150,6 @@ "timestring": "^7.0.0", "typescript-memoize": "^1.1.1", "use-resize-observer": "^9.1.0", - "vega": "^5.33.0", "vega-lite": "^5.23.0", "vega-loader": "^4.5.3", "vscode-languageserver-protocol": "^3.17.5", @@ -172,6 +171,7 @@ "lint:stylelint": "stylelint src/**/*.css --fix", "format": "biome format --write .", "preview": "vite preview", + "dev:quarto": "VITE_MARIMO_ISLANDS=true vite", "dev:islands": "cross-env VITE_MARIMO_ISLANDS=true vite --config islands/vite.config.mts", "build:islands": "cross-env VITE_MARIMO_ISLANDS=true vite --config islands/vite.config.mts build", "preview:islands": "cross-env VITE_MARIMO_VERSION='0.4.6' VITE_MARIMO_ISLANDS=true vite --config islands/vite.config.mts build", @@ -189,7 +189,7 @@ "@biomejs/biome": "2.0.0-beta.6", "@codecov/vite-plugin": "^1.9.1", "@csstools/postcss-light-dark-function": "^2.0.8", - "@playwright/test": "^1.53.0", + "@playwright/test": "^1.53.1", "@storybook/addon-docs": "^8.6.14", "@storybook/addon-essentials": "^8.6.14", "@storybook/addon-interactions": "^8.6.14", @@ -199,7 +199,7 @@ "@storybook/react-vite": "^8.6.14", "@swc-jotai/react-refresh": "^0.3.0", "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.2.0", + "@testing-library/react": "^16.3.0", "@types/katex": "^0.16.7", "@types/lodash-es": "^4.17.12", "@types/node": "^24.0.0", @@ -209,8 +209,8 @@ "@types/timestring": "^6.0.5", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", - "@vitejs/plugin-react": "^4.5.0", - "@vitejs/plugin-react-swc": "^3.10.0", + "@vitejs/plugin-react": "^4.5.2", + "@vitejs/plugin-react-swc": "^3.10.2", "autoprefixer": "^10.4.21", "babel-plugin-react-compiler": "19.1.0-rc.1", "blob-polyfill": "^7.0.20220408", @@ -226,7 +226,7 @@ "jsdom": "^24.1.3", "msw": "^2.10.2", "npm-run-all2": "^6.2.6", - "postcss": "^8.5.4", + "postcss": "^8.5.6", "postcss-plugin-namespace": "^0.0.3", "react": "^19.1.0", "react-compiler-runtime": "19.1.0-rc.1", @@ -241,7 +241,7 @@ "vite-plugin-top-level-await": "^1.5.0", "vite-plugin-wasm": "^3.4.1", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.1.4" + "vitest": "^3.2.4" }, "packageManager": "pnpm@10.10.0", "pnpm": { diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index e9ba0f9f6e1..56daf2ac47f 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -284,7 +284,7 @@ importers: version: 0.21.2(vega@5.33.0) cssnano: specifier: ^7.0.6 - version: 7.0.6(postcss@8.5.4) + version: 7.0.6(postcss@8.5.6) date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -426,9 +426,6 @@ importers: use-resize-observer: specifier: ^9.1.0 version: 9.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - vega: - specifier: ^5.33.0 - version: 5.33.0 vega-lite: specifier: ^5.23.0 version: 5.23.0(vega@5.33.0) @@ -462,10 +459,10 @@ importers: version: 1.9.1(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0)) '@csstools/postcss-light-dark-function': specifier: ^2.0.8 - version: 2.0.8(postcss@8.5.4) + version: 2.0.8(postcss@8.5.6) '@playwright/test': - specifier: ^1.53.0 - version: 1.53.0 + specifier: ^1.53.1 + version: 1.53.1 '@storybook/addon-docs': specifier: ^8.6.14 version: 8.6.14(@types/react@19.1.7)(storybook@8.6.14) @@ -494,8 +491,8 @@ importers: specifier: ^6.6.3 version: 6.6.3 '@testing-library/react': - specifier: ^16.2.0 - version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^16.3.0 + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/katex': specifier: ^0.16.7 version: 0.16.7 @@ -524,14 +521,14 @@ importers: specifier: ^7.15.0 version: 7.15.0(eslint@8.57.0)(typescript@5.8.3) '@vitejs/plugin-react': - specifier: ^4.5.0 - version: 4.5.0(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0)) + specifier: ^4.5.2 + version: 4.6.0(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0)) '@vitejs/plugin-react-swc': - specifier: ^3.10.0 - version: 3.10.0(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0)) + specifier: ^3.10.2 + version: 3.10.2(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0)) autoprefixer: specifier: ^10.4.21 - version: 10.4.21(postcss@8.5.4) + version: 10.4.21(postcss@8.5.6) babel-plugin-react-compiler: specifier: 19.1.0-rc.1 version: 19.1.0-rc.1 @@ -564,7 +561,7 @@ importers: version: 54.0.0(eslint@8.57.0) eslint-plugin-vitest: specifier: ^0.4.1 - version: 0.4.1(@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.1.4(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(terser@5.43.1)(yaml@2.7.0)) + version: 0.4.1(@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(terser@5.43.1)(yaml@2.7.0)) jsdom: specifier: ^24.1.3 version: 24.1.3 @@ -575,8 +572,8 @@ importers: specifier: ^6.2.6 version: 6.2.6 postcss: - specifier: ^8.5.4 - version: 8.5.4 + specifier: ^8.5.6 + version: 8.5.6 postcss-plugin-namespace: specifier: ^0.0.3 version: 0.0.3 @@ -620,8 +617,8 @@ importers: specifier: ^5.1.4 version: 5.1.4(typescript@5.8.3)(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0)) vitest: - specifier: ^3.1.4 - version: 3.1.4(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(terser@5.43.1)(yaml@2.7.0) + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(terser@5.43.1)(yaml@2.7.0) packages: @@ -760,8 +757,8 @@ packages: resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} '@babel/helper-replace-supers@7.25.9': @@ -842,14 +839,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1843,8 +1840,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.53.0': - resolution: {integrity: sha512-15hjKreZDcp7t6TL/7jkAo6Df5STZN09jGiv5dbP9A6vMVncXRqE7/B2SncsyOwrkZRBH2i6/TPOL8BVmm3c7w==} + '@playwright/test@1.53.1': + resolution: {integrity: sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==} engines: {node: '>=18'} hasBin: true @@ -3098,8 +3095,11 @@ packages: '@codemirror/state': 6.x.x '@codemirror/view': 6.x.x - '@rolldown/pluginutils@1.0.0-beta.9': - resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} + '@rolldown/pluginutils@1.0.0-beta.11': + resolution: {integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==} + + '@rolldown/pluginutils@1.0.0-beta.19': + resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} '@rollup/plugin-virtual@3.0.2': resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} @@ -3400,68 +3400,68 @@ packages: '@swc-jotai/react-refresh@0.3.0': resolution: {integrity: sha512-WIWesycqFWqFRlfMa/NYON7AX6zTtSwK7z+nVRgdlk2r5iIv2/BDTeRgg3on+YvYlKR7IipioRVswyPOTq/ZKA==} - '@swc/core-darwin-arm64@1.11.29': - resolution: {integrity: sha512-whsCX7URzbuS5aET58c75Dloby3Gtj/ITk2vc4WW6pSDQKSPDuONsIcZ7B2ng8oz0K6ttbi4p3H/PNPQLJ4maQ==} + '@swc/core-darwin-arm64@1.12.5': + resolution: {integrity: sha512-3WF+naP/qkt5flrTfJr+p07b522JcixKvIivM7FgvllA6LjJxf+pheoILrTS8IwrNAK/XtHfKWYcGY+3eaA4mA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.29': - resolution: {integrity: sha512-S3eTo/KYFk+76cWJRgX30hylN5XkSmjYtCBnM4jPLYn7L6zWYEPajsFLmruQEiTEDUg0gBEWLMNyUeghtswouw==} + '@swc/core-darwin-x64@1.12.5': + resolution: {integrity: sha512-GCcD3dft8YN7unTBcW02Fx41jXp2MNQHCjx5ceWSEYOGvn7vBSUp7k7LkfTxGN5Ftxb9a1mxhPq8r4rD2u/aPw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.29': - resolution: {integrity: sha512-o9gdshbzkUMG6azldHdmKklcfrcMx+a23d/2qHQHPDLUPAN+Trd+sDQUYArK5Fcm7TlpG4sczz95ghN0DMkM7g==} + '@swc/core-linux-arm-gnueabihf@1.12.5': + resolution: {integrity: sha512-jWlzP/Y4+wbE/EJM+WGIDQsklLFV3g5LmbYTBgrY4+5nb517P31mkBzf5y2knfNWPrL7HzNu0578j3Zi2E6Iig==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.29': - resolution: {integrity: sha512-sLoaciOgUKQF1KX9T6hPGzvhOQaJn+3DHy4LOHeXhQqvBgr+7QcZ+hl4uixPKTzxk6hy6Hb0QOvQEdBAAR1gXw==} + '@swc/core-linux-arm64-gnu@1.12.5': + resolution: {integrity: sha512-GkzgIUz+2r6J6Tn3hb7/4ByaWHRrRZt4vuN9BLAd+y65m2Bt0vlEpPtWhrB/TVe4hEkFR+W5PDETLEbUT4i0tQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.29': - resolution: {integrity: sha512-PwjB10BC0N+Ce7RU/L23eYch6lXFHz7r3NFavIcwDNa/AAqywfxyxh13OeRy+P0cg7NDpWEETWspXeI4Ek8otw==} + '@swc/core-linux-arm64-musl@1.12.5': + resolution: {integrity: sha512-g0AJ7QmZPj3Uw+C5pDa48LAUG7JBgQmB0mN5cW+s2mjaFKT0mTSxYALtx/MDZwJExDPo0yJV8kSbFO1tvFPyhg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.29': - resolution: {integrity: sha512-i62vBVoPaVe9A3mc6gJG07n0/e7FVeAvdD9uzZTtGLiuIfVfIBta8EMquzvf+POLycSk79Z6lRhGPZPJPYiQaA==} + '@swc/core-linux-x64-gnu@1.12.5': + resolution: {integrity: sha512-PeYoSziNy+iNiBHPtAsO84bzBne/mbCsG5ijYkAhS1GVsDgohClorUvRXXhcUZoX2gr8TfSI9WLHo30K+DKiHg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.29': - resolution: {integrity: sha512-YER0XU1xqFdK0hKkfSVX1YIyCvMDI7K07GIpefPvcfyNGs38AXKhb2byySDjbVxkdl4dycaxxhRyhQ2gKSlsFQ==} + '@swc/core-linux-x64-musl@1.12.5': + resolution: {integrity: sha512-EJrfCCIyuV5LLmYgKtIMwtgsnjVesdFe0IgQzEKs9OfB6cL6g7WO9conn8BkGX8jphVa7jChKxShDGkreWWDzA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.29': - resolution: {integrity: sha512-po+WHw+k9g6FAg5IJ+sMwtA/fIUL3zPQ4m/uJgONBATCVnDDkyW6dBA49uHNVtSEvjvhuD8DVWdFP847YTcITw==} + '@swc/core-win32-arm64-msvc@1.12.5': + resolution: {integrity: sha512-FnwT7fxkJJMgsfiDoZKEVGyCzrPFbzpflFAAoTCUCu3MaHw6mW55o/MAAfofvJ1iIcEpec4o93OilsmKtpyO5Q==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.29': - resolution: {integrity: sha512-h+NjOrbqdRBYr5ItmStmQt6x3tnhqgwbj9YxdGPepbTDamFv7vFnhZR0YfB3jz3UKJ8H3uGJ65Zw1VsC+xpFkg==} + '@swc/core-win32-ia32-msvc@1.12.5': + resolution: {integrity: sha512-jW6l4KFt9mIXSpGseE6BQOEFmbIeXeShDuWgldEJXKeXf/uPs8wrqv80XBIUwVpK0ZbmJwPQ0waGVj8UM3th2Q==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.29': - resolution: {integrity: sha512-Q8cs2BDV9wqDvqobkXOYdC+pLUSEpX/KvI0Dgfun1F+LzuLotRFuDhrvkU9ETJA6OnD2+Fn/ieHgloiKA/Mn/g==} + '@swc/core-win32-x64-msvc@1.12.5': + resolution: {integrity: sha512-AZszwuEjlz1tSNLQRm3T5OZJ5eebxjJlDQnnzXJmg0B7DJMRoaAe1HTLOmejxjFK6yWr7fh+pSeCw2PgQLxgqA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.29': - resolution: {integrity: sha512-g4mThMIpWbNhV8G2rWp5a5/Igv8/2UFRJx2yImrLGMgrDDYZIopqZ/z0jZxDgqNA1QDx93rpwNF7jGsxVWcMlA==} + '@swc/core@1.12.5': + resolution: {integrity: sha512-KxA0PHHIuUBmQ/Oi+xFpVzILj2Oo37sTtftCbyowQlyx5YOknEOw1kLpas5hMcpznXgFyAWbpK71xQps4INPgA==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -3475,8 +3475,8 @@ packages: '@swc/helpers@0.5.1': resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} - '@swc/types@0.1.21': - resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + '@swc/types@0.1.23': + resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} '@tailwindcss/typography@0.5.16': resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} @@ -3506,8 +3506,8 @@ packages: resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@16.2.0': - resolution: {integrity: sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==} + '@testing-library/react@16.3.0': + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 @@ -3570,6 +3570,9 @@ packages: '@types/babel__traverse@7.20.7': resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/clone@0.1.30': resolution: {integrity: sha512-vcxBr+ybljeSiasmdke1cQ9ICxoEwaBgM1OQ/P5h4MPj/kRyLcDl5L8PrftlbyV1kBbJIs3M3x1A1+rcWd4mEA==} @@ -3672,6 +3675,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/diff-match-patch@1.0.36': resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} @@ -3954,28 +3960,28 @@ packages: '@codemirror/state': ^6 '@codemirror/view': ^6 - '@vitejs/plugin-react-swc@3.10.0': - resolution: {integrity: sha512-ZmkdHw3wo/o/Rk05YsXZs/DJAfY2CdQ5DUAjoWji+PEr+hYADdGMCGgEAILbiKj+CjspBTuTACBcWDrmC8AUfw==} + '@vitejs/plugin-react-swc@3.10.2': + resolution: {integrity: sha512-xD3Rdvrt5LgANug7WekBn1KhcvLn1H3jNBfJRL3reeOIua/WnZOEV5qi5qIBq5T8R0jUDmRtxuvk4bPhzGHDWw==} peerDependencies: - vite: ^4 || ^5 || ^6 + vite: ^4 || ^5 || ^6 || ^7.0.0-beta.0 - '@vitejs/plugin-react@4.5.0': - resolution: {integrity: sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==} + '@vitejs/plugin-react@4.6.0': + resolution: {integrity: sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 '@vitest/expect@2.0.5': resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - '@vitest/expect@3.1.4': - resolution: {integrity: sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.1.4': - resolution: {integrity: sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true @@ -3988,20 +3994,20 @@ packages: '@vitest/pretty-format@2.1.9': resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - '@vitest/pretty-format@3.1.4': - resolution: {integrity: sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.1.4': - resolution: {integrity: sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@3.1.4': - resolution: {integrity: sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} '@vitest/spy@2.0.5': resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} - '@vitest/spy@3.1.4': - resolution: {integrity: sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} '@vitest/utils@2.0.5': resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} @@ -4009,8 +4015,8 @@ packages: '@vitest/utils@2.1.9': resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - '@vitest/utils@3.1.4': - resolution: {integrity: sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -6270,6 +6276,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -6483,8 +6492,8 @@ packages: loro-crdt@1.5.4: resolution: {integrity: sha512-yqtu2/JhuVTbGLCQT29P8nyUsMtetMpdqINJzxfIC9ZKsIXob3mhIFCo/BcsA7gga2Ck+BcOvOhC+OBQvSj8xg==} - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -7086,13 +7095,13 @@ packages: pkg-types@1.2.1: resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} - playwright-core@1.53.0: - resolution: {integrity: sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==} + playwright-core@1.53.1: + resolution: {integrity: sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==} engines: {node: '>=18'} hasBin: true - playwright@1.53.0: - resolution: {integrity: sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==} + playwright@1.53.1: + resolution: {integrity: sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==} engines: {node: '>=18'} hasBin: true @@ -7370,8 +7379,8 @@ packages: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} engines: {node: '>=6.0.0'} - postcss@8.5.4: - resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} potpack@1.0.2: @@ -8119,6 +8128,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + strongly-connected-components@1.0.1: resolution: {integrity: sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==} @@ -8316,12 +8328,12 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} tinyqueue@2.0.3: @@ -8342,6 +8354,10 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + to-float32@1.1.0: resolution: {integrity: sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==} @@ -8805,8 +8821,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.1.4: - resolution: {integrity: sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -8868,16 +8884,16 @@ packages: yaml: optional: true - vitest@3.1.4: - resolution: {integrity: sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.1.4 - '@vitest/ui': 3.1.4 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -9372,7 +9388,7 @@ snapshots: dependencies: '@babel/types': 7.27.6 - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.27.1': {} '@babel/helper-replace-supers@7.25.9(@babel/core@7.27.4)': dependencies: @@ -9416,7 +9432,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -9424,7 +9440,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.27.4) transitivePeerDependencies: - supports-color @@ -9432,23 +9448,23 @@ snapshots: '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-simple-access': 7.25.9 transitivePeerDependencies: - supports-color @@ -9457,26 +9473,26 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.27.4) transitivePeerDependencies: @@ -9485,7 +9501,7 @@ snapshots: '@babel/preset-typescript@7.25.9(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.27.4) '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.27.4) @@ -9879,26 +9895,26 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3 - '@csstools/postcss-light-dark-function@2.0.8(postcss@8.5.4)': + '@csstools/postcss-light-dark-function@2.0.8(postcss@8.5.6)': dependencies: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3 - '@csstools/postcss-progressive-custom-properties': 4.0.1(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 + '@csstools/postcss-progressive-custom-properties': 4.0.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 - '@csstools/postcss-progressive-custom-properties@4.0.1(postcss@8.5.4)': + '@csstools/postcss-progressive-custom-properties@4.0.1(postcss@8.5.6)': dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': dependencies: postcss-selector-parser: 7.1.0 - '@csstools/utilities@2.0.0(postcss@8.5.4)': + '@csstools/utilities@2.0.0(postcss@8.5.6)': dependencies: - postcss: 8.5.4 + postcss: 8.5.6 '@dagrejs/dagre@1.1.4': dependencies: @@ -10668,9 +10684,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.53.0': + '@playwright/test@1.53.1': dependencies: - playwright: 1.53.0 + playwright: 1.53.1 '@plotly/d3-sankey-circular@0.33.1': dependencies: @@ -12494,7 +12510,9 @@ snapshots: '@codemirror/state': 6.5.2 '@codemirror/view': 6.37.2 - '@rolldown/pluginutils@1.0.0-beta.9': {} + '@rolldown/pluginutils@1.0.0-beta.11': {} + + '@rolldown/pluginutils@1.0.0-beta.19': {} '@rollup/plugin-virtual@3.0.2(rollup@4.39.0)': optionalDependencies: @@ -12796,51 +12814,51 @@ snapshots: '@swc-jotai/react-refresh@0.3.0': {} - '@swc/core-darwin-arm64@1.11.29': + '@swc/core-darwin-arm64@1.12.5': optional: true - '@swc/core-darwin-x64@1.11.29': + '@swc/core-darwin-x64@1.12.5': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.29': + '@swc/core-linux-arm-gnueabihf@1.12.5': optional: true - '@swc/core-linux-arm64-gnu@1.11.29': + '@swc/core-linux-arm64-gnu@1.12.5': optional: true - '@swc/core-linux-arm64-musl@1.11.29': + '@swc/core-linux-arm64-musl@1.12.5': optional: true - '@swc/core-linux-x64-gnu@1.11.29': + '@swc/core-linux-x64-gnu@1.12.5': optional: true - '@swc/core-linux-x64-musl@1.11.29': + '@swc/core-linux-x64-musl@1.12.5': optional: true - '@swc/core-win32-arm64-msvc@1.11.29': + '@swc/core-win32-arm64-msvc@1.12.5': optional: true - '@swc/core-win32-ia32-msvc@1.11.29': + '@swc/core-win32-ia32-msvc@1.12.5': optional: true - '@swc/core-win32-x64-msvc@1.11.29': + '@swc/core-win32-x64-msvc@1.12.5': optional: true - '@swc/core@1.11.29': + '@swc/core@1.12.5': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.21 + '@swc/types': 0.1.23 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.29 - '@swc/core-darwin-x64': 1.11.29 - '@swc/core-linux-arm-gnueabihf': 1.11.29 - '@swc/core-linux-arm64-gnu': 1.11.29 - '@swc/core-linux-arm64-musl': 1.11.29 - '@swc/core-linux-x64-gnu': 1.11.29 - '@swc/core-linux-x64-musl': 1.11.29 - '@swc/core-win32-arm64-msvc': 1.11.29 - '@swc/core-win32-ia32-msvc': 1.11.29 - '@swc/core-win32-x64-msvc': 1.11.29 + '@swc/core-darwin-arm64': 1.12.5 + '@swc/core-darwin-x64': 1.12.5 + '@swc/core-linux-arm-gnueabihf': 1.12.5 + '@swc/core-linux-arm64-gnu': 1.12.5 + '@swc/core-linux-arm64-musl': 1.12.5 + '@swc/core-linux-x64-gnu': 1.12.5 + '@swc/core-linux-x64-musl': 1.12.5 + '@swc/core-win32-arm64-msvc': 1.12.5 + '@swc/core-win32-ia32-msvc': 1.12.5 + '@swc/core-win32-x64-msvc': 1.12.5 '@swc/counter@0.1.3': {} @@ -12848,7 +12866,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/types@0.1.21': + '@swc/types@0.1.23': dependencies: '@swc/counter': 0.1.3 @@ -12899,7 +12917,7 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@babel/runtime': 7.27.6 '@testing-library/dom': 10.4.0 @@ -12983,6 +13001,10 @@ snapshots: dependencies: '@babel/types': 7.27.6 + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/clone@0.1.30': {} '@types/cookie@0.6.0': {} @@ -13108,6 +13130,8 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/deep-eql@4.0.2': {} + '@types/diff-match-patch@1.0.36': {} '@types/doctrine@0.0.9': {} @@ -13451,20 +13475,20 @@ snapshots: '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) '@connectrpc/connect-web': 1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)) - '@vitejs/plugin-react-swc@3.10.0(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0))': + '@vitejs/plugin-react-swc@3.10.2(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0))': dependencies: - '@rolldown/pluginutils': 1.0.0-beta.9 - '@swc/core': 1.11.29 + '@rolldown/pluginutils': 1.0.0-beta.11 + '@swc/core': 1.12.5 vite: 6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.5.0(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0))': + '@vitejs/plugin-react@4.6.0(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0))': dependencies: '@babel/core': 7.27.4 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.27.4) - '@rolldown/pluginutils': 1.0.0-beta.9 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) + '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 vite: 6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0) @@ -13478,16 +13502,17 @@ snapshots: chai: 5.2.0 tinyrainbow: 1.2.0 - '@vitest/expect@3.1.4': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 3.1.4 - '@vitest/utils': 3.1.4 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.4(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0))': + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0))': dependencies: - '@vitest/spy': 3.1.4 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: @@ -13502,18 +13527,19 @@ snapshots: dependencies: tinyrainbow: 1.2.0 - '@vitest/pretty-format@3.1.4': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.1.4': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 3.1.4 + '@vitest/utils': 3.2.4 pathe: 2.0.3 + strip-literal: 3.0.0 - '@vitest/snapshot@3.1.4': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.4 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 @@ -13521,27 +13547,27 @@ snapshots: dependencies: tinyspy: 3.0.2 - '@vitest/spy@3.1.4': + '@vitest/spy@3.2.4': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.3 '@vitest/utils@2.0.5': dependencies: '@vitest/pretty-format': 2.0.5 estree-walker: 3.0.3 - loupe: 3.1.3 + loupe: 3.1.4 tinyrainbow: 1.2.0 '@vitest/utils@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 - loupe: 3.1.3 + loupe: 3.1.4 tinyrainbow: 1.2.0 - '@vitest/utils@3.1.4': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.4 - loupe: 3.1.3 + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 tinyrainbow: 2.0.0 '@webassemblyjs/ast@1.14.1': @@ -13848,14 +13874,14 @@ snapshots: attr-accept@2.2.5: {} - autoprefixer@10.4.21(postcss@8.5.4): + autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.25.0 caniuse-lite: 1.0.30001722 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -14006,7 +14032,7 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.3 + loupe: 3.1.4 pathval: 2.0.0 chalk@3.0.0: @@ -14276,9 +14302,9 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-declaration-sorter@7.2.0(postcss@8.5.4): + css-declaration-sorter@7.2.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 css-font-size-keywords@1.0.0: {} @@ -14306,12 +14332,12 @@ snapshots: css-loader@7.1.2(webpack@5.96.1(esbuild@0.25.5)): dependencies: - icss-utils: 5.1.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.4) - postcss-modules-local-by-default: 4.1.0(postcss@8.5.4) - postcss-modules-scope: 3.2.1(postcss@8.5.4) - postcss-modules-values: 4.0.0(postcss@8.5.4) + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.1.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 semver: 7.7.2 optionalDependencies: @@ -14350,49 +14376,49 @@ snapshots: cssesc@3.0.0: {} - cssnano-preset-default@7.0.6(postcss@8.5.4): + cssnano-preset-default@7.0.6(postcss@8.5.6): dependencies: browserslist: 4.25.0 - css-declaration-sorter: 7.2.0(postcss@8.5.4) - cssnano-utils: 5.0.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-calc: 10.0.2(postcss@8.5.4) - postcss-colormin: 7.0.2(postcss@8.5.4) - postcss-convert-values: 7.0.4(postcss@8.5.4) - postcss-discard-comments: 7.0.3(postcss@8.5.4) - postcss-discard-duplicates: 7.0.1(postcss@8.5.4) - postcss-discard-empty: 7.0.0(postcss@8.5.4) - postcss-discard-overridden: 7.0.0(postcss@8.5.4) - postcss-merge-longhand: 7.0.4(postcss@8.5.4) - postcss-merge-rules: 7.0.4(postcss@8.5.4) - postcss-minify-font-values: 7.0.0(postcss@8.5.4) - postcss-minify-gradients: 7.0.0(postcss@8.5.4) - postcss-minify-params: 7.0.2(postcss@8.5.4) - postcss-minify-selectors: 7.0.4(postcss@8.5.4) - postcss-normalize-charset: 7.0.0(postcss@8.5.4) - postcss-normalize-display-values: 7.0.0(postcss@8.5.4) - postcss-normalize-positions: 7.0.0(postcss@8.5.4) - postcss-normalize-repeat-style: 7.0.0(postcss@8.5.4) - postcss-normalize-string: 7.0.0(postcss@8.5.4) - postcss-normalize-timing-functions: 7.0.0(postcss@8.5.4) - postcss-normalize-unicode: 7.0.2(postcss@8.5.4) - postcss-normalize-url: 7.0.0(postcss@8.5.4) - postcss-normalize-whitespace: 7.0.0(postcss@8.5.4) - postcss-ordered-values: 7.0.1(postcss@8.5.4) - postcss-reduce-initial: 7.0.2(postcss@8.5.4) - postcss-reduce-transforms: 7.0.0(postcss@8.5.4) - postcss-svgo: 7.0.1(postcss@8.5.4) - postcss-unique-selectors: 7.0.3(postcss@8.5.4) - - cssnano-utils@5.0.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - cssnano@7.0.6(postcss@8.5.4): - dependencies: - cssnano-preset-default: 7.0.6(postcss@8.5.4) + css-declaration-sorter: 7.2.0(postcss@8.5.6) + cssnano-utils: 5.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 10.0.2(postcss@8.5.6) + postcss-colormin: 7.0.2(postcss@8.5.6) + postcss-convert-values: 7.0.4(postcss@8.5.6) + postcss-discard-comments: 7.0.3(postcss@8.5.6) + postcss-discard-duplicates: 7.0.1(postcss@8.5.6) + postcss-discard-empty: 7.0.0(postcss@8.5.6) + postcss-discard-overridden: 7.0.0(postcss@8.5.6) + postcss-merge-longhand: 7.0.4(postcss@8.5.6) + postcss-merge-rules: 7.0.4(postcss@8.5.6) + postcss-minify-font-values: 7.0.0(postcss@8.5.6) + postcss-minify-gradients: 7.0.0(postcss@8.5.6) + postcss-minify-params: 7.0.2(postcss@8.5.6) + postcss-minify-selectors: 7.0.4(postcss@8.5.6) + postcss-normalize-charset: 7.0.0(postcss@8.5.6) + postcss-normalize-display-values: 7.0.0(postcss@8.5.6) + postcss-normalize-positions: 7.0.0(postcss@8.5.6) + postcss-normalize-repeat-style: 7.0.0(postcss@8.5.6) + postcss-normalize-string: 7.0.0(postcss@8.5.6) + postcss-normalize-timing-functions: 7.0.0(postcss@8.5.6) + postcss-normalize-unicode: 7.0.2(postcss@8.5.6) + postcss-normalize-url: 7.0.0(postcss@8.5.6) + postcss-normalize-whitespace: 7.0.0(postcss@8.5.6) + postcss-ordered-values: 7.0.1(postcss@8.5.6) + postcss-reduce-initial: 7.0.2(postcss@8.5.6) + postcss-reduce-transforms: 7.0.0(postcss@8.5.6) + postcss-svgo: 7.0.1(postcss@8.5.6) + postcss-unique-selectors: 7.0.3(postcss@8.5.6) + + cssnano-utils@5.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + cssnano@7.0.6(postcss@8.5.6): + dependencies: + cssnano-preset-default: 7.0.6(postcss@8.5.6) lilconfig: 3.1.3 - postcss: 8.5.4 + postcss: 8.5.6 csso@5.0.5: dependencies: @@ -15134,13 +15160,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-vitest@0.4.1(@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.1.4(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(terser@5.43.1)(yaml@2.7.0)): + eslint-plugin-vitest@0.4.1(@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(terser@5.43.1)(yaml@2.7.0)): dependencies: '@typescript-eslint/utils': 7.15.0(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) - vitest: 3.1.4(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(terser@5.43.1)(yaml@2.7.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(terser@5.43.1)(yaml@2.7.0) transitivePeerDependencies: - supports-color - typescript @@ -15810,9 +15836,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.4): + icss-utils@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 ieee754@1.2.1: {} @@ -16087,6 +16113,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -16305,7 +16333,7 @@ snapshots: loro-crdt@1.5.4: {} - loupe@3.1.3: {} + loupe@3.1.4: {} lru-cache@10.4.3: {} @@ -17093,11 +17121,11 @@ snapshots: mlly: 1.7.2 pathe: 1.1.2 - playwright-core@1.53.0: {} + playwright-core@1.53.1: {} - playwright@1.53.0: + playwright@1.53.1: dependencies: - playwright-core: 1.53.0 + playwright-core: 1.53.1 optionalDependencies: fsevents: 2.3.2 @@ -17180,198 +17208,198 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-calc@10.0.2(postcss@8.5.4): + postcss-calc@10.0.2(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - postcss-colormin@7.0.2(postcss@8.5.4): + postcss-colormin@7.0.2(postcss@8.5.6): dependencies: browserslist: 4.25.0 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-convert-values@7.0.4(postcss@8.5.4): + postcss-convert-values@7.0.4(postcss@8.5.6): dependencies: browserslist: 4.25.0 - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-discard-comments@7.0.3(postcss@8.5.4): + postcss-discard-comments@7.0.3(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-discard-duplicates@7.0.1(postcss@8.5.4): + postcss-discard-duplicates@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-discard-empty@7.0.0(postcss@8.5.4): + postcss-discard-empty@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-discard-overridden@7.0.0(postcss@8.5.4): + postcss-discard-overridden@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-import@15.1.0(postcss@8.5.4): + postcss-import@15.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.4): + postcss-js@4.0.1(postcss@8.5.6): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.4 + postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.4): + postcss-load-config@4.0.2(postcss@8.5.6): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-merge-longhand@7.0.4(postcss@8.5.4): + postcss-merge-longhand@7.0.4(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - stylehacks: 7.0.4(postcss@8.5.4) + stylehacks: 7.0.4(postcss@8.5.6) - postcss-merge-rules@7.0.4(postcss@8.5.4): + postcss-merge-rules@7.0.4(postcss@8.5.6): dependencies: browserslist: 4.25.0 caniuse-api: 3.0.0 - cssnano-utils: 5.0.0(postcss@8.5.4) - postcss: 8.5.4 + cssnano-utils: 5.0.0(postcss@8.5.6) + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-minify-font-values@7.0.0(postcss@8.5.4): + postcss-minify-font-values@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-gradients@7.0.0(postcss@8.5.4): + postcss-minify-gradients@7.0.0(postcss@8.5.6): dependencies: colord: 2.9.3 - cssnano-utils: 5.0.0(postcss@8.5.4) - postcss: 8.5.4 + cssnano-utils: 5.0.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-params@7.0.2(postcss@8.5.4): + postcss-minify-params@7.0.2(postcss@8.5.6): dependencies: browserslist: 4.25.0 - cssnano-utils: 5.0.0(postcss@8.5.4) - postcss: 8.5.4 + cssnano-utils: 5.0.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-selectors@7.0.4(postcss@8.5.4): + postcss-minify-selectors@7.0.4(postcss@8.5.6): dependencies: cssesc: 3.0.0 - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-modules-extract-imports@3.1.0(postcss@8.5.4): + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-modules-local-by-default@4.1.0(postcss@8.5.4): + postcss-modules-local-by-default@4.1.0(postcss@8.5.6): dependencies: - icss-utils: 5.1.0(postcss@8.5.4) - postcss: 8.5.4 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.4): + postcss-modules-scope@3.2.1(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 7.1.0 - postcss-modules-values@4.0.0(postcss@8.5.4): + postcss-modules-values@4.0.0(postcss@8.5.6): dependencies: - icss-utils: 5.1.0(postcss@8.5.4) - postcss: 8.5.4 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 - postcss-nested@6.2.0(postcss@8.5.4): + postcss-nested@6.2.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-normalize-charset@7.0.0(postcss@8.5.4): + postcss-normalize-charset@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 - postcss-normalize-display-values@7.0.0(postcss@8.5.4): + postcss-normalize-display-values@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-positions@7.0.0(postcss@8.5.4): + postcss-normalize-positions@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@7.0.0(postcss@8.5.4): + postcss-normalize-repeat-style@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-string@7.0.0(postcss@8.5.4): + postcss-normalize-string@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@7.0.0(postcss@8.5.4): + postcss-normalize-timing-functions@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@7.0.2(postcss@8.5.4): + postcss-normalize-unicode@7.0.2(postcss@8.5.6): dependencies: browserslist: 4.25.0 - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-url@7.0.0(postcss@8.5.4): + postcss-normalize-url@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@7.0.0(postcss@8.5.4): + postcss-normalize-whitespace@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-ordered-values@7.0.1(postcss@8.5.4): + postcss-ordered-values@7.0.1(postcss@8.5.6): dependencies: - cssnano-utils: 5.0.0(postcss@8.5.4) - postcss: 8.5.4 + cssnano-utils: 5.0.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-plugin-namespace@0.0.3: dependencies: postcss: 7.0.39 - postcss-reduce-initial@7.0.2(postcss@8.5.4): + postcss-reduce-initial@7.0.2(postcss@8.5.6): dependencies: browserslist: 4.25.0 caniuse-api: 3.0.0 - postcss: 8.5.4 + postcss: 8.5.6 - postcss-reduce-transforms@7.0.0(postcss@8.5.4): + postcss-reduce-transforms@7.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-resolve-nested-selector@0.1.6: {} - postcss-safe-parser@7.0.1(postcss@8.5.4): + postcss-safe-parser@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser@6.0.10: dependencies: @@ -17388,15 +17416,15 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-svgo@7.0.1(postcss@8.5.4): + postcss-svgo@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-value-parser: 4.2.0 svgo: 3.3.2 - postcss-unique-selectors@7.0.3(postcss@8.5.4): + postcss-unique-selectors@7.0.3(postcss@8.5.6): dependencies: - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-value-parser@4.2.0: {} @@ -17406,7 +17434,7 @@ snapshots: picocolors: 0.2.1 source-map: 0.6.1 - postcss@8.5.4: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -18440,6 +18468,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + strongly-connected-components@1.0.1: {} style-loader@4.0.0(webpack@5.96.1(esbuild@0.25.5)): @@ -18456,10 +18488,10 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - stylehacks@7.0.4(postcss@8.5.4): + stylehacks@7.0.4(postcss@8.5.6): dependencies: browserslist: 4.25.0 - postcss: 8.5.4 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 stylelint-config-recommended@14.0.1(stylelint@16.19.1(typescript@5.8.3)): @@ -18500,9 +18532,9 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.4 + postcss: 8.5.6 postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 7.0.1(postcss@8.5.4) + postcss-safe-parser: 7.0.1(postcss@8.5.6) postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 @@ -18630,11 +18662,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.4 - postcss-import: 15.1.0(postcss@8.5.4) - postcss-js: 4.0.1(postcss@8.5.4) - postcss-load-config: 4.0.2(postcss@8.5.4) - postcss-nested: 6.2.0(postcss@8.5.4) + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.0.1(postcss@8.5.6) + postcss-load-config: 4.0.2(postcss@8.5.6) + postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -18708,12 +18740,12 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.13: + tinyglobby@0.2.14: dependencies: fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@1.0.2: {} + tinypool@1.1.1: {} tinyqueue@2.0.3: {} @@ -18725,6 +18757,8 @@ snapshots: tinyspy@3.0.2: {} + tinyspy@4.0.3: {} + to-float32@1.1.0: {} to-px@1.0.1: @@ -19383,7 +19417,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.4(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0): + vite-node@3.2.4(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.1 @@ -19407,7 +19441,7 @@ snapshots: vite-plugin-top-level-await@1.5.0(rollup@4.39.0)(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0)): dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@4.39.0) - '@swc/core': 1.11.29 + '@swc/core': 1.12.5 uuid: 10.0.0 vite: 6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0) transitivePeerDependencies: @@ -19434,9 +19468,9 @@ snapshots: esbuild: 0.25.5 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.4 + postcss: 8.5.6 rollup: 4.39.0 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 optionalDependencies: '@types/node': 24.0.3 fsevents: 2.3.3 @@ -19445,28 +19479,30 @@ snapshots: terser: 5.43.1 yaml: 2.7.0 - vitest@3.1.4(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(terser@5.43.1)(yaml@2.7.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(terser@5.43.1)(yaml@2.7.0): dependencies: - '@vitest/expect': 3.1.4 - '@vitest/mocker': 3.1.4(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0)) - '@vitest/pretty-format': 3.1.4 - '@vitest/runner': 3.1.4 - '@vitest/snapshot': 3.1.4 - '@vitest/spy': 3.1.4 - '@vitest/utils': 3.1.4 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.0.3)(typescript@5.8.3))(vite@6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 debug: 4.4.1 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 + picomatch: 4.0.2 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.13 - tinypool: 1.0.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 tinyrainbow: 2.0.0 vite: 6.3.2(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0) - vite-node: 3.1.4(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0) + vite-node: 3.2.4(@types/node@24.0.3)(jiti@1.21.7)(less@4.2.0)(terser@5.43.1)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 diff --git a/frontend/src/components/app-config/app-config-button.tsx b/frontend/src/components/app-config/app-config-button.tsx index 0009a2a6f56..aaf47ac6731 100644 --- a/frontend/src/components/app-config/app-config-button.tsx +++ b/frontend/src/components/app-config/app-config-button.tsx @@ -17,10 +17,17 @@ import { UserConfigForm } from "./user-config-form"; interface Props { showAppConfig?: boolean; + disabled?: boolean; + tooltip?: string; } -export const ConfigButton: React.FC = ({ showAppConfig = true }) => { +export const ConfigButton: React.FC = ({ + showAppConfig = true, + disabled = false, + tooltip = "Settings", +}) => { const [settingDialog, setSettingDialog] = useAtom(settingDialogAtom); + const button = ( = ({ showAppConfig = true }) => { shape="circle" size="small" className="h-[27px] w-[27px]" - color="hint-green" + disabled={disabled} + color={disabled ? "disabled" : "hint-green"} > - + diff --git a/frontend/src/components/app-config/user-config-form.tsx b/frontend/src/components/app-config/user-config-form.tsx index 1376ea85c7c..394b0eac45d 100644 --- a/frontend/src/components/app-config/user-config-form.tsx +++ b/frontend/src/components/app-config/user-config-form.tsx @@ -659,6 +659,34 @@ export const UserConfigForm: React.FC = () => { )} /> + ( +
+ + Reference highlighting + + + + + + + + + Visually emphasizes variables in a cell that are defined + elsewhere in the notebook. + +
+ )} + /> { chartsFeatureEnabled?: boolean; togglePanel?: (panelType: PanelType) => void; isPanelOpen?: (panelType: PanelType) => boolean; + tableLoading?: boolean; } export const TableActions = ({ @@ -53,6 +54,7 @@ export const TableActions = ({ chartsFeatureEnabled, togglePanel, isPanelOpen, + tableLoading, }: TableActionsProps) => { const handleSelectAllRows = (value: boolean) => { if (!onRowSelectionChange) { @@ -163,6 +165,7 @@ export const TableActions = ({ selection={selection} onSelectAllRowsChange={handleSelectAllRows} table={table} + tableLoading={tableLoading} /> )}
diff --git a/frontend/src/components/data-table/chart-spec-model.tsx b/frontend/src/components/data-table/chart-spec-model.tsx index 5e5d63287f7..520e7052bdc 100644 --- a/frontend/src/components/data-table/chart-spec-model.tsx +++ b/frontend/src/components/data-table/chart-spec-model.tsx @@ -1,9 +1,9 @@ /* Copyright 2024 Marimo. All rights reserved. */ import { mint, orange, slate } from "@radix-ui/colors"; -// @ts-expect-error vega-typings does not include formats -import { formats } from "vega"; import type { TopLevelSpec } from "vega-lite"; +// @ts-expect-error vega-typings does not include formats +import { formats } from "vega-loader"; import { asRemoteURL } from "@/core/runtime/config"; import type { TopLevelFacetedUnitSpec } from "@/plugins/impl/data-explorer/queries/types"; import { arrow } from "@/plugins/impl/vega/formats"; diff --git a/frontend/src/components/data-table/charts/chart-spec/encodings.ts b/frontend/src/components/data-table/charts/chart-spec/encodings.ts index 5770817abb3..922ef9db28d 100644 --- a/frontend/src/components/data-table/charts/chart-spec/encodings.ts +++ b/frontend/src/components/data-table/charts/chart-spec/encodings.ts @@ -1,6 +1,5 @@ /* Copyright 2024 Marimo. All rights reserved. */ -import type { ColorScheme } from "vega"; import type { Aggregate } from "vega-lite/build/src/aggregate"; import type { BinParams } from "vega-lite/build/src/bin"; import type { ColorDef, OffsetDef } from "vega-lite/build/src/channeldef"; @@ -12,6 +11,7 @@ import { type AggregationFn, BIN_AGGREGATION, ChartType, + type ColorScheme, NONE_AGGREGATION, type SelectableDataType, STRING_AGGREGATION_FNS, diff --git a/frontend/src/components/data-table/charts/chart-spec/spec.ts b/frontend/src/components/data-table/charts/chart-spec/spec.ts index ba372149cb9..54b624bfb30 100644 --- a/frontend/src/components/data-table/charts/chart-spec/spec.ts +++ b/frontend/src/components/data-table/charts/chart-spec/spec.ts @@ -1,6 +1,5 @@ /* Copyright 2024 Marimo. All rights reserved. */ -import type { ExprRef, SignalRef } from "vega"; import type { TopLevelSpec } from "vega-lite"; import type { ColorDef, @@ -164,7 +163,7 @@ export function getAxisEncoding( export function getFacetEncoding( facet: z.infer | z.infer, chartType: ChartType, -): FacetFieldDef { +): FacetFieldDef { const binValues = getBinEncoding( chartType, facet.selectedDataType || "string", diff --git a/frontend/src/components/data-table/charts/constants.ts b/frontend/src/components/data-table/charts/constants.ts index b830c0a977c..b28684ce135 100644 --- a/frontend/src/components/data-table/charts/constants.ts +++ b/frontend/src/components/data-table/charts/constants.ts @@ -18,10 +18,10 @@ import { SquareFunctionIcon, TableIcon, } from "lucide-react"; -import type { ColorScheme } from "vega"; import type { AggregationFn, ChartType, + ColorScheme, SelectableDataType, TimeUnit, } from "./types"; diff --git a/frontend/src/components/data-table/charts/types.ts b/frontend/src/components/data-table/charts/types.ts index a592b2a41f2..3ede1226f2d 100644 --- a/frontend/src/components/data-table/charts/types.ts +++ b/frontend/src/components/data-table/charts/types.ts @@ -1,4 +1,11 @@ /* Copyright 2024 Marimo. All rights reserved. */ +import type { Scale } from "vega-lite/build/src/scale"; + +/** + * Valid string-based color scheme options from + * Vega-Lite `Scale["scheme"]` (aka `vega.ColorScheme`). + */ +export type ColorScheme = NonNullable; /** * Similar to VegaLite's ScaleType, https://vega.github.io/vega-lite/docs/scale.html#type diff --git a/frontend/src/components/data-table/column-explorer-panel/column-explorer.tsx b/frontend/src/components/data-table/column-explorer-panel/column-explorer.tsx index 0096888d48a..53ca5c65932 100644 --- a/frontend/src/components/data-table/column-explorer-panel/column-explorer.tsx +++ b/frontend/src/components/data-table/column-explorer-panel/column-explorer.tsx @@ -78,7 +78,7 @@ export const ColumnExplorerPanel = ({ className="h-3 w-3 ml-1 mt-0.5" /> - + { const { theme } = useTheme(); - const { data, error, isPending } = useAsyncData(async () => { + const { + data, + error, + isPending, + refetch: refetchPreview, + } = useAsyncData(async () => { const response = await previewColumn({ column: columnName }); return response; }, []); @@ -196,7 +201,8 @@ const ColumnPreview = ({ } = data; const errorState = - previewError && renderPreviewError(previewError, missing_packages); + previewError && + renderPreviewError(previewError, missing_packages, refetchPreview); const previewStats = stats && renderStats(stats, dataType); diff --git a/frontend/src/components/data-table/column-summary.tsx b/frontend/src/components/data-table/column-summary.tsx index 0aeb0a15ec8..bfaa85feec7 100644 --- a/frontend/src/components/data-table/column-summary.tsx +++ b/frontend/src/components/data-table/column-summary.tsx @@ -47,8 +47,8 @@ export const TableColumnSummary = ({ spec={spec} width={70} height={30} - // eslint-disable-next-line @typescript-eslint/no-explicit-any - loader={batchedLoader as any} + // @ts-expect-error - Our `loader.load` method is broader than VegaLite's typings but is functionally supported. + loader={batchedLoader} style={{ minWidth: "unset", maxHeight: "40px" }} actions={false} theme={theme === "dark" ? "dark" : "vox"} diff --git a/frontend/src/components/data-table/columns.tsx b/frontend/src/components/data-table/columns.tsx index 6adbfd318ea..f0d2a0aeaf6 100644 --- a/frontend/src/components/data-table/columns.tsx +++ b/frontend/src/components/data-table/columns.tsx @@ -68,12 +68,12 @@ export function inferFieldTypes(items: T[]): FieldTypesWithExternalType { // This can be slow for large datasets, // so only sample 10 evenly distributed rows uniformSample(items, 10).forEach((item) => { - if (typeof item !== "object") { + if (typeof item !== "object" || item === null) { return; } // We will be a bit defensive and assume values are not homogeneous. // If any is a mimetype, then we will treat it as a mimetype (i.e. not sortable) - Object.entries(item as object).forEach(([key, value], idx) => { + Object.entries(item).forEach(([key, value], idx) => { const currentValue = fieldTypes[key]; if (!currentValue) { // Set for the first time @@ -152,8 +152,7 @@ export function generateColumns({ // may have periods in them ... // https://github.com/TanStack/table/issues/1671 accessorFn: (row) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (row as any)[key]; + return row[key as keyof T]; }, header: ({ column }) => { diff --git a/frontend/src/components/data-table/data-table.tsx b/frontend/src/components/data-table/data-table.tsx index 7e4b31f712b..5696c241d41 100644 --- a/frontend/src/components/data-table/data-table.tsx +++ b/frontend/src/components/data-table/data-table.tsx @@ -126,12 +126,32 @@ const DataTableInternal = ({ onViewedRowChange, }: DataTableProps) => { const [isSearchEnabled, setIsSearchEnabled] = React.useState(false); + const [showLoadingBar, setShowLoadingBar] = React.useState(false); const { columnPinning, setColumnPinning } = useColumnPinning( freezeColumnsLeft, freezeColumnsRight, ); + // Show loading bar only after a short delay to prevent flickering + React.useEffect(() => { + let timeoutId: NodeJS.Timeout; + + if (reloading) { + timeoutId = setTimeout(() => { + setShowLoadingBar(true); + }, 300); + } else { + setShowLoadingBar(false); + } + + return () => { + if (timeoutId) { + clearTimeout(timeoutId); + } + }; + }, [reloading]); + // Returns the row index, accounting for pagination function getPaginatedRowIndex(row: TData, idx: number): number { if (!paginationState) { @@ -231,7 +251,10 @@ const DataTableInternal = ({ reloading={reloading} /> )} - +
+ {showLoadingBar && ( +
+ )} {renderTableHeader(table)} ({ chartsFeatureEnabled={chartsFeatureEnabled} togglePanel={togglePanel} isPanelOpen={isPanelOpen} + tableLoading={reloading} />
); diff --git a/frontend/src/components/data-table/pagination.tsx b/frontend/src/components/data-table/pagination.tsx index 15d7a3b4a39..096448e5e66 100644 --- a/frontend/src/components/data-table/pagination.tsx +++ b/frontend/src/components/data-table/pagination.tsx @@ -10,6 +10,7 @@ import { ChevronsRight, } from "lucide-react"; import { Button } from "@/components/ui/button"; +import { Events } from "@/utils/events"; import { PluralWord } from "@/utils/pluralize"; import { Select, @@ -27,6 +28,7 @@ interface DataTablePaginationProps { selection?: DataTableSelection; totalColumns: number; onSelectAllRowsChange?: (value: boolean) => void; + tableLoading?: boolean; } export const DataTablePagination = ({ @@ -34,6 +36,7 @@ export const DataTablePagination = ({ selection, onSelectAllRowsChange, totalColumns, + tableLoading, }: DataTablePaginationProps) => { const renderTotal = () => { const { rowSelection, cellSelection } = table.getState(); @@ -59,6 +62,7 @@ export const DataTablePagination = ({ data-testid="select-all-button" variant="link" className="h-4" + onMouseDown={Events.preventFocus} onClick={() => { if (onSelectAllRowsChange) { onSelectAllRowsChange(true); @@ -82,6 +86,7 @@ export const DataTablePagination = ({ data-testid="clear-selection-button" variant="link" className="h-4" + onMouseDown={Events.preventFocus} onClick={() => { if (!isCellSelection) { if (onSelectAllRowsChange) { @@ -115,6 +120,13 @@ export const DataTablePagination = ({ const pageSizeSet = new Set([5, 10, 25, 50, 100, pageSize]); const pageSizes = [...pageSizeSet].sort((a, b) => a - b); + const handlePageChange = (pageChangeFn: () => void) => { + // Frequent page changes can reset the page index, so we wait until the previous change has completed + if (!tableLoading) { + pageChangeFn(); + } + }; + return (
@@ -151,7 +163,8 @@ export const DataTablePagination = ({ variant="outline" data-testid="first-page-button" className="hidden h-6 w-6 p-0 lg:flex" - onClick={() => table.setPageIndex(0)} + onClick={() => handlePageChange(() => table.setPageIndex(0))} + onMouseDown={Events.preventFocus} disabled={!table.getCanPreviousPage()} > Go to first page @@ -162,7 +175,8 @@ export const DataTablePagination = ({ variant="outline" data-testid="previous-page-button" className="h-6 w-6 p-0" - onClick={() => table.previousPage()} + onClick={() => handlePageChange(() => table.previousPage())} + onMouseDown={Events.preventFocus} disabled={!table.getCanPreviousPage()} > Go to previous page @@ -173,7 +187,9 @@ export const DataTablePagination = ({ table.setPageIndex(page)} + onPageChange={(page) => + handlePageChange(() => table.setPageIndex(page)) + } /> of {prettyNumber(totalPages)}
@@ -182,7 +198,8 @@ export const DataTablePagination = ({ variant="outline" data-testid="next-page-button" className="h-6 w-6 p-0" - onClick={() => table.nextPage()} + onClick={() => handlePageChange(() => table.nextPage())} + onMouseDown={Events.preventFocus} disabled={!table.getCanNextPage()} > Go to next page @@ -193,7 +210,10 @@ export const DataTablePagination = ({ variant="outline" data-testid="last-page-button" className="hidden h-6 w-6 p-0 lg:flex" - onClick={() => table.setPageIndex(table.getPageCount() - 1)} + onClick={() => + handlePageChange(() => table.setPageIndex(table.getPageCount() - 1)) + } + onMouseDown={Events.preventFocus} disabled={!table.getCanNextPage()} > Go to last page diff --git a/frontend/src/components/data-table/renderers.tsx b/frontend/src/components/data-table/renderers.tsx index 1fc119ccd51..63f50969ca0 100644 --- a/frontend/src/components/data-table/renderers.tsx +++ b/frontend/src/components/data-table/renderers.tsx @@ -55,9 +55,11 @@ export function renderTableHeader( return ( - {renderHeaderGroup(table.getLeftHeaderGroups())} - {renderHeaderGroup(table.getCenterHeaderGroups())} - {renderHeaderGroup(table.getRightHeaderGroups())} + + {renderHeaderGroup(table.getLeftHeaderGroups())} + {renderHeaderGroup(table.getCenterHeaderGroups())} + {renderHeaderGroup(table.getRightHeaderGroups())} + ); } diff --git a/frontend/src/components/datasources/__tests__/install-package-button.test.tsx b/frontend/src/components/datasources/__tests__/install-package-button.test.tsx index 34b7a75dffd..4ce2368b074 100644 --- a/frontend/src/components/datasources/__tests__/install-package-button.test.tsx +++ b/frontend/src/components/datasources/__tests__/install-package-button.test.tsx @@ -1,6 +1,6 @@ /* Copyright 2024 Marimo. All rights reserved. */ -import { fireEvent, render, screen } from "@testing-library/react"; +import { render, screen } from "@testing-library/react"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { InstallPackageButton } from "../install-package-button"; @@ -11,12 +11,6 @@ vi.mock("@/components/editor/chrome/state", () => ({ }), })); -const mockSetPackagesToInstall = vi.fn(); -vi.mock("jotai", () => ({ - atom: () => ({}), - useSetAtom: () => mockSetPackagesToInstall, -})); - vi.mock("@/components/editor/chrome/panels/packages-state", () => ({ packagesToInstallAtom: {}, })); @@ -65,14 +59,4 @@ describe("InstallPackageButton", () => { ); expect(screen.getByText("Install altair")).toBeInTheDocument(); }); - - it("should open the packages panel when clicked", () => { - render(); - - fireEvent.click(screen.getByText("Install altair")); - - expect(mockSetPackagesToInstall).toHaveBeenCalledWith("altair"); - - expect(mockOpenApplication).toHaveBeenCalledWith("packages"); - }); }); diff --git a/frontend/src/components/datasources/__tests__/utils.test.ts b/frontend/src/components/datasources/__tests__/utils.test.ts index b3be5889abf..423f119f40e 100644 --- a/frontend/src/components/datasources/__tests__/utils.test.ts +++ b/frontend/src/components/datasources/__tests__/utils.test.ts @@ -1,10 +1,8 @@ /* Copyright 2024 Marimo. All rights reserved. */ import { describe, expect, it } from "vitest"; -import { - DUCKDB_ENGINE, - type SQLTableContext, -} from "@/core/datasets/data-source-connections"; +import type { SQLTableContext } from "@/core/datasets/data-source-connections"; +import { DUCKDB_ENGINE } from "@/core/datasets/engines"; import type { DataTable, DataTableColumn } from "@/core/kernel/messages"; import { sqlCode } from "../utils"; diff --git a/frontend/src/components/datasources/column-preview.tsx b/frontend/src/components/datasources/column-preview.tsx index e9752800130..835e0bb85fe 100644 --- a/frontend/src/components/datasources/column-preview.tsx +++ b/frontend/src/components/datasources/column-preview.tsx @@ -41,6 +41,18 @@ export const DatasetColumnPreview: React.FC<{ }> = ({ table, column, preview, onAddColumnChart, sqlTableContext }) => { const { theme } = useTheme(); + const previewColumn = () => { + previewDatasetColumn({ + source: table.source, + tableName: table.name, + columnName: column.name, + sourceType: table.source_type, + fullyQualifiedTableName: sqlTableContext + ? `${sqlTableContext.database}.${sqlTableContext.schema}.${table.name}` + : table.name, + }); + }; + useOnMount(() => { if (preview) { return; @@ -51,15 +63,7 @@ export const DatasetColumnPreview: React.FC<{ return; } - previewDatasetColumn({ - source: table.source, - tableName: table.name, - columnName: column.name, - sourceType: table.source_type, - fullyQualifiedTableName: sqlTableContext - ? `${sqlTableContext.database}.${sqlTableContext.schema}.${table.name}` - : table.name, - }); + previewColumn(); }); if (table.source_type === "connection") { @@ -93,7 +97,7 @@ export const DatasetColumnPreview: React.FC<{ const error = preview.error && - renderPreviewError(preview.error, preview.missing_packages); + renderPreviewError(preview.error, preview.missing_packages, previewColumn); const stats = preview.stats && renderStats(preview.stats, column.type); @@ -137,15 +141,17 @@ export const DatasetColumnPreview: React.FC<{ export function renderPreviewError( error: string, missing_packages?: string[] | null, + refetchPreview?: () => void, ) { return ( -
+
{error} {missing_packages && ( )}
diff --git a/frontend/src/components/datasources/datasources.tsx b/frontend/src/components/datasources/datasources.tsx index 56e1b88e187..c969297e3e8 100644 --- a/frontend/src/components/datasources/datasources.tsx +++ b/frontend/src/components/datasources/datasources.tsx @@ -29,12 +29,11 @@ import { cellIdsAtom, useCellActions } from "@/core/cells/cells"; import { useLastFocusedCellId } from "@/core/cells/focus"; import { autoInstantiateAtom } from "@/core/config/config"; import { - DUCKDB_ENGINE, dataConnectionsMapAtom, - INTERNAL_SQL_ENGINES, type SQLTableContext, useDataSourceActions, } from "@/core/datasets/data-source-connections"; +import { DUCKDB_ENGINE, INTERNAL_SQL_ENGINES } from "@/core/datasets/engines"; import { PreviewSQLTable, PreviewSQLTableList, diff --git a/frontend/src/components/datasources/install-package-button.tsx b/frontend/src/components/datasources/install-package-button.tsx index a32d46bc753..df6f4a74fa6 100644 --- a/frontend/src/components/datasources/install-package-button.tsx +++ b/frontend/src/components/datasources/install-package-button.tsx @@ -1,16 +1,15 @@ /* Copyright 2024 Marimo. All rights reserved. */ -import { useSetAtom } from "jotai"; import React from "react"; -import { packagesToInstallAtom } from "@/components/editor/chrome/panels/packages-state"; -import { useChromeActions } from "@/components/editor/chrome/state"; import { Button } from "@/components/ui/button"; +import { useInstallPackages } from "@/core/packages/useInstallPackage"; import { cn } from "@/utils/cn"; interface InstallPackageButtonProps { packages: string[] | undefined; showMaxPackages?: number; className?: string; + onInstall?: () => void; } /** @@ -21,29 +20,21 @@ export const InstallPackageButton: React.FC = ({ packages, showMaxPackages, className, + onInstall, }) => { - const chromeActions = useChromeActions(); - const setPackagesToInstall = useSetAtom(packagesToInstallAtom); + const { handleInstallPackages } = useInstallPackages(); if (!packages || packages.length === 0) { return null; } - const handleClick = () => { - const packagesString = packages.join(", "); - - // Set the packages to install - setPackagesToInstall(packagesString); - - // Open the packages panel - chromeActions.openApplication("packages"); - }; - return ( ); @@ -80,7 +90,9 @@ export const NotebookMenuDropdown: React.FC = () => { return ( - {button} + + {button} + {actions.map((action) => { if (action.hidden) { diff --git a/frontend/src/components/editor/controls/shutdown-button.tsx b/frontend/src/components/editor/controls/shutdown-button.tsx index c68e8364f22..0f270da6be1 100644 --- a/frontend/src/components/editor/controls/shutdown-button.tsx +++ b/frontend/src/components/editor/controls/shutdown-button.tsx @@ -8,7 +8,17 @@ import { AlertDialogDestructiveAction } from "../../ui/alert-dialog"; import { Tooltip } from "../../ui/tooltip"; import { Button } from "../inputs/Inputs"; -export const ShutdownButton: React.FC<{ description: string }> = (props) => { +interface Props { + description: string; + disabled?: boolean; + tooltip?: string; +} + +export const ShutdownButton: React.FC = ({ + description, + disabled = false, + tooltip = "Shutdown", +}) => { const { openConfirm, closeModal } = useImperativeModal(); const handleShutdown = () => { sendShutdown(); @@ -23,19 +33,20 @@ export const ShutdownButton: React.FC<{ description: string }> = (props) => { } return ( - +