diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 9fedbb456ec..1a831e96618 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -26,6 +26,7 @@ jobs: - '!docs/**' - '!examples/**' - '!README.md' + - '!tests/**' test: needs: changes diff --git a/.github/workflows/test_be.yaml b/.github/workflows/test_be.yaml index b89071f000a..2df9202d76a 100644 --- a/.github/workflows/test_be.yaml +++ b/.github/workflows/test_be.yaml @@ -25,6 +25,7 @@ jobs: - '!marimo/_smoke_tests/**' - 'tests/**' - 'pyproject.toml' + - '!frontend/**' docs: - 'docs/**' diff --git a/.github/workflows/test_be_dagger.yaml.skip b/.github/workflows/test_be_dagger.yaml.skip index 03072fc35a0..5cd6f8f6d42 100644 --- a/.github/workflows/test_be_dagger.yaml.skip +++ b/.github/workflows/test_be_dagger.yaml.skip @@ -22,6 +22,7 @@ jobs: - 'tests/**' - 'pyproject.toml' - 'dagger/**' + - '!frontend/**' test_python: needs: changes diff --git a/docs/_static/docs-markdown-toggle.webm b/docs/_static/docs-markdown-toggle.webm index 3797836163d..36743bbaa89 100644 Binary files a/docs/_static/docs-markdown-toggle.webm and b/docs/_static/docs-markdown-toggle.webm differ diff --git a/docs/guides/editor_features/watching.md b/docs/guides/editor_features/watching.md index e8e401eab06..10d98f2e5c7 100644 --- a/docs/guides/editor_features/watching.md +++ b/docs/guides/editor_features/watching.md @@ -11,24 +11,22 @@ have the changes automatically reflected in your browser. For better performance, install [watchdog](https://pypi.org/project/watchdog/). Without watchdog, marimo resorts to polling. -## marimo's File format - -### Python file format +## marimo's file format !!! tip "File format tutorial" Run `marimo tutorial fileformat` at the command line for a full guide. -marimo stores notebooks as Python files with cell definitions. Cells are stored +marimo stores notebooks as Python files. Cells are stored as functions, decorated with`@app.cell`; you can optionally give cells names in the editor UI or by editing the notebook file. ```python @app.cell -def memorable_cell_name(auto, determined, references): # signature denotes cell inputs +def memorable_cell_name(auto, determined, references): # signature denotes cell references computed_value = auto + determined + references - "hello!" # final statement are outputted - return computed_value # return denotes cell outputs + "hello!" # final statement is the visual output + return computed_value # return denotes cell definitions ``` !!! note "Cell signature and returns" @@ -36,66 +34,119 @@ def memorable_cell_name(auto, determined, references): # signature denotes cell Don't worry about maintaining the signatures of cells and their return values; marimo will handle this for you. -You may also expose imports, and top-level functions and classes in your -notebook. Functions must be decorated with `@app.function`, and classes with -`app.class_definition`. These functions and classes must be pure, closing over -only other pure functions and classes or imports and constants defined in -an `app.setup` with block: +### Exposing functions and classes top-level + +You can expose top-level functions and classes in your +notebook, so that other Python modules can import them: + +```python +from my_notebook import my_function, MyClass +``` + +Top-level functions are added to a notebook using the `@app.function` +decorator, and classes with `@app.class_definition`; these appear in your +notebook as cells with just a function or class definition. These functions and +classes must be pure, closing over only other pure functions and classes, or +imports and constants defined in an `app.setup` `with` block. + +Here is a complete example that you can copy/paste and run locally: -For more details see the [library guide](../reusing_functions.md). ```python +import marimo + +app = marimo.App() + with app.setup: + # These symbols can be used by top-level functions and classes + # (as well as by regular cells) + import numpy as np + CONSTANT: int = 1 - import marimo as mo @app.function -def my_function(x): ... +def my_function(x: np.ndarray): + return np.mean(x) + CONSTANT @app.class_definition -class MyClass: ... +class MyClass: + ... + +@app.cell +def _(): + my_function(np.random.randn(2, 2)) + return + +if __name__ == "__main__": + app.run() ``` -!!! question "Want to use your own LSP for typing?" - Explicitly typing your definitions will let marimo carry the annotations - into function signatures. For instance +For more details see the [guide on reusable functions and classes](../reusing_functions.md). + +### Types and autocompletion + +Add type hints to your variables, and marimo will carry over these types +hints to cells where these variables use. This, combined with declaring +your inputs in the setup cell, makes it possible for your editor +to give completions on cell inputs. + + +For example: ```python +# setup cell +import numpy as np + # cell 1 -x: int -y: str +x: np.ndarray # cell 2 -z = f"{x} & {y}" +np.mean(x) ``` will be serialized as ```python +import marimo + +app = marimo.App() + +with app.setup: + import numpy as np + @app.cell -def cell_1(): - x: int - y: str - return x, y +def _(): + x: np.ndarray + return x, @app.cell -def cell_2(x: int, y: str): - z = f"{x} & {y}" +def _(x: np.ndarray): + np.mean(x) + +if __name__ == "__main__": + app.run() ``` -### Markdown file format +### As markdown !!! tip "Markdown File format tutorial" Run `marimo tutorial markdown-format` at the command line for a full guide. marimo notebooks can also be stored as Markdown files. This is a good option for prose heavy text, and can be easy to navigate and edit in external editors. +To convert a marimo notebook to markdown, use + +``` +marimo export md notebook.py -o notebook.md +``` + +at the command-line, or rename your file to have an `.md` extension in the notebook editor. marimo conforms to standard markdown document format, and will render most -places like Github. -Metadata in this file format is saved in the frontmatter, which marimo may use -for information like [sandboxing](../package_reproducibility.md), and the -marimo version. All other fields are kept, but ignored. +places like Github. Metadata in this file format is saved in the frontmatter, +which marimo may use for information like +[sandboxing](../package_reproducibility.md), and the marimo version. All other +fields are kept, but ignored. For execution, marimo extracts code fences that contain `marimo` in braces. For instance `python {marimo}`, `{marimo}` or `{.marimo .python}`. The marimo @@ -117,13 +168,16 @@ print("Hello World!") ```` marimo's markdown format can be used with a [`mkdocs -plugin`](https://github.com/marimo-team/mkdocs-marimo), and +plugin`](https://github.com/marimo-team/mkdocs-marimo) and [`Quarto`](https://github.com/marimo-team/quarto-marimo). -Note, there is some feature loss in this format. Reactive tests will not work, -and the notebooks cannot be imported or used as a library. +Note that the markdown format is not as fully featured as the Python format. +Reactive tests will not work, markdown notebooks cannot be imported or used as +a library, and they cannot be run as scripts. + +## Watching for changes to your notebook -## `marimo edit --watch` +### `marimo edit --watch` When you run `marimo edit` with the `--watch` flag, the marimo server will open your notebook in the browser and watch the underlying notebook @@ -142,9 +196,9 @@ If you want to run all affected cells automatically when you save, change the watcher_on_save = "autorun" ``` -## `marimo run --watch` +### `marimo run --watch` -When you run a notebook with the `--watch` flag, whenever the file watcher +When you run `marimo run` with the `--watch` flag, whenever the file watcher detects a change to the notebook file, the application will be refreshed. The browser will trigger a page refresh to ensure your notebook starts from a fresh state. @@ -160,8 +214,9 @@ Guide](module_autoreloading.md) !!! note Support for watching data files and automatically refreshing cells that - depend on them is coming soon. Follow along at - + depend on them is not yet supported. Follow along at + and let us know + if it is important to you. ## Hot-reloading WebAssembly notebooks diff --git a/docs/guides/outputs.md b/docs/guides/outputs.md index 430764b21bb..2d0853e84db 100644 --- a/docs/guides/outputs.md +++ b/docs/guides/outputs.md @@ -64,22 +64,26 @@ mo.md( ### Markdown editor -marimo automatically renders cells that only use `mo.md("")`, without an -`f`-string, in a markdown editor that supports common hotkeys. - -Because the Markdown editor doesn't support f-strings, you'll need to use -`mo.md` directly to interpolate Python values into your Markdown. You can -switch between the Markdown and Python editors by clicking the button in the -top right. +marimo automatically renders cells that only use `mo.md` in a markdown editor +that supports common hotkeys. You can switch between the Markdown and Python +editors by clicking the button in the top right:
-
+**Writing LaTeX.** The markdown editor supports writing LaTeX. You should typically +use a raw string for markdown with LaTeX, which you can activate by checking the `r` +box in the bottom-right corner of the markdown editor. + +**Interpolating Python values.** Interpolating Python values requires using an +`f`-string, which you can activate by checking the `f` box in the bottom-right +corner of the markdown editor. + ### Markdown extensions #### Details diff --git a/docs/guides/reusing_functions.md b/docs/guides/reusing_functions.md index 09cc130ef64..8c6428b7ee8 100644 --- a/docs/guides/reusing_functions.md +++ b/docs/guides/reusing_functions.md @@ -57,7 +57,7 @@ To add a setup cell in the editor, open the notebook menu and select "Add setup ### 2. Define your function Define a single function in a cell. If the -[criteria](overview) for top-level +[criteria](#overview) for top-level functions are met, a marker in the bottom right will indicate that it is a reusable function. @@ -102,8 +102,8 @@ print(stats) ## Best practices -- Use setup cells for immediate, widely used imports -- Keep function dependencies limited to setup-cell references, or other top-level declarations. +- Use setup cells for widely used imports +- Keep function dependencies limited to setup-cell references, or other top-level declarations - Use descriptive names for your functions - Add docstrings to document your functions' behavior diff --git a/frontend/package.json b/frontend/package.json index 859703d46c3..f5c843dd526 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -36,7 +36,7 @@ "@emotion/cache": "^11.14.0", "@emotion/react": "^11.14.0", "@hookform/resolvers": "^3.10.0", - "@internationalized/date": "^3.7.0", + "@internationalized/date": "^3.8.0", "@lezer/common": "^1.2.3", "@lezer/highlight": "^1.2.1", "@lezer/lr": "^1.4.2", @@ -78,7 +78,7 @@ "@react-aria/focus": "^3.20.2", "@replit/codemirror-vim": "^6.3.0", "@tailwindcss/typography": "^0.5.16", - "@tanstack/react-table": "^8.21.2", + "@tanstack/react-table": "^8.21.3", "@textea/json-viewer": "^4.0.1", "@types/humanize-duration": "^3.27.4", "@types/js-cookie": "^3.0.6", @@ -92,10 +92,10 @@ "@xterm/addon-attach": "^0.11.0", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", - "ag-grid-community": "^32.3.4", - "ag-grid-react": "^32.3.4", - "ai": "^4.2.8", - "ansi_up": "^6.0.2", + "ag-grid-community": "^32.3.7", + "ag-grid-react": "^32.3.7", + "ai": "^4.3.10", + "ansi_up": "^6.0.5", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", @@ -105,22 +105,22 @@ "dequal": "^2.0.3", "eslint-plugin-header": "^3.1.1", "htm": "^3.1.1", - "html-react-parser": "^5.2.2", + "html-react-parser": "^5.2.3", "html-to-image": "^1.11.13", "humanize-duration": "^3.32.1", "iconify-icon": "^2.3.0", - "jotai": "^2.12.2", + "jotai": "^2.12.3", "js-cookie": "^3.0.5", - "katex": "^0.16.21", + "katex": "^0.16.22", "lodash-es": "^4.17.21", - "lucide-react": "^0.485.0", + "lucide-react": "^0.503.0", "lz-string": "^1.5.0", - "marked": "^15.0.7", + "marked": "^15.0.11", "mermaid": "^11.6.0", "partysocket": "1.1.3", "path-to-regexp": "^8.2.0", "plotly.js": "^2.35.3", - "pyodide": "0.27.4", + "pyodide": "0.27.5", "react-arborist": "^3.4.3", "react-aria-components": "^1.8.0", "react-codemirror-merge": "4.23.10", @@ -130,13 +130,13 @@ "react-hook-form": "7.54.2", "react-markdown": "^9.1.0", "react-plotly.js": "^2.6.0", - "react-resizable-panels": "2.1.7", + "react-resizable-panels": "2.1.9", "react-use-event-hook": "^0.9.6", "react-vega": "^7.6.0", "react-virtuoso": "^4.12.6", "reactflow": "^11.11.4", "rpc-anywhere": "^1.7.0", - "sql-formatter": "^15.6.0", + "sql-formatter": "^15.6.1", "string-dedent": "^3.0.1", "swiper": "^11.2.6", "tailwind-merge": "^2.6.0", @@ -152,8 +152,8 @@ "web-vitals": "^4.2.4", "y-codemirror.next": "^0.3.5", "y-websocket": "^2.1.0", - "yjs": "^13.6.24", - "zod": "^3.24.2" + "yjs": "^13.6.26", + "zod": "^3.24.3" }, "scripts": { "preinstall": "npx only-allow pnpm", @@ -186,7 +186,7 @@ "@babel/preset-typescript": "^7.25.9", "@biomejs/biome": "1.9.4", "@codecov/vite-plugin": "^1.9.0", - "@csstools/postcss-light-dark-function": "^2.0.7", + "@csstools/postcss-light-dark-function": "^2.0.8", "@playwright/test": "^1.49.1", "@storybook/addon-docs": "^8.6.12", "@storybook/addon-essentials": "^8.6.12", @@ -201,9 +201,9 @@ "@testing-library/react-hooks": "^8.0.1", "@types/katex": "^0.16.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.17.28", + "@types/node": "^20.17.32", "@types/react": "^18.3.20", - "@types/react-dom": "^18.3.5", + "@types/react-dom": "^18.3.6", "@types/react-plotly.js": "^2.6.3", "@types/timestring": "^6.0.5", "@typescript-eslint/eslint-plugin": "^7.15.0", @@ -232,16 +232,16 @@ "react-dom": "^18.3.1", "react-test-renderer": "^18.3.1", "storybook": "^8.6.12", - "stylelint": "^16.17.0", + "stylelint": "^16.19.1", "stylelint-config-standard": "^36.0.1", "tailwindcss": "^3.4.17", - "turbo": "^2.4.4", + "turbo": "^2.5.2", "typescript": "^5.8.3", "vite": "^6.3.2", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.1.1" }, - "packageManager": "pnpm@10.9.0", + "packageManager": "pnpm@10.10.0", "pnpm": { "patchedDependencies": { "react-plotly.js": "patches/react-plotly.js.patch" diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 194746ca654..9a996b57987 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -85,7 +85,7 @@ importers: specifier: ^3.10.0 version: 3.10.0(react-hook-form@7.54.2(react@18.3.1)) '@internationalized/date': - specifier: ^3.7.0 + specifier: ^3.8.0 version: 3.8.0 '@lezer/common': specifier: ^1.2.3 @@ -131,70 +131,70 @@ importers: version: 1.1.2 '@radix-ui/react-accordion': specifier: ~1.2.8 - version: 1.2.8(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-alert-dialog': specifier: ~1.1.11 - version: 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-checkbox': specifier: ~1.2.3 - version: 1.2.3(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.3(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': specifier: ~1.1.2 version: 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context-menu': specifier: ~2.2.12 - version: 2.2.12(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.2.12(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': specifier: ~1.1.11 - version: 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': specifier: ~2.1.12 - version: 2.1.12(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.12(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-icons': specifier: ~1.3.2 version: 1.3.2(react@18.3.1) '@radix-ui/react-label': specifier: ~2.1.4 - version: 2.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-navigation-menu': specifier: ~1.2.10 - version: 1.2.10(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.10(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-popover': specifier: ~1.1.11 - version: 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-progress': specifier: ~1.1.4 - version: 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-radio-group': specifier: ~1.3.4 - version: 1.3.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.3.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-scroll-area': specifier: ^1.2.6 - version: 1.2.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-select': specifier: ~2.2.2 - version: 2.2.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.2.2(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slider': specifier: ~1.3.2 - version: 1.3.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.3.2(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: ~1.2.0 version: 1.2.0(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-switch': specifier: ~1.2.2 - version: 1.2.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.2(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tabs': specifier: ~1.1.9 - version: 1.1.9(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-toast': specifier: ~1.2.11 - version: 1.2.11(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.11(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-toggle': specifier: ~1.1.6 - version: 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tooltip': specifier: ~1.2.4 - version: 1.2.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': specifier: ~1.1.1 version: 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -211,8 +211,8 @@ importers: specifier: ^0.5.16 version: 0.5.16(tailwindcss@3.4.17) '@tanstack/react-table': - specifier: ^8.21.2 - version: 8.21.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^8.21.3 + version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@textea/json-viewer': specifier: ^4.0.1 version: 4.0.1(@emotion/react@11.14.0(@types/react@18.3.20)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.14.0(@types/react@18.3.20)(react@18.3.1))(@types/react@18.3.20)(react@18.3.1))(@mui/material@6.4.11(@emotion/react@11.14.0(@types/react@18.3.20)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.14.0(@types/react@18.3.20)(react@18.3.1))(@types/react@18.3.20)(react@18.3.1))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -253,17 +253,17 @@ importers: specifier: ^5.5.0 version: 5.5.0 ag-grid-community: - specifier: ^32.3.4 - version: 32.3.4 + specifier: ^32.3.7 + version: 32.3.7 ag-grid-react: - specifier: ^32.3.4 - version: 32.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^32.3.7 + version: 32.3.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ai: - specifier: ^4.2.8 - version: 4.2.10(react@18.3.1)(zod@3.24.2) + specifier: ^4.3.10 + version: 4.3.13(react@18.3.1)(zod@3.24.3) ansi_up: - specifier: ^6.0.2 - version: 6.0.2 + specifier: ^6.0.5 + version: 6.0.5 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -272,7 +272,7 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) compassql: specifier: ^0.21.2 version: 0.21.2(vega@5.33.0) @@ -292,8 +292,8 @@ importers: specifier: ^3.1.1 version: 3.1.1 html-react-parser: - specifier: ^5.2.2 - version: 5.2.2(@types/react@18.3.20)(react@18.3.1) + specifier: ^5.2.3 + version: 5.2.3(@types/react@18.3.20)(react@18.3.1) html-to-image: specifier: ^1.11.13 version: 1.11.13 @@ -304,26 +304,26 @@ importers: specifier: ^2.3.0 version: 2.3.0 jotai: - specifier: ^2.12.2 - version: 2.12.2(@types/react@18.3.20)(react@18.3.1) + specifier: ^2.12.3 + version: 2.12.3(@types/react@18.3.20)(react@18.3.1) js-cookie: specifier: ^3.0.5 version: 3.0.5 katex: - specifier: ^0.16.21 - version: 0.16.21 + specifier: ^0.16.22 + version: 0.16.22 lodash-es: specifier: ^4.17.21 version: 4.17.21 lucide-react: - specifier: ^0.485.0 - version: 0.485.0(react@18.3.1) + specifier: ^0.503.0 + version: 0.503.0(react@18.3.1) lz-string: specifier: ^1.5.0 version: 1.5.0 marked: - specifier: ^15.0.7 - version: 15.0.7 + specifier: ^15.0.11 + version: 15.0.11 mermaid: specifier: ^11.6.0 version: 11.6.0 @@ -337,11 +337,11 @@ importers: specifier: ^2.35.3 version: 2.35.3(mapbox-gl@1.13.3)(webpack@5.96.1(esbuild@0.25.2)) pyodide: - specifier: 0.27.4 - version: 0.27.4 + specifier: 0.27.5 + version: 0.27.5 react-arborist: specifier: ^3.4.3 - version: 3.4.3(@types/node@20.17.30)(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.4.3(@types/node@20.17.32)(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-aria-components: specifier: ^1.8.0 version: 1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -367,8 +367,8 @@ importers: specifier: ^2.6.0 version: 2.6.0(patch_hash=e65888c226f3ef8f42923cbb3b026d2f4811da3e96fa0d7dee3cb62df02c6189)(plotly.js@2.35.3(mapbox-gl@1.13.3)(webpack@5.96.1(esbuild@0.25.2)))(react@18.3.1) react-resizable-panels: - specifier: 2.1.7 - version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.1.9 + version: 2.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use-event-hook: specifier: ^0.9.6 version: 0.9.6(react@18.3.1) @@ -385,8 +385,8 @@ importers: specifier: ^1.7.0 version: 1.7.0 sql-formatter: - specifier: ^15.6.0 - version: 15.6.0 + specifier: ^15.6.1 + version: 15.6.1 string-dedent: specifier: ^3.0.1 version: 3.0.1 @@ -428,16 +428,16 @@ importers: version: 4.2.4 y-codemirror.next: specifier: ^0.3.5 - version: 0.3.5(@codemirror/state@6.5.2)(@codemirror/view@6.36.6)(yjs@13.6.24) + version: 0.3.5(@codemirror/state@6.5.2)(@codemirror/view@6.36.6)(yjs@13.6.26) y-websocket: specifier: ^2.1.0 - version: 2.1.0(yjs@13.6.24) + version: 2.1.0(yjs@13.6.26) yjs: - specifier: ^13.6.24 - version: 13.6.24 + specifier: ^13.6.26 + version: 13.6.26 zod: - specifier: ^3.24.2 - version: 3.24.2 + specifier: ^3.24.3 + version: 3.24.3 devDependencies: '@babel/plugin-proposal-class-properties': specifier: ^7.18.6 @@ -453,10 +453,10 @@ importers: version: 1.9.4 '@codecov/vite-plugin': specifier: ^1.9.0 - version: 1.9.0(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) + version: 1.9.0(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) '@csstools/postcss-light-dark-function': - specifier: ^2.0.7 - version: 2.0.7(postcss@8.5.3) + specifier: ^2.0.8 + version: 2.0.8(postcss@8.5.3) '@playwright/test': specifier: ^1.49.1 version: 1.49.1 @@ -480,7 +480,7 @@ importers: version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12)(typescript@5.8.3) '@storybook/react-vite': specifier: ^8.6.12 - version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12)(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) + version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12)(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) '@swc-jotai/react-refresh': specifier: ^0.3.0 version: 0.3.0 @@ -489,7 +489,7 @@ importers: version: 6.6.3 '@testing-library/react': specifier: ^16.2.0 - version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/react-hooks': specifier: ^8.0.1 version: 8.0.1(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react-test-renderer@18.3.1(react@18.3.1))(react@18.3.1) @@ -500,14 +500,14 @@ importers: specifier: ^4.17.12 version: 4.17.12 '@types/node': - specifier: ^20.17.28 - version: 20.17.30 + specifier: ^20.17.32 + version: 20.17.32 '@types/react': specifier: ^18.3.20 version: 18.3.20 '@types/react-dom': - specifier: ^18.3.5 - version: 18.3.5(@types/react@18.3.20) + specifier: ^18.3.6 + version: 18.3.7(@types/react@18.3.20) '@types/react-plotly.js': specifier: ^2.6.3 version: 2.6.3 @@ -522,10 +522,10 @@ importers: version: 7.15.0(eslint@8.57.0)(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.4.1 - version: 4.4.1(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) + version: 4.4.1(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) '@vitejs/plugin-react-swc': specifier: ^3.9.0 - version: 3.9.0(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) + version: 3.9.0(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.3) @@ -564,7 +564,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.2(@types/debug@4.1.12)(@types/node@20.17.30)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(terser@5.39.0)(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.1.2(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) jsdom: specifier: ^24.1.3 version: 24.1.3 @@ -593,29 +593,29 @@ importers: specifier: ^8.6.12 version: 8.6.12 stylelint: - specifier: ^16.17.0 - version: 16.17.0(typescript@5.8.3) + specifier: ^16.19.1 + version: 16.19.1(typescript@5.8.3) stylelint-config-standard: specifier: ^36.0.1 - version: 36.0.1(stylelint@16.17.0(typescript@5.8.3)) + version: 36.0.1(stylelint@16.19.1(typescript@5.8.3)) tailwindcss: specifier: ^3.4.17 version: 3.4.17 turbo: - specifier: ^2.4.4 - version: 2.4.4 + specifier: ^2.5.2 + version: 2.5.2 typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.3.2 - version: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + version: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) vitest: specifier: ^3.1.1 - version: 3.1.2(@types/debug@4.1.12)(@types/node@20.17.30)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + version: 3.1.2(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) packages: @@ -641,18 +641,18 @@ packages: '@adobe/css-tools@4.4.0': resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} - '@ai-sdk/provider-utils@2.2.3': - resolution: {integrity: sha512-o3fWTzkxzI5Af7U7y794MZkYNEsxbjLam2nxyoUZSScqkacb7vZ3EYHLh21+xCcSSzEC161C7pZAGHtC0hTUMw==} + '@ai-sdk/provider-utils@2.2.7': + resolution: {integrity: sha512-kM0xS3GWg3aMChh9zfeM+80vEZfXzR3JEUBdycZLtbRZ2TRT8xOj3WodGHPb06sUK5yD7pAXC/P7ctsi2fvUGQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.23.8 - '@ai-sdk/provider@1.1.0': - resolution: {integrity: sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==} + '@ai-sdk/provider@1.1.3': + resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} engines: {node: '>=18'} - '@ai-sdk/react@1.2.5': - resolution: {integrity: sha512-0jOop3S2WkDOdO4X5I+5fTGqZlNX8/h1T1eYokpkR9xh8Vmrxqw8SsovqGvrddTsZykH8uXRsvI+G4FTyy894A==} + '@ai-sdk/react@1.2.11': + resolution: {integrity: sha512-+kPqLkJ3TWP6czaJPV+vzAKSUcKQ1598BUrcLHt56sH99+LhmIIW3ylZp0OfC3O6TR3eO1Lt0Yzw4R0mK6g9Gw==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -661,8 +661,8 @@ packages: zod: optional: true - '@ai-sdk/ui-utils@1.2.4': - resolution: {integrity: sha512-wLTxEZrKZRyBmlVZv8nGXgLBg5tASlqXwbuhoDu0MhZa467ZFREEnosH/OC/novyEHTQXko2zC606xoVbMrUcA==} + '@ai-sdk/ui-utils@1.2.10': + resolution: {integrity: sha512-GUj+LBoAlRQF1dL/M49jtufGqtLOMApxTpCmVjoRpIPt/dFALVL9RfqfvxwztyIwbK+IxGzcYjSGRsrWrj+86g==} engines: {node: '>=18'} peerDependencies: zod: ^3.23.8 @@ -1066,14 +1066,14 @@ packages: '@csstools/css-parser-algorithms': ^3.0.4 '@csstools/css-tokenizer': ^3.0.3 - '@csstools/postcss-light-dark-function@2.0.7': - resolution: {integrity: sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==} + '@csstools/postcss-light-dark-function@2.0.8': + resolution: {integrity: sha512-v8VU5WtrZIyEtk88WB4fkG22TGd8HyAfSFfZZQ1uNN0+arMJdZc++H3KYTfbYDpJRGy8GwADYH8ySXiILn+OyA==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 - '@csstools/postcss-progressive-custom-properties@4.0.0': - resolution: {integrity: sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q==} + '@csstools/postcss-progressive-custom-properties@4.0.1': + resolution: {integrity: sha512-Ofz81HaY8mmbP8/Qr3PZlUzjsyV5WuxWmvtYn+jhYGvvjFazTmN9R2io5W5znY1tyk2CA9uM0IPWyY4ygDytCw==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 @@ -3382,15 +3382,15 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tanstack/react-table@8.21.2': - resolution: {integrity: sha512-11tNlEDTdIhMJba2RBH+ecJ9l1zgS2kjmexDPAraulc8jeNA4xocSNeyzextT0XJyASil4XsCYlJmf5jEWAtYg==} + '@tanstack/react-table@8.21.3': + resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} engines: {node: '>=12'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/table-core@8.21.2': - resolution: {integrity: sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA==} + '@tanstack/table-core@8.21.3': + resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} engines: {node: '>=12'} '@testing-library/dom@10.4.0': @@ -3663,8 +3663,8 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@20.17.30': - resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} + '@types/node@20.17.32': + resolution: {integrity: sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==} '@types/normalize-package-data@2.4.1': resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -3681,8 +3681,8 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/react-dom@18.3.5': - resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: '@types/react': ^18.0.0 @@ -4010,14 +4010,14 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ag-charts-types@10.3.4: - resolution: {integrity: sha512-MU+3gvKn1jEyLlMHS0Vu0nHmIQxiVJAnA6ftUatLZvV0c7hOWap4VWghqZ0cVZUJsCdMI59Iuq1u3xquKv4LOQ==} + ag-charts-types@10.3.7: + resolution: {integrity: sha512-ja7eA27Ns0SfwvV89ORsZTqcsZ57rPYptlzrvzRLjoKXowR+Ft9stb3USLHJjpPwT45qtMyCmTdRTfis6auWnw==} - ag-grid-community@32.3.4: - resolution: {integrity: sha512-iYQYFapKkqtCml1BvIX/nyNO6SvZYe/Z/1hLa7/7Dpzj2uqABJZIPGgW/ZTOc+/YiM9JYJWMkD7c+5E23GzkAw==} + ag-grid-community@32.3.7: + resolution: {integrity: sha512-36P/ex/itDEWMC0gESNR5J+lm3aeLquhgwXgM+AKGb/soLdvKv8Fc3BP/5n4r6a7qhsSFE/E1w37b26xbpHuPQ==} - ag-grid-react@32.3.4: - resolution: {integrity: sha512-JuIum0etQnWUxWt4EbCXkLGa2lNLgFXNK0nR/rr2+WcOHZSIo1wXe5DPySnL725BK+yPqfB6XZmZcETpEDT+bQ==} + ag-grid-react@32.3.7: + resolution: {integrity: sha512-rKTy4WqfVB0l5l7poMJoqIpLLKe2zdIbRAFoM8PiBJmFrGSjyhhR4kXVvj/AQPKdejKZkcy8r6R8F1C8obG/dA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4026,8 +4026,8 @@ packages: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} - ai@4.2.10: - resolution: {integrity: sha512-rOfKbNRWlzwxbFll6W9oAdnC0R5VVbAJoof+p92CatHzA3reqQZmYn33IBnj+CgqeXYUsH9KX9Wnj7g2wCHc9Q==} + ai@4.3.13: + resolution: {integrity: sha512-cC5HXItuOwGykSMacCPzNp6+NMTxeuTjOenztVgSJhdC9Z4OrzBxwkyeDAf4h1QP938ZFi7IBdq3u4lxVoVmvw==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -4095,8 +4095,8 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - ansi_up@6.0.2: - resolution: {integrity: sha512-3G3vKvl1ilEp7J1u6BmULpMA0xVoW/f4Ekqhl8RTrJrhEBkonKn5k3bUc5Xt+qDayA6iDX0jyUh3AbZjB/l0tw==} + ansi_up@6.0.5: + resolution: {integrity: sha512-bo4K8S5usgFivfgvgQozTC2EfusPf76o7w0LUVdAOkpISvVmQqtwCdF5c6okokrgIN13KhFIVB/0BhnNXueQeA==} any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -5467,8 +5467,8 @@ packages: picomatch: optional: true - file-entry-cache@10.0.7: - resolution: {integrity: sha512-txsf5fu3anp2ff3+gOJJzRImtrtm/oa9tYLN0iTuINZ++EyVR/nRrg2fKYwvG/pXDofcrvvb0scEbX3NyW/COw==} + file-entry-cache@10.0.8: + resolution: {integrity: sha512-FGXHpfmI4XyzbLd3HQ8cbUcsFGohJpZtmQRHr8z8FxxtCe2PcpgIlVLwIgunqjvRmXypBETvwhV4ptJizA+Y1Q==} file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} @@ -5505,8 +5505,8 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flat-cache@6.1.7: - resolution: {integrity: sha512-qwZ4xf1v1m7Rc9XiORly31YaChvKt6oNVHuqqZcoED/7O+ToyNVGobKsIAopY9ODcWpEDKEBAbrSOCBHtNQvew==} + flat-cache@6.1.8: + resolution: {integrity: sha512-R6MaD3nrJAtO7C3QOuS79ficm2pEAy++TgEUD8ii1LVlbcgZ9DtASLkt9B+RZSFCzm7QHDMlXPsqqB6W2Pfr1Q==} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -5819,8 +5819,8 @@ packages: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} - html-react-parser@5.2.2: - resolution: {integrity: sha512-yA5012CJGSFWYZsgYzfr6HXJgDap38/AEP4ra8Cw+WHIi2ZRDXRX/QVYdumRf1P8zKyScKd6YOrWYvVEiPfGKg==} + html-react-parser@5.2.3: + resolution: {integrity: sha512-y34oKTu+9T1fKdJE1cN9QWFWu8sx8Qa5tJOafUfMUF5Niah+yF6zlEHhWh7a0iZEcLRPIMw54bY14ajQF7xP7A==} peerDependencies: '@types/react': 0.14 || 15 || 16 || 17 || 18 || 19 react: 0.14 || 15 || 16 || 17 || 18 || 19 @@ -6186,8 +6186,8 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jotai@2.12.2: - resolution: {integrity: sha512-oN8715y7MkjXlSrpyjlR887TOuc/NLZMs9gvgtfWH/JP47ChwO0lR2ijSwBvPMYyXRAPT+liIAhuBavluKGgtA==} + jotai@2.12.3: + resolution: {integrity: sha512-DpoddSkmPGXMFtdfnoIHfueFeGP643nqYUWC6REjUcME+PG2UkAtYnLbffRDw3OURI9ZUTcRWkRGLsOvxuWMCg==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -6293,8 +6293,8 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - katex@0.16.21: - resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} + katex@0.16.22: + resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} hasBin: true kdbush@3.0.0: @@ -6316,8 +6316,8 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - known-css-properties@0.35.0: - resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} + known-css-properties@0.36.0: + resolution: {integrity: sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==} kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -6484,8 +6484,8 @@ packages: ltgt@2.2.1: resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} - lucide-react@0.485.0: - resolution: {integrity: sha512-NvyQJ0LKyyCxL23nPKESlr/jmz8r7fJO1bkuptSNYSy0s8VVj4ojhX0YAgmE1e0ewfxUZjIlZpvH+otfTnla8Q==} + lucide-react@0.503.0: + resolution: {integrity: sha512-HGGkdlPWQ0vTF8jJ5TdIqhQXZi6uh3LnNgfZ8MHiuxFfX3RZeA79r2MW2tHAZKlAVfoNE8esm3p+O6VkIvpj6w==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -6521,8 +6521,8 @@ packages: resolution: {integrity: sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==} engines: {node: '>=16.14.0', npm: '>=8.1.0'} - marked@15.0.7: - resolution: {integrity: sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==} + marked@15.0.11: + resolution: {integrity: sha512-1BEXAU2euRCG3xwgLVT1y0xbJEld1XOrmRJpUwRCcy7rxhSCwMrmEu9LXoPhHSCJG41V7YcQ2mjKRr5BA3ITIA==} engines: {node: '>= 18'} hasBin: true @@ -7407,8 +7407,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pyodide@0.27.4: - resolution: {integrity: sha512-2y3ySHCBmyzYDUlB939SaU3n7RxYQxwnGHgdakW/CPrNFX2L9fC+4nfJWQJH8a0ruQa8bBZSKCImMt/cq15RiQ==} + pyodide@0.27.5: + resolution: {integrity: sha512-nXErpLzEdtQolt+sNQ/5mKuN9XTUwhxR2MRhRhZ6oDRGpYLXrOp5+kkTPGEwK+wn1ZA8+poNmoxKTj2sq/p9og==} engines: {node: '>=18.0.0'} qs@6.11.2: @@ -7600,8 +7600,8 @@ packages: '@types/react': optional: true - react-resizable-panels@2.1.7: - resolution: {integrity: sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==} + react-resizable-panels@2.1.9: + resolution: {integrity: sha512-z77+X08YDIrgAes4jl8xhnUu1LNIRp4+E7cv4xHmLOxxUPO/ML7PSrE813b90vj7xvQ1lcf7g2uA9GeMZonjhQ==} peerDependencies: react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -7995,8 +7995,8 @@ packages: spdx-license-ids@3.0.12: resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} - sql-formatter@15.6.0: - resolution: {integrity: sha512-PFJoCMXx42aoKaSIDhqLBJ/vKHBbwMlFPaW9YFlI99V+VWq2sV31xi3JH/StCovlZ1X5jpqwZMl9vq+X0s6bFw==} + sql-formatter@15.6.1: + resolution: {integrity: sha512-uoKbRLVbjzwa8ouY4lI9YM387zRxDv9Gg5kZBzu2iNls2wVBlDLshhudCstczddRvj7J+xOpHTTWX6Z0lRgYGA==} hasBin: true sshpk@1.18.0: @@ -8163,8 +8163,8 @@ packages: peerDependencies: stylelint: ^16.1.0 - stylelint@16.17.0: - resolution: {integrity: sha512-I9OwVIWRMqVm2Br5iTbrfSqGRPWQUlvm6oXO1xZuYYu0Gpduy67N8wXOZv15p6E/JdlZiAtQaIoLKZEWk5hrjw==} + stylelint@16.19.1: + resolution: {integrity: sha512-C1SlPZNMKl+d/C867ZdCRthrS+6KuZ3AoGW113RZCOL0M8xOGpgx7G70wq7lFvqvm4dcfdGFVLB/mNaLFChRKw==} engines: {node: '>=18.12.0'} hasBin: true @@ -8433,38 +8433,38 @@ packages: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - turbo-darwin-64@2.4.4: - resolution: {integrity: sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g==} + turbo-darwin-64@2.5.2: + resolution: {integrity: sha512-2aIl0Sx230nLk+Cg2qSVxvPOBWCZpwKNuAMKoROTvWKif6VMpkWWiR9XEPoz7sHeLmCOed4GYGMjL1bqAiIS/g==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.4.4: - resolution: {integrity: sha512-/gtHPqbGQXDFhrmy+Q/MFW2HUTUlThJ97WLLSe4bxkDrKHecDYhAjbZ4rN3MM93RV9STQb3Tqy4pZBtsd4DfCw==} + turbo-darwin-arm64@2.5.2: + resolution: {integrity: sha512-MrFYhK/jYu8N6QlqZtqSHi3e4QVxlzqU3ANHTKn3/tThuwTLbNHEvzBPWSj5W7nZcM58dCqi6gYrfRz6bJZyAA==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.4.4: - resolution: {integrity: sha512-SR0gri4k0bda56hw5u9VgDXLKb1Q+jrw4lM7WAhnNdXvVoep4d6LmnzgMHQQR12Wxl3KyWPbkz9d1whL6NTm2Q==} + turbo-linux-64@2.5.2: + resolution: {integrity: sha512-LxNqUE2HmAJQ/8deoLgMUDzKxd5bKxqH0UBogWa+DF+JcXhtze3UTMr6lEr0dEofdsEUYK1zg8FRjglmwlN5YA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.4.4: - resolution: {integrity: sha512-COXXwzRd3vslQIfJhXUklgEqlwq35uFUZ7hnN+AUyXx7hUOLIiD5NblL+ETrHnhY4TzWszrbwUMfe2BYWtaPQg==} + turbo-linux-arm64@2.5.2: + resolution: {integrity: sha512-0MI1Ao1q8zhd+UUbIEsrM+yLq1BsrcJQRGZkxIsHFlGp7WQQH1oR3laBgfnUCNdCotCMD6w4moc9pUbXdOR3bg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.4.4: - resolution: {integrity: sha512-PV9rYNouGz4Ff3fd6sIfQy5L7HT9a4fcZoEv8PKRavU9O75G7PoDtm8scpHU10QnK0QQNLbE9qNxOAeRvF0fJg==} + turbo-windows-64@2.5.2: + resolution: {integrity: sha512-hOLcbgZzE5ttACHHyc1ajmWYq4zKT42IC3G6XqgiXxMbS+4eyVYTL+7UvCZBd3Kca1u4TLQdLQjeO76zyDJc2A==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.4.4: - resolution: {integrity: sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg==} + turbo-windows-arm64@2.5.2: + resolution: {integrity: sha512-fMU41ABhSLa18H8V3Z7BMCGynQ8x+wj9WyBMvWm1jeyRKgkvUYJsO2vkIsy8m0vrwnIeVXKOIn6eSe1ddlBVqw==} cpu: [arm64] os: [win32] - turbo@2.4.4: - resolution: {integrity: sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ==} + turbo@2.5.2: + resolution: {integrity: sha512-Qo5lfuStr6LQh3sPQl7kIi243bGU4aHGDQJUf6ylAdGwks30jJFloc9NYHP7Y373+gGU9OS0faA4Mb5Sy8X9Xw==} hasBin: true tweetnacl@0.14.5: @@ -9167,8 +9167,8 @@ packages: yargs@6.6.0: resolution: {integrity: sha512-6/QWTdisjnu5UHUzQGst+UOEuEVwIzFVGBjq3jMTFNs5WJQsH/X6nMURSaScIdF5txylr1Ao9bvbWiKi2yXbwA==} - yjs@13.6.24: - resolution: {integrity: sha512-xn/pYLTZa3uD1uDG8lpxfLRo5SR/rp0frdASOl2a71aYNvUXdWcLtVL91s2y7j+Q8ppmjZ9H3jsGVgoFMbT2VA==} + yjs@13.6.26: + resolution: {integrity: sha512-wiARO3wixu7mtoRP5f7LqpUtsURP9SmNgXUt3RlnZg4qDuF7dUjthwIvwxIDmK55dPw4Wl4QdW5A3ag0atwu7g==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} yocto-queue@0.1.0: @@ -9186,8 +9186,8 @@ packages: peerDependencies: zod: ^3.18.0 - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.24.3: + resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} zustand@4.5.6: resolution: {integrity: sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==} @@ -9236,33 +9236,33 @@ snapshots: '@adobe/css-tools@4.4.0': {} - '@ai-sdk/provider-utils@2.2.3(zod@3.24.2)': + '@ai-sdk/provider-utils@2.2.7(zod@3.24.3)': dependencies: - '@ai-sdk/provider': 1.1.0 + '@ai-sdk/provider': 1.1.3 nanoid: 3.3.8 secure-json-parse: 2.7.0 - zod: 3.24.2 + zod: 3.24.3 - '@ai-sdk/provider@1.1.0': + '@ai-sdk/provider@1.1.3': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@1.2.5(react@18.3.1)(zod@3.24.2)': + '@ai-sdk/react@1.2.11(react@18.3.1)(zod@3.24.3)': dependencies: - '@ai-sdk/provider-utils': 2.2.3(zod@3.24.2) - '@ai-sdk/ui-utils': 1.2.4(zod@3.24.2) + '@ai-sdk/provider-utils': 2.2.7(zod@3.24.3) + '@ai-sdk/ui-utils': 1.2.10(zod@3.24.3) react: 18.3.1 swr: 2.2.5(react@18.3.1) throttleit: 2.1.0 optionalDependencies: - zod: 3.24.2 + zod: 3.24.3 - '@ai-sdk/ui-utils@1.2.4(zod@3.24.2)': + '@ai-sdk/ui-utils@1.2.10(zod@3.24.3)': dependencies: - '@ai-sdk/provider': 1.1.0 - '@ai-sdk/provider-utils': 2.2.3(zod@3.24.2) - zod: 3.24.2 - zod-to-json-schema: 3.24.1(zod@3.24.2) + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.7(zod@3.24.3) + zod: 3.24.3 + zod-to-json-schema: 3.24.1(zod@3.24.3) '@alloc/quick-lru@5.2.0': {} @@ -9583,13 +9583,13 @@ snapshots: chalk: 4.1.2 semver: 7.6.3 unplugin: 1.16.1 - zod: 3.24.2 + zod: 3.24.3 - '@codecov/vite-plugin@1.9.0(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': + '@codecov/vite-plugin@1.9.0(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': dependencies: '@codecov/bundler-plugin-core': 1.9.0 unplugin: 1.16.1 - vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) '@codemirror/autocomplete@6.18.6': dependencies: @@ -9863,15 +9863,15 @@ 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.7(postcss@8.5.3)': + '@csstools/postcss-light-dark-function@2.0.8(postcss@8.5.3)': 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.0(postcss@8.5.3) + '@csstools/postcss-progressive-custom-properties': 4.0.1(postcss@8.5.3) '@csstools/utilities': 2.0.0(postcss@8.5.3) postcss: 8.5.3 - '@csstools/postcss-progressive-custom-properties@4.0.0(postcss@8.5.3)': + '@csstools/postcss-progressive-custom-properties@4.0.1(postcss@8.5.3)': dependencies: postcss: 8.5.3 postcss-value-parser: 4.2.0 @@ -10220,12 +10220,12 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': dependencies: glob: 10.4.5 magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.8.3) - vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) optionalDependencies: typescript: 5.8.3 @@ -10400,7 +10400,7 @@ snapshots: '@codemirror/state': 6.5.2 '@codemirror/view': 6.36.6 '@open-rpc/client-js': 1.8.1 - marked: 15.0.7 + marked: 15.0.11 vscode-languageserver-protocol: 3.17.5 transitivePeerDependencies: - bufferutil @@ -10673,53 +10673,53 @@ snapshots: '@radix-ui/primitive@1.1.2': {} - '@radix-ui/react-accordion@1.2.8(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-accordion@1.2.8(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collapsible': 1.1.8(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collapsible': 1.1.8(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-alert-dialog@1.1.11(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-alert-dialog@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.0(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-arrow@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-checkbox@1.2.3(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-checkbox@1.2.3(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -10727,35 +10727,35 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-collapsible@1.1.8(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collapsible@1.1.8(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-collection@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.0(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.20)(react@18.3.1)': dependencies: @@ -10763,19 +10763,19 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 - '@radix-ui/react-context-menu@2.2.12(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-context-menu@2.2.12(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-menu': 2.1.12(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-menu': 2.1.12(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) '@radix-ui/react-context@1.1.2(@types/react@18.3.20)(react@18.3.1)': dependencies: @@ -10783,18 +10783,18 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 - '@radix-ui/react-dialog@1.1.11(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dialog@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.0(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) aria-hidden: 1.2.4 @@ -10803,7 +10803,7 @@ snapshots: react-remove-scroll: 2.6.3(@types/react@18.3.20)(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) '@radix-ui/react-direction@1.1.1(@types/react@18.3.20)(react@18.3.1)': dependencies: @@ -10811,33 +10811,33 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 - '@radix-ui/react-dismissable-layer@1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-dropdown-menu@2.1.12(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dropdown-menu@2.1.12(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-menu': 2.1.12(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-menu': 2.1.12(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) '@radix-ui/react-focus-guards@1.1.2(@types/react@18.3.20)(react@18.3.1)': dependencies: @@ -10845,16 +10845,16 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 - '@radix-ui/react-focus-scope@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) '@radix-ui/react-icons@1.3.2(react@18.3.1)': dependencies: @@ -10867,31 +10867,31 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 - '@radix-ui/react-label@2.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-label@2.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-menu@2.1.12(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-menu@2.1.12(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-popper': 1.2.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.0(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) aria-hidden: 1.2.4 @@ -10900,43 +10900,43 @@ snapshots: react-remove-scroll: 2.6.3(@types/react@18.3.20)(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-navigation-menu@1.2.10(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-navigation-menu@1.2.10(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-popover@1.1.11(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popover@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-popper': 1.2.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.0(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) aria-hidden: 1.2.4 @@ -10945,15 +10945,15 @@ snapshots: react-remove-scroll: 2.6.3(@types/react@18.3.20)(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-popper@1.2.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popper@1.2.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-rect': 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -10963,19 +10963,19 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-portal@1.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-presence@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -10983,36 +10983,36 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-primitive@2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-slot': 1.2.0(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-progress@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-progress@1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-radio-group@1.3.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-radio-group@1.3.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -11020,80 +11020,80 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-roving-focus@1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-scroll-area@1.2.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-scroll-area@1.2.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-select@2.2.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-select@2.2.2(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-popper': 1.2.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.0(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-remove-scroll: 2.6.3(@types/react@18.3.20)(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-slider@1.3.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-slider@1.3.2(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -11102,7 +11102,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) '@radix-ui/react-slot@1.2.0(@types/react@18.3.20)(react@18.3.1)': dependencies: @@ -11111,12 +11111,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 - '@radix-ui/react-switch@1.2.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-switch@1.2.2(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -11124,74 +11124,74 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-tabs@1.1.9(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tabs@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-toast@1.2.11(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-toast@1.2.11(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-toggle@1.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-toggle@1.1.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@radix-ui/react-tooltip@1.2.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tooltip@1.2.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-popper': 1.2.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.0(@types/react@18.3.20)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.20)(react@18.3.1)': dependencies: @@ -11247,14 +11247,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 - '@radix-ui/react-visually-hidden@1.2.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-visually-hidden@1.2.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) '@radix-ui/rect@1.1.1': {} @@ -12600,13 +12600,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@8.6.12(storybook@8.6.12)(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': + '@storybook/builder-vite@8.6.12(storybook@8.6.12)(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': dependencies: '@storybook/csf-plugin': 8.6.12(storybook@8.6.12) browser-assert: 1.2.1 storybook: 8.6.12 ts-dedent: 2.2.0 - vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) '@storybook/components@8.6.12(storybook@8.6.12)': dependencies: @@ -12667,11 +12667,11 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.6.12 - '@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12)(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': + '@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12)(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) '@rollup/pluginutils': 5.0.2 - '@storybook/builder-vite': 8.6.12(storybook@8.6.12)(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) + '@storybook/builder-vite': 8.6.12(storybook@8.6.12)(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) '@storybook/react': 8.6.12(@storybook/test@8.6.12(storybook@8.6.12))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12)(typescript@5.8.3) find-up: 5.0.0 magic-string: 0.30.17 @@ -12681,7 +12681,7 @@ snapshots: resolve: 1.22.8 storybook: 8.6.12 tsconfig-paths: 4.2.0 - vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) optionalDependencies: '@storybook/test': 8.6.12(storybook@8.6.12) transitivePeerDependencies: @@ -12785,13 +12785,13 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.17 - '@tanstack/react-table@8.21.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-table@8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/table-core': 8.21.2 + '@tanstack/table-core': 8.21.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/table-core@8.21.2': {} + '@tanstack/table-core@8.21.3': {} '@testing-library/dom@10.4.0': dependencies: @@ -12834,7 +12834,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-test-renderer: 18.3.1(react@18.3.1) - '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.27.0 '@testing-library/dom': 10.4.0 @@ -12842,7 +12842,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.20 - '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@types/react-dom': 18.3.7(@types/react@18.3.20) '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: @@ -13091,7 +13091,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 20.17.30 + '@types/node': 20.17.32 '@types/tough-cookie': 4.0.4 parse5: 7.1.2 @@ -13121,7 +13121,7 @@ snapshots: '@types/ms@0.7.34': {} - '@types/node@20.17.30': + '@types/node@20.17.32': dependencies: undici-types: 6.19.8 @@ -13135,7 +13135,7 @@ snapshots: '@types/prop-types@15.7.14': {} - '@types/react-dom@18.3.5(@types/react@18.3.20)': + '@types/react-dom@18.3.7(@types/react@18.3.20)': dependencies: '@types/react': 18.3.20 @@ -13381,21 +13381,21 @@ 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.9.0(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': + '@vitejs/plugin-react-swc@3.9.0(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': dependencies: '@swc/core': 1.11.21 - vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.4.1(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': + '@vitejs/plugin-react@4.4.1(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -13413,13 +13413,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.2(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/mocker@3.1.2(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.1.2 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) '@vitest/pretty-format@2.0.5': dependencies: @@ -13589,15 +13589,15 @@ snapshots: acorn@8.14.1: {} - ag-charts-types@10.3.4: {} + ag-charts-types@10.3.7: {} - ag-grid-community@32.3.4: + ag-grid-community@32.3.7: dependencies: - ag-charts-types: 10.3.4 + ag-charts-types: 10.3.7 - ag-grid-react@32.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + ag-grid-react@32.3.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - ag-grid-community: 32.3.4 + ag-grid-community: 32.3.7 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -13608,15 +13608,15 @@ snapshots: transitivePeerDependencies: - supports-color - ai@4.2.10(react@18.3.1)(zod@3.24.2): + ai@4.3.13(react@18.3.1)(zod@3.24.3): dependencies: - '@ai-sdk/provider': 1.1.0 - '@ai-sdk/provider-utils': 2.2.3(zod@3.24.2) - '@ai-sdk/react': 1.2.5(react@18.3.1)(zod@3.24.2) - '@ai-sdk/ui-utils': 1.2.4(zod@3.24.2) + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.7(zod@3.24.3) + '@ai-sdk/react': 1.2.11(react@18.3.1)(zod@3.24.3) + '@ai-sdk/ui-utils': 1.2.10(zod@3.24.3) '@opentelemetry/api': 1.9.0 jsondiffpatch: 0.6.0 - zod: 3.24.2 + zod: 3.24.3 optionalDependencies: react: 18.3.1 @@ -13669,7 +13669,7 @@ snapshots: ansi-styles@6.2.1: {} - ansi_up@6.0.2: {} + ansi_up@6.0.5: {} any-promise@1.3.0: {} @@ -14061,12 +14061,12 @@ snapshots: clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + cmdk@1.1.1(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.20)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -15097,8 +15097,8 @@ snapshots: '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) eslint: 8.57.0 hermes-parser: 0.25.1 - zod: 3.24.2 - zod-validation-error: 3.4.0(zod@3.24.2) + zod: 3.24.3 + zod-validation-error: 3.4.0(zod@3.24.3) transitivePeerDependencies: - supports-color @@ -15161,13 +15161,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.2(@types/debug@4.1.12)(@types/node@20.17.30)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(terser@5.39.0)(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.1.2(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(terser@5.39.0)(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.2(@types/debug@4.1.12)(@types/node@20.17.30)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vitest: 3.1.2(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color - typescript @@ -15324,9 +15324,9 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - file-entry-cache@10.0.7: + file-entry-cache@10.0.8: dependencies: - flat-cache: 6.1.7 + flat-cache: 6.1.8 file-entry-cache@6.0.1: dependencies: @@ -15367,7 +15367,7 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 - flat-cache@6.1.7: + flat-cache@6.1.8: dependencies: cacheable: 1.8.9 flatted: 3.3.3 @@ -15766,7 +15766,7 @@ snapshots: dependencies: whatwg-encoding: 3.1.1 - html-react-parser@5.2.2(@types/react@18.3.20)(react@18.3.1): + html-react-parser@5.2.3(@types/react@18.3.20)(react@18.3.1): dependencies: domhandler: 5.0.3 html-dom-parser: 5.0.13 @@ -16092,13 +16092,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.17.30 + '@types/node': 20.17.32 merge-stream: 2.0.0 supports-color: 8.1.1 jiti@1.21.7: {} - jotai@2.12.2(@types/react@18.3.20)(react@18.3.1): + jotai@2.12.3(@types/react@18.3.20)(react@18.3.1): optionalDependencies: '@types/react': 18.3.20 react: 18.3.1 @@ -16200,7 +16200,7 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 - katex@0.16.21: + katex@0.16.22: dependencies: commander: 8.3.0 @@ -16220,7 +16220,7 @@ snapshots: kind-of@6.0.3: {} - known-css-properties@0.35.0: {} + known-css-properties@0.36.0: {} kolorist@1.8.0: {} @@ -16404,7 +16404,7 @@ snapshots: ltgt@2.2.1: optional: true - lucide-react@0.485.0(react@18.3.1): + lucide-react@0.503.0(react@18.3.1): dependencies: react: 18.3.1 @@ -16488,7 +16488,7 @@ snapshots: tinyqueue: 3.0.0 vt-pbf: 3.1.3 - marked@15.0.7: {} + marked@15.0.11: {} math-log2@1.0.1: {} @@ -16621,10 +16621,10 @@ snapshots: dagre-d3-es: 7.0.11 dayjs: 1.11.13 dompurify: 3.2.4 - katex: 0.16.21 + katex: 0.16.22 khroma: 2.1.0 lodash-es: 4.17.21 - marked: 15.0.7 + marked: 15.0.11 roughjs: 4.6.6 stylis: 4.3.6 ts-dedent: 2.2.0 @@ -17530,7 +17530,7 @@ snapshots: punycode@2.3.1: {} - pyodide@0.27.4: + pyodide@0.27.5: dependencies: ws: 8.18.0 transitivePeerDependencies: @@ -17572,10 +17572,10 @@ snapshots: dependencies: safe-buffer: 5.2.1 - react-arborist@3.4.3(@types/node@20.17.30)(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-arborist@3.4.3(@types/node@20.17.32)(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 - react-dnd: 14.0.5(@types/node@20.17.30)(@types/react@18.3.20)(react@18.3.1) + react-dnd: 14.0.5(@types/node@20.17.32)(@types/react@18.3.20)(react@18.3.1) react-dnd-html5-backend: 14.1.0 react-dom: 18.3.1(react@18.3.1) react-window: 1.8.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -17691,7 +17691,7 @@ snapshots: dependencies: dnd-core: 14.0.1 - react-dnd@14.0.5(@types/node@20.17.30)(@types/react@18.3.20)(react@18.3.1): + react-dnd@14.0.5(@types/node@20.17.32)(@types/react@18.3.20)(react@18.3.1): dependencies: '@react-dnd/invariant': 2.0.0 '@react-dnd/shallowequal': 2.0.0 @@ -17700,7 +17700,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/node': 20.17.30 + '@types/node': 20.17.32 '@types/react': 18.3.20 react-docgen-typescript@2.2.2(typescript@5.8.3): @@ -17822,7 +17822,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 - react-resizable-panels@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-resizable-panels@2.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18372,7 +18372,7 @@ snapshots: spdx-license-ids@3.0.12: {} - sql-formatter@15.6.0: + sql-formatter@15.6.1: dependencies: argparse: 2.0.1 nearley: 2.20.1 @@ -18572,16 +18572,16 @@ snapshots: postcss: 8.5.3 postcss-selector-parser: 6.1.2 - stylelint-config-recommended@14.0.1(stylelint@16.17.0(typescript@5.8.3)): + stylelint-config-recommended@14.0.1(stylelint@16.19.1(typescript@5.8.3)): dependencies: - stylelint: 16.17.0(typescript@5.8.3) + stylelint: 16.19.1(typescript@5.8.3) - stylelint-config-standard@36.0.1(stylelint@16.17.0(typescript@5.8.3)): + stylelint-config-standard@36.0.1(stylelint@16.19.1(typescript@5.8.3)): dependencies: - stylelint: 16.17.0(typescript@5.8.3) - stylelint-config-recommended: 14.0.1(stylelint@16.17.0(typescript@5.8.3)) + stylelint: 16.19.1(typescript@5.8.3) + stylelint-config-recommended: 14.0.1(stylelint@16.19.1(typescript@5.8.3)) - stylelint@16.17.0(typescript@5.8.3): + stylelint@16.19.1(typescript@5.8.3): dependencies: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3 @@ -18596,7 +18596,7 @@ snapshots: debug: 4.4.0 fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.0.7 + file-entry-cache: 10.0.8 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 @@ -18604,7 +18604,7 @@ snapshots: ignore: 7.0.3 imurmurhash: 0.1.4 is-plain-object: 5.0.0 - known-css-properties: 0.35.0 + known-css-properties: 0.36.0 mathml-tag-names: 2.1.3 meow: 13.2.0 micromatch: 4.0.8 @@ -18910,32 +18910,32 @@ snapshots: tunnel@0.0.6: {} - turbo-darwin-64@2.4.4: + turbo-darwin-64@2.5.2: optional: true - turbo-darwin-arm64@2.4.4: + turbo-darwin-arm64@2.5.2: optional: true - turbo-linux-64@2.4.4: + turbo-linux-64@2.5.2: optional: true - turbo-linux-arm64@2.4.4: + turbo-linux-arm64@2.5.2: optional: true - turbo-windows-64@2.4.4: + turbo-windows-64@2.5.2: optional: true - turbo-windows-arm64@2.4.4: + turbo-windows-arm64@2.5.2: optional: true - turbo@2.4.4: + turbo@2.5.2: optionalDependencies: - turbo-darwin-64: 2.4.4 - turbo-darwin-arm64: 2.4.4 - turbo-linux-64: 2.4.4 - turbo-linux-arm64: 2.4.4 - turbo-windows-64: 2.4.4 - turbo-windows-arm64: 2.4.4 + turbo-darwin-64: 2.5.2 + turbo-darwin-arm64: 2.5.2 + turbo-linux-64: 2.5.2 + turbo-linux-arm64: 2.5.2 + turbo-windows-64: 2.5.2 + turbo-windows-arm64: 2.5.2 tweetnacl@0.14.5: {} @@ -19483,13 +19483,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.1.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -19504,18 +19504,18 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.3) optionalDependencies: - vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color - typescript - vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0): + vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0): dependencies: esbuild: 0.25.2 fdir: 6.4.4(picomatch@4.0.2) @@ -19524,17 +19524,17 @@ snapshots: rollup: 4.39.0 tinyglobby: 0.2.13 optionalDependencies: - '@types/node': 20.17.30 + '@types/node': 20.17.32 fsevents: 2.3.3 jiti: 1.21.7 less: 4.2.0 terser: 5.39.0 yaml: 2.7.0 - vitest@3.1.2(@types/debug@4.1.12)(@types/node@20.17.30)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0): + vitest@3.1.2(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(jsdom@24.1.3)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.1.2 - '@vitest/mocker': 3.1.2(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/mocker': 3.1.2(vite@6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0)) '@vitest/pretty-format': 3.1.2 '@vitest/runner': 3.1.2 '@vitest/snapshot': 3.1.2 @@ -19551,12 +19551,12 @@ snapshots: tinyglobby: 0.2.13 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) - vite-node: 3.1.2(@types/node@20.17.30)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite: 6.3.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) + vite-node: 3.1.2(@types/node@20.17.32)(jiti@1.21.7)(less@4.2.0)(terser@5.39.0)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 20.17.30 + '@types/node': 20.17.32 jsdom: 24.1.3 transitivePeerDependencies: - jiti @@ -19790,34 +19790,34 @@ snapshots: xtend@4.0.2: {} - y-codemirror.next@0.3.5(@codemirror/state@6.5.2)(@codemirror/view@6.36.6)(yjs@13.6.24): + y-codemirror.next@0.3.5(@codemirror/state@6.5.2)(@codemirror/view@6.36.6)(yjs@13.6.26): dependencies: '@codemirror/state': 6.5.2 '@codemirror/view': 6.36.6 lib0: 0.2.99 - yjs: 13.6.24 + yjs: 13.6.26 - y-leveldb@0.1.2(yjs@13.6.24): + y-leveldb@0.1.2(yjs@13.6.26): dependencies: level: 6.0.1 lib0: 0.2.99 - yjs: 13.6.24 + yjs: 13.6.26 optional: true - y-protocols@1.0.6(yjs@13.6.24): + y-protocols@1.0.6(yjs@13.6.26): dependencies: lib0: 0.2.99 - yjs: 13.6.24 + yjs: 13.6.26 - y-websocket@2.1.0(yjs@13.6.24): + y-websocket@2.1.0(yjs@13.6.26): dependencies: lib0: 0.2.99 lodash.debounce: 4.0.8 - y-protocols: 1.0.6(yjs@13.6.24) - yjs: 13.6.24 + y-protocols: 1.0.6(yjs@13.6.26) + yjs: 13.6.26 optionalDependencies: ws: 6.2.3 - y-leveldb: 0.1.2(yjs@13.6.24) + y-leveldb: 0.1.2(yjs@13.6.26) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -19884,21 +19884,21 @@ snapshots: y18n: 3.2.2 yargs-parser: 4.2.1 - yjs@13.6.24: + yjs@13.6.26: dependencies: lib0: 0.2.99 yocto-queue@0.1.0: {} - zod-to-json-schema@3.24.1(zod@3.24.2): + zod-to-json-schema@3.24.1(zod@3.24.3): dependencies: - zod: 3.24.2 + zod: 3.24.3 - zod-validation-error@3.4.0(zod@3.24.2): + zod-validation-error@3.4.0(zod@3.24.3): dependencies: - zod: 3.24.2 + zod: 3.24.3 - zod@3.24.2: {} + zod@3.24.3: {} zustand@4.5.6(@types/react@18.3.20)(react@18.3.1): dependencies: diff --git a/frontend/src/__tests__/__snapshots__/CellStatus.test.tsx.snap b/frontend/src/__tests__/__snapshots__/CellStatus.test.tsx.snap index e36381aa0ca..28192832b0d 100644 --- a/frontend/src/__tests__/__snapshots__/CellStatus.test.tsx.snap +++ b/frontend/src/__tests__/__snapshots__/CellStatus.test.tsx.snap @@ -27,6 +27,7 @@ exports[`CellStatusComponent > renders disabled and stale state 1`] = ` class="multi-icon relative w-fit" >
-
-
- {selectedPanel} -
- +
+
+
+ {selectedPanel}
+ +
+ {selectedPanel === "files" && } {selectedPanel === "errors" && } @@ -158,8 +158,8 @@ export const AppChrome: React.FC = ({ children }) => { {selectedPanel === "tracing" && } {selectedPanel === "secrets" && } -
- + +
); diff --git a/frontend/src/core/codemirror/language/__tests__/extension.test.ts b/frontend/src/core/codemirror/language/__tests__/extension.test.ts index ad914a38ecd..8ea45707a5b 100644 --- a/frontend/src/core/codemirror/language/__tests__/extension.test.ts +++ b/frontend/src/core/codemirror/language/__tests__/extension.test.ts @@ -145,9 +145,9 @@ describe("switchLanguage", () => { expect(mockEditor.state.doc.toString()).toMatchInlineSnapshot(` "mo.md( r""" - print('Hello') - print('Goodbye') - """ + print('Hello') + print('Goodbye') + """ )" `); diff --git a/frontend/src/core/codemirror/language/__tests__/markdown.test.ts b/frontend/src/core/codemirror/language/__tests__/markdown.test.ts index 06f4b41acf3..8110c5aebe8 100644 --- a/frontend/src/core/codemirror/language/__tests__/markdown.test.ts +++ b/frontend/src/core/codemirror/language/__tests__/markdown.test.ts @@ -170,6 +170,36 @@ describe("MarkdownLanguageAdapter", () => { expect(offset).toBe(8); expect(adapter.lastQuotePrefix).toBe("r"); }); + + it("should preserve indentation in f-strings", () => { + const pythonCode = + 'mo.md(\n f"""\n```python\n{some_variable}\n```\n"""\n)'; + const [innerCode, offset] = adapter.transformIn(pythonCode); + expect(innerCode).toBe("```python\n{some_variable}\n```"); + expect(offset).toBe(15); + expect(adapter.lastQuotePrefix).toBe("f"); + + // Transform out + const [outerCode, outerOffset] = adapter.transformOut(innerCode); + expect(outerCode).toMatch(pythonCode); + expect(outerOffset).toBe(17); + }); + + it("should handle f-strings", () => { + const pythonCode = 'mo.md(f"""# Title\n{some_variable}""")'; + const [innerCode, offset] = adapter.transformIn(pythonCode); + expect(innerCode).toBe("# Title\n{some_variable}"); + expect(offset).toBe(10); + expect(adapter.lastQuotePrefix).toBe("f"); + }); + + it("should handle rf-strings", () => { + const pythonCode = 'mo.md(rf"""# Title\n{some_variable}""")'; + const [innerCode, offset] = adapter.transformIn(pythonCode); + expect(innerCode).toBe("# Title\n{some_variable}"); + expect(offset).toBe(11); + expect(adapter.lastQuotePrefix).toBe("rf"); + }); }); describe("transformOut", () => { @@ -204,8 +234,8 @@ describe("MarkdownLanguageAdapter", () => { expect(wrappedCode).toMatchInlineSnapshot(` "mo.md( """ - "Hello" world - """ + "Hello" world + """ )" `); expect(offset).toBe(16); @@ -218,8 +248,8 @@ describe("MarkdownLanguageAdapter", () => { expect(wrappedCode).toMatchInlineSnapshot(` "mo.md( """ - Hello "world" - """ + Hello "world" + """ )" `); expect(offset).toBe(16); @@ -232,10 +262,10 @@ describe("MarkdownLanguageAdapter", () => { expect(wrappedCode).toMatchInlineSnapshot(` "mo.md( """ - # Markdown Title + # Markdown Title - Some content here. - """ + Some content here. + """ )" `); expect(offset).toBe(16); @@ -274,6 +304,36 @@ describe("MarkdownLanguageAdapter", () => { expect(wrappedCode).toBe(pythonCode); expect(offset).toBe(10); }); + + it("should handle f-strings in transformOut", () => { + const code = "# Title\n{some_variable}"; + adapter.lastQuotePrefix = "f"; + const [wrappedCode, offset] = adapter.transformOut(code); + expect(wrappedCode).toMatchInlineSnapshot(` + "mo.md( + f""" + # Title + {some_variable} + """ + )" + `); + expect(offset).toBe(17); + }); + + it("should handle rf-strings in transformOut", () => { + const code = "# Title\n{some_variable}"; + adapter.lastQuotePrefix = "rf"; + const [wrappedCode, offset] = adapter.transformOut(code); + expect(wrappedCode).toMatchInlineSnapshot(` + "mo.md( + rf""" + # Title + {some_variable} + """ + )" + `); + expect(offset).toBe(18); + }); }); describe("isSupported", () => { @@ -284,6 +344,8 @@ describe("MarkdownLanguageAdapter", () => { "mo.md()", "mo.md('')", 'mo.md("")', + 'mo.md(""" hi """)', + "mo.md(''' hi ''')", "mo.md(f'hello world')", 'mo.md(f"hello world")', "mo.md(r'hello world')", @@ -292,12 +354,30 @@ describe("MarkdownLanguageAdapter", () => { 'mo.md(rf"hello world")', "mo.md(fr'hello world')", 'mo.md(fr"hello world")', + 'mo.md(f"""\n```python\n{some_variable}\n```\n""")', + "mo.md(f'''\n```python\n{some_variable}\n```\n''')", + 'mo.md(rf"""\n```python\n{some_variable}\n```\n""")', + "mo.md(rf'''\n```python\n{some_variable}\n```\n''')", + 'mo.md(f"""{np.random.randint(0, 10)}""")', ]; for (const format of VALID_FORMATS) { expect(adapter.isSupported(format)).toBe(true); } }); + it("should return true for complex nested markdown", () => { + const pythonCode = String.raw` + mo.md( + rf""" + \`\`\`python + {pathlib.Path(__file__).read_text(encoding="utf-8")} + \`\`\` + """ + ) + `; + expect(adapter.isSupported(pythonCode)).toBe(true); + }); + it("should return false for unsupported string formats", () => { const pythonCode = 'print("Hello, World!")'; expect(adapter.isSupported(pythonCode)).toBe(false); diff --git a/frontend/src/core/codemirror/language/markdown.ts b/frontend/src/core/codemirror/language/markdown.ts index a09a18273b7..728e582fa88 100644 --- a/frontend/src/core/codemirror/language/markdown.ts +++ b/frontend/src/core/codemirror/language/markdown.ts @@ -18,7 +18,6 @@ import { once } from "lodash-es"; import { enhancedMarkdownExtension } from "../markdown/extension"; import type { CompletionConfig } from "@/core/config/config-schema"; import type { HotkeyProvider } from "@/core/hotkeys/hotkeys"; -import { indentOneTab } from "./utils/indentOneTab"; import { QUOTE_PREFIX_KINDS, type QuotePrefixKind, @@ -122,44 +121,76 @@ export class MarkdownLanguageAdapter implements LanguageAdapter { // Multiline code const start = `mo.md(\n ${prefix}"""\n`; - const end = `\n """\n)`; - return [start + indentOneTab(escapedCode) + end, start.length + 1]; + const end = `\n"""\n)`; + return [start + escapedCode + end, start.length + 1]; } isSupported(pythonCode: string): boolean { - if (pythonCode.trim() === "") { + pythonCode = pythonCode.trim(); + + // Empty strings are supported + if (pythonCode === "") { return true; } - if (pythonCode.trim() === "mo.md()") { - return true; + // Must start with mo.md( + if (!pythonCode.startsWith("mo.md(")) { + return false; } - // Handle mo.md("foo"), mo.plain_text("bar") in the same line - // If it starts with mo.md, but we have more than one function call, return false - if (pythonCode.trim().startsWith("mo.md(")) { - const tree = pythonLanguage.parser.parse(pythonCode); - let functionCallCount = 0; - - // Parse the code using Lezer to check for multiple function calls - tree.iterate({ - enter: (node) => { - if (node.name === "CallExpression") { - functionCallCount++; - if (functionCallCount > 1) { - return false; // Stop iterating if we've found more than one function call - } - } - }, - }); - - // If the function call count is greater than 1, we don't want to show "view as markdown" - if (functionCallCount > 1) { - return false; - } + // Empty function calls are supported + if (pythonCode === "mo.md()") { + return true; } - return regexes.some(([, regex]) => regex.test(pythonCode)); + // Parse the code using Lezer and check for the exact match of mo.md() signature + const tree = pythonLanguage.parser.parse(pythonCode); + + // This is the exact match of mo.md() signature + const enterOrder: Array<{ match: string | RegExp; stop?: boolean }> = [ + { match: "Script" }, + { match: "ExpressionStatement" }, + { match: "CallExpression" }, + { match: "MemberExpression" }, + { match: "VariableName" }, + { match: "." }, + { match: "PropertyName" }, + { match: "ArgList" }, + { match: "(" }, + { match: /String|FormatString/, stop: true }, + { match: ")" }, + ]; + + let isValid = true; + + // Parse the code using Lezer to check for multiple function calls and string content + tree.iterate({ + enter: (node) => { + const current = enterOrder.shift(); + if (current === undefined) { + // If our list is empty, but we are still going + // then this is not a valid call + isValid = false; + return false; + } + + const match = current.match; + + if (typeof match === "string") { + isValid = isValid && match === node.name; + return isValid && !current.stop; + } + + if (!match.test(node.name)) { + isValid = false; + return isValid && !current.stop; + } + + return isValid && !current.stop; + }, + }); + + return isValid; } getExtension( diff --git a/frontend/src/core/codemirror/language/python.ts b/frontend/src/core/codemirror/language/python.ts index 9f24555d122..8f64ded8a2c 100644 --- a/frontend/src/core/codemirror/language/python.ts +++ b/frontend/src/core/codemirror/language/python.ts @@ -78,7 +78,12 @@ const lspClient = once((lspConfig: LSPConfig) => { enabled: true, }, jedi: { - auto_import_modules: ["marimo", "numpy"], + // Modules which should be imported and use compile-time, rather + // than static analysis; this is a trade-off between being able + // to access more information set on runtime (e.g. via setattr) + // vs being able to read the information from the source code + // (e.g. comments with documentation for attributes). + auto_import_modules: ["numpy"], }, jedi_completion: { // Ensure that parameters are included for completion snippets. diff --git a/frontend/src/plugins/core/RenderHTML.tsx b/frontend/src/plugins/core/RenderHTML.tsx index bec844acde7..0fe08edd6b3 100644 --- a/frontend/src/plugins/core/RenderHTML.tsx +++ b/frontend/src/plugins/core/RenderHTML.tsx @@ -80,7 +80,7 @@ const addCopyButtonToCodehilite: TransformFn = ( const CopyableCode = ({ children }: { children: ReactNode }) => { const id = useId(); return ( -
+
{children} should render a form aggregate 1`] = ` > Select columns tag. - # Example - + Examples: Using the MarimoIslandGenerator class: ```python import asyncio @@ -231,6 +241,8 @@ async def main(): f.write(html) ``` + Args: + app_id: The optional identifier of the app, defaults to `main`. """ def __init__(self, app_id: str = "main"): diff --git a/marimo/_output/data/data.py b/marimo/_output/data/data.py index f54d82835e7..08b3df1caab 100644 --- a/marimo/_output/data/data.py +++ b/marimo/_output/data/data.py @@ -85,13 +85,11 @@ def arrow(data: bytes) -> VirtualFile: def parquet(data: bytes) -> VirtualFile: """Create a virtual file for Parquet data. - **Args.** - - - data: Parquet data in bytes - - **Returns.** + Args: + data: Parquet data in bytes - A `VirtualFile` object. + Returns: + A `VirtualFile` object. """ return any_data(data, ext="parquet") # type: ignore diff --git a/marimo/_output/formatters/ipython_formatters.py b/marimo/_output/formatters/ipython_formatters.py index afeba2526fa..6b15c62a57d 100644 --- a/marimo/_output/formatters/ipython_formatters.py +++ b/marimo/_output/formatters/ipython_formatters.py @@ -2,8 +2,9 @@ from __future__ import annotations import functools +import weakref from dataclasses import dataclass -from typing import Any, Callable +from typing import Any, Callable, Optional from marimo._messaging.mimetypes import KnownMimeType from marimo._output.builder import h @@ -21,39 +22,116 @@ def register(self) -> Callable[[], None]: from marimo._output import formatting from marimo._runtime.output import _output + # Dictionary to store display objects by ID + display_objects: weakref.WeakValueDictionary[str, Any] = ( + weakref.WeakValueDictionary() + ) + + def clear_display_objects() -> None: + """Clear all stored display objects.""" + display_objects.clear() + old_display = IPython.display.display - # monkey patch IPython.display.display, which imperatively writes - # outputs to the frontend + old_update_display = getattr(IPython.display, "update_display", None) - @functools.wraps(old_display) - def display(*objs: Any, **kwargs: Any) -> None: - # IPython.display.display returns a DisplayHandle, which - # can be used to update the displayed object. We don't support - # that yet ... + # DisplayHandle class to match IPython's API + class DisplayHandle: + def __init__(self, display_id: str): + self.display_id = display_id + def update(self, obj: Any, **kwargs: Any) -> None: + update_display(obj, display_id=self.display_id, **kwargs) + + # Monkey patch IPython.display.display, which imperatively writes + # outputs to the frontend + @functools.wraps(old_display) + def display(*objs: Any, **kwargs: Any) -> Optional[DisplayHandle]: # If clear is True, clear the output before displaying if kwargs.pop("clear", False): _output.clear() + # Get display_id if provided + display_id = kwargs.pop("display_id", None) + if display_id is True: # Generate a new display_id if True + import uuid + + display_id = str(uuid.uuid4()) + raw = kwargs.pop("raw", False) for value in objs: # raw means it's a mimebundle, with the key (mime) and value (raw data) if raw and isinstance(value, dict): - _output.append(ReprMimeBundle(value)) + output_value = ReprMimeBundle(value) else: - _output.append(value) + output_value = value + + # Store the object if display_id is provided + if display_id is not None: + display_objects[display_id] = output_value + + _output.append(output_value) + + # Return a DisplayHandle if display_id is provided + if display_id is not None: + return DisplayHandle(display_id) + return None + + # Implement update_display function + def update_display( + obj: Any, *, display_id: str, **kwargs: Any + ) -> None: + """Update an existing display by id + + Parameters + ---------- + obj : Any + The object with which to update the display + display_id : str + The id of the display to update + """ + if display_id not in display_objects: + return + + # Clear the output before updating + # _output.clear() + + # Update the stored object + raw = kwargs.pop("raw", False) + if raw and isinstance(obj, dict): + display_objects[display_id] = ReprMimeBundle(obj) + else: + display_objects[display_id] = obj + + # Append the updated object to the output + _output.replace(display_objects[display_id]) + # Patch both display and update_display IPython.display.display = display + IPython.display.update_display = update_display + # Patching display_functions handles display_markdown, display_x, etc. try: IPython.core.display_functions.display = display # type: ignore + IPython.core.display_functions.update_display = update_display # type: ignore except AttributeError: pass def unpatch() -> None: + clear_display_objects() # Clean up on unpatch IPython.display.display = old_display # type: ignore + if old_update_display is not None: + IPython.display.update_display = old_update_display # type: ignore + else: + delattr(IPython.display, "update_display") + try: IPython.core.display_functions.display = old_display # type: ignore + if old_update_display is not None: + IPython.core.display_functions.update_display = ( + old_update_display # type: ignore + ) + else: + delattr(IPython.core.display_functions, "update_display") except AttributeError: pass diff --git a/marimo/_output/formatters/tqdm_formatters.py b/marimo/_output/formatters/tqdm_formatters.py index a6b5b50a5d1..a05c52bcf59 100644 --- a/marimo/_output/formatters/tqdm_formatters.py +++ b/marimo/_output/formatters/tqdm_formatters.py @@ -26,7 +26,7 @@ def __init__(self, *args: Any, **kwargs: Any): super().__init__( collection=iterable, - title=desc or "Loading...", + title=desc or "", total=total, ) @@ -39,6 +39,38 @@ def update(self, n: int = 1) -> None: if hasattr(self, "progress") and self.progress is not None: self.progress.update(increment=n) + def close(self) -> None: + """Close the progress bar and clean up. + + This method is called when the progress bar is no longer needed. + In tqdm, this method also handles styling based on completion status. + """ + if hasattr(self, "progress") and self.progress is not None: + self.progress.clear() + self.progress.close() + + @classmethod + def write(cls, s: str, file: Any = None, end: str = "\n") -> None: + """Print a message via tqdm (without overlap with bars). + + Args: + s (str): The message to print + file: The file to write to (defaults to sys.stdout) + end (str): The end character to use (defaults to newline) + """ + import sys + + fp: Any = file if file is not None else sys.stdout + # In marimo, we don't need special handling to avoid overlapping with bars + # as the output is handled differently than in terminal environments + fp.write(s) + fp.write(end) + + +class ProgressBarTrangePatch(ProgressBarTqdmPatch): + def __init__(self, *args: Any, **kwargs: Any): + super().__init__(range(*args), **kwargs) + class TqdmFormatter(FormatterFactory): @staticmethod @@ -47,6 +79,8 @@ def package_name() -> str: def register(self) -> None: if running_in_notebook(): + # Import tqdm.notebook for notebook-specific progress bar implementation import tqdm.notebook # type: ignore [import-not-found,import-untyped] # noqa: E501 tqdm.notebook.tqdm = ProgressBarTqdmPatch + tqdm.notebook.trange = ProgressBarTrangePatch diff --git a/marimo/_output/justify.py b/marimo/_output/justify.py index f56170e59d7..96d65b48128 100644 --- a/marimo/_output/justify.py +++ b/marimo/_output/justify.py @@ -8,6 +8,9 @@ def center(item: object) -> Html: """Center an item. + Args: + item: object to center. + Returns: A centered `Html` object. """ @@ -18,6 +21,9 @@ def center(item: object) -> Html: def left(item: object) -> Html: """Left-justify an item. + Args: + item: object to left-justify. + Returns: A left-justified `Html` object. """ @@ -28,6 +34,9 @@ def left(item: object) -> Html: def right(item: object) -> Html: """Right-justify an item. + Args: + item: object to right-justify. + Returns: A right-justified `Html` object. """ diff --git a/marimo/_output/md.py b/marimo/_output/md.py index c4842155b27..7316e950c0a 100644 --- a/marimo/_output/md.py +++ b/marimo/_output/md.py @@ -209,13 +209,11 @@ def md(text: str) -> Html: $$ - **Args**: + Args: + text: a string of markdown - - `text`: a string of markdown - - **Returns**: - - - An `Html` object. + Returns: + An `Html` object. """ return _md(text) @@ -237,11 +235,11 @@ def latex(*, filename: Union[str, Path]) -> None: mo.latex(filename="https://example.com/macros.tex") ``` - **Args**: - - `filename`: Path to a LaTeX file + Args: + filename: Path to a LaTeX file - **Returns**: - - An `Html` object + Returns: + An `Html` object """ if isinstance(filename, Path): diff --git a/marimo/_output/show_code.py b/marimo/_output/show_code.py index 49099561099..36d3f6c432e 100644 --- a/marimo/_output/show_code.py +++ b/marimo/_output/show_code.py @@ -69,17 +69,15 @@ def factorial(n: int) -> int: mo.show_code() ``` - **Args:** - - - `output`: the output to display with the cell's code; omit the output - to just show the cell's code. - - `position`: Where to display the code relative to the output. - Use "above" to show code above the output, or "below" (default) to show - code below the output. - - **Returns:** - - HTML of the `output` arg displayed with its code. + Args: + output: the output to display with the cell's code; omit the output + to just show the cell's code. + position: Where to display the code relative to the output. + Use "above" to show code above the output, or "below" (default) to show + code below the output. + + Returns: + HTML of the `output` arg displayed with its code. """ assert position in ["above", "below"], ( "position must be 'above' or 'below'" diff --git a/marimo/_plugins/core/json_encoder.py b/marimo/_plugins/core/json_encoder.py index b70eeebb9b3..9e247e97cf7 100644 --- a/marimo/_plugins/core/json_encoder.py +++ b/marimo/_plugins/core/json_encoder.py @@ -29,6 +29,9 @@ def _convert_to_json(self, o: Any) -> Any: return o # Handle bytes objects + if isinstance(o, memoryview): + o = o.tobytes() + if isinstance(o, bytes): try: return o.decode("utf-8") diff --git a/marimo/_plugins/ui/_impl/data_editor.py b/marimo/_plugins/ui/_impl/data_editor.py index fa03e83b4ff..307c8125c70 100644 --- a/marimo/_plugins/ui/_impl/data_editor.py +++ b/marimo/_plugins/ui/_impl/data_editor.py @@ -135,6 +135,8 @@ class data_editor( on_change (Optional[Callable]): Optional callback to run when this element's value changes. column_sizing_mode (Literal["auto", "fit"]): The column sizing mode for the table. `auto` will size columns based on the content, `fit` will size columns to fit the view. + pagination (Optional[bool]): Whether to use pagination, enabled by default. + page_size (Optional[int]): Page size if pagination is in use, 50 by default. """ _name: Final[str] = "marimo-data-editor" diff --git a/marimo/_plugins/ui/_impl/data_explorer.py b/marimo/_plugins/ui/_impl/data_explorer.py index 0c9244b0e4b..fd510543f38 100644 --- a/marimo/_plugins/ui/_impl/data_explorer.py +++ b/marimo/_plugins/ui/_impl/data_explorer.py @@ -27,6 +27,8 @@ class data_explorer(UIElement[dict[str, Any], dict[str, Any]]): Args: df (IntoDataFrame): The DataFrame to visualize. + on_change (Callable[[dict[str, object]], None], optional): Optional callback + to run when this element's value changes. """ _name: Final[str] = "marimo-data-explorer" diff --git a/marimo/_plugins/ui/_impl/dictionary.py b/marimo/_plugins/ui/_impl/dictionary.py index df1e9968c6d..974ef9f1783 100644 --- a/marimo/_plugins/ui/_impl/dictionary.py +++ b/marimo/_plugins/ui/_impl/dictionary.py @@ -91,6 +91,8 @@ class dictionary(_batch_base): elements (dict[str, UIElement[Any, Any]]): A dict mapping names to UI elements to include. label (str, optional): A descriptive name for the dictionary. Defaults to "". + on_change (Callable[[dict[str, object]], None], optional): Optional callback + to run when this element's value changes. """ def __init__( diff --git a/marimo/_plugins/ui/_impl/from_anywidget.py b/marimo/_plugins/ui/_impl/from_anywidget.py index 55609bf296f..156ec54d81a 100644 --- a/marimo/_plugins/ui/_impl/from_anywidget.py +++ b/marimo/_plugins/ui/_impl/from_anywidget.py @@ -129,7 +129,14 @@ def __init__(self, widget: AnyWidget): def on_change(change: T) -> None: _put_buffers = ipywidgets.widgets.widget._put_buffers # type: ignore _put_buffers(change, buffer_paths, buffers) - widget.set_state(change) + current_state: dict[str, Any] = widget.get_state() + changed_state: dict[str, Any] = {} + for k, v in change.items(): + if k not in current_state: + changed_state[k] = v + elif current_state[k] != v: + changed_state[k] = v + widget.set_state(changed_state) js_hash: str = hashlib.md5( js.encode("utf-8"), usedforsecurity=False diff --git a/marimo/_plugins/ui/_impl/table.py b/marimo/_plugins/ui/_impl/table.py index 5e2d24412fb..c118979d0a7 100644 --- a/marimo/_plugins/ui/_impl/table.py +++ b/marimo/_plugins/ui/_impl/table.py @@ -279,7 +279,7 @@ def style_cell(_rowId, _columnName, value): selection (Literal["single", "multi", "single-cell", "multi-cell"], optional): 'single' or 'multi' to enable row selection, 'single-cell' or 'multi-cell' to enable cell selection or None to disable. Defaults to "multi". - initial_selection (Union[List[int], List[tuple[str, str]), optional): Indices of the rows you want selected by default. + initial_selection (Union[List[int], List[tuple[str, str]], optional): Indices of the rows you want selected by default. page_size (int, optional): The number of rows to show per page. Defaults to 10. show_column_summaries (Union[bool, Literal["stats", "chart"]], optional): Whether to show column summaries. Defaults to True when the table has less than 40 columns and at least 10 rows, False otherwise. @@ -299,6 +299,7 @@ def style_cell(_rowId, _columnName, value): style_cell (Callable[[str, str, Any], Dict[str, Any]], optional): A function that takes the row id, column name and value and returns a dictionary of CSS styles. max_columns (int, optional): Maximum number of columns to display. Defaults to 50. Set to None to show all columns. + label (str, optional): A descriptive name for the table. Defaults to "". """ _name: Final[str] = "marimo-table" diff --git a/marimo/_plugins/ui/_impl/tabs.py b/marimo/_plugins/ui/_impl/tabs.py index ef8b5c9ac84..ea5bd2bea53 100644 --- a/marimo/_plugins/ui/_impl/tabs.py +++ b/marimo/_plugins/ui/_impl/tabs.py @@ -48,6 +48,9 @@ class tabs(UIElement[str, str]): lazy (bool, optional): Whether to lazily load the tab content. This is a convenience that wraps each tab in a `mo.lazy` component. Defaults to False. + label (str, optional): A descriptive name for the tab. Defaults to "". + on_change (Callable[[dict[str, object]], None], optional): Optional callback + to run when this element's value changes. """ _name: Final[str] = "marimo-tabs" diff --git a/marimo/_runtime/complete.py b/marimo/_runtime/complete.py index bb9468aa472..726e6ea223d 100644 --- a/marimo/_runtime/complete.py +++ b/marimo/_runtime/complete.py @@ -495,13 +495,12 @@ def completion_worker( """Code completion worker. - **Args:** - - - `completion_queue`: queue from which requests are pulled. - - `graph`: dataflow graph backing the marimo program - - `glbls`: dictionary of global variables in interpreter memory - - `glbls_lock`: lock protecting globals - - `stream`: stream used to communicate completion results + Args: + completion_queue: queue from which requests are pulled. + graph: dataflow graph backing the marimo program + glbls: dictionary of global variables in interpreter memory + glbls_lock: lock protecting globals + stream: stream used to communicate completion results """ while True: diff --git a/marimo/_runtime/control_flow.py b/marimo/_runtime/control_flow.py index 843fd640633..8c4fa20f268 100644 --- a/marimo/_runtime/control_flow.py +++ b/marimo/_runtime/control_flow.py @@ -16,6 +16,9 @@ class MarimoStopError(BaseException): Inherits from `BaseException` to prevent accidental capture with `except Exception` (similar to `KeyboardInterrupt`) + + Args: + output: optional output object """ def __init__(self, output: Optional[object]) -> None: @@ -37,6 +40,10 @@ def stop(predicate: bool, output: Optional[object] = None) -> None: mo.stop(form.value is None, mo.md("**Submit the form to continue.**")) ``` + Args: + predicate (bool): The predicate indicating whether to stop. + output (bool): The output to be assigned to the current cell. + Raises: MarimoStopError: When `predicate` is `True` """ diff --git a/marimo/_runtime/output/_output.py b/marimo/_runtime/output/_output.py index 7c2d38e8261..15773a12865 100644 --- a/marimo/_runtime/output/_output.py +++ b/marimo/_runtime/output/_output.py @@ -32,9 +32,8 @@ def replace(value: object) -> None: Call `mo.output.replace()` to write to a cell's output area, replacing the existing output, if any. - **Args:** - - - `value`: object to output + Args: + value: object to output """ try: ctx = get_context() @@ -57,10 +56,9 @@ def replace_at_index(value: object, idx: int) -> None: Call this function to replace an existing object in a cell's output. If idx is equal to the length of the output, this is equivalent to an append. - **Args:** - - - `value`: new object to replace an existing object - - `idx`: index of output to replace + Args: + value: new object to replace an existing object + idx: index of output to replace """ try: @@ -91,9 +89,8 @@ def append(value: object) -> None: Call this function to incrementally build a cell's output. Appended outputs are stacked vertically. - **Args:** - - - `value`: object to output + Args: + value: object to output """ try: ctx = get_context() diff --git a/marimo/_runtime/params.py b/marimo/_runtime/params.py index 455e25b6898..44bebde2429 100644 --- a/marimo/_runtime/params.py +++ b/marimo/_runtime/params.py @@ -117,7 +117,12 @@ def set(self, key: str, value: Union[str, list[str]]) -> None: self[key] = value def append(self, key: str, value: str) -> None: - """Append a value to a list of values""" + """Append a value to a list of values + + Args: + key: The key identifying the list; the list will be created if needed. + value: The value to append. + """ if key not in self._params: self._params[key] = value QueryParamsAppend(key, value).broadcast(self._stream) @@ -134,7 +139,12 @@ def append(self, key: str, value: str) -> None: self._set_value(self._params) def remove(self, key: str, value: Optional[str] = None) -> None: - """Remove a value from a list of values.""" + """Remove a value from a list of values. + + Args: + key: The key identifying the list; no-op if absent. + value: The optional value to remove; if not given the entire list gets removed. + """ if key not in self._params: return # If value is None, remove the key diff --git a/marimo/_runtime/patches.py b/marimo/_runtime/patches.py index a3049fb8f3e..4cc093e4c5c 100644 --- a/marimo/_runtime/patches.py +++ b/marimo/_runtime/patches.py @@ -8,11 +8,17 @@ import types from typing import TYPE_CHECKING, Any, Callable +from marimo._dependencies.dependencies import DependencyManager from marimo._runtime import marimo_browser, marimo_pdb if TYPE_CHECKING: from collections.abc import Iterator + from jedi.inference.base_value import ( # type: ignore[import-untyped] + ValueSet, + ) + from parso.python.tree import ExprStmt + def patch_pdb(debugger: marimo_pdb.MarimoPdb) -> None: import pdb @@ -207,3 +213,205 @@ def patch_main_module_context( yield module finally: sys.modules["__main__"] = main + + +def patch_jedi_parameter_completion() -> None: + import re + + from jedi.inference.compiled import ( # type: ignore[import-untyped] + CompiledValue, + ) + from jedi.inference.compiled.value import ( # type: ignore[import-untyped] + SignatureParamName, + ) + from jedi.inference.names import ( # type: ignore[import-untyped] + AnonymousParamName, + ParamNameWrapper, + ) + from jedi.parser_utils import ( # type: ignore[import-untyped] + clean_scope_docstring, + ) + + original_static_infer = AnonymousParamName.infer + original_dynamic_infer = SignatureParamName.infer + + original_dynamic_init: Callable[..., None] = SignatureParamName.__init__ + + def find_statement_documentation(tree_node: ExprStmt) -> str: + """Find documentation of a statement (attribute in a class). + + By default jedi's `find_statement_documentation` will search + for strings >below< attributes (not above); while that follows + the convention of docstrings being below function signature, + it is often contrary to what authors expect, which is comments + above attributes in data classes. + """ + if tree_node.type == "expr_stmt": + maybe_name = tree_node.children[0] + if maybe_name.type != "name": + return "" + maybe_comment = getattr(maybe_name, "prefix", None) + if not isinstance(maybe_comment, str): + return "" + maybe_comment = maybe_comment.strip() + if not maybe_comment.startswith("#"): + return "" + lines = [ + line.strip().lstrip("#") for line in maybe_comment.splitlines() + ] + min_indent = min( + [len(line) - len(line.lstrip()) for line in lines] + ) + return "\n".join( + line.strip().lstrip("#")[min_indent:] + for line in maybe_comment.splitlines() + ) + return "" + + def extract_marimo_style_arguments(docstring: str) -> dict[str, str]: + lines = docstring.splitlines() + try: + start = lines.index("# Arguments") + except ValueError: + return {} + parsing_marimo_docstring = False + param_descriptions: dict[str, str] = {} + for line in lines[start + 1 :]: + if line == "| Parameter | Type | Description |": + parsing_marimo_docstring = True + continue + if line == "|-----------|------|-------------|": + continue + if parsing_marimo_docstring: + if line.strip() == "" or line.startswith("#"): + parsing_marimo_docstring = False + continue + match = re.match( + r"^\| `(.+)` \| `(.*)` \| (.*) \|$", line.strip() + ) + if match: + param, _param_type, description = match.groups() + param_descriptions[param] = description + return param_descriptions + + def extract_docstring_to_markdown_arguments( + docstring: str, + ) -> dict[str, str]: + param_descriptions: dict[str, str] = {} + lines = docstring.splitlines() + try: + start = lines.index("#### Parameters") + except ValueError: + return {} + param = None + for line in lines[start + 2 :]: + if line.strip() == "" or line.startswith("#"): + continue + param_start = re.match(r"^\- `(.+)`: (.*)$", line.strip()) + if param_start: + param, first_line = param_start.groups() + param_descriptions[param] = first_line + else: + if param: + param_descriptions[param] += "\n" + line.strip() + return param_descriptions + + def py__doc__(self: ParamNameWrapper) -> str: + # Patch for https://github.com/davidhalter/jedi/issues/2061 + if self.tree_name is None: + # This will only happen for runtime (imported packages) + arg_name = self.string_name + + if self.parent_context.is_class(): + docstring = self.parent_context.py__doc__() + else: + docstring = self.compiled_value.py__doc__() + else: + # Static analysis + definition = self.tree_name.get_definition() + if definition.type not in {"param", "expr_stmt"}: + return "" + if definition.type == "expr_stmt": + # The case of dataclasses. + return find_statement_documentation( + self.tree_name.get_definition() + ) + arg_name = definition.name.value + + if self.parent_context.is_class(): + docstring = self.parent_context.py__doc__() + else: + docstring = clean_scope_docstring(definition.parent.parent) + + if DependencyManager.docstring_to_markdown.has(): + from docstring_to_markdown import ( # type: ignore[import-not-found] + UnknownFormatError, + convert, + ) + + try: + docstring = convert(docstring) + except UnknownFormatError: + return "" + + if "# Arguments" in docstring: + param_descriptions = extract_marimo_style_arguments(docstring) + else: + param_descriptions = extract_docstring_to_markdown_arguments( + docstring + ) + + if arg_name in param_descriptions: + return param_descriptions[arg_name] + return "" + + def filter_none_value(value: Any) -> bool: + if not isinstance(value, CompiledValue): + return True + value_repr: str = value.access_handle.get_repr() + return not ( + value_repr == "None" + or + # numpy's special type acting as a sentinel + # in new and deprecated keyword arguments + "_NoValueType" in value_repr + ) + + def wrap_infer( + original_infer: Callable[[Any], ValueSet], + ) -> Callable[[Any], ValueSet]: + def infer(self: AnonymousParamName | SignatureParamName) -> ValueSet: + # Patch for https://github.com/davidhalter/jedi/issues/2063 + result = original_infer(self) + return result.filter(filter_none_value) + + infer.patched = True # type: ignore[attr-defined] + return infer + + py__doc__.patched = True # type: ignore[attr-defined] + + def enhanced_init( + self: SignatureParamName, + compiled_value: CompiledValue, + signature_param: str, + ) -> None: + original_dynamic_init(self, compiled_value, signature_param) + self.compiled_value = compiled_value + + enhanced_init.patched = True # type: ignore[attr-defined] + + if not ( + hasattr(ParamNameWrapper, "py__doc__") + and getattr(ParamNameWrapper.py__doc__, "patched", False) + ): + ParamNameWrapper.py__doc__ = py__doc__ + if not ( + hasattr(AnonymousParamName, "infer") + and getattr(AnonymousParamName.infer, "patched", False) + ): + AnonymousParamName.infer = wrap_infer(original_static_infer) + + if not getattr(SignatureParamName.infer, "patched", False): + SignatureParamName.infer = wrap_infer(original_dynamic_infer) + if not getattr(SignatureParamName.__init__, "patched", False): + SignatureParamName.__init__ = enhanced_init diff --git a/marimo/_save/save.py b/marimo/_save/save.py index 0536cf97fd2..9845f326da0 100644 --- a/marimo/_save/save.py +++ b/marimo/_save/save.py @@ -503,8 +503,7 @@ def cache( # type: ignore[misc] Decorating a function with `@mo.cache` will cache its value based on the function's arguments, closed-over values, and the notebook code. - **Usage.** - + Examples: ```python import marimo as mo @@ -540,10 +539,9 @@ def fib(n): Note, `mo.cache` can also be used as a drop in replacement for context block caching like `mo.persistent_cache`. - **Args**: - - - `pin_modules`: if True, the cache will be invalidated if module versions - differ. + Args: + pin_modules: if True, the cache will be invalidated if module versions + differ. ## Context manager to cache the return value of a block of code. @@ -553,20 +551,20 @@ def fib(n): By default, the cache is stored in memory and is not persisted across kernel runs, for that functionality, refer to `mo.persistent_cache`. - **Usage.** - + Examples: ```python with mo.cache("my_cache") as cache: variable = expensive_function() ``` - **Args**: - - - `name`: the name of the cache, used to set saving path- to manually - invalidate the cache, change the name. - - `pin_modules`: if True, the cache will be invalidated if module versions - differ. - - `loader`: the loader to use for the cache, defaults to `MemoryLoader`. + Args: + name: the name of the cache, used to set saving path- to manually + invalidate the cache, change the name. + pin_modules: if True, the cache will be invalidated if module versions + differ. + loader: the loader to use for the cache, defaults to `MemoryLoader`. + **kwargs: keyword arguments + *args: positional arguments """ arg = name del name @@ -613,8 +611,7 @@ def lru_cache( # type: ignore[misc] retained, with the oldest values being discarded. For more information, see the documentation of `mo.cache`. - **Usage.** - + Examples: ```python import marimo as mo @@ -624,22 +621,22 @@ def factorial(n): return n * factorial(n - 1) if n else 1 ``` - **Args**: - - - `maxsize`: the maximum number of entries in the cache; defaults to 128. - Setting to -1 disables cache limits. - - `pin_modules`: if True, the cache will be invalidated if module versions - differ. + Args: + maxsize: the maximum number of entries in the cache; defaults to 128. + Setting to -1 disables cache limits. + pin_modules: if True, the cache will be invalidated if module versions + differ. ## Context manager for LRU caching the return value of a block of code. - **Args**: - - - `name`: Namespace key for the cache. - - `maxsize`: the maximum number of entries in the cache; defaults to 128. - Setting to -1 disables cache limits. - - `pin_modules`: if True, the cache will be invalidated if module versions - differ. + Args: + name: Namespace key for the cache. + maxsize: the maximum number of entries in the cache; defaults to 128. + Setting to -1 disables cache limits. + pin_modules: if True, the cache will be invalidated if module versions + differ. + **kwargs: keyword arguments passed to `cache()` + *args: positional arguments passed to `cache()` """ arg = name del name @@ -703,8 +700,7 @@ def persistent_cache( # type: ignore[misc] that would otherwise be expensive to compute already materialized in memory. - **Usage.** - + Examples: ```python with persistent_cache(name="my_cache"): variable = expensive_function() # This will be cached to disk. @@ -723,16 +719,18 @@ def persistent_cache( # type: ignore[misc] **Warning.** Since context abuses sys frame trace, this may conflict with debugging tools or libraries that also use `sys.settrace`. - **Args**: - - - `name`: the name of the cache, used to set saving path- to manually - invalidate the cache, change the name. - - `save_path`: the folder in which to save the cache, defaults to - `__marimo__/cache` in the directory of the notebook file - - `method`: the serialization method to use, current options are "json", - and "pickle" (default). - - `pin_modules`: if True, the cache will be invalidated if module versions - differ between runs, defaults to False. + Args: + name: the name of the cache, used to set saving path- to manually + invalidate the cache, change the name. + save_path: the folder in which to save the cache, defaults to + `__marimo__/cache` in the directory of the notebook file + method: the serialization method to use, current options are "json", + and "pickle" (default). + pin_modules: if True, the cache will be invalidated if module versions + differ between runs, defaults to False. + store: optional store. + **kwargs: keyword arguments passed to `cache()` + *args: positional arguments passed to `cache()` ## Decorator for persistently caching the return value of a function. @@ -759,15 +757,14 @@ def my_expensive_function_cached_in_a_certain_location(): # Do expensive things ``` - **Args**: - - - `fn`: the wrapped function if no settings are passed. - - `save_path`: the folder in which to save the cache, defaults to - `__marimo__/cache` in the directory of the notebook file - - `method`: the serialization method to use, current options are "json", - and "pickle" (default). - - `pin_modules`: if True, the cache will be invalidated if module versions - differ between runs, defaults to False. + Args: + fn: the wrapped function if no settings are passed. + save_path: the folder in which to save the cache, defaults to + `__marimo__/cache` in the directory of the notebook file + method: the serialization method to use, current options are "json", + and "pickle" (default). + pin_modules: if True, the cache will be invalidated if module versions + differ between runs, defaults to False. """ arg = name diff --git a/marimo/_server/export/utils.py b/marimo/_server/export/utils.py index 0ac2156ad55..058ca8b842d 100644 --- a/marimo/_server/export/utils.py +++ b/marimo/_server/export/utils.py @@ -55,9 +55,7 @@ def _const_or_id(args: ast.stmt) -> str: return f"{args.id}" # type: ignore[attr-defined] -def get_markdown_from_cell( - cell: Cell, code: str, native_callout: bool = False -) -> Optional[str]: +def get_markdown_from_cell(cell: Cell, code: str) -> Optional[str]: """Attempt to extract markdown from a cell, or return None""" if not (cell.refs == {"mo"} and not cell.defs): @@ -73,24 +71,13 @@ def get_markdown_from_cell( # Wish there was a more compact to ignore ignore[attr-defined] for all. try: (body,) = ast.parse(code).body - callout = None if body.value.func.attr == "md": # type: ignore[attr-defined] value = body.value # type: ignore[attr-defined] - elif body.value.func.attr == "callout": # type: ignore[attr-defined] - if not native_callout: - return None - if body.value.args: # type: ignore[attr-defined] - callout = _const_string(body.value.args) # type: ignore[attr-defined] - else: - (keyword,) = body.value.keywords # type: ignore[attr-defined] - assert keyword.arg == "kind" - callout = _const_string([keyword.value]) # type: ignore - value = body.value.func.value # type: ignore[attr-defined] else: return None assert value.func.value.id == "mo" md_lines = _const_string(value.args).split("\n") - except (AssertionError, AttributeError, ValueError): + except (AssertionError, AttributeError, ValueError, SyntaxError): # No reason to explicitly catch exceptions if we can't parse out # markdown. Just handle it as a code block. return None @@ -100,14 +87,6 @@ def get_markdown_from_cell( md_lines = [line.rstrip() for line in md_lines] md = dedent(md_lines[0]) + "\n" + dedent("\n".join(md_lines[1:])) md = md.strip() - - if callout: - md = dedent( - f""" - ::: {{.callout-{callout}}} - {md} - :::""" - ) return md diff --git a/marimo/_smoke_tests/issues/4746_altair_hstacks.py b/marimo/_smoke_tests/issues/4746_altair_hstacks.py new file mode 100644 index 00000000000..0f15138e54b --- /dev/null +++ b/marimo/_smoke_tests/issues/4746_altair_hstacks.py @@ -0,0 +1,60 @@ + + +import marimo + +__generated_with = "0.13.3" +app = marimo.App(width="medium") + + +@app.cell +def _(): + import altair as alt + import pandas as pd + import marimo as mo + + from vega_datasets import data + + source = data.cars() + + plot_1 = mo.ui.altair_chart( + alt.Chart(source) + .mark_point() + .encode( + x="Horsepower", + y="Miles_per_Gallon", + ) + ) + + plot_2 = mo.ui.altair_chart( + alt.Chart(source) + .mark_point() + .encode( + x="Year", + y="Horsepower", + ) + ) + + mo.hstack([plot_1, plot_2]) + return mo, plot_1, plot_2 + + +@app.cell +def _(mo, plot_1, plot_2): + mo.hstack([plot_1, plot_2], justify="start") + return + + +@app.cell +def _(mo, plot_1, plot_2): + mo.hstack([plot_1, plot_2], justify="start", widths="equal") + return + + +@app.cell +def _(plot_1): + plot_1 + return + + +if __name__ == "__main__": + app.run() diff --git a/marimo/_smoke_tests/tqdm_update_test.py b/marimo/_smoke_tests/tqdm_update_test.py index df0cd7b1001..249301fcae3 100644 --- a/marimo/_smoke_tests/tqdm_update_test.py +++ b/marimo/_smoke_tests/tqdm_update_test.py @@ -7,9 +7,9 @@ @app.cell def __(): - from tqdm.notebook import tqdm + from tqdm.notebook import tqdm, trange import time - return time, tqdm + return time, tqdm, trange @app.cell @@ -19,12 +19,19 @@ def __(time, tqdm): time.sleep(0.1) return i, +@app.cell +def __(time, tqdm): + # Test regular iteration + for i in trange(5): + time.sleep(0.1) + return i, + @app.cell def __(time, tqdm): # Test manual update method - pbar = tqdm(total=10) - for i in range(10): + pbar = tqdm(total=5) + for i in range(5): time.sleep(0.1) pbar.update(1) # Explicitly calling update pbar.close() @@ -34,10 +41,10 @@ def __(time, tqdm): @app.cell def __(time, tqdm): # Test update with different increment - pbar = tqdm(total=100) - for i in range(0, 100, 10): + pbar = tqdm(total=50) + for i in range(0, 50, 5): time.sleep(0.1) - pbar.update(10) # Update by 10 each time + pbar.update(5) # Update by 5 each time pbar.close() return i, diff --git a/marimo/_sql/engines/pyiceberg.py b/marimo/_sql/engines/pyiceberg.py index 8f26919b3cf..9c82ae3edeb 100644 --- a/marimo/_sql/engines/pyiceberg.py +++ b/marimo/_sql/engines/pyiceberg.py @@ -87,7 +87,9 @@ def get_databases( del include_schemas databases: list[Database] = [] try: - namespaces = self._catalog.list_namespaces() + namespaces = sorted( + self._catalog.list_namespaces() + ) # Sort for consistent ordering for namespace in namespaces: tables = [] if self._resolve_should_auto_discover(include_tables): diff --git a/marimo/_tutorials/markdown.py b/marimo/_tutorials/markdown.py index 9d7f1d14ef8..40cd90ec445 100644 --- a/marimo/_tutorials/markdown.py +++ b/marimo/_tutorials/markdown.py @@ -11,7 +11,7 @@ import marimo -__generated_with = "0.12.2" +__generated_with = "0.13.3" app = marimo.App() @@ -45,20 +45,20 @@ def _(mo): @app.cell def _(mo): mo.md( - """ + r""" **Tip: toggling between the Markdown and Python editor** Although markdown is written with `mo.md`, marimo provides a markdown editor - that hides this boilerplate from you. + that hides this boilerplate from you, for cells that only contain `mo.md(...)`. Toggle between the Markdown and Python editors by clicking the blue icon in the top-right of the editor, entering `Ctrl/Cmd+Shift+M`, or using the "cell actions menu". You can also **hide** the markdown editor through the cell actions menu. - **Tip**: To interpolate Python values into markdown strings, you'll - need to use `mo.md(f"...")` directly; the markdown view does not support - f-strings. + **Tip:** To interpolate Python values into markdown strings, you'll need to use + a Python f-string; do this by checking the `f` box in the bottom-right corner of the + markdown editor, or with `mo.md(f"...")` in the Python view. """ ) return @@ -195,7 +195,7 @@ def _(mo): @app.cell def _(leaves, mo): - mo.md(f"Your leaves: {'🍃' * leaves.value}") + mo.md(f"""Your leaves: {'🍃' * leaves.value}""") return @@ -239,7 +239,7 @@ def make_dataframe(): {mo.as_html(make_dataframe())} """ ) - return make_dataframe, pl + return @app.cell(hide_code=True) diff --git a/marimo/_utils/docs.py b/marimo/_utils/docs.py index 1e103df166e..f48ae0d8622 100644 --- a/marimo/_utils/docs.py +++ b/marimo/_utils/docs.py @@ -4,6 +4,8 @@ import re from textwrap import dedent +from marimo._runtime.patches import patch_jedi_parameter_completion + def google_docstring_to_markdown(docstring: str) -> str: """ @@ -201,6 +203,9 @@ def _handle_arg_or_attribute( class MarimoConverter: priority = 100 + def __init__(self) -> None: + patch_jedi_parameter_completion() + SECTION_HEADERS = ["Args", "Returns", "Raises", "Examples"] def convert(self, docstring: str) -> str: diff --git a/openapi/package.json b/openapi/package.json index bd48a8381df..e6809d7b74a 100644 --- a/openapi/package.json +++ b/openapi/package.json @@ -19,5 +19,5 @@ "dependencies": { "openapi-fetch": "0.9.7" }, - "packageManager": "pnpm@10.9.0" + "packageManager": "pnpm@10.10.0" } diff --git a/pyproject.toml b/pyproject.toml index 5cdbb8c5d2a..b4e95a16b01 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -259,7 +259,7 @@ extra-dependencies = [ "pyiceberg>=0.9.0", # For testing clickhouse "chdb>=3; platform_system != 'Windows'", # there is no suitable wheel for windows - "clickhouse-connect>=0.8.16", + "clickhouse-connect>=0.8.17", "pandas>=1.5.3", "hvplot~=0.11.2", # Causes issues installing `shapely` (v2.0.7) @@ -273,7 +273,7 @@ extra-dependencies = [ # testing gen ai "openai>=1.55.3", "anthropic==0.34.1", - "google-generativeai==0.8.4", + "google-generativeai==0.8.5", # exporting as ipynb "nbformat >=5.10.4", "sympy>=1.13.3", diff --git a/tests/_ast/test_codegen.py b/tests/_ast/test_codegen.py index aac8ec5c18c..7f5e3625392 100644 --- a/tests/_ast/test_codegen.py +++ b/tests/_ast/test_codegen.py @@ -62,9 +62,12 @@ def wrap_generate_filecontents( resolved_configs = [CellConfig() for _ in range(len(codes))] else: resolved_configs = cell_configs - return codegen.generate_filecontents( + filecontents = codegen.generate_filecontents( codes, names, cell_configs=resolved_configs, **kwargs ) + # leading spaces should be removed too + assert filecontents.lstrip() == filecontents + return filecontents def get_idempotent_marimo_source(name: str) -> str: diff --git a/tests/_ast/test_visitor.py b/tests/_ast/test_visitor.py index fb6900d4989..eb4bd99280d 100644 --- a/tests/_ast/test_visitor.py +++ b/tests/_ast/test_visitor.py @@ -482,6 +482,54 @@ def foo(a): } +def test_global_not_ref() -> None: + code = cleandoc( + """ + x = 0 + def foo(a): + global x + """ + ) + v = visitor.ScopedVisitor() + mod = ast.parse(code) + v.visit(mod) + assert v.defs == set(["foo", "x"]) + assert v.refs == set() + + +def test_global_not_ref_define_later() -> None: + code = cleandoc( + """ + def foo(a): + global x + x = 0 + """ + ) + v = visitor.ScopedVisitor() + mod = ast.parse(code) + v.visit(mod) + assert v.defs == set(["foo", "x"]) + assert v.refs == set() + + +def test_global_after_scoped_def() -> None: + code = cleandoc( + """ + def f(): + x = 0 + + def g(): + global x + x = 1 + """ + ) + v = visitor.ScopedVisitor() + mod = ast.parse(code) + v.visit(mod) + assert v.defs == set(["f", "x"]) + assert not v.refs + + def test_global_ref() -> None: code = cleandoc( """ @@ -500,6 +548,22 @@ def foo(a): } +def test_global_deleted_ref() -> None: + code = cleandoc( + """ + def f(): + global x + del x + """ + ) + v = visitor.ScopedVisitor() + mod = ast.parse(code) + v.visit(mod) + assert v.defs == set(["f"]) + assert v.refs == set(["x"]) + assert v.deleted_refs == {"x"} + + def test_nested_local_def_and_global_ref() -> None: code = cleandoc( """ @@ -954,6 +1018,81 @@ def test_private_ref_requirement_caught() -> None: } +def test_outer_ref_not_resolved_by_inner_resolution() -> None: + code = cleandoc( + """ + def f(): + x + def g(): + def h(): + x + x = 0 + """ + ) + v = visitor.ScopedVisitor() + mod = ast.parse(code) + v.visit(mod) + assert v.defs == {"f"} + assert v.refs == {"x"} + + +def test_deleted_ref_basic() -> None: + code = "del x" + v = visitor.ScopedVisitor() + mod = ast.parse(code) + v.visit(mod) + assert not v.defs + assert v.refs == {"x"} + assert v.deleted_refs == {"x"} + + +def test_not_deleted_ref() -> None: + code = cleandoc( + """ + x = 0 + def fn(): + if False: + z = x + del x + x + """ + ) + + v = visitor.ScopedVisitor() + mod = ast.parse(code) + v.visit(mod) + assert v.defs == {"x", "fn"} + assert not v.refs + assert not v.deleted_refs + + +@pytest.mark.xfail(reason="Unbound locals are currently treated as refs") +def test_unbound_local_not_deleted_ref() -> None: + # here `x` is an unbound local, because + # `del` adds `x` to scope. In particular, + # `z = x` raises an UnboundLocalError, even + # if `x` is in the global scope, meaning + # that technically: + # + # 1. this code should not have any refs + # 2. so del `x` is not deleting a ref + code = cleandoc( + """ + def fn(): + z = x + del x + """ + ) + + v = visitor.ScopedVisitor() + mod = ast.parse(code) + v.visit(mod) + assert v.defs == {"fn"} + # TODO(akshayka): These assertions currently fail. + assert not v.refs + assert not v.deleted_refs + + HAS_DEPS = DependencyManager.duckdb.has() diff --git a/tests/_output/formatters/test_ipython_update.py b/tests/_output/formatters/test_ipython_update.py new file mode 100644 index 00000000000..1747bd96b27 --- /dev/null +++ b/tests/_output/formatters/test_ipython_update.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +from unittest.mock import MagicMock, patch + +import pytest + +from marimo._dependencies.dependencies import DependencyManager +from marimo._output.formatters.ipython_formatters import ( + IPythonFormatter, +) + +HAS_DEPS = DependencyManager.ipython.has() + + +@pytest.mark.skipif(not HAS_DEPS, reason="IPython not installed") +@patch("marimo._runtime.output._output.replace") +@patch("marimo._runtime.output._output.append") +def test_display_update(mock_append: MagicMock, mock_replace: MagicMock): + """Test that display with display_id returns a handle and update works.""" + # Import IPython before patching to ensure we get the module + import IPython.display + + # Apply our formatter patch + unpatch = IPythonFormatter().register() + + try: + # Now use the patched functions + obj1 = IPython.display.HTML("
Initial Content
") + handle = IPython.display.display(obj1, display_id="test-id") + + # Verify handle was returned and append was called + assert handle is not None + assert handle.display_id == "test-id" + mock_append.assert_called_once_with(obj1) + mock_append.reset_mock() + + # Test update_display + obj2 = IPython.display.HTML("
Updated Content
") + IPython.display.update_display(obj2, display_id="test-id") + + # Verify replace was called + mock_replace.assert_called_once_with(obj2) + + # Test handle.update method + mock_replace.reset_mock() + + obj3 = IPython.display.HTML("
Handle Updated Content
") + handle.update(obj3) + + # Verify replace was called + mock_replace.assert_called_once_with(obj3) + + finally: + unpatch() + + +@pytest.mark.skipif(not HAS_DEPS, reason="IPython not installed") +@patch("marimo._runtime.output._output.append") +def test_display_auto_id(mock_append: MagicMock): + """Test that display with display_id=True auto-generates an ID.""" + # Import IPython before patching + import IPython.display + + # Apply our formatter patch + unpatch = IPythonFormatter().register() + + try: + # Test display with auto-generated display_id + obj = IPython.display.HTML("
Auto ID Content
") + handle = IPython.display.display(obj, display_id=True) + + # Verify handle was returned with a UUID + assert handle is not None + assert isinstance(handle.display_id, str) + assert len(handle.display_id) > 0 + mock_append.assert_called_once_with(obj) + + finally: + unpatch() diff --git a/tests/_plugins/core/test_json_encoder.py b/tests/_plugins/core/test_json_encoder.py index 9c6b74aab7e..f287b750ebd 100644 --- a/tests/_plugins/core/test_json_encoder.py +++ b/tests/_plugins/core/test_json_encoder.py @@ -207,6 +207,13 @@ def test_bytes_encoding() -> None: assert encoded == '"hello"' +def test_memoryview_encoding() -> None: + bytes_obj = b"hello" + memview = memoryview(bytes_obj) + encoded = json.dumps(memview, cls=WebComponentEncoder) + assert encoded == '"hello"' + + def test_set_encoding() -> None: set_obj = set(["a", "b"]) encoded = json.dumps(set_obj, cls=WebComponentEncoder) diff --git a/tests/_plugins/ui/_impl/test_anywidget.py b/tests/_plugins/ui/_impl/test_anywidget.py index 500580d958e..446f977864b 100644 --- a/tests/_plugins/ui/_impl/test_anywidget.py +++ b/tests/_plugins/ui/_impl/test_anywidget.py @@ -405,3 +405,30 @@ def __hash__(self) -> int: widget = UnhashableWidget() wrapped = from_anywidget(widget) assert wrapped is not None + + @staticmethod + async def test_partial_state_updates() -> None: + class MultiTraitWidget(_anywidget.AnyWidget): + _esm = "" + a = traitlets.Int(1).tag(sync=True) + b = traitlets.Int(2).tag(sync=True) + c = traitlets.Int(3).tag(sync=True) + + wrapped = anywidget(MultiTraitWidget()) + assert wrapped.value == {"a": 1, "b": 2, "c": 3} + + # Test partial update + wrapped._update({"a": 10}) + assert wrapped.value == {"a": 10, "b": 2, "c": 3} + + # Test multiple partial updates + wrapped._update({"b": 20}) + assert wrapped.value == {"a": 10, "b": 20, "c": 3} + + # Test updating all traits + wrapped._update({"a": 100, "b": 200, "c": 300}) + assert wrapped.value == {"a": 100, "b": 200, "c": 300} + + # Test updating with new traits + wrapped._update({"d": 4}) + assert wrapped.value == {"a": 100, "b": 200, "c": 300, "d": 4} diff --git a/tests/_runtime/test_complete.py b/tests/_runtime/test_complete.py index 3a43d86c8a3..b11b247a7a5 100644 --- a/tests/_runtime/test_complete.py +++ b/tests/_runtime/test_complete.py @@ -1,7 +1,15 @@ from __future__ import annotations +from inspect import signature +from types import ModuleType + +import jedi +import pytest + +import marimo from marimo._dependencies.dependencies import DependencyManager from marimo._runtime.complete import _build_docstring_cached +from marimo._runtime.patches import patch_jedi_parameter_completion from tests.mocks import snapshotter snapshot = snapshotter(__file__) @@ -94,3 +102,90 @@ def test_build_docstring_no_signature_no_body(): init_docstring=None, ) assert len(result.strip()) == 0 + + +def collect_modules_to_check(): + top_level_modules_to_check = [marimo] + submodules_to_check = [] + + # Collect all public exported sub-modules + for module in top_level_modules_to_check: + for attribute in dir(module): + if attribute.startswith("_"): + continue + candidate = getattr(module, attribute) + if isinstance(candidate, ModuleType): + submodules_to_check.append(candidate) + + return top_level_modules_to_check + submodules_to_check + + +def collect_functions_to_check(): + modules_to_check = collect_modules_to_check() + assert len(modules_to_check) > 1 + objects_to_check = set() + for module in modules_to_check: + for attribute in dir(module): + if attribute.startswith("_"): + continue + obj = getattr(module, attribute) + if not callable(obj): + continue + objects_to_check.add(obj) + assert len(objects_to_check) > 1 + return objects_to_check + + +@pytest.mark.skipif( + not DependencyManager.docstring_to_markdown.has(), + reason="docstring_to_markdown is not installed", +) +@pytest.mark.parametrize( + ("obj", "runtime_inference"), + [[obj, False] for obj in collect_functions_to_check()] + + [ + # Test runtime inference for a subset of values + [marimo.accordion, True] + ], + ids=lambda obj: f"{obj}" + if isinstance(obj, bool) + else f"{obj.__module__}.{obj.__qualname__}", +) +def test_parameter_descriptions(obj, runtime_inference): + patch_jedi_parameter_completion() + import_name = obj.__module__ + marimo_export = obj.__name__ + path = f"{import_name}.{marimo_export}" + if path == "marimo._output.hypertext.Html": + pytest.skip("Known issue with `Html` being a quasi-dataclass") + if path.startswith("marimo._save.save."): + pytest.skip( + "Cache functions use overloads to distinguish calls and context managers" + " this can be fixed by splitting docstring on per-oveload basis, but that" + " is not yet supported by mkdocstrings for documentation rendering, see" + " https://github.com/mkdocstrings/python/issues/135" + ) + call = f"{path}(" + code = f"import {import_name};{call}" + jedi.settings.auto_import_modules = ["marimo"] if runtime_inference else [] + script = jedi.Script(code=code) + completions = script.complete(line=1, column=len(code)) + param_completions = { + completion.name[:-1]: completion + for completion in completions + if completion.name.endswith("=") + } + for param_name, param in signature(obj).parameters.items(): + if param_name.startswith("_"): + continue + if param.kind in {param.VAR_KEYWORD, param.VAR_POSITIONAL}: + continue + assert param_name in param_completions, ( + f"Jedi did not suggest {param_name} in {call}" + ) + jedi_param = param_completions[param_name] + docstring = jedi_param.docstring() + assert docstring != "", f"Empty docstring result: {call}{param_name}" + assert "NoneType" not in docstring, ( + f"NoneType found in docstring: {call}{param_name}" + ) diff --git a/tests/_server/export/test_export_utils.py b/tests/_server/export/test_export_utils.py new file mode 100644 index 00000000000..fc8531f2de8 --- /dev/null +++ b/tests/_server/export/test_export_utils.py @@ -0,0 +1,27 @@ +from marimo._ast.compiler import compile_cell +from marimo._server.export.utils import get_markdown_from_cell + + +def test_extract_markdown_base(): + empty_markdown_str = "mo.md('hello')" + markdown = get_markdown_from_cell( + compile_cell(empty_markdown_str, "id"), empty_markdown_str + ) + assert markdown == "hello" + + +def test_extract_markdown_empty(): + empty_markdown_str = "mo.md()" + markdown = get_markdown_from_cell( + compile_cell(empty_markdown_str, "id"), empty_markdown_str + ) + assert markdown is None + + +def test_extract_markdown_broken(): + empty_markdown_str = "mo.md()" + # This can occur because the cell isn't recompiled at this point. + markdown = get_markdown_from_cell( + compile_cell(empty_markdown_str, "id"), "mo.md(f'{broken(}')" + ) + assert markdown is None diff --git a/tests/_sql/test_pyiceberg.py b/tests/_sql/test_pyiceberg.py index 5d0ffd2e200..da2865970ba 100644 --- a/tests/_sql/test_pyiceberg.py +++ b/tests/_sql/test_pyiceberg.py @@ -16,14 +16,17 @@ HAS_PYICEBERG = DependencyManager.pyiceberg.has() if TYPE_CHECKING: + from collections.abc import Generator + from pyiceberg.catalog import Catalog @pytest.fixture -def memory_catalog() -> Catalog: +def memory_catalog() -> Generator[Catalog, None, None]: """Create a mock PyIceberg catalog for testing.""" if not HAS_PYICEBERG: - return mock.MagicMock() + yield mock.MagicMock() + return from pyiceberg.catalog.memory import InMemoryCatalog from pyiceberg.schema import Schema as IcebergSchema @@ -66,7 +69,11 @@ def memory_catalog() -> Catalog: assert len(catalog.list_tables("default")) == 2 assert len(catalog.list_tables("test_namespace")) == 1 - return catalog + yield catalog + + catalog.drop_table(("default", "table1")) + catalog.drop_table(("default", "table2")) + catalog.drop_table(("test_namespace", "table3")) def get_expected_table(