diff --git a/.dockerignore b/.dockerignore index 937948ab8..aa00b07c7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -41,4 +41,10 @@ playwright/.cache/ **/.gitignore # Tests are copied to the docker container, as it modifies them -tests/ \ No newline at end of file +tests/ + +# Playwright +test-results/ +playwright-report/ +blob-report/ +playwright/.cache/ diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 000000000..37ebc1581 --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,43 @@ +name: End-to-end Tests + +on: + push: + branches: + - main + - 'release/**' + pull_request: + branches: + - main + - 'release/**' + +jobs: + e2e-test: + runs-on: ubuntu-22.04 + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Run tests + run: "./tools/run_docker.sh e2e-tests" + + - name: Upload Playwright report + uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 90 + + - name: Dump server logs + if: failure() + run: docker logs deephaven-plugins > /tmp/server-log.txt + + - name: Upload server logs + if: failure() + uses: actions/upload-artifact@v4 + with: + name: server-logs + path: /tmp/server-log.txt \ No newline at end of file diff --git a/.github/workflows/modified-plugin.yml b/.github/workflows/modified-plugin.yml index 4c4837347..3f454c88d 100644 --- a/.github/workflows/modified-plugin.yml +++ b/.github/workflows/modified-plugin.yml @@ -11,6 +11,8 @@ on: - 'matplotlib-v*' - 'json-v*' - 'ui-v*' + - 'utilities-v*' + - 'packaging-v*' jobs: changes: @@ -27,11 +29,27 @@ jobs: id: filter with: filters: | - plotly-express: plugins/plotly-express/** - plotly: plugins/plotly/** - matplotlib: plugins/matplotlib/** - json: plugins/json/** - ui: plugins/ui/** + plotly-express: + - plugins/plotly-express/** + - .github/workflows/test-*.yml + plotly: + - plugins/plotly/** + - .github/workflows/test-*.yml + matplotlib: + - plugins/matplotlib/** + - .github/workflows/test-*.yml + json: + - plugins/json/** + - .github/workflows/test-*.yml + ui: + - plugins/ui/** + - .github/workflows/test-*.yml + utilities: + - plugins/utilities/** + - .github/workflows/test-*.yml + packaging: + - plugins/packaging/** + - .github/workflows/test-*.yml # Test all python packages that have been modified individually test-python: diff --git a/.github/workflows/release-python-package.yml b/.github/workflows/release-python-package.yml index 5ffa014a2..c8045590a 100644 --- a/.github/workflows/release-python-package.yml +++ b/.github/workflows/release-python-package.yml @@ -28,10 +28,18 @@ jobs: node-version: '18.x' registry-url: 'https://registry.npmjs.org' + - name: Check file existence + id: check_files + uses: andstor/file-existence-action@v3 + with: + files: "plugins/${{ inputs.package }}/src/js/package.json" + - name: Install npm dependencies + if: steps.check_files.outputs.files_exists == 'true' run: npm ci - name: Build npm packages + if: steps.check_files.outputs.files_exists == 'true' run: npm run build -- --scope "@deephaven/js-plugin-${{ inputs.package }}" - name: Set up Python diff --git a/.github/workflows/test-python-package.yml b/.github/workflows/test-python-package.yml index 3a5203865..891b088ee 100644 --- a/.github/workflows/test-python-package.yml +++ b/.github/workflows/test-python-package.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - python: ['3.8', '3.9', '3.10', '3.11'] + python: ['3.8', '3.9', '3.10', '3.11', '3.12'] steps: - name: Checkout uses: actions/checkout@v3 diff --git a/.gitignore b/.gitignore index f431fa514..ae0a65d79 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ tsconfig.tsbuildinfo .stylelintcache # Ignore the test reports +coverage/ junit.xml # Allow for local overrides of docker-compose.yml. https://docs.docker.com/compose/multiple-compose-files/merge/ @@ -24,3 +25,13 @@ docker-compose.override.yml # Ignore temporary files created during a release releases/ + +# Playwright +test-results/ +playwright-report/ +blob-report/ +playwright/.cache/ + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ef4506e65..69809928c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,8 @@ repos: deephaven-core, plotly, json-rpc, - matplotlib + matplotlib, + deephaven-plugin-utilities ] - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.2.2 diff --git a/Dockerfile b/Dockerfile index 3d437a8df..d005c641d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,6 +37,8 @@ COPY babel.config.js lerna.json nx.json tsconfig.json ./ # This requires the Dockerfile to be built in the context of the root of the deephaven-plugins repository # https://stackoverflow.com/a/34300129 COPY plugins plugins +# delete the plotly plugin as it's deprecated +RUN rm -rf plugins/plotly # Build the JS RUN npm run build @@ -55,4 +57,4 @@ COPY --link docker/config/deephaven.prop /opt/deephaven/config/deephaven.prop COPY --link docker/data /data # Set the environment variable to enable the JS plugins embedded in Python -ENV DEEPHAVEN_ENABLE_PY_JS=true \ No newline at end of file +ENV DEEPHAVEN_ENABLE_PY_JS=true diff --git a/README.md b/README.md index bba85aea3..6f49f9c9a 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,14 @@ To bypass the pre-commit hook, you can commit with the `--no-verify` flag, for e git commit --no-verify -m "commit message"` ``` +### Running end-to-end tests + +We use [Playwright](https://playwright.dev/) for end-to-end tests. We test against Chrome, Firefox, and Webkit (Safari). Snapshots from E2E tests are only run against Linux so they can be validated in CI. + +You should be able to pass arguments to these commands as if you were running Playwright via CLI directly. For example, to test only `matplotlib.spec.ts` you could run `npm run e2e:docker -- ./tests/matplotlib.spec.ts`, or to test only `matplotlib.spec.ts` in Firefox, you could run `npm run e2e:docker -- --project firefox ./tests/matplotlib.spec.ts`. See [Playwright CLI](https://playwright.dev/docs/test-cli) for more details. + +It is highly recommended to use `npm run e2e:docker` (instead of `npm run e2e`) as CI also uses the same environment. You can also use `npm run e2e:update-snapshots` to regenerate snapshots in said environment. + ### Running Python tests The above steps will also set up `tox` to run tests for the python plugins that support it. diff --git a/cog.toml b/cog.toml index d84f61c28..9724e3789 100644 --- a/cog.toml +++ b/cog.toml @@ -27,9 +27,9 @@ post_package_bump_hooks = [ # prepare the github release changelog file "mkdir -p ../../releases", "../../tools/extract_changelog.sh CHANGELOG.md > ../../releases/GITHUB_CHANGELOG-{{package}}.md", - # update the version number to have a .dev0 suffix (when possible, only done for python plugins) + # update the version number to have a `dev0` suffix "../../tools/update_version.sh {{package}} {{version}} --dev", - "git commit -m 'chore(version): update {{package}} version to {{version}}'", + "git commit --all --message 'chore(version): update {{package}} version to {{version}}.dev0'", # push the tag and the commits to main "git push origin {{package}}-v{{version}}", "git push origin main", @@ -76,4 +76,6 @@ plotly = { path = "plugins/plotly", public_api=false } plotly-express = { path = "plugins/plotly-express", public_api=false } table-example = { path = "plugins/table-example", public_api=false } ui = { path = "plugins/ui", public_api=false } +packaging = { path = "plugins/packaging", public_api=false } +utilities = { path = "plugins/utilities", public_api=false } diff --git a/docker-compose.yml b/docker-compose.yml index 307de2637..f9bb922af 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,5 +7,10 @@ services: pull: true ports: - '${DEEPHAVEN_PORT:-10000}:10000' + expose: + - 10000 volumes: - ./docker/data/:/data + - ./tests/app.d:/app.d + environment: + - START_OPTS=-Xmx4g -DAuthHandlers=io.deephaven.auth.AnonymousAuthenticationHandler -Ddeephaven.console.type=python -Ddeephaven.application.dir=./app.d diff --git a/docker/config/deephaven.prop b/docker/config/deephaven.prop index f415db0c6..95662a24c 100644 --- a/docker/config/deephaven.prop +++ b/docker/config/deephaven.prop @@ -2,8 +2,6 @@ includefiles=dh-defaults.prop deephaven.console.type=python -# Add all plugins that you want installed here -deephaven.jsPlugins.@deephaven/js-plugin-ui=/opt/deephaven/config/plugins/plugins/ui/src/js # Anonymous authentication so we don't need to put in a password AuthHandlers=io.deephaven.auth.AnonymousAuthenticationHandler \ No newline at end of file diff --git a/docker/data/storage/notebooks/DEMO.md b/docker/data/storage/notebooks/DEMO.md index 7d7749234..19fff5579 100644 --- a/docker/data/storage/notebooks/DEMO.md +++ b/docker/data/storage/notebooks/DEMO.md @@ -61,6 +61,45 @@ def my_input(): result = my_input() ``` +## Picker (string values) + +The `ui.picker` component can be used to select from a list of items. Here's a basic example for selecting from a list of string values and displaying the selected key in a text field. + +```python +import deephaven.ui as ui +from deephaven.ui import use_state + + +@ui.component +def picker(): + value, set_value = use_state("") + + # Picker for selecting values + pick = ui.picker( + "Text 1", + "Text 2", + "Text 3", + label="Text", + on_selection_change=set_value, + selected_key=value, + ) + + # Show current selection in a ui.text component + text = ui.text("Selection: " + value) + + # Display picker and output in a flex column + return ui.flex( + pick, + text, + direction="column", + margin=10, + gap=10, + ) + + +result = picker() +``` + ## Using Tables You can open a Deephaven Table and control it using callbacks, as well. Let\'s create a table with some data, and then create a component that allows us to filter the table, and a button group it or ungroup it. @@ -158,7 +197,7 @@ def stock_table_input(source, default_sym="", default_exchange=""): return [ ui.panel( # Add a callback for when user double clicks a row in the table - ui.table(t1).on_row_double_press(handle_row_double_press), + ui.table(t1, on_row_double_press=handle_row_double_press), title="Stock Row Press", ), ui.panel(t2, title="Stock Filtered Table"), @@ -283,7 +322,7 @@ def table_tabs(source): return ui.tabs( ui.tab_list( ui.item("Unfiltered", key="Unfiltered"), - ui.item(ui.icon("vsGithubAlt"), "CAT", key="CAT"), + ui.item(ui.icon("vsGithubAlt"), ui.text("CAT"), key="CAT"), ui.item("DOG", key="DOG"), ), ui.tab_panels( diff --git a/jest.setup.ts b/jest.setup.ts index d30aeb930..a4c688a80 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -24,3 +24,10 @@ Object.defineProperty(window, 'matchMedia', { dispatchEvent: jest.fn(), })), }); + +/** + * Mock the structuredClone function to use `JSON.stringify` and `JSON.parse` + * This is necessary because jsdom does not support `structuredClone`. + * https://github.com/jsdom/jsdom/issues/3363 + */ +global.structuredClone = jest.fn(val => JSON.parse(JSON.stringify(val))); diff --git a/package-lock.json b/package-lock.json index b3ec626c2..64a2a70d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,13 @@ "@deephaven/eslint-config": "^0.40.0", "@deephaven/prettier-config": "^0.40.0", "@deephaven/tsconfig": "^0.40.0", + "@playwright/test": "^1.41.2", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "^14.4.3", "@types/jest": "^29.2.5", + "@types/node": "^20.11.17", "@types/prop-types": "^15.7.10", "@types/shortid": "^0.0.29", "eslint": "^8.37.0", @@ -52,71 +54,91 @@ "dev": true }, "node_modules/@adobe/react-spectrum": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.32.2.tgz", - "integrity": "sha512-dKDJquOlpATCe09Tf+hWwPRCFZOtIFQB0Sj79lf4ypUHONuHZCTzBz287OmnzflbvlRD8igUVru76e+xORD+YQ==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-spectrum/actionbar": "^3.4.0", - "@react-spectrum/actiongroup": "^3.10.0", - "@react-spectrum/avatar": "^3.0.7", - "@react-spectrum/badge": "^3.1.8", - "@react-spectrum/breadcrumbs": "^3.9.2", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/buttongroup": "^3.6.8", - "@react-spectrum/calendar": "^3.4.3", - "@react-spectrum/checkbox": "^3.9.0", - "@react-spectrum/combobox": "^3.11.2", - "@react-spectrum/contextualhelp": "^3.6.5", - "@react-spectrum/datepicker": "^3.9.0", - "@react-spectrum/dialog": "^3.8.5", - "@react-spectrum/divider": "^3.5.8", - "@react-spectrum/dnd": "^3.3.5", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/icon": "^3.7.8", - "@react-spectrum/illustratedmessage": "^3.4.8", - "@react-spectrum/image": "^3.4.8", - "@react-spectrum/inlinealert": "^3.2.0", - "@react-spectrum/labeledvalue": "^3.1.8", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/link": "^3.6.2", - "@react-spectrum/list": "^3.7.4", - "@react-spectrum/listbox": "^3.12.4", - "@react-spectrum/menu": "^3.16.0", - "@react-spectrum/meter": "^3.4.8", - "@react-spectrum/numberfield": "^3.8.0", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/picker": "^3.13.2", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/provider": "^3.9.2", - "@react-spectrum/radio": "^3.7.0", - "@react-spectrum/searchfield": "^3.8.0", - "@react-spectrum/slider": "^3.6.4", - "@react-spectrum/statuslight": "^3.5.8", - "@react-spectrum/switch": "^3.5.0", - "@react-spectrum/table": "^3.12.4", - "@react-spectrum/tabs": "^3.8.4", - "@react-spectrum/tag": "^3.2.0", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/textfield": "^3.11.0", - "@react-spectrum/theme-dark": "^3.5.7", - "@react-spectrum/theme-default": "^3.5.7", - "@react-spectrum/theme-light": "^3.4.7", - "@react-spectrum/tooltip": "^3.6.2", - "@react-spectrum/view": "^3.6.5", - "@react-spectrum/well": "^3.4.8", - "@react-stately/collections": "^3.10.3", - "@react-stately/data": "^3.11.0", - "@react-types/shared": "^3.22.0" + "version": "3.34.1", + "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.34.1.tgz", + "integrity": "sha512-J1HOjntW+H8xusfc5xLnIlUXNOzllp4f7qzh3LlDOsZuH8oBH8sIYmBVp4ijVhRFUKa10qg088role1On3UGbg==", + "dependencies": { + "@internationalized/string": "^3.2.1", + "@react-aria/i18n": "^3.10.2", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-spectrum/actionbar": "^3.4.3", + "@react-spectrum/actiongroup": "^3.10.3", + "@react-spectrum/avatar": "^3.0.10", + "@react-spectrum/badge": "^3.1.11", + "@react-spectrum/breadcrumbs": "^3.9.5", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/buttongroup": "^3.6.11", + "@react-spectrum/calendar": "^3.4.7", + "@react-spectrum/checkbox": "^3.9.4", + "@react-spectrum/combobox": "^3.12.3", + "@react-spectrum/contextualhelp": "^3.6.9", + "@react-spectrum/datepicker": "^3.9.4", + "@react-spectrum/dialog": "^3.8.9", + "@react-spectrum/divider": "^3.5.11", + "@react-spectrum/dnd": "^3.3.8", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/icon": "^3.7.11", + "@react-spectrum/illustratedmessage": "^3.4.11", + "@react-spectrum/image": "^3.4.11", + "@react-spectrum/inlinealert": "^3.2.3", + "@react-spectrum/labeledvalue": "^3.1.12", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/link": "^3.6.5", + "@react-spectrum/list": "^3.7.8", + "@react-spectrum/listbox": "^3.12.7", + "@react-spectrum/menu": "^3.18.1", + "@react-spectrum/meter": "^3.4.11", + "@react-spectrum/numberfield": "^3.9.1", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/picker": "^3.14.3", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/provider": "^3.9.5", + "@react-spectrum/radio": "^3.7.4", + "@react-spectrum/searchfield": "^3.8.4", + "@react-spectrum/slider": "^3.6.7", + "@react-spectrum/statuslight": "^3.5.11", + "@react-spectrum/switch": "^3.5.3", + "@react-spectrum/table": "^3.12.8", + "@react-spectrum/tabs": "^3.8.8", + "@react-spectrum/tag": "^3.2.4", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/textfield": "^3.11.4", + "@react-spectrum/theme-dark": "^3.5.8", + "@react-spectrum/theme-default": "^3.5.8", + "@react-spectrum/theme-light": "^3.4.8", + "@react-spectrum/tooltip": "^3.6.5", + "@react-spectrum/view": "^3.6.8", + "@react-spectrum/well": "^3.4.11", + "@react-stately/collections": "^3.10.5", + "@react-stately/data": "^3.11.2", + "@react-types/shared": "^3.22.1", + "client-only": "^0.0.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@adobe/react-spectrum-ui": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-ui/-/react-spectrum-ui-1.2.0.tgz", + "integrity": "sha512-os3EdjfyJbrukLcZ5uYtdFRiDlLB3zq2JoXp19J/IDpZ8btibJeRZYSwjL+LscEiT2pOYaF2McMQdkZTIwnllw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@adobe/react-spectrum-workflow": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-workflow/-/react-spectrum-workflow-2.3.4.tgz", + "integrity": "sha512-XPLzIBl58HdLF9WIPB7RDAvVXvCE3SjG+HaWQhW2P9MnxSz1DEA9O7mlTlYblJkMbfk10T/+RFaSupc1yoN+TA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -2163,9 +2185,9 @@ } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz", - "integrity": "sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", + "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", "dev": true, "funding": [ { @@ -2182,13 +2204,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.1" + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz", - "integrity": "sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", + "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", "dev": true, "funding": [ { @@ -2206,9 +2228,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz", - "integrity": "sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", + "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", "dev": true, "funding": [ { @@ -2225,14 +2247,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.2", - "@csstools/css-tokenizer": "^2.2.1" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/selector-specificity": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", - "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz", + "integrity": "sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==", "dev": true, "funding": [ { @@ -2871,33 +2893,6 @@ "node": ">=16" } }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/@deephaven/dashboard-core-plugins/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -2931,38 +2926,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/@deephaven/dashboard-core-plugins/node_modules/mdast-util-find-and-replace": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", @@ -3133,109 +3096,6 @@ "@types/unist": "*" } }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/mdast-util-to-hast/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/mdast-util-to-hast/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/mdast-util-to-hast/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/mdast-util-to-hast/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, "node_modules/@deephaven/dashboard-core-plugins/node_modules/mdast-util-to-markdown": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", @@ -3431,145 +3291,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-destination/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-destination/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-label/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-label/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-space": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", @@ -3589,184 +3310,6 @@ "micromark-util-types": "^2.0.0" } }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-title/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-title/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-title/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-factory-whitespace/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-util-character": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", @@ -3786,21 +3329,6 @@ "micromark-util-types": "^2.0.0" } }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, "node_modules/@deephaven/dashboard-core-plugins/node_modules/micromark-util-symbol": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", @@ -3831,50 +3359,6 @@ } ] }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/react-markdown": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", - "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/prop-types": "^15.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "prop-types": "^15.0.0", - "property-information": "^6.0.0", - "react-is": "^18.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/react-markdown/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, "node_modules/@deephaven/dashboard-core-plugins/node_modules/redux-thunk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", @@ -3973,458 +3457,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-parse/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/@deephaven/dashboard-core-plugins/node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -4442,18 +3474,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/@deephaven/dashboard-core-plugins/node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -4471,20 +3491,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/@deephaven/dashboard-core-plugins/node_modules/unist-util-visit-parents": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", @@ -4503,92 +3509,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/unist-util-visit/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/unist-util-visit/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/vfile-message/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/vfile/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@deephaven/dashboard-core-plugins/node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/@deephaven/dashboard/node_modules/@deephaven/react-hooks": { "version": "0.40.1", "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.40.1.tgz", @@ -5433,6 +4353,17 @@ "react": ">=16.8.0" } }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-ZKXyJeFAzcpKM2kk8ipoGIPUqx9BX52omTGnfwjJvxOCaZTM2wtDK7zN0aIgPRbT9XYAlha0HtmZ+XKteuh0Gw==", + "dev": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", @@ -5885,11 +4816,11 @@ } }, "node_modules/@formatjs/ecma402-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.0.tgz", - "integrity": "sha512-PEVLoa3zBevWSCZzPIM/lvPCi8P5l4G+NXQMc/CjEiaCWgyHieUoo0nM7Bs0n/NbuQ6JpXEolivQ9pKSBHaDlA==", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", + "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", "dependencies": { - "@formatjs/intl-localematcher": "0.5.2", + "@formatjs/intl-localematcher": "0.5.4", "tslib": "^2.4.0" } }, @@ -5902,28 +4833,28 @@ } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.3.tgz", - "integrity": "sha512-X/jy10V9S/vW+qlplqhMUxR8wErQ0mmIYSq4mrjpjDl9mbuGcCILcI1SUYkL5nlM4PJqpc0KOS0bFkkJNPxYRw==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz", + "integrity": "sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==", "dependencies": { - "@formatjs/ecma402-abstract": "1.18.0", - "@formatjs/icu-skeleton-parser": "1.7.0", + "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/icu-skeleton-parser": "1.8.0", "tslib": "^2.4.0" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.7.0.tgz", - "integrity": "sha512-Cfdo/fgbZzpN/jlN/ptQVe0lRHora+8ezrEeg2RfrNjyp+YStwBy7cqDY8k5/z2LzXg6O0AdzAV91XS0zIWv+A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz", + "integrity": "sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==", "dependencies": { - "@formatjs/ecma402-abstract": "1.18.0", + "@formatjs/ecma402-abstract": "1.18.2", "tslib": "^2.4.0" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.2.tgz", - "integrity": "sha512-txaaE2fiBMagLrR4jYhxzFO6wEdEG4TPMqrzBAcbr4HFUYzH/YC+lg6OIzKCHm8WgDdyQevxbAAV1OgcXctuGw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", "dependencies": { "tslib": "^2.4.0" } @@ -6010,34 +4941,34 @@ } }, "node_modules/@internationalized/date": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.0.tgz", - "integrity": "sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.2.tgz", + "integrity": "sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==", "dependencies": { "@swc/helpers": "^0.5.0" } }, "node_modules/@internationalized/message": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.1.tgz", - "integrity": "sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.2.tgz", + "integrity": "sha512-MHAWsZWz8jf6jFPZqpTudcCM361YMtPIRu9CXkYmKjJ/0R3pQRScV5C0zS+Qi50O5UAm8ecKhkXx6mWDDcF6/g==", "dependencies": { "@swc/helpers": "^0.5.0", "intl-messageformat": "^10.1.0" } }, "node_modules/@internationalized/number": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.4.0.tgz", - "integrity": "sha512-8TvotW3qVDHC4uv/BVoN6Qx0Dm8clHY1/vpH+dh+XRiPW/9NVpKn1P8d1A+WLphWrMwyqyWXI7uWehJPviaeIw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.1.tgz", + "integrity": "sha512-N0fPU/nz15SwR9IbfJ5xaS9Ss/O5h1sVXMZf43vc9mxEG48ovglvvzBjF53aHlq20uoR6c+88CrIXipU/LSzwg==", "dependencies": { "@swc/helpers": "^0.5.0" } }, "node_modules/@internationalized/string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.1.1.tgz", - "integrity": "sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.1.tgz", + "integrity": "sha512-vWQOvRIauvFMzOO+h7QrdsJmtN1AXAFVcaLWP9AseRN2o7iHceZ6bIXhBD4teZl8i91A3gxKnWBlGgjCwU6MFQ==", "dependencies": { "@swc/helpers": "^0.5.0" } @@ -8945,6 +7876,21 @@ "node": ">=14" } }, + "node_modules/@playwright/test": { + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.41.2.tgz", + "integrity": "sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==", + "dev": true, + "dependencies": { + "playwright": "1.41.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@plotly/d3": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.1.tgz", @@ -8971,6 +7917,38 @@ "elementary-circuits-directed-graph": "^1.0.4" } }, + "node_modules/@plotly/mapbox-gl": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@plotly/mapbox-gl/-/mapbox-gl-1.13.4.tgz", + "integrity": "sha512-sR3/Pe5LqT/fhYgp4rT4aSFf1rTsxMbGiH6Hojc7PH36ny5Bn17iVFUjpzycafETURuFbLZUfjODO8LvSI+5zQ==", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^1.5.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.1.1", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.2", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.2.1", + "grid-index": "^1.1.0", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^7.1.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + }, + "engines": { + "node": ">=6.4.0" + } + }, "node_modules/@plotly/point-cluster": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", @@ -8997,17 +7975,17 @@ } }, "node_modules/@react-aria/actiongroup": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-aria/actiongroup/-/actiongroup-3.7.0.tgz", - "integrity": "sha512-PAOoZbmvcEDy7qpYSXK+lxs7Jl0/7LpRQ+wze2muhsn8bHdPKl67lbUx8qY2L7fcamXNl4sCx/5w/MiS33HbDA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/list": "^3.10.1", - "@react-types/actiongroup": "^3.4.6", - "@react-types/shared": "^3.22.0", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@react-aria/actiongroup/-/actiongroup-3.7.3.tgz", + "integrity": "sha512-o1qw7w7GdL8vsOuzBc2mil+MM1CWWDDZ1+VhWnVwoDVt5Pxj36981leTh/WTS58IQ34N7p/jVdQMraQ25EJJyA==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/list": "^3.10.3", + "@react-types/actiongroup": "^3.4.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9016,15 +7994,15 @@ } }, "node_modules/@react-aria/breadcrumbs": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.8.tgz", - "integrity": "sha512-jeek23igeqXct7S3ShW2jtFUc5g3fS9ZEBZkF64FWBrwfCiaZwb8TcKkK/xFw36/q5mxEt+seNiqnNzvsICJuQ==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/link": "^3.6.2", - "@react-aria/utils": "^3.22.0", - "@react-types/breadcrumbs": "^3.7.2", - "@react-types/shared": "^3.22.0", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.11.tgz", + "integrity": "sha512-bQz4g2tKvcWxeqPGj9O0RQf++Ka8f2o/pJMJB+QQ27DVQWhxpQpND//oFku2aFYkxHB/fyD9qVoiqpQR25bidw==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/link": "^3.6.5", + "@react-aria/utils": "^3.23.2", + "@react-types/breadcrumbs": "^3.7.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9032,16 +8010,16 @@ } }, "node_modules/@react-aria/button": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.9.0.tgz", - "integrity": "sha512-Jri4OCN+4YmpJDPNQvk1DJoskKD9sdTxZaWWWJdAwoSIunZk3IEBXVvRfKzsEAVtI+UJN25zC2kyjXbVPS2XAA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/toggle": "^3.7.0", - "@react-types/button": "^3.9.1", - "@react-types/shared": "^3.22.0", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.9.3.tgz", + "integrity": "sha512-ZXo2VGTxfbaTEnfeIlm5ym4vYpGAy8sGrad8Scv+EyDAJWLMKokqctfaN6YSWbqUApC3FN63IvMqASflbmnYig==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/toggle": "^3.7.2", + "@react-types/button": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9049,19 +8027,19 @@ } }, "node_modules/@react-aria/calendar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.5.3.tgz", - "integrity": "sha512-jW48jk0TIe0HAJS+z8zqd8M86FEuqrk1qEIjMWnf8rFnA7hPPpjdjUrY9vSIeC95NcbyZbFnr1bHzQjAIzosQw==", - "dependencies": { - "@internationalized/date": "^3.5.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/utils": "^3.22.0", - "@react-stately/calendar": "^3.4.2", - "@react-types/button": "^3.9.1", - "@react-types/calendar": "^3.4.2", - "@react-types/shared": "^3.22.0", + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.5.6.tgz", + "integrity": "sha512-PA0Ur5WcODMn7t2gCUvq61YktkB+WlSZjzDr5kcY3sdl53ZjiyqCa2hYgrb6R0J859LVJXAp+5Qaproz8g1oLA==", + "dependencies": { + "@internationalized/date": "^3.5.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/utils": "^3.23.2", + "@react-stately/calendar": "^3.4.4", + "@react-types/button": "^3.9.2", + "@react-types/calendar": "^3.4.4", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9070,19 +8048,20 @@ } }, "node_modules/@react-aria/checkbox": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.12.0.tgz", - "integrity": "sha512-CyFZoI+z9hhyB3wb7IBsZxE30vXfYO2vSyET16zlkJ4qiFMqMiVLE4ekq034MHltCdpAczgP5yfKgNnJOmj7vQ==", - "dependencies": { - "@react-aria/form": "^3.0.0", - "@react-aria/label": "^3.7.3", - "@react-aria/toggle": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/checkbox": "^3.6.0", - "@react-stately/form": "^3.0.0", - "@react-stately/toggle": "^3.7.0", - "@react-types/checkbox": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.14.1.tgz", + "integrity": "sha512-b4rtrg5SpRSa9jBOqzJMmprJ+jDi3KyVvUh+DsvISe5Ti7gVAhMBgnca1D0xBp22w2jhk/o4gyu1bYxGLum0GA==", + "dependencies": { + "@react-aria/form": "^3.0.3", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/toggle": "^3.10.2", + "@react-aria/utils": "^3.23.2", + "@react-stately/checkbox": "^3.6.3", + "@react-stately/form": "^3.0.1", + "@react-stately/toggle": "^3.7.2", + "@react-types/checkbox": "^3.7.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9090,24 +8069,24 @@ } }, "node_modules/@react-aria/combobox": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.8.0.tgz", - "integrity": "sha512-lInzzZrH4vFlxmvDpXgQRkkREm7YIx258IRpQqll8Bny2vKMmZoF06zWMbcHP0CjFqYxExQeTjSYx0OTRRxkCQ==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/listbox": "^3.11.2", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/menu": "^3.11.2", - "@react-aria/overlays": "^3.19.0", - "@react-aria/selection": "^3.17.2", - "@react-aria/textfield": "^3.13.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/collections": "^3.10.3", - "@react-stately/combobox": "^3.8.0", - "@react-stately/form": "^3.0.0", - "@react-types/button": "^3.9.1", - "@react-types/combobox": "^3.9.0", - "@react-types/shared": "^3.22.0", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.8.4.tgz", + "integrity": "sha512-HyTWIo2B/0xq0Of+sDEZCfJyf4BvCvDYIWG4UhjqL1kHIHIGQyyr+SldbVUjXVYnk8pP1eGB3ttiREujjjALPQ==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/listbox": "^3.11.5", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/menu": "^3.13.1", + "@react-aria/overlays": "^3.21.1", + "@react-aria/selection": "^3.17.5", + "@react-aria/textfield": "^3.14.3", + "@react-aria/utils": "^3.23.2", + "@react-stately/collections": "^3.10.5", + "@react-stately/combobox": "^3.8.2", + "@react-stately/form": "^3.0.1", + "@react-types/button": "^3.9.2", + "@react-types/combobox": "^3.10.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9116,27 +8095,27 @@ } }, "node_modules/@react-aria/datepicker": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.9.0.tgz", - "integrity": "sha512-FIpiJxwBNOM8a6hLOqQJ4JrvRiGL6Zr44E1mHtAWStp2kBEJ6+O2JRm4PQ5Pzvdw6xnCpOBdfESdNdlXN7lVqQ==", - "dependencies": { - "@internationalized/date": "^3.5.0", - "@internationalized/number": "^3.4.0", - "@internationalized/string": "^3.1.1", - "@react-aria/focus": "^3.15.0", - "@react-aria/form": "^3.0.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/spinbutton": "^3.6.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/datepicker": "^3.9.0", - "@react-stately/form": "^3.0.0", - "@react-types/button": "^3.9.1", - "@react-types/calendar": "^3.4.2", - "@react-types/datepicker": "^3.7.0", - "@react-types/dialog": "^3.5.7", - "@react-types/shared": "^3.22.0", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.9.3.tgz", + "integrity": "sha512-1AjCAizd88ACKjVNhFazX4HZZFwWi2rsSlGCTm66Nx6wm5N/Cpbm466dpYEFyQUsKSOG4CC65G1zfYoMPe48MQ==", + "dependencies": { + "@internationalized/date": "^3.5.2", + "@internationalized/number": "^3.5.1", + "@internationalized/string": "^3.2.1", + "@react-aria/focus": "^3.16.2", + "@react-aria/form": "^3.0.3", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/spinbutton": "^3.6.3", + "@react-aria/utils": "^3.23.2", + "@react-stately/datepicker": "^3.9.2", + "@react-stately/form": "^3.0.1", + "@react-types/button": "^3.9.2", + "@react-types/calendar": "^3.4.4", + "@react-types/datepicker": "^3.7.2", + "@react-types/dialog": "^3.5.8", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9145,15 +8124,15 @@ } }, "node_modules/@react-aria/dialog": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.8.tgz", - "integrity": "sha512-KIc1FORdHhZ3bWom4qHO0hmlL4e5Hup6N25EY8HP5I7Ftv9EBBGaO5grtxZ2fX8kiCJNI4y+k67ZZ71wKJvMiA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-types/dialog": "^3.5.7", - "@react-types/shared": "^3.22.0", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.12.tgz", + "integrity": "sha512-7UJR/h/Y364u6Ltpw0bT51B48FybTuIBacGpEJN5IxZlpxvQt0KQcBDiOWfAa/GQogw4B5hH6agaOO0nJcP49Q==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-types/dialog": "^3.5.8", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9162,19 +8141,19 @@ } }, "node_modules/@react-aria/dnd": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.5.0.tgz", - "integrity": "sha512-6IuqmXwnfgRfeXDbfsPZzScapCmtRIkphTBPoLT575uEbZC7ROLgRJ/4NIKxvtTA6IIBqUGcvaqU9Mpg8j4U5Q==", - "dependencies": { - "@internationalized/string": "^3.1.1", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/dnd": "^3.2.6", - "@react-types/button": "^3.9.1", - "@react-types/shared": "^3.22.0", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.5.3.tgz", + "integrity": "sha512-0gi6sRnr97fSQnGy+CMt+99/+vVqr+qv2T9Ts8X9TAzxHNokz5QfSL88QSlTU36EnAVLxPY18iZQWCExSjKpEQ==", + "dependencies": { + "@internationalized/string": "^3.2.1", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/dnd": "^3.2.8", + "@react-types/button": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9183,29 +8162,29 @@ } }, "node_modules/@react-aria/focus": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.15.0.tgz", - "integrity": "sha512-nnxRyfqHuAjRwdQ4BpQyZPtGFKZmRU6cnaIb3pqWFCqEyJQensV7MA3TJ4Jhadq67cy1Ji5SYSlr1duBwjoYvw==", + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.16.2.tgz", + "integrity": "sha512-Rqo9ummmgotESfypzFjI3uh58yMpL+E+lJBbQuXkBM0u0cU2YYzu0uOrFrq3zcHk997udZvq1pGK/R+2xk9B7g==", "dependencies": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0", - "clsx": "^1.1.1" + "clsx": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-aria/form": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.0.tgz", - "integrity": "sha512-APeGph9oTO8nro4ZObuy1hk+0hpF/ji9O3odPGhLkzP/HvW2J7NI9pjKJOINfgtYr2yvVUZf/MbTMxPwtAxhaQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.3.tgz", + "integrity": "sha512-5Q2BHE4TTPDzGY2npCzpRRYshwWUb3SMUA/Cbz7QfEtBk+NYuVaq3KjvqLqgUUdyKtqLZ9Far0kIAexloOC4jw==", "dependencies": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/form": "^3.0.0", - "@react-types/shared": "^3.22.0", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/form": "^3.0.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9213,23 +8192,23 @@ } }, "node_modules/@react-aria/grid": { - "version": "3.8.5", - "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.8.5.tgz", - "integrity": "sha512-0p+Bbs9rpQeOy8b75DamlzVPKylBoe/z0XwkeeTChHP2TK3TwPXh6J5EmisQx6K8zsb3iZULQRcP4QibvnMbrg==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/collections": "^3.10.3", - "@react-stately/grid": "^3.8.3", - "@react-stately/selection": "^3.14.1", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/checkbox": "^3.6.0", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", + "version": "3.8.8", + "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.8.8.tgz", + "integrity": "sha512-7Bzbya4tO0oIgqexwRb8D6ZdC0GASYq9f/pnkrqocgvG9e1SCld4zOioKbYQDvAK/NnbCgXmmdqFAcLM/iazaA==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/collections": "^3.10.5", + "@react-stately/grid": "^3.8.5", + "@react-stately/selection": "^3.14.3", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/checkbox": "^3.7.1", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9238,18 +8217,18 @@ } }, "node_modules/@react-aria/gridlist": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.7.2.tgz", - "integrity": "sha512-9keGYZz0yILVqAnFzF6hGRtHm1vfSD1mNnH8oyn7mKjyr7qOln7s5f8Nl85ueMolfrV3H2rCZgM2itNQ+Ezzgg==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/grid": "^3.8.5", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/list": "^3.10.1", - "@react-types/shared": "^3.22.0", + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.7.5.tgz", + "integrity": "sha512-RmHEJ++vngHYEWbUCtLLmGh7H3vNd2Y9S0q/9SgHFPbqPZycT5mxDZ2arqpOXeHRVRvPBaW9ZlMxI2bPOePrYw==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/grid": "^3.8.8", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/list": "^3.10.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9258,17 +8237,17 @@ } }, "node_modules/@react-aria/i18n": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.9.0.tgz", - "integrity": "sha512-ebGP/sVG0ZtNF4RNFzs/W01tl7waYpBManh1kKWgA4roDPFt/odkgkDBzKGl+ggBb7TQRHsfUFHuqKsrsMy9TA==", - "dependencies": { - "@internationalized/date": "^3.5.0", - "@internationalized/message": "^3.1.1", - "@internationalized/number": "^3.4.0", - "@internationalized/string": "^3.1.1", - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.10.2.tgz", + "integrity": "sha512-Z1ormoIvMOI4mEdcFLYsoJy9w/EzBdBmgfLP+S/Ah+1xwQOXpgwZxiKOhYHpWa0lf6hkKJL34N9MHJvCJ5Crvw==", + "dependencies": { + "@internationalized/date": "^3.5.2", + "@internationalized/message": "^3.1.2", + "@internationalized/number": "^3.5.1", + "@internationalized/string": "^3.2.1", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9276,13 +8255,13 @@ } }, "node_modules/@react-aria/interactions": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.20.0.tgz", - "integrity": "sha512-JCCEyK2Nb4mEHucrgmqhTHTNAEqhsiM07jJmmY22eikxnCQnsEfdwXyg9cgZLG79D5V7jyqVRqOp2OsG7Qx7kQ==", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.1.tgz", + "integrity": "sha512-AlHf5SOzsShkHfV8GLLk3v9lEmYqYHURKcXWue0JdYbmquMRkUsf/+Tjl1+zHVAQ8lKqRnPYbTmc4AcZbqxltw==", "dependencies": { - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9290,12 +8269,12 @@ } }, "node_modules/@react-aria/label": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.3.tgz", - "integrity": "sha512-v1zuqbpYyYaPjrBWpceGjMpwP4ne6fLoOXdoIZoKLux2jkAcyIF2kIJFiyYoPQYQJWGRNo7q1oSwamxmng4xJw==", + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.6.tgz", + "integrity": "sha512-ap9iFS+6RUOqeW/F2JoNpERqMn1PvVIo3tTMrJ1TY1tIwyJOxdCBRgx9yjnPBnr+Ywguep+fkPNNi/m74+tXVQ==", "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9303,15 +8282,15 @@ } }, "node_modules/@react-aria/link": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.6.2.tgz", - "integrity": "sha512-v9gXgQ3Gev0JOlg2MAXcubDMgX+0BlJ+hTyFYFMuN/4jVBlAe426WKbjg+6MMzxwukWg9C3Q08JzqdFTi4cBng==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-types/link": "^3.5.2", - "@react-types/shared": "^3.22.0", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.6.5.tgz", + "integrity": "sha512-kg8CxKqkciQFzODvLAfxEs8gbqNXFZCW/ISOE2LHYKbh9pA144LVo71qO3SPeYVVzIjmZeW4vEMdZwqkNozecw==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-types/link": "^3.5.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9319,18 +8298,18 @@ } }, "node_modules/@react-aria/listbox": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.11.2.tgz", - "integrity": "sha512-FXdoqYLUTJn16OxodyS518PIcwzFkCfW5bxQepoy88NDMGtqp6u8fvEPpAoZbomvw/pV9MuEaMAw9qLyfkD4DA==", - "dependencies": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/collections": "^3.10.3", - "@react-stately/list": "^3.10.1", - "@react-types/listbox": "^3.4.6", - "@react-types/shared": "^3.22.0", + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.11.5.tgz", + "integrity": "sha512-y3a3zQYjT+JKgugCMMKS7K9sRoCoP1Z6Fiiyfd77OHXWzh9RlnvWGsseljynmbxLzSuPwFtCYkU1Jz4QwsPUIg==", + "dependencies": { + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/collections": "^3.10.5", + "@react-stately/list": "^3.10.3", + "@react-types/listbox": "^3.4.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9339,30 +8318,30 @@ } }, "node_modules/@react-aria/live-announcer": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.1.tgz", - "integrity": "sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.2.tgz", + "integrity": "sha512-aOyPcsfyY9tLCBhuUaYCruwcd1IrYLc47Ou+J7wMzjeN9v4lsaEfiN12WFl8pDqOwfy6/7It2wmlm5hOuZY8wQ==", "dependencies": { "@swc/helpers": "^0.5.0" } }, "node_modules/@react-aria/menu": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.11.2.tgz", - "integrity": "sha512-I4R5FOvRtwIQW+0naXav5giZBp935X2tXB2xBg/cSAYDXgfLmFPLHkyPbO77hR6FwazfFfJoKdn0pVcRox3lrQ==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/collections": "^3.10.3", - "@react-stately/menu": "^3.5.7", - "@react-stately/tree": "^3.7.4", - "@react-types/button": "^3.9.1", - "@react-types/menu": "^3.9.6", - "@react-types/shared": "^3.22.0", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.13.1.tgz", + "integrity": "sha512-jF80YIcvD16Fgwm5pj7ViUE3Dj7z5iewQixLaFVdvpgfyE58SD/ZVU9/JkK5g/03DYM0sjpUKZGkdFxxw8eKnw==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/overlays": "^3.21.1", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/collections": "^3.10.5", + "@react-stately/menu": "^3.6.1", + "@react-stately/tree": "^3.7.6", + "@react-types/button": "^3.9.2", + "@react-types/menu": "^3.9.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9371,13 +8350,13 @@ } }, "node_modules/@react-aria/meter": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.8.tgz", - "integrity": "sha512-u/pNisFs8UottonYlwqaS2i/NhHIw9LcApHo55XP7XMFCnaHPlq3mJzpSsr0zuCTvat2djoKelj41jT6Fhuw+A==", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.11.tgz", + "integrity": "sha512-P1G3Jdh0f/uieUDqvc3Ee4wzqBJa7H077BVSC3KPRqEp6YY7JimZGWjOwbFlO2PXhryXm/dI8EzUmh+4ZXjq/g==", "dependencies": { - "@react-aria/progress": "^3.4.8", - "@react-types/meter": "^3.3.6", - "@react-types/shared": "^3.22.0", + "@react-aria/progress": "^3.4.11", + "@react-types/meter": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9385,20 +8364,20 @@ } }, "node_modules/@react-aria/numberfield": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.10.0.tgz", - "integrity": "sha512-ixkvkPTn18RNPnbaT726CHA+Wpr/qTYWboq8hSaJK0LiAtiEWCKg0pmVtJ4lFntAQ5GNp02xudTwhQdLN5WRig==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/spinbutton": "^3.6.0", - "@react-aria/textfield": "^3.13.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/form": "^3.0.0", - "@react-stately/numberfield": "^3.7.0", - "@react-types/button": "^3.9.1", - "@react-types/numberfield": "^3.7.0", - "@react-types/shared": "^3.22.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.11.1.tgz", + "integrity": "sha512-JQ1Z+Ho5H+jeav7jt9A4vBsIQR/Dd2CFbObrULjGkqSrnWjARFZBv3gZwmfGCtplEPeAv9buYKHAqebPtJNUww==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/spinbutton": "^3.6.3", + "@react-aria/textfield": "^3.14.3", + "@react-aria/utils": "^3.23.2", + "@react-stately/form": "^3.0.1", + "@react-stately/numberfield": "^3.9.1", + "@react-types/button": "^3.9.2", + "@react-types/numberfield": "^3.8.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9407,20 +8386,20 @@ } }, "node_modules/@react-aria/overlays": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.19.0.tgz", - "integrity": "sha512-VN5GkB8+uZ2cfXljBtkqmrsAhBdGoj4un/agH0Qyihi2dazsMeafczSNnqzbpVgB4Zt2UHPJUkKwihgzXRxJJA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-stately/overlays": "^3.6.4", - "@react-types/button": "^3.9.1", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.21.1.tgz", + "integrity": "sha512-djEBDF+TbIIOHWWNpdm19+z8xtY8U+T+wKVQg/UZ6oWnclSqSWeGl70vu73Cg4HVBJ4hKf1SRx4Z/RN6VvH4Yw==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-stately/overlays": "^3.6.5", + "@react-types/button": "^3.9.2", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9429,15 +8408,15 @@ } }, "node_modules/@react-aria/progress": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.8.tgz", - "integrity": "sha512-Nah3aj5BNRa0+urQZimzb0vuKQK7lsc8BrUwJuHTwGRBSWUjCADExrJYdhDIR/nLUV2TCmAQl+GJtTgbEEj0DQ==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/label": "^3.7.3", - "@react-aria/utils": "^3.22.0", - "@react-types/progress": "^3.5.1", - "@react-types/shared": "^3.22.0", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.11.tgz", + "integrity": "sha512-RePHbS15/KYFiApYLdwazwvWKsB9q0Kn5DGCSb0hqCC+k2Eui8iVVOsegswiP+xqkk/TiUCIkBEw22W3Az4kTg==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/label": "^3.7.6", + "@react-aria/utils": "^3.23.2", + "@react-types/progress": "^3.5.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9445,19 +8424,19 @@ } }, "node_modules/@react-aria/radio": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.9.0.tgz", - "integrity": "sha512-kr3+OQ1YU/3mURZfCsYaQmJ/c15qOm8uScaDRC39qz97bLNASakQqMImIaS+GluPKx1PEW3y2ErAgLplH28zZw==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/form": "^3.0.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/utils": "^3.22.0", - "@react-stately/radio": "^3.10.0", - "@react-types/radio": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.10.2.tgz", + "integrity": "sha512-CTUTR+qt3BLjmyQvKHZuVm+1kyvT72ZptOty++sowKXgJApTLdjq8so1IpaLAr8JIfzqD5I4tovsYwIQOX8log==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/form": "^3.0.3", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/utils": "^3.23.2", + "@react-stately/radio": "^3.10.2", + "@react-types/radio": "^3.7.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9465,17 +8444,17 @@ } }, "node_modules/@react-aria/searchfield": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.6.0.tgz", - "integrity": "sha512-mHaN+sx2SLqluvF0/YIBQ9WA5LakSWl79FgC0sOWEaOZhDswAbJ9tESdi/M/ahtOnVwblE0cpHRlUKV0Oz4gOw==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/textfield": "^3.13.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/searchfield": "^3.5.0", - "@react-types/button": "^3.9.1", - "@react-types/searchfield": "^3.5.2", - "@react-types/shared": "^3.22.0", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.7.3.tgz", + "integrity": "sha512-mnYI969R7tU3yMRIGmY1+peq7tmEW0W3MB/J2ImK36Obz/91tTtspHHEeFtPlQDLIyvVPB0Ucam4LIxCKPJm/Q==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/textfield": "^3.14.3", + "@react-aria/utils": "^3.23.2", + "@react-stately/searchfield": "^3.5.1", + "@react-types/button": "^3.9.2", + "@react-types/searchfield": "^3.5.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9483,23 +8462,23 @@ } }, "node_modules/@react-aria/select": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.14.0.tgz", - "integrity": "sha512-ulVFH8K1yr8CxQE7pzhlM3aWBltWfSbWdJV3FXDqM0kA+GHqqPwZVJcqPuegtaiju1z6nRk4q789kJa4o+4M9g==", - "dependencies": { - "@react-aria/form": "^3.0.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/listbox": "^3.11.2", - "@react-aria/menu": "^3.11.2", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-stately/select": "^3.6.0", - "@react-types/button": "^3.9.1", - "@react-types/select": "^3.9.0", - "@react-types/shared": "^3.22.0", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.14.3.tgz", + "integrity": "sha512-9KCxI41FI+jTxEfUzRsMdJsZvjkCuuhL4UHig8MZXtXs0nsi7Ir3ezUDQ9m5MSG+ooBYM/CA9DyLDvo5Ioef+g==", + "dependencies": { + "@react-aria/form": "^3.0.3", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/listbox": "^3.11.5", + "@react-aria/menu": "^3.13.1", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-stately/select": "^3.6.2", + "@react-types/button": "^3.9.2", + "@react-types/select": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9508,16 +8487,16 @@ } }, "node_modules/@react-aria/selection": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.17.2.tgz", - "integrity": "sha512-AXXY3eOIWnITabMn6c0bpLPXkSX7040LOZU+7pQgtZJwDdZorLuKw4i7WS5i71LcV71ywG4mtqc9mOb/GfhUbg==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/selection": "^3.14.1", - "@react-types/shared": "^3.22.0", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.17.5.tgz", + "integrity": "sha512-gO5jBUkc7WdkiFMlWt3x9pTSuj3Yeegsxfo44qU5NPlKrnGtPRZDWrlACNgkDHu645RNNPhlyoX0C+G8mUg1xA==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/selection": "^3.14.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9526,12 +8505,12 @@ } }, "node_modules/@react-aria/separator": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.8.tgz", - "integrity": "sha512-u15HgH2IVKN/mx7Hp9dfNiFpPU/mq2EA7l0e2fsVSjA77nhSctUFBAqaR7FAI/y86RUhq3zplIz4BJek1/3Dvw==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.11.tgz", + "integrity": "sha512-UTla+3P2pELpP73WSfbwZgP1y1wODFBQbEOHnUxxO8ocyaUyQLJdvc07bBLLpPoyutlggRG0v9ACo0Rui7AjOg==", "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9539,18 +8518,18 @@ } }, "node_modules/@react-aria/slider": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.3.tgz", - "integrity": "sha512-AbrTD9UzMn0CwxFjOhJHz2ms2zdJlBL3XnbvqkpsmpXUl0u8WT1QAEaMnS5+792gnSGZs/ARDmse53o+IO8wTA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/utils": "^3.22.0", - "@react-stately/slider": "^3.4.5", - "@react-types/shared": "^3.22.0", - "@react-types/slider": "^3.7.0", + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.6.tgz", + "integrity": "sha512-ZeZhyHzhk9gxGuThPKgX2K3RKsxPxsFig1iYoJvqP8485NtHYQIPht2YcpEKA9siLxGF0DR9VCfouVhSoW0AEA==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/utils": "^3.23.2", + "@react-stately/slider": "^3.5.2", + "@react-types/shared": "^3.22.1", + "@react-types/slider": "^3.7.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9558,15 +8537,15 @@ } }, "node_modules/@react-aria/spinbutton": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.0.tgz", - "integrity": "sha512-I7f1gfwVRcjguEXZijk0z5g8njZ2YWnQzVzcwGf8ocLPxfw1CnSivNCzwVj2ChXPX10uXewXVMLWVCz+BRC9uQ==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/utils": "^3.22.0", - "@react-types/button": "^3.9.1", - "@react-types/shared": "^3.22.0", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.3.tgz", + "integrity": "sha512-IlfhRu/pc9zOt2C5zSEB7NmmzddvWisGx2iGzw8BwIKMD+cN3uy+Qwp+sG6Z/JzFEBN0F6Mxm3l5lhbiqjpICQ==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/utils": "^3.23.2", + "@react-types/button": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9575,9 +8554,9 @@ } }, "node_modules/@react-aria/ssr": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.0.tgz", - "integrity": "sha512-Bz6BqP6ZorCme9tSWHZVmmY+s7AU8l6Vl2NUYmBzezD//fVHHfFo4lFBn5tBuAaJEm3AuCLaJQ6H2qhxNSb7zg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.2.tgz", + "integrity": "sha512-0gKkgDYdnq1w+ey8KzG9l+H5Z821qh9vVjztk55rUg71vTk/Eaebeir+WtzcLLwTjw3m/asIjx8Y59y1lJZhBw==", "dependencies": { "@swc/helpers": "^0.5.0" }, @@ -9589,13 +8568,13 @@ } }, "node_modules/@react-aria/switch": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.5.7.tgz", - "integrity": "sha512-zBEsB071zzhQ82RwAA42pFLXHgrpya0OoRAsTO6jHZwiaYMsyqJI2eiXd7F6rqklpgyO6k7jOQklGUuoSJW4pA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.6.2.tgz", + "integrity": "sha512-X5m/omyhXK+V/vhJFsHuRs2zmt9Asa/RuzlldbXnWohLdeuHMPgQnV8C9hg3f+sRi3sh9UUZ64H61pCtRoZNwg==", "dependencies": { - "@react-aria/toggle": "^3.9.0", - "@react-stately/toggle": "^3.7.0", - "@react-types/switch": "^3.5.0", + "@react-aria/toggle": "^3.10.2", + "@react-stately/toggle": "^3.7.2", + "@react-types/switch": "^3.5.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9603,25 +8582,25 @@ } }, "node_modules/@react-aria/table": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.13.2.tgz", - "integrity": "sha512-bJgMx2SZ8SFmTosbv6k1lZ1a0Yw3f8tzWhpIQodCaMHhtI7izA6YqDNx47NeBNYpVm9DFfAoWbb79HFJ+OKIJA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/grid": "^3.8.5", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-stately/collections": "^3.10.3", - "@react-stately/flags": "^3.0.0", - "@react-stately/table": "^3.11.3", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/checkbox": "^3.6.0", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", - "@react-types/table": "^3.9.1", + "version": "3.13.5", + "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.13.5.tgz", + "integrity": "sha512-P2nHEDk2CCoEbMFKNCyBC9qvmv7F/IXARDt/7z/J4mKFgU2iNSK+/zw6yrb38q33Zlk8hDaqSYNxHlMrh+/1MQ==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/grid": "^3.8.8", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-stately/collections": "^3.10.5", + "@react-stately/flags": "^3.0.1", + "@react-stately/table": "^3.11.6", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/checkbox": "^3.7.1", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", + "@react-types/table": "^3.9.3", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9630,17 +8609,17 @@ } }, "node_modules/@react-aria/tabs": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.8.2.tgz", - "integrity": "sha512-zDfeEEyJmcnH9TFvJECWIrJpxX4SmREFV1/P8hN6ZUJPYoeiGMXYYFvjcRb1r3LN8XKlbwR37AQ3Cn1/yhrUwQ==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/tabs": "^3.6.2", - "@react-types/shared": "^3.22.0", - "@react-types/tabs": "^3.3.4", + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.8.5.tgz", + "integrity": "sha512-Jvt33/W+66n5oCxVwHAYarJ3Fit61vULiPcG7uTez0Mf11cq/C72wOrj+ZuNz6PTLTi2veBNQ7MauY72SnOjRg==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/tabs": "^3.6.4", + "@react-types/shared": "^3.22.1", + "@react-types/tabs": "^3.3.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9649,19 +8628,19 @@ } }, "node_modules/@react-aria/tag": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.3.0.tgz", - "integrity": "sha512-mANJTcPyut98O4D3cAKaNEV6QFfoljZCDAgC+uJkV/Zn8cU4JOFeNLAyNoLRlPvYw+msqr6wUyPkWNERuO+1Uw==", - "dependencies": { - "@react-aria/gridlist": "^3.7.2", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/list": "^3.10.1", - "@react-types/button": "^3.9.1", - "@react-types/shared": "^3.22.0", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.3.3.tgz", + "integrity": "sha512-tlJD9qj1XcsPIZD7DVJ6tWv8t7Z87/8qkbRDx7ugNqeHso9z0WqH9ZkSt17OFUWE2IQIk3V8D3iBSOtmhXcZGQ==", + "dependencies": { + "@react-aria/gridlist": "^3.7.5", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/list": "^3.10.3", + "@react-types/button": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9670,18 +8649,18 @@ } }, "node_modules/@react-aria/textfield": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.13.0.tgz", - "integrity": "sha512-sUlinDE+k/WhbskyqVOkuffuhiQpjgvp+iGRoralStVgb8Tcb+POxgAlw5jS4tNjdivCb3IjVJemUNJM7xsxxA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/form": "^3.0.0", - "@react-aria/label": "^3.7.3", - "@react-aria/utils": "^3.22.0", - "@react-stately/form": "^3.0.0", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@react-types/textfield": "^3.9.0", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.3.tgz", + "integrity": "sha512-wPSjj/mTABspYQdahg+l5YMtEQ3m5iPCTtb5g6nR1U1rzJkvS4i5Pug6PUXeLeMz2H3ToflPWGlNOqBioAFaOQ==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/form": "^3.0.3", + "@react-aria/label": "^3.7.6", + "@react-aria/utils": "^3.23.2", + "@react-stately/form": "^3.0.1", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", + "@react-types/textfield": "^3.9.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9689,15 +8668,15 @@ } }, "node_modules/@react-aria/toggle": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.9.0.tgz", - "integrity": "sha512-2YMWYQUEmcoAXtrAE86QXBS9XlmJyV6IFRlMTBNaeLTdH3AmACExgsyU66Tt0sKl6LMDMI376ItMFqAz27BBdQ==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/toggle": "^3.7.0", - "@react-types/checkbox": "^3.6.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.2.tgz", + "integrity": "sha512-DgitscHWgI6IFgnvp2HcMpLGX/cAn+XX9kF5RJQbRQ9NqUgruU5cEEGSOLMrEJ6zXDa2xmOiQ+kINcyNhA+JLg==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/toggle": "^3.7.2", + "@react-types/checkbox": "^3.7.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9705,16 +8684,16 @@ } }, "node_modules/@react-aria/tooltip": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.6.5.tgz", - "integrity": "sha512-hXw4Z8nYLOWz3QOQ807wWZdvDwR3gofsmZhAehg2HPRwdRfCQK+1cjVKeUd9cKCAxs0Cay7dV0oUdilLbCQ2Gg==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/tooltip": "^3.4.6", - "@react-types/shared": "^3.22.0", - "@react-types/tooltip": "^3.4.6", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.2.tgz", + "integrity": "sha512-6jXOSGPao3gPgUQWLbH2r/jxGMqIaIKrJgfwu9TQrh+UkwwiTYW20EpEDCYY2nRFlcoi7EYAiPDSEbHCwXS7Lg==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/tooltip": "^3.4.7", + "@react-types/shared": "^3.22.1", + "@react-types/tooltip": "^3.4.7", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9722,30 +8701,30 @@ } }, "node_modules/@react-aria/utils": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.22.0.tgz", - "integrity": "sha512-Qi/m65GFFljXA/ayj1m5g3KZdgbZY3jacSSqD5vNUOEGiKsn4OQcsw8RfC2c0SgtLV1hLzsfvFI1OiryPlGCcw==", + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.23.2.tgz", + "integrity": "sha512-yznR9jJ0GG+YJvTMZxijQwVp+ahP66DY0apZf7X+dllyN+ByEDW+yaL1ewYPIpugxVzH5P8jhnBXsIyHKN411g==", "dependencies": { - "@react-aria/ssr": "^3.9.0", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", + "@react-aria/ssr": "^3.9.2", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0", - "clsx": "^1.1.1" + "clsx": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-aria/virtualizer": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-3.9.7.tgz", - "integrity": "sha512-xaLnzRypiJuGi91ns+LXLGfEhi4a2oz2ZUrZmIrMnBF3asEqULX1PEZoeSWrTWENzumM9D49fvB4JqonK0Ktwg==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/shared": "^3.22.0", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-3.9.10.tgz", + "integrity": "sha512-oDvGgexK6phB9XECWvAaKTq/nRKxHjmJSiZ2gv9j72JFoky4iVEHKAV6Qnar0VBcEpk16JcJVI/wf1xr9F+sjQ==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9754,13 +8733,13 @@ } }, "node_modules/@react-aria/visually-hidden": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.7.tgz", - "integrity": "sha512-OuIGMVQIt7GC43h4x35BgkZid8lhoPu7Xz4TQRP8nvOJWb1lH7ehrRRuGdUsK3y90nwpxTdNdg4DILblg+VaLw==", + "version": "3.8.10", + "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.10.tgz", + "integrity": "sha512-np8c4wxdbE7ZrMv/bnjwEfpX0/nkWy9sELEb0sK8n4+HJ+WycoXXrVxBUb9tXgL/GCx5ReeDQChjQWwajm/z3A==", "dependencies": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9768,24 +8747,24 @@ } }, "node_modules/@react-spectrum/actionbar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/actionbar/-/actionbar-3.4.0.tgz", - "integrity": "sha512-Kb0lSo5iFpb4Qeet0fN8Ful7TFtmtHkl1LJuKz53q2qYQll+E+r2VVAdcOQMJRMRAEnecfd5mxAjEVawdOqrdw==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/actiongroup": "^3.10.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-types/actionbar": "^3.1.4", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/actionbar/-/actionbar-3.4.3.tgz", + "integrity": "sha512-LIg3a5z0bnFIkA1teaGUo/RdT4ZKPpUUF0RxPSm0nHWEzolSgD7BN4ijK5UxsDLA2cfNxv78s+vwHHKkKnsjSA==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/actiongroup": "^3.10.3", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-types/actionbar": "^3.1.5", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9795,25 +8774,25 @@ } }, "node_modules/@react-spectrum/actiongroup": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/actiongroup/-/actiongroup-3.10.0.tgz", - "integrity": "sha512-Wz6nD43bSFiUJsGJr8nIlFjiDzh7ZM65a7xnkHHk+wEPU6wDR6pA0fLVsscMMgNDqDaW2RclfIpJ2jBTBqZ7/w==", - "dependencies": { - "@react-aria/actiongroup": "^3.7.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/menu": "^3.16.0", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/tooltip": "^3.6.2", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/list": "^3.10.1", - "@react-types/actiongroup": "^3.4.6", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", - "@spectrum-icons/workflow": "^4.2.7", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/actiongroup/-/actiongroup-3.10.3.tgz", + "integrity": "sha512-VJASE+Y75Q885z9mx7CVELrX8PuZPbRnGFQnkoRnwZOTpMVZM6wQxA4IcAfsFVvaVIpHgBwtQTI1Ib+gAdtqgw==", + "dependencies": { + "@react-aria/actiongroup": "^3.7.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/menu": "^3.18.1", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/tooltip": "^3.6.5", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/list": "^3.10.3", + "@react-types/actiongroup": "^3.4.7", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", + "@spectrum-icons/workflow": "^4.2.10", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9823,14 +8802,14 @@ } }, "node_modules/@react-spectrum/avatar": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@react-spectrum/avatar/-/avatar-3.0.7.tgz", - "integrity": "sha512-+WfgiweFfu8rIhTIEKC/4i0X97lqTWxvosjQMmAgDV2m3Z0Qf03stJzZFL9UISEF+EchE6G17bAYfZ5UjmmErQ==", - "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/avatar": "^3.0.4", - "@react-types/shared": "^3.22.0", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@react-spectrum/avatar/-/avatar-3.0.10.tgz", + "integrity": "sha512-PvsCTTcjNN7QSsa3iCc2UF5LeQCwFNaiR0/xvpk+/ViP1wVq+xFR1tfSrbAq7TAF1B3NQNfI+wepy2ol5l8X2g==", + "dependencies": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/avatar": "^3.0.5", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9839,15 +8818,15 @@ } }, "node_modules/@react-spectrum/badge": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/badge/-/badge-3.1.8.tgz", - "integrity": "sha512-yplVbI2r/JJKVrsoc7cQpGv7JCPOApH6NYvjPo2UI7Vi5qI86BMP51BtHvZaxsmxKIinGBaoX44jcBcJw40Pmg==", - "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/badge": "^3.1.6", - "@react-types/shared": "^3.22.0", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/badge/-/badge-3.1.11.tgz", + "integrity": "sha512-YOuUBdWmqDQQrNI0uUpazWv/qYmFeDCsJVfQnl/K4J0A6/x7wuvz3iLPJKYuvmqG45/I+WXYFFaNuWOm4jCMzA==", + "dependencies": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-types/badge": "^3.1.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9856,22 +8835,22 @@ } }, "node_modules/@react-spectrum/breadcrumbs": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/breadcrumbs/-/breadcrumbs-3.9.2.tgz", - "integrity": "sha512-JMDeUpvzehx82mNizcc/Hnd1KYJCAnZARn9LJZpDhTqCMZW7OVkaUf8l5EtYPQpy6IAt477rQX4Gh/ipl+niLw==", - "dependencies": { - "@react-aria/breadcrumbs": "^3.5.8", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/menu": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-types/breadcrumbs": "^3.7.2", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/breadcrumbs/-/breadcrumbs-3.9.5.tgz", + "integrity": "sha512-MV1b077f189biweuI8H1/D6F7Nwrao0phYzAKqjaTa8bhXf180ej3VhtEEhrSyEhhMrHG3pPzCCbNUn2VMXDlg==", + "dependencies": { + "@react-aria/breadcrumbs": "^3.5.11", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/menu": "^3.18.1", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-types/breadcrumbs": "^3.7.3", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9881,22 +8860,22 @@ } }, "node_modules/@react-spectrum/button": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.15.0.tgz", - "integrity": "sha512-Hr4A2ex9uxg93XsnboCgiFYSD/lh8dK4u7+0I+yZ075kinrQVfbS4x5QZKqTW/BRxMOifHqfzz1CY2FMZ+9FSA==", - "dependencies": { - "@react-aria/button": "^3.9.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/toggle": "^3.7.0", - "@react-types/button": "^3.9.1", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.16.2.tgz", + "integrity": "sha512-T0B4EUeAAfsocTMZpfKYIsPMIbuwjB1+hfbZyBBvWt8gerLiEiPAwt6+ga1YzV7C6aAz2FPeTT+zd/RxouDTPw==", + "dependencies": { + "@react-aria/button": "^3.9.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/toggle": "^3.7.2", + "@react-types/button": "^3.9.2", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9905,14 +8884,14 @@ } }, "node_modules/@react-spectrum/buttongroup": { - "version": "3.6.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/buttongroup/-/buttongroup-3.6.8.tgz", - "integrity": "sha512-KyyhNBok0bmAMVYIu7V5sNtw+sywfihF3j60yLwVCGdNl8tekLtZs8bwQY+HhkDMuyM5OPK9ClY5mMZAzDxWoQ==", - "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/buttongroup": "^3.3.6", - "@react-types/shared": "^3.22.0", + "version": "3.6.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/buttongroup/-/buttongroup-3.6.11.tgz", + "integrity": "sha512-yJv6yBZRLIPYdOAch4FVhdrI0xZz5PPuLiSA6HF/9LlIimALj0qBgCsbQPPThz/UV8+8Y1F76wQUsDcj+iub/A==", + "dependencies": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/buttongroup": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9921,25 +8900,25 @@ } }, "node_modules/@react-spectrum/calendar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/calendar/-/calendar-3.4.3.tgz", - "integrity": "sha512-UF5lR+zHbur1tjjE+B6dcht9+o7iu+jfCf8sXfU0HSs7DoJGiUazpOuTKG3WQhuTMcuYYewGU7zXdphEM8NGcw==", - "dependencies": { - "@internationalized/date": "^3.5.0", - "@react-aria/calendar": "^3.5.3", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/calendar": "^3.4.2", - "@react-types/button": "^3.9.1", - "@react-types/calendar": "^3.4.2", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-spectrum/calendar/-/calendar-3.4.7.tgz", + "integrity": "sha512-eBH8SAHHbhprbzk445wnNrW80bnm7Kv5rwmcDBd7/FGb5EhWnQgcQtBo3z79dpCXCl8UtpLsih3eDV9QQSjIDA==", + "dependencies": { + "@internationalized/date": "^3.5.2", + "@react-aria/calendar": "^3.5.6", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/calendar": "^3.4.4", + "@react-types/button": "^3.9.2", + "@react-types/calendar": "^3.4.4", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9949,21 +8928,21 @@ } }, "node_modules/@react-spectrum/checkbox": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/checkbox/-/checkbox-3.9.0.tgz", - "integrity": "sha512-UDNy1qLSgvBtpsX+Df2GL7hBsnqtNPXj13lX5YflvbxqQhqMK5H838toMtbxM1fgO/JW1lD6mXOLx8TgK5WSOw==", - "dependencies": { - "@react-aria/checkbox": "^3.12.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/checkbox": "^3.6.0", - "@react-stately/toggle": "^3.7.0", - "@react-types/checkbox": "^3.6.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/checkbox/-/checkbox-3.9.4.tgz", + "integrity": "sha512-PzUaSza13wh7YipWJLd/0q/nkAnEnxso7hdvMzDLYcw0iKhXNTM2fUoouUuY1SsbithlF2GS5REYyMpQ4FNO3g==", + "dependencies": { + "@react-aria/checkbox": "^3.14.1", + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/checkbox": "^3.6.3", + "@react-stately/toggle": "^3.7.2", + "@react-types/checkbox": "^3.7.1", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -9972,34 +8951,34 @@ } }, "node_modules/@react-spectrum/combobox": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/combobox/-/combobox-3.11.2.tgz", - "integrity": "sha512-HSgXm/dleNOG5BJ00Dju0pUlYYXgTMXJ0zgt4yVRyDKpH+vBwL60TYTP/JoVik9YrZkYd3NJ+IgaS5a5MEIXMg==", - "dependencies": { - "@react-aria/button": "^3.9.0", - "@react-aria/combobox": "^3.8.0", - "@react-aria/dialog": "^3.5.8", - "@react-aria/focus": "^3.15.0", - "@react-aria/form": "^3.0.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/listbox": "^3.12.4", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/textfield": "^3.11.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/combobox": "^3.8.0", - "@react-types/button": "^3.9.1", - "@react-types/combobox": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.12.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/combobox/-/combobox-3.12.3.tgz", + "integrity": "sha512-hskwbdqXSSNEBRYTn3XESSnLGjELU4Lfht3GkZCvcQt02TVvu9NMETSkVe4lwCYV2hwXtPFGyl3jXvmA3MQurQ==", + "dependencies": { + "@react-aria/button": "^3.9.3", + "@react-aria/combobox": "^3.8.4", + "@react-aria/dialog": "^3.5.12", + "@react-aria/focus": "^3.16.2", + "@react-aria/form": "^3.0.3", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/listbox": "^3.12.7", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/textfield": "^3.11.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/combobox": "^3.8.2", + "@react-types/button": "^3.9.2", + "@react-types/combobox": "^3.10.1", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10009,18 +8988,18 @@ } }, "node_modules/@react-spectrum/contextualhelp": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/contextualhelp/-/contextualhelp-3.6.5.tgz", - "integrity": "sha512-gDxB68DFXPz3odOkyVFFWJZOx5l57JXUuZnrrUXSP4TnX/snXL+1+aIBzMcXqdJJhW8OB9sYmWAkimffLMuzGA==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/dialog": "^3.8.5", - "@react-spectrum/utils": "^3.11.2", - "@react-types/contextualhelp": "^3.2.7", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/workflow": "^4.2.7", + "version": "3.6.9", + "resolved": "https://registry.npmjs.org/@react-spectrum/contextualhelp/-/contextualhelp-3.6.9.tgz", + "integrity": "sha512-M0GUmZSLWm6pBAqy0Wwv1srlUPxBSvhQxTxvxtBcRSQwCIE1BcnQ6VaJxlx6n+Ocr14GwYH6MTpD1ZLMUvWeiA==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/dialog": "^3.8.9", + "@react-spectrum/utils": "^3.11.5", + "@react-types/contextualhelp": "^3.2.8", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/workflow": "^4.2.10", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10030,29 +9009,29 @@ } }, "node_modules/@react-spectrum/datepicker": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/datepicker/-/datepicker-3.9.0.tgz", - "integrity": "sha512-Hqq3/IigL939mbFtUWsr95/rr/IN9r7a2Nvquha6vg9UALk8XnTj0f3fJl6m16GdSavpfOvxz7Ef9+Vqijw0mg==", - "dependencies": { - "@internationalized/date": "^3.5.0", - "@react-aria/datepicker": "^3.9.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/calendar": "^3.4.3", - "@react-spectrum/dialog": "^3.8.5", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/utils": "^3.11.2", - "@react-spectrum/view": "^3.6.5", - "@react-stately/datepicker": "^3.9.0", - "@react-types/datepicker": "^3.7.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", - "@spectrum-icons/workflow": "^4.2.7", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/datepicker/-/datepicker-3.9.4.tgz", + "integrity": "sha512-NyFIH68WqbGajBMe/UMxZDwNwaPL/AKJeLC9CY+GcLp4uncWjI42LdcoBPSQFoEJHLtJlLhx+r7qWO/PMOhg3Q==", + "dependencies": { + "@internationalized/date": "^3.5.2", + "@react-aria/datepicker": "^3.9.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/calendar": "^3.4.7", + "@react-spectrum/dialog": "^3.8.9", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/utils": "^3.11.5", + "@react-spectrum/view": "^3.6.8", + "@react-stately/datepicker": "^3.9.2", + "@react-types/datepicker": "^3.7.2", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", + "@spectrum-icons/workflow": "^4.2.10", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10062,28 +9041,28 @@ } }, "node_modules/@react-spectrum/dialog": { - "version": "3.8.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.8.5.tgz", - "integrity": "sha512-lkAgRhzawhOX9yEjnA1tQeb5Yyv9W4CbRYv7ZtY6pr8f35b8JQQUGKCby3A/TArW5zTBvoueoMt27gJDxnGF5w==", - "dependencies": { - "@react-aria/dialog": "^3.5.8", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/buttongroup": "^3.6.8", - "@react-spectrum/divider": "^3.5.8", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-spectrum/view": "^3.6.5", - "@react-stately/overlays": "^3.6.4", - "@react-types/button": "^3.9.1", - "@react-types/dialog": "^3.5.7", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.8.9", + "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.8.9.tgz", + "integrity": "sha512-CxyARi0qYOJi24YVqXZp7tHVreYQoYc7+VBZzcn8dTbIL1CSxcSGbRGXOpHiaAejZ9/3lPm/PTbrWrKUBLbckA==", + "dependencies": { + "@react-aria/dialog": "^3.5.12", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/buttongroup": "^3.6.11", + "@react-spectrum/divider": "^3.5.11", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-spectrum/view": "^3.6.8", + "@react-stately/overlays": "^3.6.5", + "@react-types/button": "^3.9.2", + "@react-types/dialog": "^3.5.8", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10093,14 +9072,14 @@ } }, "node_modules/@react-spectrum/divider": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/divider/-/divider-3.5.8.tgz", - "integrity": "sha512-1+uIZW/TO/laTgvUpSaBuKyScpVKDXQhyWd0WyP2UioRA7gIh9rEgoMAIV4WPFUXBLdj6W12uYGOjSS2iXfzYQ==", - "dependencies": { - "@react-aria/separator": "^3.3.8", - "@react-spectrum/utils": "^3.11.2", - "@react-types/divider": "^3.3.6", - "@react-types/shared": "^3.22.0", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/divider/-/divider-3.5.11.tgz", + "integrity": "sha512-u6pyqBEc4JRpntF+KGuzmkzn+rJh04kfvjJ3Tx4F9IucaY8xCfglhunf6/yvRqQB0VaMdlxKy5BGhHgBJzUBiA==", + "dependencies": { + "@react-aria/separator": "^3.3.11", + "@react-spectrum/utils": "^3.11.5", + "@react-types/divider": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10108,13 +9087,13 @@ } }, "node_modules/@react-spectrum/dnd": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/dnd/-/dnd-3.3.5.tgz", - "integrity": "sha512-+lPqHd/CSbz/PV2HXIOpKLuBRpee3oz0nO0CRIog7zfIkI/wl2xaov+PdrUKk+58GUNGhz1C69QlPnDCV+t+0w==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/dnd/-/dnd-3.3.8.tgz", + "integrity": "sha512-GfLqduIBpH2LArBsFpNa4i9cYeFg7lJpqwrLVJRl96DbhdXEcwt9a4tqvsegkqKn6KPHDPG7uTX0OqPoQJluXQ==", "dependencies": { - "@react-aria/dnd": "^3.5.0", - "@react-stately/dnd": "^3.2.6", - "@react-types/shared": "^3.22.0", + "@react-aria/dnd": "^3.5.3", + "@react-stately/dnd": "^3.2.8", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10124,15 +9103,15 @@ } }, "node_modules/@react-spectrum/form": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/form/-/form-3.7.0.tgz", - "integrity": "sha512-TrUUG6D28Ugy/CmiGJJxkr8ue4zRE3wQkC6HScNCLcVGSkrcsWzDDUxRYDrxwlyFNMuZjUDhiLMMPthZqZcIUA==", - "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/form": "^3.0.0", - "@react-types/form": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/form/-/form-3.7.4.tgz", + "integrity": "sha512-xAS6vFM6dzKJc7gkC8Qy76VXLxZ9VqPZq4xxQeySvsO8pOujTFCL97QkS0mDjMOdpu72VDIF5JegK1Edlewr7g==", + "dependencies": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/form": "^3.0.1", + "@react-types/form": "^3.7.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10141,13 +9120,13 @@ } }, "node_modules/@react-spectrum/icon": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/icon/-/icon-3.7.8.tgz", - "integrity": "sha512-OllOy3+2laBHZNXAsVfy7J7ov9UsT/e6zTeqvWVIhYW8abpIYcCtJWxeaBPubVMcA47NRCLF46sEOuFhnTUxIw==", + "version": "3.7.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/icon/-/icon-3.7.11.tgz", + "integrity": "sha512-CTvbukq0g2oEjMqwMDx2qjfmFAv6u7/KwHRn9pGf6BUiU53Zlnl6Fjtm+c9cw8d9GcwlXyIWYBMIKyMm4+7g5A==", "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10156,15 +9135,15 @@ } }, "node_modules/@react-spectrum/illustratedmessage": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/illustratedmessage/-/illustratedmessage-3.4.8.tgz", - "integrity": "sha512-QHrjAZ9rXv+WpUR0QG3bz/3j1qLkc7qS4AwImZ9aoF7YRWMxLJCB2/b9tPGmWRWjjeH+gSSa4Q4y8FEr2hsYkA==", - "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/illustratedmessage": "^3.3.6", - "@react-types/shared": "^3.22.0", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/illustratedmessage/-/illustratedmessage-3.4.11.tgz", + "integrity": "sha512-KJdcF+YY2rPZBTP5P38MEQBoNLglP1QUaCmbPH8a5dSZ+wj5EsOgseFa0fxAEZ23q9Wo9Fv9P9niRq0/479KTQ==", + "dependencies": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/utils": "^3.11.5", + "@react-types/illustratedmessage": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10173,14 +9152,14 @@ } }, "node_modules/@react-spectrum/image": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/image/-/image-3.4.8.tgz", - "integrity": "sha512-hdDFjAxF9poKsE820H37C3y8J8NBzNQx8c/Erp2O1LTQP5HynBimYxqezx5KAl9scFsOaHsbY+VdGdFTzOmIsg==", - "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/image": "^3.3.6", - "@react-types/shared": "^3.22.0", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/image/-/image-3.4.11.tgz", + "integrity": "sha512-pzYubgkkC5Ic3eKrNlPUFPbVUTUvZ7DObmGpQvmgmG0xipmUAscYKFEBr4LhCsy/29Sm7Tz4zsGUdA2vM5eA8g==", + "dependencies": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/image": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10189,17 +9168,17 @@ } }, "node_modules/@react-spectrum/inlinealert": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/inlinealert/-/inlinealert-3.2.0.tgz", - "integrity": "sha512-uRWLLl2M5tc7B3/Lzm2/JLxXOyi+cT6uYkq9eksBM41OMfvgLksT5vaOegiBGHgi2r7QktTMZnDzGk5sGvaQyA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/inlinealert/-/inlinealert-3.2.3.tgz", + "integrity": "sha512-NX1bZvmI3EOBTRWaT4dzVyFxAuePPbXASZeJ4/wAnhvWDN65rKrctn+VZW3x6ZQoZ/WkQl4qW1txjVcLHkRBWg==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10208,18 +9187,18 @@ } }, "node_modules/@react-spectrum/label": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/label/-/label-3.16.0.tgz", - "integrity": "sha512-VLTpsq8wxTSv5eA2LwUVW79gdja3oSAKiTZmU6dMlo3yuBOhTMAsaAbgFhopTvotjUim9JG24BRpajnuA7Jz4w==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/label": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.16.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/label/-/label-3.16.4.tgz", + "integrity": "sha512-38hk6wqUwDCyYeScF1NIaxlPaltkTRTv6/XtIkm528eilLyOMxtMGXcP0Bl7nv0oDLxDZSm9TkgXjN24SyY0KQ==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/utils": "^3.11.5", + "@react-types/label": "^3.9.1", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10228,16 +9207,16 @@ } }, "node_modules/@react-spectrum/labeledvalue": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/labeledvalue/-/labeledvalue-3.1.8.tgz", - "integrity": "sha512-J/LaCVR3pWYbTg7sZg1p0W7jdWongUTjEE+2mlSdtJJaxLTUgOFgm32k/RU7foFK9+ds41S6gfDpv88aR4M+YA==", - "dependencies": { - "@internationalized/date": "^3.5.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@react-spectrum/labeledvalue/-/labeledvalue-3.1.12.tgz", + "integrity": "sha512-Pa/eYf9FKr8QF7xKLoCv6a+Ezudfi7N1jFJLZ71zaVcDOcNByYKiy1lAquwLB+36PpsWt/EwKLE2/U7OuiWyfQ==", + "dependencies": { + "@internationalized/date": "^3.5.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10246,14 +9225,14 @@ } }, "node_modules/@react-spectrum/layout": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/layout/-/layout-3.6.0.tgz", - "integrity": "sha512-eOG7u7dqqawMJq/cgr0Iq96Tqt2tuRVStnLgVpWJqKSYxJadd8Ja3mAkWzUq5SfX3r1w3UJWSJPcqYcu4TQ5yQ==", - "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/layout": "^3.3.12", - "@react-types/shared": "^3.22.0", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/layout/-/layout-3.6.3.tgz", + "integrity": "sha512-JsG4KclsgzKfRbe+PyMo8QryG5SmwYlym8JRuSLmZ+nfIKhESVbqSJE3IXblmDDWUb0rabQhSvW4p5h5nOil4w==", + "dependencies": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/layout": "^3.3.13", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10262,16 +9241,16 @@ } }, "node_modules/@react-spectrum/link": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/link/-/link-3.6.2.tgz", - "integrity": "sha512-Pa3fgGUpxzlWZ6fXVQcdLXDxp6Ui9KtJDSKZYAxQrTL4OzEA8rgF+FeG0d7MDAHW2okW6a/N9dJALrJEtlizGg==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/link": "^3.6.2", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/link": "^3.5.2", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/link/-/link-3.6.5.tgz", + "integrity": "sha512-pnPIzkM0/Nxm460dHuR195bD0BAaIvasqW8TqUFT0Igxfw0NFYyWZr5d4OkHKyypyUoQKaobpOgeAJHXxPtzTg==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/link": "^3.6.5", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/link": "^3.5.3", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10280,30 +9259,30 @@ } }, "node_modules/@react-spectrum/list": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/list/-/list-3.7.4.tgz", - "integrity": "sha512-ccMeyylTWknzZoWHGGDzmaPHKU2hns0UjHBDyNT8hCItO/YL0s2NWY83QO+iYS8Xb6n/EDts7IBrJJYrmxDRWQ==", - "dependencies": { - "@react-aria/button": "^3.9.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/gridlist": "^3.7.2", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-aria/virtualizer": "^3.9.7", - "@react-aria/visually-hidden": "^3.8.7", - "@react-spectrum/checkbox": "^3.9.0", - "@react-spectrum/dnd": "^3.3.5", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/layout": "^3.13.4", - "@react-stately/list": "^3.10.1", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/list/-/list-3.7.8.tgz", + "integrity": "sha512-w+fxiX+wz8X0bASAtKsf/myMrFI1Z0OXamttPRAJS5Ene6x09kf+K2djpZO1t9nT70IPnCcthhkMaCHk6eyUIw==", + "dependencies": { + "@react-aria/button": "^3.9.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/gridlist": "^3.7.5", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-aria/virtualizer": "^3.9.10", + "@react-aria/visually-hidden": "^3.8.10", + "@react-spectrum/checkbox": "^3.9.4", + "@react-spectrum/dnd": "^3.3.8", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/layout": "^3.13.7", + "@react-stately/list": "^3.10.3", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0", "react-transition-group": "^4.4.5" }, @@ -10314,27 +9293,27 @@ } }, "node_modules/@react-spectrum/listbox": { - "version": "3.12.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/listbox/-/listbox-3.12.4.tgz", - "integrity": "sha512-qmgHbeoFMFAK3AViPWri2z0Aqio0h2pf0ROjjkNPmTIm9xZEFMwArLqWhftmEm+smMTuNLjZv8aYGahKwiQDrg==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/listbox": "^3.11.2", - "@react-aria/utils": "^3.22.0", - "@react-aria/virtualizer": "^3.9.7", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/layout": "^3.13.4", - "@react-stately/list": "^3.10.1", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/listbox": "^3.4.6", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.12.7", + "resolved": "https://registry.npmjs.org/@react-spectrum/listbox/-/listbox-3.12.7.tgz", + "integrity": "sha512-cFUIKPRtz5ViQYS0vO+oQmiFmbJjA04GCpyZKnBJAEonNDiY1RIHfFg/53Mr8IwstwNvGbxHVjMilPy6DtWDjA==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/listbox": "^3.11.5", + "@react-aria/utils": "^3.23.2", + "@react-aria/virtualizer": "^3.9.10", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/layout": "^3.13.7", + "@react-stately/list": "^3.10.3", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/listbox": "^3.4.7", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10344,31 +9323,31 @@ } }, "node_modules/@react-spectrum/menu": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/menu/-/menu-3.16.0.tgz", - "integrity": "sha512-wcUwBLifWvJvMQrdnh7+m9g4maW87zv7yB2D/cnGYIkXL1aNZxa6zHLxSegs1PrqdP77fhEXthVFcMreuIHO6A==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/menu": "^3.11.2", - "@react-aria/overlays": "^3.19.0", - "@react-aria/separator": "^3.3.8", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/menu": "^3.5.7", - "@react-stately/overlays": "^3.6.4", - "@react-stately/tree": "^3.7.4", - "@react-types/menu": "^3.9.6", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", - "@spectrum-icons/workflow": "^4.2.7", + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/@react-spectrum/menu/-/menu-3.18.1.tgz", + "integrity": "sha512-3KutRgn9/uYcRH2IzUT6qiPlS9SK9+4R2W4Z1Ox27lQ30ZgC68kE37uOwZX10bDgTOWV/COYvm6qBBScZ+VFUg==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/menu": "^3.13.1", + "@react-aria/overlays": "^3.21.1", + "@react-aria/separator": "^3.3.11", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/menu": "^3.6.1", + "@react-stately/overlays": "^3.6.5", + "@react-stately/tree": "^3.7.6", + "@react-types/menu": "^3.9.7", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", + "@spectrum-icons/workflow": "^4.2.10", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10378,15 +9357,15 @@ } }, "node_modules/@react-spectrum/meter": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/meter/-/meter-3.4.8.tgz", - "integrity": "sha512-7nFE+B9OE6WyKJpBn8gAulNAlKqG2VFq74UiB/xV37rHXRIjn4waLaxK7s6uHCozOu2Ly5uTDJV5x3AN3W2ldw==", - "dependencies": { - "@react-aria/meter": "^3.4.8", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/utils": "^3.11.2", - "@react-types/meter": "^3.3.6", - "@react-types/shared": "^3.22.0", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/meter/-/meter-3.4.11.tgz", + "integrity": "sha512-OBYIHnumb2cfeT48py6Qtsfs7m9DmddaHSCVB8MXNnn3fzrpPr5t4Wz2dYUWXnkPPC11D8WarjJ+6EgrNwNvdQ==", + "dependencies": { + "@react-aria/meter": "^3.4.11", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/utils": "^3.11.5", + "@react-types/meter": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10395,26 +9374,26 @@ } }, "node_modules/@react-spectrum/numberfield": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/numberfield/-/numberfield-3.8.0.tgz", - "integrity": "sha512-uboKuVBDYR5BkGw1qY3udKmsMRipkhQIY1diKK0uu5ETdKrjhXRNQ5L+xfshT/K960tmztwnKk/nj1jePjk6MA==", - "dependencies": { - "@react-aria/button": "^3.9.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/numberfield": "^3.10.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/textfield": "^3.11.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/numberfield": "^3.7.0", - "@react-types/button": "^3.9.1", - "@react-types/numberfield": "^3.7.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", - "@spectrum-icons/workflow": "^4.2.7", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-spectrum/numberfield/-/numberfield-3.9.1.tgz", + "integrity": "sha512-s6QNRncVrVjOYihKeyQ8fkdD1YJTqYttog/Rj96rD66vfUlI0bTr3q6mK6hZpU1YM29SL24BUCn6NdqOxqVeiQ==", + "dependencies": { + "@react-aria/button": "^3.9.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/numberfield": "^3.11.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/textfield": "^3.11.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/numberfield": "^3.9.1", + "@react-types/button": "^3.9.2", + "@react-types/numberfield": "^3.8.1", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", + "@spectrum-icons/workflow": "^4.2.10", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10424,17 +9403,17 @@ } }, "node_modules/@react-spectrum/overlays": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-5.5.2.tgz", - "integrity": "sha512-4VXK1HMazuETgSnpPSPszuCB/4WaVhPX0h+1ICllReuvv9mvgWt6KoCkqJSoVMM8qlB4XocGUPsI1pL+Bck78w==", - "dependencies": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/overlays": "^3.6.4", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-5.5.5.tgz", + "integrity": "sha512-rFwbWuagFo/Tuo45UE8KHUMz1Li1j5CNzsZdIfKZydHd0u4t69yR8bCn3pDUNIYEwclrLGUD2XFJaN9jYq1H4A==", + "dependencies": { + "@react-aria/interactions": "^3.21.1", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/overlays": "^3.6.5", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0", "react-transition-group": "^4.4.5" }, @@ -10445,27 +9424,27 @@ } }, "node_modules/@react-spectrum/picker": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/picker/-/picker-3.13.2.tgz", - "integrity": "sha512-o7t1tnCKrYbDpZ/n3vohok82Yx6iEv8TQXUrXkiqHbRiohN72PB4WJMOlBjMbNaprcC4tdkHVuGlAhSwQHYBdA==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/select": "^3.14.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/listbox": "^3.12.4", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/select": "^3.6.0", - "@react-types/select": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/picker/-/picker-3.14.3.tgz", + "integrity": "sha512-xaewWrOtGt/dQbiSwZe9UYH58berRlxyqIeAZQ7+FCRGoG/gl1p+l+7rfNKFS5OjVy6Adh6BZrrY6A99j4PbQA==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/select": "^3.14.3", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/listbox": "^3.12.7", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/select": "^3.6.2", + "@react-types/select": "^3.9.2", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10475,15 +9454,15 @@ } }, "node_modules/@react-spectrum/progress": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/progress/-/progress-3.7.2.tgz", - "integrity": "sha512-YtAvWHC4rwBqRagoS/Mmt2NOZo4G6p5rIdhiVp/UjKa1oqEEiut29dMvr/JS30AoNPPSc95ctydgUU6JynyGJQ==", - "dependencies": { - "@react-aria/progress": "^3.4.8", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/progress": "^3.5.1", - "@react-types/shared": "^3.22.0", + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/progress/-/progress-3.7.5.tgz", + "integrity": "sha512-ku+RTtgXWaxUwjopzWpvgNxJsn/gohMWO4len2K2yDQp6b4SY67ojRFBwyIDZ9Oi9RPTAvZOc3wJu5QPftfVcg==", + "dependencies": { + "@react-aria/progress": "^3.4.11", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/progress": "^3.5.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10492,18 +9471,18 @@ } }, "node_modules/@react-spectrum/provider": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.9.2.tgz", - "integrity": "sha512-5DZA8UdAXWzLJo7nxO7VgTqvmjN6cbjctMWhLbv81jSLWRqm+O6RhRZjnbEVXqwfyPpxJzDG8ZhjaQe/kFs38A==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/provider": "^3.7.1", - "@react-types/shared": "^3.22.0", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.9.5.tgz", + "integrity": "sha512-FE5RQC1EwMMXUAtslekheyA0IrXSev4flaY4CT3exC/ohB1PuiXUDg4qqaHos2vVhsdUPNq5SeathtHEr8ryJA==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/provider": "^3.7.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0", - "clsx": "^1.1.1" + "clsx": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", @@ -10511,19 +9490,19 @@ } }, "node_modules/@react-spectrum/radio": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/radio/-/radio-3.7.0.tgz", - "integrity": "sha512-AikFzw+aJ1gL6Ysnfb4wXDgsnPp0KB9jbMrqENW6KKZxQ5+au2Xzj28mnKDfAjBXlxQlTAhBo5SnI0WnjTmKWA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/radio": "^3.9.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/radio": "^3.10.0", - "@react-types/radio": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/radio/-/radio-3.7.4.tgz", + "integrity": "sha512-FmWcJlOeo5KsbWYpnEtoB9oC+haUeowfRda8dq0kBptR5WlagWD4Arez55/hjXCHLqQZ4r6vY6rYgMya2xiddQ==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/radio": "^3.10.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/radio": "^3.10.2", + "@react-types/radio": "^3.7.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10532,19 +9511,19 @@ } }, "node_modules/@react-spectrum/searchfield": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/searchfield/-/searchfield-3.8.0.tgz", - "integrity": "sha512-WVI/5ONt1hSm+D/A7J3ICpVOue6J2FBBWKU9zVSK7cwcklWgUGyGkZLD8luVQtcpI5bDLb2tHixs7a1OXPC8Uw==", - "dependencies": { - "@react-aria/searchfield": "^3.6.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/textfield": "^3.11.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/searchfield": "^3.5.0", - "@react-types/searchfield": "^3.5.2", - "@react-types/textfield": "^3.9.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/searchfield/-/searchfield-3.8.4.tgz", + "integrity": "sha512-O8pM9dGlRZoFhNtZLVFpIOHM2+sy5/t23Lv0z0jXvVYmzHOaib8wPPJELnPRsDUIylqpnVxfiYSz051Gx5Zq8g==", + "dependencies": { + "@react-aria/searchfield": "^3.7.3", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/textfield": "^3.11.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/searchfield": "^3.5.1", + "@react-types/searchfield": "^3.5.3", + "@react-types/textfield": "^3.9.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10553,20 +9532,20 @@ } }, "node_modules/@react-spectrum/slider": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/slider/-/slider-3.6.4.tgz", - "integrity": "sha512-ckKlRJhDKUIsZepnCzRcCe20Q4MaoC8dLEFNz/f6CItfZNoE8sH5OsHuDFOEbhNOgNyGjj9Dv99iKPAkRrDWkg==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/slider": "^3.7.3", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/slider": "^3.4.5", - "@react-types/shared": "^3.22.0", - "@react-types/slider": "^3.7.0", + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/@react-spectrum/slider/-/slider-3.6.7.tgz", + "integrity": "sha512-mhTG+sGZwQfNW9z+uzvmTQzzV2Qzcack3qYSw8HXEfd4BOjkgwTinS9aN8MLv147TF5RMvI0y3dmNirAoDi+yQ==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/slider": "^3.7.6", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/slider": "^3.5.2", + "@react-types/shared": "^3.22.1", + "@react-types/slider": "^3.7.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10575,14 +9554,14 @@ } }, "node_modules/@react-spectrum/statuslight": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/statuslight/-/statuslight-3.5.8.tgz", - "integrity": "sha512-q0q/JzEmucU83fCGokIQZ09/TsFWKuv+eHm2FKRZNeLcTS1oGNZGsty7iFa7To+b4F3lA7HxEQ936EOjQuDOwQ==", - "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", - "@react-types/statuslight": "^3.3.6", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/statuslight/-/statuslight-3.5.11.tgz", + "integrity": "sha512-zbIrI8rPLmMu3Jnl2fpA/kb0V3azdRBsv1KfhGNQkHM17Gy6ufrzzzh6cmnvQh8FREllMcIjC4eaBkYHFArtyg==", + "dependencies": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", + "@react-types/statuslight": "^3.3.7", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10591,17 +9570,17 @@ } }, "node_modules/@react-spectrum/switch": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/switch/-/switch-3.5.0.tgz", - "integrity": "sha512-a9SbC3seaU/Ai840q1PZEZraB3EJosDqww0zKU80pDtTqtP4b3KWwvHrVRWOQ2PeJm1bm/aPkuyMa7cM12m2tQ==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/switch": "^3.5.7", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/toggle": "^3.7.0", - "@react-types/shared": "^3.22.0", - "@react-types/switch": "^3.5.0", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/switch/-/switch-3.5.3.tgz", + "integrity": "sha512-NJMk/b/Lrmgl0RB9QPF0wSuD5CgTPODaLuZD1uxXAcESKFVdN58eW8CU99e+ZC0tHgFofroTpEF073Yiz2LnkQ==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/switch": "^3.6.2", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/toggle": "^3.7.2", + "@react-types/shared": "^3.22.1", + "@react-types/switch": "^3.5.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10610,33 +9589,33 @@ } }, "node_modules/@react-spectrum/table": { - "version": "3.12.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/table/-/table-3.12.4.tgz", - "integrity": "sha512-29dWRfs0rZv4PXByyRZPdgPVQiyjZAm4hFhvqmZnpeKQx3+Y63MrO0xdDYIIbopmANhKT/JPO3jIG4gWMvd72A==", - "dependencies": { - "@react-aria/button": "^3.9.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/table": "^3.13.2", - "@react-aria/utils": "^3.22.0", - "@react-aria/virtualizer": "^3.9.7", - "@react-aria/visually-hidden": "^3.8.7", - "@react-spectrum/checkbox": "^3.9.0", - "@react-spectrum/dnd": "^3.3.5", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/menu": "^3.16.0", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/tooltip": "^3.6.2", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/flags": "^3.0.0", - "@react-stately/layout": "^3.13.4", - "@react-stately/table": "^3.11.3", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", - "@react-types/table": "^3.9.1", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.12.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/table/-/table-3.12.8.tgz", + "integrity": "sha512-4JyDlvKljhvqqUHYk6X5JjmxXy03IZergKTu//MbELW4v9bwiwf94Ap8zTcUZPh/pcw7IQhpUDLPAi6RFBAUpA==", + "dependencies": { + "@react-aria/button": "^3.9.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/table": "^3.13.5", + "@react-aria/utils": "^3.23.2", + "@react-aria/virtualizer": "^3.9.10", + "@react-aria/visually-hidden": "^3.8.10", + "@react-spectrum/checkbox": "^3.9.4", + "@react-spectrum/dnd": "^3.3.8", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/menu": "^3.18.1", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/tooltip": "^3.6.5", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/flags": "^3.0.1", + "@react-stately/layout": "^3.13.7", + "@react-stately/table": "^3.11.6", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", + "@react-types/table": "^3.9.3", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10646,24 +9625,24 @@ } }, "node_modules/@react-spectrum/tabs": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/tabs/-/tabs-3.8.4.tgz", - "integrity": "sha512-wDMHf8Xa3lCh7vkkpwT3G8Vd6ooo5VSHlMv1NUQsFjlymbZQ88aBkZfJVBxag7fWoO/Yo2IGf5Tb2Gpj1hW99Q==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/tabs": "^3.8.2", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/picker": "^3.13.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/list": "^3.10.1", - "@react-stately/tabs": "^3.6.2", - "@react-types/select": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@react-types/tabs": "^3.3.4", + "version": "3.8.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/tabs/-/tabs-3.8.8.tgz", + "integrity": "sha512-oBXKLD7cyCLQV3SUXIjEn9ttdyoGwpiTUfM3DNY3ki097pRdoBgMxPk1Sp7jKQs6tRUg4osK53iOG4LvEs6eTg==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/tabs": "^3.8.5", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/picker": "^3.14.3", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/list": "^3.10.3", + "@react-stately/tabs": "^3.6.4", + "@react-types/select": "^3.9.2", + "@react-types/shared": "^3.22.1", + "@react-types/tabs": "^3.3.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10673,24 +9652,24 @@ } }, "node_modules/@react-spectrum/tag": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/tag/-/tag-3.2.0.tgz", - "integrity": "sha512-BrYpyaoJkaHL/74DzaCJjMzn544TvJbf9uJaZ3TUwt8MQ4rAOdHKn5fI3jiX665WWJPhsI6Dfns/gN/4HlqfJA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/selection": "^3.17.2", - "@react-aria/tag": "^3.3.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/list": "^3.10.1", - "@react-types/shared": "^3.22.0", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/tag/-/tag-3.2.4.tgz", + "integrity": "sha512-d6cqX+n10pokLsBGEC/ksLLHM3vBoR7zc0AAlBAUrBN6VMBWUQRyazDHeXPLLZs/S4+ICL80UXRf8NwWfA7Efg==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/selection": "^3.17.5", + "@react-aria/tag": "^3.3.3", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/list": "^3.10.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10700,14 +9679,14 @@ } }, "node_modules/@react-spectrum/text": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/text/-/text-3.5.0.tgz", - "integrity": "sha512-gZ2sqrfz/T8kYhS/TUXoR6ZhC9apU1i+K+8W9LV7LXAraZYQiDTiglTqnxER+qtW/+Xon1ZDoL2TICt63wHFFA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/text/-/text-3.5.3.tgz", + "integrity": "sha512-28WiSnIPm8WC4JOsHPLudCGjPc3tk7zKm3L+8xqzr374j1+HdMGivrhVOf1t4jbUMcT5dOxR7huuDe7E97qe5A==", "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", - "@react-types/text": "^3.3.6", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", + "@react-types/text": "^3.3.7", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10716,21 +9695,21 @@ } }, "node_modules/@react-spectrum/textfield": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/textfield/-/textfield-3.11.0.tgz", - "integrity": "sha512-bAG4hwFUJGWiViaOBXDWvYxsMvzs8+rCfdiLil7b5CPgbZCpvsHVMSt8dOQW18MqrJNGv2Zm8gZYjvFSnfklAA==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/textfield": "^3.13.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@react-types/textfield": "^3.9.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/textfield/-/textfield-3.11.4.tgz", + "integrity": "sha512-J70Q1ddpX0v+R7x8w5DaJLixnp5mBWm39lUnekiahEUuA420U1eZCW80GiHXFS/GO6wpwjIZpWHcpBQuF/EDCQ==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/textfield": "^3.14.3", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", + "@react-types/textfield": "^3.9.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10739,11 +9718,11 @@ } }, "node_modules/@react-spectrum/theme-dark": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-dark/-/theme-dark-3.5.7.tgz", - "integrity": "sha512-WaBVkhJKsZNcsHCcm6HQOSV934KLxZK6cbTt/FjUZtNTHcQTb5s2xf2jPeMwcRbRJfzagfTuTr5BkM38B9Zi1Q==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/theme-dark/-/theme-dark-3.5.8.tgz", + "integrity": "sha512-ep78rIrgrXu5MHe6LQAiK8+Us/4PoeHcixm+xFJk8I7AP+6wrh+9+QSWdIi3/NJY9fIjXsMm+VyehFVtEq8PAg==", "dependencies": { - "@react-types/provider": "^3.7.1", + "@react-types/provider": "^3.7.2", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10751,11 +9730,11 @@ } }, "node_modules/@react-spectrum/theme-default": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-default/-/theme-default-3.5.7.tgz", - "integrity": "sha512-5GgCKfzA1be3pE5XtQ+5hk39I4BhU1qY+fHCDxvE/tndm2I7pCk26d6ifxA0H2RVKH8V3eiH0WG1TNXHcHIO1g==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/theme-default/-/theme-default-3.5.8.tgz", + "integrity": "sha512-vZ9GH4l6H2Ks/PD15k2mx6XgA1EYKxQbB+ai9UZ3ALXf0KYlVIFSoHk4Vp3hP16D12KsuB7V0Gk8SvHlsRNo+Q==", "dependencies": { - "@react-types/provider": "^3.7.1", + "@react-types/provider": "^3.7.2", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10763,11 +9742,11 @@ } }, "node_modules/@react-spectrum/theme-light": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-light/-/theme-light-3.4.7.tgz", - "integrity": "sha512-3NeIDN9QU8c40rqRSzurTdJRTZ5Uag4c2fLlF9Bve/yF7N6KlzK29H3EWNLBizAfozhPe5/HDEYqdArz7bxhlQ==", + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/theme-light/-/theme-light-3.4.8.tgz", + "integrity": "sha512-6kjtQ6IGrh2E0WJKQ9eAR5yhcWFI2mNvd+wi8Uy3rtRdBB1L3iSfr2RmgxgcTCl50DnKqmcFsHbHaKMMKqhkaQ==", "dependencies": { - "@react-types/provider": "^3.7.1", + "@react-types/provider": "^3.7.2", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10775,21 +9754,21 @@ } }, "node_modules/@react-spectrum/tooltip": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/tooltip/-/tooltip-3.6.2.tgz", - "integrity": "sha512-aZ0CSlWOGgRQe/u41PgCgiXdO7+GowGE8CA46BCA8DEoqrw3JjSOX2JYClrPUra1VxHXId8AeQGU5bRw3abb2g==", - "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/tooltip": "^3.6.5", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/tooltip": "^3.4.6", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0", - "@react-types/tooltip": "^3.4.6", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/tooltip/-/tooltip-3.6.5.tgz", + "integrity": "sha512-TnVUX8gNx65wOfHE5UIzuzpC4kUd6RuFeDykcu+3OM+fsK6qvDYg2MQq/3UiZHFI0ZHhX89yPf4uLaP0hcT8sg==", + "dependencies": { + "@react-aria/focus": "^3.16.2", + "@react-aria/overlays": "^3.21.1", + "@react-aria/tooltip": "^3.7.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/tooltip": "^3.4.7", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1", + "@react-types/tooltip": "^3.4.7", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10799,30 +9778,30 @@ } }, "node_modules/@react-spectrum/utils": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/utils/-/utils-3.11.2.tgz", - "integrity": "sha512-JLv0ntBrrIvloUgqVhAZvTTiBqZ/pHtAWOuIgrii3PFUsds4OVX+YebB88rj639Zi/tFrSdfrlZJNER1ZOq9jw==", - "dependencies": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/utils/-/utils-3.11.5.tgz", + "integrity": "sha512-V4heIuCBXhYOP3om5B0KNs2+RK6RKwAhHVjjJZ3RBeNqsF9UDxv+D/+dk3sAM2dsM1F8l38BNXQMMWXWW/BZYA==", + "dependencies": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0", - "clsx": "^1.1.1" + "clsx": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-spectrum/view": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/view/-/view-3.6.5.tgz", - "integrity": "sha512-y135Ownoi6Hw466k4hWcYBJmqjTQlKVgXtCT5aKpKm8l9RlpvPvtoUe5OBUxKkHHgB1TCIOpy76hLi9SQc0Omw==", + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/view/-/view-3.6.8.tgz", + "integrity": "sha512-jAKh22xUjFY5sxPTtLc53fw3C+dki+DEDxArFK06/tF+ntV6lDat91j+YedcOtDT2p7C2PSfaToX5moyEAQ+NA==", "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", - "@react-types/view": "^3.4.6", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", + "@react-types/view": "^3.4.7", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10831,14 +9810,14 @@ } }, "node_modules/@react-spectrum/well": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/well/-/well-3.4.8.tgz", - "integrity": "sha512-A2fJxlT/eAKyPTbCOmoUNB+BjDP8RnViZ7X6/gcxjEAtn5KVnJ6DmZTG8Kw+yPnuLxK+5Lui/dfGI9g19GWohw==", - "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", - "@react-types/well": "^3.3.6", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/well/-/well-3.4.11.tgz", + "integrity": "sha512-oCQqKKcKXNoF18dNz5GHBdSXrNPsVH5jsH17suqQevzDQkMN2X02Ov0oyOYMAUQM0xSE3ensLdjvLzUL0yl36g==", + "dependencies": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", + "@react-types/well": "^3.3.7", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10846,14 +9825,14 @@ } }, "node_modules/@react-stately/calendar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.4.2.tgz", - "integrity": "sha512-RfH40rVa2EhUnQgqH3HTZL+YhL+6tZ8T9GbN1K3AbIM5BBEtkb3P8qGhcaI7WpwNy1rlRFFFXGcqFAMUncDg2Q==", - "dependencies": { - "@internationalized/date": "^3.5.0", - "@react-stately/utils": "^3.9.0", - "@react-types/calendar": "^3.4.2", - "@react-types/shared": "^3.22.0", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.4.4.tgz", + "integrity": "sha512-f9ZOd096gGGD+3LmU1gkmfqytGyQtrgi+Qjn+70GbM2Jy65pwOR4I9YrobbmeAFov5Tff13mQEa0yqWvbcDLZQ==", + "dependencies": { + "@internationalized/date": "^3.5.2", + "@react-stately/utils": "^3.9.1", + "@react-types/calendar": "^3.4.4", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10861,14 +9840,14 @@ } }, "node_modules/@react-stately/checkbox": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.0.tgz", - "integrity": "sha512-e1ChMwGovcOEDcdizqXDT6eDZixIMiPQOzNV5wPQ91SlGaIry9b0lQnK18tHg3yv2iiS6Ipj96cGBUKLJqQ+cQ==", - "dependencies": { - "@react-stately/form": "^3.0.0", - "@react-stately/utils": "^3.9.0", - "@react-types/checkbox": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.3.tgz", + "integrity": "sha512-hWp0GXVbMI4sS2NbBjWgOnHNrRqSV4jeftP8zc5JsIYRmrWBUZitxluB34QuVPzrBO29bGsF0GTArSiQZt6BWw==", + "dependencies": { + "@react-stately/form": "^3.0.1", + "@react-stately/utils": "^3.9.1", + "@react-types/checkbox": "^3.7.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10876,11 +9855,11 @@ } }, "node_modules/@react-stately/collections": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.3.tgz", - "integrity": "sha512-fA28HIApAIz9sNGeOVXZJPgV5Kig6M72KI1t9sUbnRUr9Xq9OMJTR6ElDMXNe0iTeZffRFDOPYyqnX9zkxof6Q==", + "version": "3.10.5", + "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.5.tgz", + "integrity": "sha512-k8Q29Nnvb7iAia1QvTanZsrWP2aqVNBy/1SlE6kLL6vDqtKZC+Esd1SDLHRmIcYIp5aTdfwIGd0NuiRQA7a81Q==", "dependencies": { - "@react-types/shared": "^3.22.0", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10888,18 +9867,18 @@ } }, "node_modules/@react-stately/combobox": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.0.tgz", - "integrity": "sha512-F74Avf7+8ruRqEB+3Lh6/C5jXc3ESJbRf9ovUxhmNAzBGeFKesPn5HpEpo87C+3OukGb+/Buvi3Rhib9+HVBKA==", - "dependencies": { - "@react-stately/collections": "^3.10.3", - "@react-stately/form": "^3.0.0", - "@react-stately/list": "^3.10.1", - "@react-stately/menu": "^3.5.7", - "@react-stately/select": "^3.6.0", - "@react-stately/utils": "^3.9.0", - "@react-types/combobox": "^3.9.0", - "@react-types/shared": "^3.22.0", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.2.tgz", + "integrity": "sha512-f+IHuFW848VoMbvTfSakn2WIh2urDxO355LrKxnisXPCkpQHpq3lvT2mJtKJwkPxjAy7xPjpV8ejgga2R6p53Q==", + "dependencies": { + "@react-stately/collections": "^3.10.5", + "@react-stately/form": "^3.0.1", + "@react-stately/list": "^3.10.3", + "@react-stately/overlays": "^3.6.5", + "@react-stately/select": "^3.6.2", + "@react-stately/utils": "^3.9.1", + "@react-types/combobox": "^3.10.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10907,11 +9886,11 @@ } }, "node_modules/@react-stately/data": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.11.0.tgz", - "integrity": "sha512-0BlPT58WrAtUvpiEfUuyvIsGFTzp/9vA5y+pk53kGJhOdc5tqBGHi9cg40pYE/i1vdHJGMpyHGRD9nkQb8wN3Q==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.11.2.tgz", + "integrity": "sha512-yhK2upk2WbJeiLBRWHrh/4G2CvmmozCzoivLaRAPYu53m1J3MyzVGCLJgnZMbMZvAbNcYWZK6IzO6VqZ2y1fOw==", "dependencies": { - "@react-types/shared": "^3.22.0", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10919,17 +9898,17 @@ } }, "node_modules/@react-stately/datepicker": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.0.tgz", - "integrity": "sha512-p6BuxPbDxjIgBZmskdv2dR6XIdPEftCjS7kYe/+iLZxfz1vYiDqpJVb3ascLyBjl84bDDyr4z2vWcKhdDwyhEA==", - "dependencies": { - "@internationalized/date": "^3.5.0", - "@internationalized/string": "^3.1.1", - "@react-stately/form": "^3.0.0", - "@react-stately/overlays": "^3.6.4", - "@react-stately/utils": "^3.9.0", - "@react-types/datepicker": "^3.7.0", - "@react-types/shared": "^3.22.0", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.2.tgz", + "integrity": "sha512-Z6FrK6Af7R5BizqHhJFCj3Hn32mg5iLSDdEgFQAuO043guOXUKFUAnbxfbQUjL6PGE6QwWMfQD7PPGebHn9Ifw==", + "dependencies": { + "@internationalized/date": "^3.5.2", + "@internationalized/string": "^3.2.1", + "@react-stately/form": "^3.0.1", + "@react-stately/overlays": "^3.6.5", + "@react-stately/utils": "^3.9.1", + "@react-types/datepicker": "^3.7.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10937,12 +9916,12 @@ } }, "node_modules/@react-stately/dnd": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.2.6.tgz", - "integrity": "sha512-ex3Pjn+9uIoqsBb9F4ZFJb3fB0YadN8uYBOEiBb9N4UXWyANibGUYJ2FvIbvq1nFDU7On7MW1J9e3vkGglX4FQ==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.2.8.tgz", + "integrity": "sha512-oSo+2Bzum3Q1/d+3FuaDmpVHqqBB004tycuQDDFtad3N1BKm+fNfmslRK1ioLkPLK4sm1130V+BZBY3JXLe80A==", "dependencies": { - "@react-stately/selection": "^3.14.1", - "@react-types/shared": "^3.22.0", + "@react-stately/selection": "^3.14.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10950,9 +9929,9 @@ } }, "node_modules/@react-stately/flags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.0.tgz", - "integrity": "sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.1.tgz", + "integrity": "sha512-h5PcDMj54aipQNO18ig/IMI1kzPwcvSwVq5M6Ib6XE1WIkOH0dIuW2eADdAOhcGi3KXJtXVdD29zh0Eox1TKgQ==", "dependencies": { "@swc/helpers": "^0.4.14" } @@ -10967,11 +9946,11 @@ } }, "node_modules/@react-stately/form": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.0.0.tgz", - "integrity": "sha512-C8wkfFmtx1escizibhdka5JvTy9/Vp173CS9cakjvWTmnjYYC1nOlzwp7BsYWTgerCFbRY/BU/Cf/bJDxPiUKQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.0.1.tgz", + "integrity": "sha512-T1Ul2Ou0uE/S4ECLcGKa0OfXjffdjEHfUFZAk7OZl0Mqq/F7dl5WpoLWJ4d4IyvZzGO6anFNenP+vODWbrF3NA==", "dependencies": { - "@react-types/shared": "^3.22.0", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10979,14 +9958,14 @@ } }, "node_modules/@react-stately/grid": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.8.3.tgz", - "integrity": "sha512-JceGSJcuO6Zv+Aq5s2NZvmbMjdPjTtGNQR9kTgXKC/pOfM6FJ58bJiOmEllyN6oawqh4Ey8Xdqk9NuW4l2ctuw==", + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.8.5.tgz", + "integrity": "sha512-KCzi0x0p1ZKK+OptonvJqMbn6Vlgo6GfOIlgcDd0dNYDP8TJ+3QFJAFre5mCr7Fubx7LcAOio4Rij0l/R8fkXQ==", "dependencies": { - "@react-stately/collections": "^3.10.3", - "@react-stately/selection": "^3.14.1", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", + "@react-stately/collections": "^3.10.5", + "@react-stately/selection": "^3.14.3", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -10994,16 +9973,16 @@ } }, "node_modules/@react-stately/layout": { - "version": "3.13.4", - "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-3.13.4.tgz", - "integrity": "sha512-gmtkB+EISfB1Ne/56cd4djJXUwCtcrjzA7BHzBBXcjJNmTc/NQh5+qh66JHkXTKF3PT5FdVtmO2MODqGaWkUeg==", - "dependencies": { - "@react-stately/collections": "^3.10.3", - "@react-stately/table": "^3.11.3", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", - "@react-types/table": "^3.9.1", + "version": "3.13.7", + "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-3.13.7.tgz", + "integrity": "sha512-9HH/aSxpEHwUW1T1vGN3+iznkAXQUzoMrsoEepNzesOsUGSm/MFZmEk4+9cdPA7y3ou2eHpGNUB1YIDDVptElg==", + "dependencies": { + "@react-stately/collections": "^3.10.5", + "@react-stately/table": "^3.11.6", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", + "@react-types/table": "^3.9.3", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11011,14 +9990,14 @@ } }, "node_modules/@react-stately/list": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.10.1.tgz", - "integrity": "sha512-iVarLMd7FmMT0H20dRWsFOHHX5+c4gK51AXP2BSr1VtDSfbL4dgaGgu7IaAMVc/rO0au1e1tPM2hutiIFvPcnA==", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.10.3.tgz", + "integrity": "sha512-Ul8el0tQy2Ucl3qMQ0fiqdJ874W1ZNjURVSgSxN+pGwVLNBVRjd6Fl7YwZFCXER2YOlzkwg+Zqozf/ZlS0EdXA==", "dependencies": { - "@react-stately/collections": "^3.10.3", - "@react-stately/selection": "^3.14.1", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", + "@react-stately/collections": "^3.10.5", + "@react-stately/selection": "^3.14.3", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11026,13 +10005,13 @@ } }, "node_modules/@react-stately/menu": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.5.7.tgz", - "integrity": "sha512-bzTmAqzcMNatvyruWlvOdZSmMhz3+mkdxtqaZzYHq+DpR6ka57lIRj8dBnZWQGwV3RypMZfz+X6aIX4kruGVbw==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.6.1.tgz", + "integrity": "sha512-3v0vkTm/kInuuG8jG7jbxXDBnMQcoDZKWvYsBQq7+POt0LmijbLdbdZPBoz9TkZ3eo/OoP194LLHOaFTQyHhlw==", "dependencies": { - "@react-stately/overlays": "^3.6.4", - "@react-types/menu": "^3.9.6", - "@react-types/shared": "^3.22.0", + "@react-stately/overlays": "^3.6.5", + "@react-types/menu": "^3.9.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11040,14 +10019,14 @@ } }, "node_modules/@react-stately/numberfield": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.7.0.tgz", - "integrity": "sha512-DOz4jL7T30KGUXpGh/z80aHf+DEOQfvCHVDfll+IU7p3sd+bbM5uj7JdwXpZgIYUK8KTf2N49sL6lq5uCoxh8w==", - "dependencies": { - "@internationalized/number": "^3.4.0", - "@react-stately/form": "^3.0.0", - "@react-stately/utils": "^3.9.0", - "@react-types/numberfield": "^3.7.0", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.9.1.tgz", + "integrity": "sha512-btBIcBEfSVCUm6NwJrMrMygoIu/fQGazzD0RhF7PNsfvkFiWn+TSOyQqSXcsUJVOnBfoS/dVWj6r57KA7zl3FA==", + "dependencies": { + "@internationalized/number": "^3.5.1", + "@react-stately/form": "^3.0.1", + "@react-stately/utils": "^3.9.1", + "@react-types/numberfield": "^3.8.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11055,12 +10034,12 @@ } }, "node_modules/@react-stately/overlays": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.4.tgz", - "integrity": "sha512-tHEaoAGpE9dSnsskqLPVKum59yGteoSqsniTopodM+miQozbpPlSjdiQnzGLroy5Afx5OZYClE616muNHUILXA==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.5.tgz", + "integrity": "sha512-U4rCFj6TPJPXLUvYXAcvh+yP/CO2W+7f0IuqP7ZZGE+Osk9qFkT+zRK5/6ayhBDFpmueNfjIEAzT9gYPQwNHFw==", "dependencies": { - "@react-stately/utils": "^3.9.0", - "@react-types/overlays": "^3.8.4", + "@react-stately/utils": "^3.9.1", + "@react-types/overlays": "^3.8.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11068,14 +10047,14 @@ } }, "node_modules/@react-stately/radio": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.0.tgz", - "integrity": "sha512-d8IgZtUq/4vhE7YhyBVg1QdVoFS0caIcvPumXqtp/5vlDgpUsVy9jSeWtbk0H4FyUcmJlQhRcTylKB9THXY1YQ==", - "dependencies": { - "@react-stately/form": "^3.0.0", - "@react-stately/utils": "^3.9.0", - "@react-types/radio": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.2.tgz", + "integrity": "sha512-JW5ZWiNMKcZvMTsuPeWJQLHXD5rlqy7Qk6fwUx/ZgeibvMBW/NnW19mm2+IMinzmbtERXvR6nsiA837qI+4dew==", + "dependencies": { + "@react-stately/form": "^3.0.1", + "@react-stately/utils": "^3.9.1", + "@react-types/radio": "^3.7.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11083,12 +10062,12 @@ } }, "node_modules/@react-stately/searchfield": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.0.tgz", - "integrity": "sha512-SStjChkn/33pEn40slKQPnBnmQYyxVazVwPjiBkdeVejC42lUVairUTrGJgF0PNoZTbxn0so2/XzjqTC9T8iCw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.1.tgz", + "integrity": "sha512-9A8Wghx1avRHhMpNH1Nj+jFfiF1bhsff2GEC5PZgWYzhCykw3G5bywn3JAuUS4kh7Vpqhbu4KpHAhmWPSv4B/Q==", "dependencies": { - "@react-stately/utils": "^3.9.0", - "@react-types/searchfield": "^3.5.2", + "@react-stately/utils": "^3.9.1", + "@react-types/searchfield": "^3.5.3", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11096,15 +10075,15 @@ } }, "node_modules/@react-stately/select": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.0.tgz", - "integrity": "sha512-GvSE4DXmcvdRNUc+ciPU7gedt7LfRO8FFFIzhB/bCQhUlK6/xihUPrGXayzqxLeTQKttMH323LuYFKfwpJRhsA==", - "dependencies": { - "@react-stately/form": "^3.0.0", - "@react-stately/list": "^3.10.1", - "@react-stately/menu": "^3.5.7", - "@react-types/select": "^3.9.0", - "@react-types/shared": "^3.22.0", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.2.tgz", + "integrity": "sha512-duOxdHKol93h6Ew6fap6Amz+zngoERKZLSKVm/8I8uaBgkoBhEeTFv7mlpHTgINxymMw3mMrvy6GL/gfKFwkqg==", + "dependencies": { + "@react-stately/form": "^3.0.1", + "@react-stately/list": "^3.10.3", + "@react-stately/overlays": "^3.6.5", + "@react-types/select": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11112,13 +10091,13 @@ } }, "node_modules/@react-stately/selection": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.14.1.tgz", - "integrity": "sha512-96/CerrB6yH4Ad9FkzBzyVerSPjcIj1NBTWTFHo1N+oHECvyGsDxZl7Y4LQR++teFK66FhX5KjCJQGae4IZd6A==", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.14.3.tgz", + "integrity": "sha512-d/t0rIWieqQ7wjLoMoWnuHEUSMoVXxkPBFuSlJF3F16289FiQ+b8aeKFDzFTYN7fFD8rkZTnpuE4Tcxg3TmA+w==", "dependencies": { - "@react-stately/collections": "^3.10.3", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", + "@react-stately/collections": "^3.10.5", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11126,13 +10105,13 @@ } }, "node_modules/@react-stately/slider": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.4.5.tgz", - "integrity": "sha512-lJPZC8seYbnZDqAlZm3/QC95I5iluG8ouwkPMmvtWCz1baayV/jJtfxA/74zR7Vcob9Fe7O57g8Edhz/hv9xOQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.5.2.tgz", + "integrity": "sha512-ntH3NLRG+AwVC7q4Dx9DcmMkMh9vmHjHNXAgaoqNjhvwfSIae7sQ69CkVe6XeJjIBy6LlH81Kgapz+ABe5a1ZA==", "dependencies": { - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@react-types/slider": "^3.7.0", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", + "@react-types/slider": "^3.7.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11140,18 +10119,18 @@ } }, "node_modules/@react-stately/table": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.11.3.tgz", - "integrity": "sha512-r0rzSKbtMG4tjFpCGtXb8p6hOuek03c6rheJE88z4I/ujZ5EmEO6Ps8q0JMNEDCY2qigvKM+ODisMBeZCEkIJg==", - "dependencies": { - "@react-stately/collections": "^3.10.3", - "@react-stately/flags": "^3.0.0", - "@react-stately/grid": "^3.8.3", - "@react-stately/selection": "^3.14.1", - "@react-stately/utils": "^3.9.0", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", - "@react-types/table": "^3.9.1", + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.11.6.tgz", + "integrity": "sha512-34YsfOILXusj3p6QNcKEaDWVORhM6WEhwPSLCZlkwAJvkxuRQFdih5rQKoIDc0uV5aZsB6bYBqiFhnjY0VERhw==", + "dependencies": { + "@react-stately/collections": "^3.10.5", + "@react-stately/flags": "^3.0.1", + "@react-stately/grid": "^3.8.5", + "@react-stately/selection": "^3.14.3", + "@react-stately/utils": "^3.9.1", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", + "@react-types/table": "^3.9.3", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11159,13 +10138,13 @@ } }, "node_modules/@react-stately/tabs": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.2.tgz", - "integrity": "sha512-f+U4D1FAVfVVcNRbtKIv4GrO37CLFClYQlXx9zIuSXjHsviapVD2IQSyAmpKo/CbgXhYRMdGwENZdOsmF/Ns7g==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.4.tgz", + "integrity": "sha512-WZJgMBqzLgN88RN8AxhY4aH1+I+4w1qQA0Lh3LRSDegaytd+NHixCWaP3IPjePgCB5N1UsPe96Xglw75zjHmDg==", "dependencies": { - "@react-stately/list": "^3.10.1", - "@react-types/shared": "^3.22.0", - "@react-types/tabs": "^3.3.4", + "@react-stately/list": "^3.10.3", + "@react-types/shared": "^3.22.1", + "@react-types/tabs": "^3.3.5", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11173,12 +10152,12 @@ } }, "node_modules/@react-stately/toggle": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.0.tgz", - "integrity": "sha512-TRksHkCJk/Xogq4181g3CYgJf+EfsJCqX5UZDSw1Z1Kgpvonjmdf6FAfQfCh9QR2OuXUL6hOLUDVLte5OPI+5g==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.2.tgz", + "integrity": "sha512-SHCF2btcoK57c4lyhucRbyPBAFpp0Pdp0vcPdn3hUgqbu6e5gE0CwG/mgFmZRAQoc7PRc7XifL0uNw8diJJI0Q==", "dependencies": { - "@react-stately/utils": "^3.9.0", - "@react-types/checkbox": "^3.6.0", + "@react-stately/utils": "^3.9.1", + "@react-types/checkbox": "^3.7.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11186,12 +10165,12 @@ } }, "node_modules/@react-stately/tooltip": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.6.tgz", - "integrity": "sha512-uL93bmsXf+OOgpKLPEKfpDH4z+MK2CuqlqVxx7rshN0vjWOSoezE5nzwgee90+RpDrLNNNWTNa7n+NkDRpI1jA==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.7.tgz", + "integrity": "sha512-ACtRgBQ8rphBtsUaaxvEAM0HHN9PvMuyvL0vUHd7jvBDCVZJ6it1BKu9SBKjekBkoBOw9nemtkplh9R2CA6V8Q==", "dependencies": { - "@react-stately/overlays": "^3.6.4", - "@react-types/tooltip": "^3.4.6", + "@react-stately/overlays": "^3.6.5", + "@react-types/tooltip": "^3.4.7", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11199,14 +10178,14 @@ } }, "node_modules/@react-stately/tree": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.7.4.tgz", - "integrity": "sha512-0yvVODBS8WnSivLFX5ccEjCl2NA/8lbEt1E48wVcY1xcXgISNpw5MSGK5jC6YrtJPIqVolQIkNSbMreXGBktIg==", - "dependencies": { - "@react-stately/collections": "^3.10.3", - "@react-stately/selection": "^3.14.1", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.7.6.tgz", + "integrity": "sha512-y8KvEoZX6+YvqjNCVGS3zA/BKw4D3XrUtUKIDme3gu5Mn6z97u+hUXKdXVCniZR7yvV3fHAIXwE5V2K8Oit4aw==", + "dependencies": { + "@react-stately/collections": "^3.10.5", + "@react-stately/selection": "^3.14.3", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11214,9 +10193,9 @@ } }, "node_modules/@react-stately/utils": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.0.tgz", - "integrity": "sha512-yPKFY1F88HxuZ15BG2qwAYxtpE4HnIU0Ofi4CuBE0xC6I8mwo4OQjDzi+DZjxQngM9D6AeTTD6F1V8gkozA0Gw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.1.tgz", + "integrity": "sha512-yzw75GE0iUWiyps02BOAPTrybcsMIxEJlzXqtvllAb01O9uX5n0i3X+u2eCpj2UoDF4zS08Ps0jPgWxg8xEYtA==", "dependencies": { "@swc/helpers": "^0.5.0" }, @@ -11225,12 +10204,12 @@ } }, "node_modules/@react-stately/virtualizer": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.6.5.tgz", - "integrity": "sha512-v0cZeNCGPMeo3LP4UrGuDo3Xpq7ufNaZyGObgSvdrIW49qK5F02kczcKy6NKg+QfOgC/+Nc9Tof/2S8dcxDrCA==", + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.6.8.tgz", + "integrity": "sha512-Pf06ihTwExRJltGhi72tmLIo0pcjkL55nu7ifMafAAdxZK4ONxRLSuUjjpvYf/0Rs92xRZy2t/XmHREnfirdkQ==", "dependencies": { - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -11238,470 +10217,470 @@ } }, "node_modules/@react-types/actionbar": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@react-types/actionbar/-/actionbar-3.1.4.tgz", - "integrity": "sha512-/z9N7ztd/MOdEDQNHTCNviYe0+rqy1s19Xg3tv/PV1oUCOsjrnja85VVxoa+AWR8IbwgDNIfpXg2Wa66b1FDbw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@react-types/actionbar/-/actionbar-3.1.5.tgz", + "integrity": "sha512-Z3hfIoaOaW8wJxQm1NyWVvSftpNDYv9iWqpEWBEdhxuqsUkOVszZ7KcNaF4qsm4bJIcJWn3FNKhaTKGwISZcdQ==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/actiongroup": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/actiongroup/-/actiongroup-3.4.6.tgz", - "integrity": "sha512-Dho2mEDCU9ZAW+QX2HZkZhyxHK/EGfTvSWdHBFaCYsh4CPI/6PcvtirpSKMrzNNaZ97Exthv3GcLpAnLwM9jZw==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-types/actiongroup/-/actiongroup-3.4.7.tgz", + "integrity": "sha512-VsyHn6mGqEHKEIGFiHTq7rSuzuQjGVZGtnhh/9jQXW6zoSJyoM4fAnHEt+RE92NdiRv5e3+OzzrwG0TZsi87cQ==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/avatar": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@react-types/avatar/-/avatar-3.0.4.tgz", - "integrity": "sha512-fQ+qGce0EqcX0s2glnFjfvxSq42GHaqvl+eL8TnsDz0OIvB8KKzTO/rV/q1CIy/LtMP8fjCb6oqVFQcLfuODfw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@react-types/avatar/-/avatar-3.0.5.tgz", + "integrity": "sha512-/hM/BnRoUhusT16G4hf2hfe4FocxaM5H/a7aetUrmlr9e5ppX3n0VsU0btIwxdh+aJL8u2BBt2scoiJaujQPNg==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/badge": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@react-types/badge/-/badge-3.1.6.tgz", - "integrity": "sha512-6xjgfRnCVSBI6l/RQkI4u3tXiXw1aeFKRqXPcyIyt/kuu7rP0nKeYcM2XYyXXQp7vHfBdOEL2f6LwIHR/lx4uQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@react-types/badge/-/badge-3.1.7.tgz", + "integrity": "sha512-2Q5W9gleI83WpL1i6qPdcPC8l1V7364dpkNLcMi9DFmM2l69+QcPvSWVQMQLevmRo4cnaQ+TYsOgYv8I4rRJCg==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/breadcrumbs": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.2.tgz", - "integrity": "sha512-esl6RucDW2CNMsApJxNYfMtDaUcfLlwKMPH/loYsOBbKxGl2HsgVLMcdpjEkTRs2HCTNCbBXWpeU8AY77t+bsw==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.3.tgz", + "integrity": "sha512-eFto/+6J+JR58vThNcALZRA1OlqlG3GzQ/bq3q8IrrkOZcrfbEJJCWit/+53Ia98siJKuF4OJHnotxIVIz5I3w==", "dependencies": { - "@react-types/link": "^3.5.2", - "@react-types/shared": "^3.22.0" + "@react-types/link": "^3.5.3", + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/button": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.1.tgz", - "integrity": "sha512-bf9iTar3PtqnyV9rA+wyFyrskZKhwmOuOd/ifYIjPs56YNVXWH5Wfqj6Dx3xdFBgtKx8mEVQxVhoX+WkHX+rtw==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.2.tgz", + "integrity": "sha512-EnPTkGHZRtiwAoJy5q9lDjoG30bEzA/qnvKG29VVXKYAGeqY2IlFs1ypmU+z1X/CpJgPcG3I5cakM7yTVm3pSg==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/buttongroup": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/buttongroup/-/buttongroup-3.3.6.tgz", - "integrity": "sha512-aKFDzAWM6bk2+EBDSZe3zq4NMuguXsPyZ9OexN0YLleK4IkRKE2S51PdChY/GAFhfs7VsOKgjHrYWUnrmCCYvw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/buttongroup/-/buttongroup-3.3.7.tgz", + "integrity": "sha512-EZ/1k66GtDtWfE/udNRz2UBbt4YJumeyW1SGcZEO3jketvpms58WapLsMkCezlLz7WYaa5ADV0kU8v88APjI6g==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/calendar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.2.tgz", - "integrity": "sha512-tCZ21un/8OAhpNtmSXDkOVvS5Pzp+y/JwNr6VGFi8HBC5F/c8SzuwV0jKN8ymsZSWbDQ68xXGNWxFaG43Bw8Pg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.4.tgz", + "integrity": "sha512-hV1Thmb/AES5OmfPvvmyjSkmsEULjiDfA7Yyy70L/YKuSNKb7Su+Bf2VnZuDW3ec+GxO4JJNlpJ0AkbphWBvcg==", "dependencies": { - "@internationalized/date": "^3.5.0", - "@react-types/shared": "^3.22.0" + "@internationalized/date": "^3.5.2", + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/checkbox": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.6.0.tgz", - "integrity": "sha512-vgbuJzQpVCNT5AZWV0OozXCnihqrXxoZKfJFIw0xro47pT2sn3t5UC4RA9wfjDGMoK4frw1K/4HQLsQIOsPBkw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.7.1.tgz", + "integrity": "sha512-kuGqjQFex0As/3gfWyk+e9njCcad/ZdnYLLiNvhlk15730xfa0MmnOdpqo9jfuFSXBjOcpxoofvEhvrRMtEdUA==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/combobox": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.9.0.tgz", - "integrity": "sha512-VAQWM2jrIWROgcTKxj4k37WWpK/1zRjj1HfGeuenAQyOQwImqDwCHx5YxQR1GiUEFne4v1yXe2khT0T5Kt2vDg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.10.1.tgz", + "integrity": "sha512-XMno1rgVRNta49vf5nV7VJpVSVAV20tt79t618gG1qRKH5Kt2Cy8lz2fQ5vHG6UTv/6jUOvU8g5Pc93sLaTmoA==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/contextualhelp": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@react-types/contextualhelp/-/contextualhelp-3.2.7.tgz", - "integrity": "sha512-BHwBSBhPekKc/PxDpnkvfcEgpaYLMrV6WYgMfUz2/BMYOjdm+pb1y80vpNkWtrJKytyqp1zeZ+Ca+xzX1HdazA==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@react-types/contextualhelp/-/contextualhelp-3.2.8.tgz", + "integrity": "sha512-Yb0zOqkWfjKCO+gpfVj69CfWPhVq6RTgwLBV47ntIlHitpbh7RDYwDVulPyaVoopPbNSFUoV4YIJZPlOgpbKjg==", "dependencies": { - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/datepicker": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.0.tgz", - "integrity": "sha512-Uh+p6pZpMFc5ZBOns5TXCBbUvJp1KVROLBn2gk5dMEFVq78Qs1VFuAt4lwr9gQBOJrX5I/l65pRTwwWwAKxYtQ==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.2.tgz", + "integrity": "sha512-zThqFAdhQL1dqyVDsDSSTdfCjoD6634eyg/B0ZJfQxcLUR/5pch3v/gxBhbyCVDGMNHRWUWIJvY9DVOepuoSug==", "dependencies": { - "@internationalized/date": "^3.5.0", - "@react-types/calendar": "^3.4.2", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" + "@internationalized/date": "^3.5.2", + "@react-types/calendar": "^3.4.4", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/dialog": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.7.tgz", - "integrity": "sha512-geYoqAyQaTLG43AaXdMUVqZXYgkSifrD9cF7lR2kPAT0uGFv0YREi6ieU+aui8XJ83EW0xcxP+EPWd2YkN4D4w==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.8.tgz", + "integrity": "sha512-RX8JsMvty8ADHRqVEkppoynXLtN4IzUh8d5z88UEBbcvWKlHfd6bOBQjQcBH3AUue5wjfpPIt6brw2VzgBY/3Q==", "dependencies": { - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/divider": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/divider/-/divider-3.3.6.tgz", - "integrity": "sha512-Iwwe349IiCX7ZQK1Oz4AN5kWwiXG0DECSN4qB3h+14n97JKy3chWJC7UA+V6+2p5DbxmLVZm4XxDRgx7y0lVTg==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/divider/-/divider-3.3.7.tgz", + "integrity": "sha512-enAlzHVwzqBPpmE+/VAO5IGVPxPrscHkdbnEkTqW9JQeMUGXd4L0TdHOGd+vtcA+gILJMnhUfT3XE4wQ4HlpVw==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/form": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.6.0.tgz", - "integrity": "sha512-+k6IpjQE+sVi/xoK5lnRGyeISkOQ+CKfuH8IeGcYVHr2voDxSJC5WZsp+L5zeoxuSorKokeEPKGOX2HFj9BG/A==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.7.2.tgz", + "integrity": "sha512-6/isEJY4PsYoHdMaGQtqQyquXGTwB1FqCBOPKQjI/vBGWG3fL7FGfWm4Z62eTbCH4Xyv3FZuNywlT8UjPMQyKA==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/grid": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.3.tgz", - "integrity": "sha512-GQM4RDmYhstcYZ0Odjq+xUwh1fhLmRebG6qMM8OXHTPQ77nhl3wc1UTGRhZm6mzEionplSRx4GCpEMEHMJIU0w==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.4.tgz", + "integrity": "sha512-sDVoyQcH7MoGdx5nBi5ZOU/mVFBt9YTxhvr0PZ97dMdEHZtJC1w9SuezwWS34f50yb8YAXQRTICbZYcK4bAlDA==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/illustratedmessage": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/illustratedmessage/-/illustratedmessage-3.3.6.tgz", - "integrity": "sha512-1FdJl1tR6mirmXT8yaTFeHNWdLXV6Dll66Mv1liEtTYsmCgn2anxwM73jK63t3jdT6ez/M1wGiwMlMtyiqo+ZQ==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/illustratedmessage/-/illustratedmessage-3.3.7.tgz", + "integrity": "sha512-r8WAv+w0WQSDRmDmG6jL0dXK8MjMr/lr2gBpVYVvC45Gu+fqf4VL+4zphgwASRysWclFbjQhgkgC7OEXk3GUKg==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/image": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/image/-/image-3.3.6.tgz", - "integrity": "sha512-GSb0deyquS3kFt0e9SfPP9I/YaYYUToYYPzx9As0R0mzuVn6qTHhUtpKhBqQAOpE1Cd8XdEQeYsDB3sdOurI+A==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/image/-/image-3.3.7.tgz", + "integrity": "sha512-ty6wuan6p3Z8OzSrbjtL2k8yXHW+n0qiYKyqKpSA8TcRLDLhtvRceI7X12RuDfbAiEN6/zfLCuF47O3y7OeKug==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/label": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.9.0.tgz", - "integrity": "sha512-nTmPf5ED8aLGqvFsZHIHwMPrRX0cfbOyayva//Rdis41KWQoKUB80DIQjE+iUDOgTivIxGBkpqdIZVqRuehTnw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.9.1.tgz", + "integrity": "sha512-0N/UOhwrKjE9VjVbUoJCsH5UwTzSu3d5B3xtvhH8YFqSbJCI+HMKILby8i8ys55RA9fQDMScIjCJafEFWW7UWA==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/layout": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/@react-types/layout/-/layout-3.3.12.tgz", - "integrity": "sha512-Ai6limgTVYQoGiXUvsXg8MHik+YAtRWEVLQhT5E1nQkDkNkQyccB+waUSfORhRkjJcnp+KMcbmPZ8V5ZO42rvQ==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@react-types/layout/-/layout-3.3.13.tgz", + "integrity": "sha512-Y3pmSsfDB+bV299F5SJannR6m/XM5IyfdqjPS0/Qx8KBBf0A3UWfL6qUr4BMEAKsEJuIXA7zT3RSo/AbGSbSyg==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/link": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.5.2.tgz", - "integrity": "sha512-/s51/WejmpLiyxOgP89s4txgxYoGaPe8pVDItVo1h4+BhU1Puyvgv/Jx8t9dPvo6LUXbraaN+SgKk/QDxaiirw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.5.3.tgz", + "integrity": "sha512-yVafjW3IejyVnK3oMBNjFABCGG6J27EUG8rvkaGaI1uB6srGUEhpJ97XLv11aj1QkXHBy3VGXqxEV3S7wn4HTw==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/listbox": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.6.tgz", - "integrity": "sha512-XOQvrTqNh5WIPDvKiWiep8T07RAsMfjAXTjDbnjxVlKACUXkcwpts9kFaLnJ9LJRFt6DwItfP+WMkzvmx63/NQ==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.7.tgz", + "integrity": "sha512-68y5H9CVSPFiwO6MOFxTbry9JQMK/Lb1M9i3M8TDyq1AbJxBPpgAvJ9RaqIMCucsnqCzpY/zA3D/X417zByL1w==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/menu": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.6.tgz", - "integrity": "sha512-w/RbFInOf4nNayQDv5c2L8IMJbcFOkBhsT3xvvpTy+CHvJcQdjggwaV1sRiw7eF/PwB81k2CwigmidUzHJhKDg==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.7.tgz", + "integrity": "sha512-K6KhloJVoGsqwkdeez72fkNI9dfrmLI/sNrB4XuOKo2crDQ/eyZYWyJmzz8giz/tHME9w774k487rVoefoFh5w==", "dependencies": { - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/meter": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.3.6.tgz", - "integrity": "sha512-1XYp1fA9UU0lO6kjf3TwVE8mppOJa64mBKAcLWtTyq1e/cYIAbx5o6CsuUx0YDpXKF6gdtvIWvfmxeWsmqJ1jQ==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.3.7.tgz", + "integrity": "sha512-p+YJ0+Lpn5MLmlbFZbDH1P0ILv1+AuMcUbxLcXMIVMGn7o0FO7eVZnFuq76D+qTDm9all+TRLJix7bctOrP+5Q==", "dependencies": { - "@react-types/progress": "^3.5.1" + "@react-types/progress": "^3.5.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/numberfield": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.7.0.tgz", - "integrity": "sha512-gaGi+vqm1Y8LCWRsWYUjcGftPIzl+8W2VOfkgKMLM8y76nnwTPtmAqs+Ap1cg7sEJSfsiKMq93e9yvP3udrC2w==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.1.tgz", + "integrity": "sha512-GaCjLQgXUGCt40SLjKk3/COMWFlN2vV/3Xs3VSLAEdFZpk99b+Ik1oR21+7ZP5/iMHuQDc1MJRWdFfIjxCvVDQ==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/overlays": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.4.tgz", - "integrity": "sha512-pfgNlQnbF6RB/R2oSxyqAP3Uzz0xE/k5q4n5gUeCDNLjY5qxFHGE8xniZZ503nZYw6VBa9XMN1efDOKQyeiO0w==", + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.5.tgz", + "integrity": "sha512-4D7EEBQigD/m8hE68Ys8eloyyZFHHduqykSIgINJ0edmo0jygRbWlTwuhWFR9USgSP4dK54duN0Mvq0m4HEVEw==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/progress": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.1.tgz", - "integrity": "sha512-CqsUjczUK/SfuFzDcajBBaXRTW0D3G9S/yqLDj9e8E0ii+lGDLt1PHj24t1J7E88U2rVYqmM9VL4NHTt8o3IYA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.2.tgz", + "integrity": "sha512-aQql22kusEudsHwDEzq6y/Mh29AM+ftRDKdS5E5g4MkCY5J4FMbOYco1T5So83NIvvG9+eKcxPoJUMjQQACAyA==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/provider": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-types/provider/-/provider-3.7.1.tgz", - "integrity": "sha512-WKwHwG5b0LkI570tbHCy4hBhT/E+OrdgIybScDxM713B2OwmMKKyaPKdV05SeoomP8oiPvkaAeXhLZa1ah7CYg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-types/provider/-/provider-3.7.2.tgz", + "integrity": "sha512-nzxbfuh/ZJXt/blGAiRPkxi9jAUnnBkHcvljqdfizfLJlN5epaYYaTWNUSde27Oe1tAnpm2WDlLQo5+0C6C0FA==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/radio": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.6.0.tgz", - "integrity": "sha512-VOZzegxxZS55gHRVyWu278Q4y/rEQGiAVQCUqi25GmpbMe4MlHrzg16c76RiZMUK9PPoyv+XNUgAaPmxebkn7g==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.7.1.tgz", + "integrity": "sha512-Zut3rN1odIUBLZdijeyou+UqsLeRE76d9A+npykYGu29ndqmo3w4sLn8QeQcdj1IR71ZnG0pW2Y2BazhK5XrrQ==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/searchfield": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.5.2.tgz", - "integrity": "sha512-JAK2/Kg4Dr393FYfbRw0TlXKnJPX77sq1x/ZBxtO6p64+MuuIYKqw0i9PwDlo1PViw2QI5u8GFhKA2TgemY9uA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.5.3.tgz", + "integrity": "sha512-gBfsT1WpY8UIb74yyYmnjiHpVasph2mdmGj9i8cGF2HUYwx5p+Fr85mtCGDph0uirvRoM5ExMp4snD+ueNAVCg==", "dependencies": { - "@react-types/shared": "^3.22.0", - "@react-types/textfield": "^3.9.0" + "@react-types/shared": "^3.22.1", + "@react-types/textfield": "^3.9.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/select": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.0.tgz", - "integrity": "sha512-0nalGmcoma4jreICLSJae/uKAuMiVyWgqWjGrGiUGGcdDchH4limKVEqNDaBwLvxVT6NB5LLsaipCTCAEEl4Rg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.2.tgz", + "integrity": "sha512-fGFrunednY3Pq/BBwVOf87Fsuyo/SlevL0wFIE9OOl2V5NXVaTY7/7RYA8hIOHPzmvsMbndy419BEudiNGhv4A==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/shared": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.0.tgz", - "integrity": "sha512-yVOekZWbtSmmiThGEIARbBpnmUIuePFlLyctjvCbgJgGhz8JnEJOipLQ/a4anaWfzAgzSceQP8j/K+VOOePleA==", + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.1.tgz", + "integrity": "sha512-PCpa+Vo6BKnRMuOEzy5zAZ3/H5tnQg1e80khMhK2xys0j6ZqzkgQC+fHMNZ7VDFNLqqNMj/o0eVeSBDh2POjkw==", "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/slider": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.0.tgz", - "integrity": "sha512-uyQXUVFfqc9SPUW0LZLMan2n232F/OflRafiHXz9viLFa9tVOupVa7GhASRAoHojwkjoJ1LjFlPih7g5dOZ0/Q==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.1.tgz", + "integrity": "sha512-FKO3YZYdrBs00XbBW5acP+0L1cCdevl/uRJiXbnLpGysO5PrSFIRS7Wlv4M7ztf6gT7b1Ao4FNC9crbxBr6BzA==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/statuslight": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/statuslight/-/statuslight-3.3.6.tgz", - "integrity": "sha512-MB/CnsbaE6reOrnpowJfgkpeSNY0ZuqA6g/k8331a+TP2yIO6X0cUYyEGG8S/k9hFyFCMKlcmmm4pwMrX4sZtQ==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/statuslight/-/statuslight-3.3.7.tgz", + "integrity": "sha512-PFctvM8NJFENNWHydEK4pCMXKmjrHB2PJ/fdJ2Bi6ABRcTBXzi/qgUUdbeTG7STXlA+P2/xNgKtHheus8K+K3g==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/switch": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.0.tgz", - "integrity": "sha512-/wNmUGjk69bP6t5k2QkAdrNN5Eb9Rz4dOyp0pCPmoeE+5haW6sV5NmtkvWX1NSc4DQz1xL/a5b+A0vxPCP22Jw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.1.tgz", + "integrity": "sha512-2LFEKMGeufqyYmeN/5dtkDkCPG6x9O4eu6aaBaJmPGon7C/l3yiFEgRue6oCUYc1HixR7Qlp0sPxk0tQeWzrSg==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/table": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.9.1.tgz", - "integrity": "sha512-3e+Oouw9jGqNDg+JRg7v7fgPqDZd6DtST9S/UPp81f32ntnQ8Wsu7S/J4eyLHu5CVQDqcHkf4xPeeXBgPx4qmw==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.9.3.tgz", + "integrity": "sha512-Hs/pMbxJdga2zBol4H5pV1FVIiRjCuSTXst6idJjkctanTexR4xkyrtBwl+rdLNoGwQ2pGii49vgklc5bFK7zA==", "dependencies": { - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0" + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/tabs": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.4.tgz", - "integrity": "sha512-4mCTtFrwMRypyGTZCvNYVT9CkknexO/UYvqwDm2jMYb8JgjRvxnomu776Yh7uyiYKWyql2upm20jqasEOm620w==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.5.tgz", + "integrity": "sha512-6NTSZBOWekCtApdZrhu5tHhE/8q52oVohQN+J5T7shAXd6ZAtu8PABVR/nH4BWucc8FL0OUajRqunqzQMU13gA==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/text": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/text/-/text-3.3.6.tgz", - "integrity": "sha512-cO3IQ/DQ/xUGGskJ8/zCLkbzvrjlQbRnrJl95BEGs97CmiN+zqGoCqvDhjWEbuPRtfGXJ27CYZDC2oVZetUG4w==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/text/-/text-3.3.7.tgz", + "integrity": "sha512-URkJHS314ppyq6JjMPZbg/P4j9vey0H/Lc2+YB96qIcebBKy8iNN0IlwRsLFXimlGDp7dgn6tv+51bdJh+CRCQ==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/textfield": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.0.tgz", - "integrity": "sha512-D/DiwzsfkwlAg3uv8hoIfwju+zhB/hWDEdTvxQbPkntDr0kmN/QfI17NMSzbOBCInC4ABX87ViXLGxr940ykGA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.1.tgz", + "integrity": "sha512-JBHY9M2CkL6xFaGSfWmUJVu3tEK09FaeB1dU3IEh6P41xxbFnPakYHSSAdnwMXBtXPoSHIVsUBickW/pjgfe5g==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/tooltip": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.6.tgz", - "integrity": "sha512-RaZewdER7ZcsNL99RhVHs8kSLyzIBkwc0W6eFZrxST2MD9J5GzkVWRhIiqtFOd5U1aYnxdJ6woq72Ef+le6Vfw==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.7.tgz", + "integrity": "sha512-rV4HZRQxLRNhe24yATOxnFQtGRUmsR7mqxMupXCmd1vrw8h+rdKlQv1zW2q8nALAKNmnRXZJHxYQ1SFzb98fgg==", "dependencies": { - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/view": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/view/-/view-3.4.6.tgz", - "integrity": "sha512-GAdvvabJAYrVCgOUsZp8KkmNLfkKnDmoMNmwCN9I2OnSS+5JyjTrgNIOiznMjDEqhXTbaefcsVofoUfTYXjtyQ==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-types/view/-/view-3.4.7.tgz", + "integrity": "sha512-AcgLrlaZkCXH+pD4I7pTPB52Rstg1M+V2yKPP29lnqg/rOjsqLjN/gLLy/EBi97cQ+TbDbg0854vcxAKs6qclg==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-types/well": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/well/-/well-3.3.6.tgz", - "integrity": "sha512-NX4+bMmNYrbjllKR9Xxg0YHNWrscHzZQmcdYiM/Z8qZ1TNVPhXeLmKxCDamlmUSZudCqwui4q5xwzuUyrRRA6w==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/well/-/well-3.3.7.tgz", + "integrity": "sha512-BaZ4utlEeweD8+mAYdqwq2bS8aDrXqi4xFPdfqZpHcpbSJjmGBCCS+GU2y/N2Yl1aODu5l0+gcrvxxr63bV+GA==", "dependencies": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" @@ -12046,12 +11025,12 @@ } }, "node_modules/@spectrum-icons/ui": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.6.2.tgz", - "integrity": "sha512-X13fgmi3h0fzolZF+cVJ6NvA91VCb055eBGkhhkQ+vjvUZrHZ8ACD2YUfaDt44BX+fsGUBOZ4fwOrdXnAaVhDQ==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.6.5.tgz", + "integrity": "sha512-L1QISmlzoA4xuBdMpWT2vkR7NDxuROjSwC5BxS8R2SAZR4oKs0dPfODaw2uju6D/xqJIqVrSM6yQDhV51lPKyA==", "dependencies": { "@adobe/react-spectrum-ui": "1.2.0", - "@react-spectrum/icon": "^3.7.8", + "@react-spectrum/icon": "^3.7.11", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -12059,22 +11038,13 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@spectrum-icons/ui/node_modules/@adobe/react-spectrum-ui": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-ui/-/react-spectrum-ui-1.2.0.tgz", - "integrity": "sha512-os3EdjfyJbrukLcZ5uYtdFRiDlLB3zq2JoXp19J/IDpZ8btibJeRZYSwjL+LscEiT2pOYaF2McMQdkZTIwnllw==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@spectrum-icons/workflow": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.2.7.tgz", - "integrity": "sha512-Qrl2VPDsNd6WyEbqSvcMHPPRKHr6hhFcYXuh26h7XosmIf1irHZqvhpBGEJun2ADao4EQkwMUDy+3VSzvxuGIQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.2.10.tgz", + "integrity": "sha512-CaDYaGMe2bYDozzHztrgEy0tljQWn4OBE9hJC2fAM5cMTve4viiWhcmHYYWFv3MZQyavHy1UwCL1jlXg7bK3PA==", "dependencies": { "@adobe/react-spectrum-workflow": "2.3.4", - "@react-spectrum/icon": "^3.7.8", + "@react-spectrum/icon": "^3.7.11", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -12082,15 +11052,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@spectrum-icons/workflow/node_modules/@adobe/react-spectrum-workflow": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-workflow/-/react-spectrum-workflow-2.3.4.tgz", - "integrity": "sha512-XPLzIBl58HdLF9WIPB7RDAvVXvCE3SjG+HaWQhW2P9MnxSz1DEA9O7mlTlYblJkMbfk10T/+RFaSupc1yoN+TA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, "node_modules/@swc/core": { "version": "1.3.99", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.99.tgz", @@ -12302,9 +11263,9 @@ "dev": true }, "node_modules/@testing-library/dom": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", - "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", "dev": true, "peer": true, "dependencies": { @@ -12968,9 +11929,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz", - "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==", + "version": "20.11.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", + "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -14274,9 +13235,9 @@ } }, "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -14293,6 +13254,14 @@ "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -14740,9 +13709,9 @@ } }, "node_modules/ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -14771,33 +13740,6 @@ "node": ">=10" } }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -14925,6 +13867,11 @@ "node": ">= 10" } }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -15022,9 +13969,9 @@ } }, "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", "engines": { "node": ">=6" } @@ -15166,9 +14113,9 @@ } }, "node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16549,9 +15496,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "dev": true, "peer": true, "dependencies": { @@ -18460,9 +17407,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", "dev": true, "peer": true, "dependencies": { @@ -19212,33 +18159,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hastscript/node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/hastscript/node_modules/property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/hastscript/node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -19400,9 +18320,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -19463,16 +18383,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -19748,13 +18658,13 @@ } }, "node_modules/intl-messageformat": { - "version": "10.5.8", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.8.tgz", - "integrity": "sha512-NRf0jpBWV0vd671G5b06wNofAN8tp7WWDogMZyaU8GUAsmbouyvgwmFJI7zLjfAMpm3zK+vSwRP3jzaoIcMbaA==", + "version": "10.5.11", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.11.tgz", + "integrity": "sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==", "dependencies": { - "@formatjs/ecma402-abstract": "1.18.0", + "@formatjs/ecma402-abstract": "1.18.2", "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.3", + "@formatjs/icu-messageformat-parser": "2.7.6", "tslib": "^2.4.0" } }, @@ -19764,28 +18674,6 @@ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -19954,15 +18842,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -20063,15 +18942,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-iexplorer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", @@ -23245,9 +22115,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.30.0.tgz", + "integrity": "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==", "dev": true, "peer": true }, @@ -24162,9 +23032,9 @@ } }, "node_modules/longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -24491,46 +23361,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mapbox-gl": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.10.1.tgz", - "integrity": "sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==", - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.0", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "minimist": "^1.2.5", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.0.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - }, - "engines": { - "node": ">=6.4.0" - } - }, "node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dependencies": { - "repeat-string": "^1.0.0" - }, + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -24567,11 +23401,13 @@ } }, "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", "dependencies": { - "unist-util-visit": "^2.0.0" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" }, "funding": { "type": "opencollective", @@ -24579,13 +23415,14 @@ } }, "node_modules/mdast-util-find-and-replace": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", - "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", "dependencies": { - "escape-string-regexp": "^4.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" }, "funding": { "type": "opencollective", @@ -24593,42 +23430,108 @@ } }, "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", "dependencies": { "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, "node_modules/mdast-util-gfm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", - "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", "dependencies": { - "mdast-util-gfm-autolink-literal": "^0.1.0", - "mdast-util-gfm-strikethrough": "^0.2.0", - "mdast-util-gfm-table": "^0.1.0", - "mdast-util-gfm-task-list-item": "^0.1.0", - "mdast-util-to-markdown": "^0.6.1" + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" }, "funding": { "type": "opencollective", @@ -24636,13 +23539,14 @@ } }, "node_modules/mdast-util-gfm-autolink-literal": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz", - "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", "dependencies": { - "ccount": "^1.0.0", - "mdast-util-find-and-replace": "^1.1.0", - "micromark": "^2.11.3" + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" }, "funding": { "type": "opencollective", @@ -24678,15 +23582,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/mdast-util-gfm-footnote/node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-from-markdown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", @@ -24894,21 +23789,13 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-gfm-footnote/node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/mdast-util-gfm-strikethrough": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz", - "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", "dependencies": { - "mdast-util-to-markdown": "^0.6.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" }, "funding": { "type": "opencollective", @@ -24916,37 +23803,13 @@ } }, "node_modules/mdast-util-gfm-table": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz", - "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==", - "dependencies": { - "markdown-table": "^2.0.0", - "mdast-util-to-markdown": "~0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz", - "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==", - "dependencies": { - "mdast-util-to-markdown": "~0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-math": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz", - "integrity": "sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", "dependencies": { "@types/mdast": "^3.0.0", - "longest-streak": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", "mdast-util-to-markdown": "^1.3.0" }, "funding": { @@ -24954,81 +23817,37 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-math/node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-math/node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", "dependencies": { "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" + "mdast-util-to-markdown": "^1.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-math/node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "node_modules/mdast-util-gfm/node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", "dependencies": { "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-math/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-math/node_modules/micromark-util-decode-numeric-character-reference": { + "node_modules/mdast-util-gfm/node_modules/micromark-util-normalize-identifier": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/mdast-util-math/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", "funding": [ { "type": "GitHub Sponsors", @@ -25040,138 +23859,193 @@ } ], "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-symbol": "^1.0.0" } }, - "node_modules/mdast-util-math/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "node_modules/mdast-util-math": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz", + "integrity": "sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==", "dependencies": { - "@types/unist": "^2.0.0" + "@types/mdast": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-math/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-math/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "node_modules/mdast-util-phrasing/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "@types/unist": "*" + } + }, + "node_modules/mdast-util-phrasing/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-math/node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-phrasing/node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "node_modules/mdast-util-to-hast/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/unist": "*" + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/mdast-util-phrasing/node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", "dependencies": { - "@types/unist": "^3.0.0" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-hast": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", - "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", + "node_modules/mdast-util-to-markdown/node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", "dependencies": { "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" + "unist-util-is": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" } }, "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -25184,11 +24058,6 @@ "dev": true, "peer": true }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", @@ -25465,9 +24334,9 @@ "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==" }, "node_modules/micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", "funding": [ { "type": "GitHub Sponsors", @@ -25479,8 +24348,23 @@ } ], "dependencies": { + "@types/debug": "^4.0.0", "debug": "^4.0.0", - "parse-entities": "^2.0.0" + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" } }, "node_modules/micromark-core-commonmark": { @@ -25585,16 +24469,18 @@ ] }, "node_modules/micromark-extension-gfm": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", - "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==", - "dependencies": { - "micromark": "~2.11.0", - "micromark-extension-gfm-autolink-literal": "~0.5.0", - "micromark-extension-gfm-strikethrough": "~0.6.5", - "micromark-extension-gfm-table": "~0.4.0", - "micromark-extension-gfm-tagfilter": "~0.3.0", - "micromark-extension-gfm-task-list-item": "~0.3.0" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" }, "funding": { "type": "opencollective", @@ -25602,17 +24488,55 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz", - "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", "dependencies": { - "micromark": "~2.11.3" + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", @@ -25701,23 +24625,88 @@ ] }, "node_modules/micromark-extension-gfm-strikethrough": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz", - "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", "dependencies": { - "micromark": "~2.11.0" + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, "node_modules/micromark-extension-gfm-table": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz", - "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", "dependencies": { - "micromark": "~2.11.0" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" }, "funding": { "type": "opencollective", @@ -25725,26 +24714,332 @@ } }, "node_modules/micromark-extension-gfm-tagfilter": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz", - "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-task-list-item": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz", - "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", "dependencies": { - "micromark": "~2.11.0" + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-gfm/node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, "node_modules/micromark-extension-math": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz", @@ -26603,6 +25898,304 @@ } ] }, + "node_modules/micromark/node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark/node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark/node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark/node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -28946,23 +28539,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -29243,17 +28819,63 @@ "node": ">=8" } }, + "node_modules/playwright": { + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.41.2.tgz", + "integrity": "sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==", + "dev": true, + "dependencies": { + "playwright-core": "1.41.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.2.tgz", + "integrity": "sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/plotly.js": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.27.1.tgz", - "integrity": "sha512-XeE0zTJWTxURYrUJqzf73l8lTb+HnyRvvhHkoSIEvWf58ins4saopo9l25kCm+xHAGz8E/2EOncE4DyXsJ34kA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.29.1.tgz", + "integrity": "sha512-+XirhgCh42JF/iVu/RtBRbhcs328ipinajy7hd3mnZdnQv2Th6F441DSXer5S+P0nNluNs10vAFTELo4k/icjg==", "dependencies": { "@plotly/d3": "3.8.1", "@plotly/d3-sankey": "0.7.2", "@plotly/d3-sankey-circular": "0.33.1", + "@plotly/mapbox-gl": "v1.13.4", "@turf/area": "^6.4.0", "@turf/bbox": "^6.4.0", "@turf/centroid": "^6.0.2", + "base64-arraybuffer": "^1.0.2", "canvas-fit": "^1.5.0", "color-alpha": "1.0.4", "color-normalize": "1.5.0", @@ -29275,7 +28897,6 @@ "has-hover": "^1.0.1", "has-passive-events": "^1.0.0", "is-mobile": "^4.0.0", - "mapbox-gl": "1.10.1", "mouse-change": "^1.4.0", "mouse-event-offset": "^3.0.2", "mouse-wheel": "^1.2.0", @@ -29287,7 +28908,7 @@ "regl": "npm:@plotly/regl@^2.1.2", "regl-error2d": "^2.0.12", "regl-line2d": "^3.1.2", - "regl-scatter2d": "^3.2.9", + "regl-scatter2d": "^3.3.1", "regl-splom": "^1.0.14", "strongly-connected-components": "^1.0.1", "superscript-text": "^1.0.0", @@ -29300,9 +28921,9 @@ } }, "node_modules/plotly.js-dist-min": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/plotly.js-dist-min/-/plotly.js-dist-min-2.27.1.tgz", - "integrity": "sha512-fFPFityhOkDtjoIVd/9IJQbEEuKEjfmNALBVLZyHwLIkry5ygE4ZC/XENRqLnWR3rNJdTtEaxhM5zflcWTRlDA==" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/plotly.js-dist-min/-/plotly.js-dist-min-2.29.1.tgz", + "integrity": "sha512-YvqX5TISWsJVTDIaUh2Qgt9uhLl0bWcQhO2rLPF0/hIY9BlinFa1JwSO2jFKcEmG0AJXSo4DnVdgKpsk9/8Apg==" }, "node_modules/point-in-polygon": { "version": "1.1.0", @@ -29325,9 +28946,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -29346,7 +28967,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -29360,26 +28981,36 @@ "peer": true }, "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", + "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "peer": true, "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">=18.0" }, "peerDependencies": { - "postcss": "^8.3.3" + "postcss": "^8.4.31" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -29580,12 +29211,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dependencies": { - "xtend": "^4.0.0" - }, + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -29806,23 +29434,25 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-markdown": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-6.0.3.tgz", - "integrity": "sha512-kQbpWiMoBHnj9myLlmZG9T1JdoT/OEyHK7hqM6CqFT14MAkgWiWBUYijLyBmxbntaN6dCDicPcUhWhci1QYodg==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", "dependencies": { "@types/hast": "^2.0.0", - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "prop-types": "^15.7.2", - "property-information": "^5.3.0", - "react-is": "^17.0.0", - "remark-parse": "^9.0.0", - "remark-rehype": "^8.0.0", - "space-separated-tokens": "^1.1.0", - "style-to-object": "^0.3.0", - "unified": "^9.0.0", - "unist-util-visit": "^2.0.0", - "vfile": "^4.0.0" + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" }, "funding": { "type": "opencollective", @@ -29833,6 +29463,11 @@ "react": ">=16" } }, + "node_modules/react-markdown/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/react-plotly.js": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.6.0.tgz", @@ -30483,9 +30118,9 @@ } }, "node_modules/regl-scatter2d": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.2.9.tgz", - "integrity": "sha512-PNrXs+xaCClKpiB2b3HZ2j3qXQXhC5kcTh/Nfgx9rLO0EpEhab0BSQDqAsbdbpdf+pSHSJvbgitB7ulbGeQ+Fg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.3.1.tgz", + "integrity": "sha512-seOmMIVwaCwemSYz/y4WE0dbSO9svNFSqtTh5RE57I7PjGo3tcUYKtH0MTSoshcAsreoqN8HoCtnn8wfHXXfKQ==", "dependencies": { "@plotly/point-cluster": "^3.1.9", "array-range": "^1.0.1", @@ -30538,139 +30173,15 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-mathjax/node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/rehype-mathjax/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rehype-mathjax/node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/rehype-mathjax/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-mathjax/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-mathjax/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-mathjax/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-mathjax/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-mathjax/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-mathjax/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-gfm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", - "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", "dependencies": { - "mdast-util-gfm": "^0.1.0", - "micromark-extension-gfm": "^0.3.0" + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" }, "funding": { "type": "opencollective", @@ -30692,99 +30203,14 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-math/node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/remark-math/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/remark-math/node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/remark-math/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-math/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-math/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-math/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", "dependencies": { - "mdast-util-from-markdown": "^0.8.0" + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" }, "funding": { "type": "opencollective", @@ -30792,11 +30218,14 @@ } }, "node_modules/remark-rehype": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-8.1.0.tgz", - "integrity": "sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", "dependencies": { - "mdast-util-to-hast": "^10.2.0" + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" }, "funding": { "type": "opencollective", @@ -30830,15 +30259,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/remark-stringify/node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/remark-stringify/node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -30850,15 +30270,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/remark-stringify/node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/remark-stringify/node_modules/mdast-util-to-markdown": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", @@ -30890,15 +30301,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-stringify/node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/remark-stringify/node_modules/unified": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", @@ -30995,23 +30397,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-stringify/node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -31703,9 +31088,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -31722,9 +31107,9 @@ } }, "node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -32238,64 +31623,56 @@ "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==" }, - "node_modules/style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true, - "peer": true - }, "node_modules/style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", "dependencies": { "inline-style-parser": "0.1.1" } }, "node_modules/stylelint": { - "version": "15.11.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", - "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.3.1.tgz", + "integrity": "sha512-/JOwQnBvxEKOT2RtNgGpBVXnCSMBgKOL2k7w0K52htwCyJls4+cHvc4YZgXlVoAZS9QJd2DgYAiRnja96pTgxw==", "dev": true, "peer": true, "dependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/media-query-list-parser": "^2.1.4", - "@csstools/selector-specificity": "^3.0.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/media-query-list-parser": "^2.1.9", + "@csstools/selector-specificity": "^3.0.2", + "@dual-bundle/import-meta-resolve": "^4.0.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^8.2.0", + "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.1", "css-tree": "^2.3.1", "debug": "^4.3.4", - "fast-glob": "^3.3.1", + "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^7.0.0", + "file-entry-cache": "^8.0.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.2.4", - "import-lazy": "^4.0.0", + "ignore": "^5.3.1", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.29.0", + "known-css-properties": "^0.30.0", "mathml-tag-names": "^2.1.3", - "meow": "^10.1.5", + "meow": "^13.2.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.28", + "postcss": "^8.4.38", "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.13", + "postcss-safe-parser": "^7.0.0", + "postcss-selector-parser": "^6.0.16", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", + "strip-ansi": "^7.1.0", "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", "table": "^6.8.1", @@ -32305,63 +31682,44 @@ "stylelint": "bin/stylelint.mjs" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": ">=18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/stylelint" } }, - "node_modules/stylelint/node_modules/balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true, - "peer": true - }, - "node_modules/stylelint/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/stylelint/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "peer": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/stylelint/node_modules/camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "peer": true }, "node_modules/stylelint/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "peer": true, "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -32378,176 +31736,41 @@ } } }, - "node_modules/stylelint/node_modules/decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", - "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", - "dev": true, - "peer": true, - "dependencies": { - "flat-cache": "^3.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/stylelint/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "peer": true, "dependencies": { - "lru-cache": "^6.0.0" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16.0.0" } }, - "node_modules/stylelint/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/stylelint/node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "peer": true, "dependencies": { - "yallist": "^4.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/stylelint/node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "peer": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "peer": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, "peer": true, - "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -32563,22 +31786,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/stylelint/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -32592,46 +31799,20 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/stylelint/node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "node_modules/stylelint/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "peer": true, "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" + "ansi-regex": "^6.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", - "dev": true, - "peer": true, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/stylelint/node_modules/write-file-atomic": { @@ -32648,23 +31829,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/stylelint/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "node_modules/stylelint/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/supercluster": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", @@ -32787,9 +31951,9 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "peer": true, "dependencies": { @@ -33149,9 +32313,9 @@ } }, "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -33548,16 +32712,17 @@ } }, "node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", "dependencies": { - "bail": "^1.0.0", + "@types/unist": "^2.0.0", + "bail": "^2.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" }, "funding": { "type": "opencollective", @@ -33565,11 +32730,14 @@ } }, "node_modules/unified/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/unique-filename": { @@ -33608,15 +32776,6 @@ "node": ">=8" } }, - "node_modules/unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-find-after": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz", @@ -33630,51 +32789,45 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-find-after/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "dependencies": { - "@types/unist": "^2.0.2" + "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", @@ -33682,13 +32835,13 @@ } }, "node_modules/unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", "dependencies": { "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" }, "funding": { "type": "opencollective", @@ -33696,12 +32849,12 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", "dependencies": { "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" + "unist-util-is": "^5.0.0" }, "funding": { "type": "opencollective", @@ -33918,14 +33071,14 @@ } }, "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" }, "funding": { "type": "opencollective", @@ -33933,12 +33086,12 @@ } }, "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", "dependencies": { "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "unist-util-stringify-position": "^3.0.0" }, "funding": { "type": "opencollective", @@ -34619,9 +33772,9 @@ } }, "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -35952,7 +35105,7 @@ }, "plugins/plotly-express/src/js": { "name": "@deephaven/js-plugin-plotly-express", - "version": "0.4.0", + "version": "0.7.0", "license": "Apache-2.0", "dependencies": { "@deephaven/chart": "0.64.0", @@ -35965,8 +35118,8 @@ "@deephaven/plugin": "0.64.0", "@deephaven/utils": "0.64.0", "deep-equal": "^2.2.1", - "plotly.js": "^2.23.0", - "plotly.js-dist-min": "^2.23.0", + "plotly.js": "^2.29.1", + "plotly.js-dist-min": "^2.29.1", "react-plotly.js": "^2.4.0", "react-redux": "^7.2.9", "shortid": "^2.2.16" @@ -36175,7 +35328,7 @@ }, "plugins/plotly/src/js": { "name": "@deephaven/js-plugin-plotly", - "version": "0.3.0", + "version": "0.1.0", "license": "Apache-2.0", "dependencies": { "@deephaven/components": "^0.40.0", @@ -36183,7 +35336,7 @@ "@deephaven/jsapi-types": "^0.40.0", "@deephaven/log": "^0.40.0", "@deephaven/utils": "^0.40.0", - "plotly.js-dist-min": "^2.20.0", + "plotly.js-dist-min": "^2.29.1", "prop-types": "^15.8.1", "react-plotly.js": "^2.4.0", "shortid": "^2.2.16" @@ -36244,26 +35397,29 @@ }, "plugins/ui/src/js": { "name": "@deephaven/js-plugin-ui", - "version": "0.7.0", + "version": "0.11.0", "license": "Apache-2.0", "dependencies": { - "@adobe/react-spectrum": "^3.29.0", - "@deephaven/chart": "0.62.0", - "@deephaven/components": "0.62.0", - "@deephaven/dashboard": "0.62.0", - "@deephaven/dashboard-core-plugins": "0.62.0", - "@deephaven/icons": "0.62.0", - "@deephaven/iris-grid": "0.62.0", - "@deephaven/jsapi-bootstrap": "0.62.0", - "@deephaven/jsapi-components": "0.62.0", - "@deephaven/jsapi-types": "0.62.0", - "@deephaven/log": "0.62.0", - "@deephaven/plugin": "0.62.0", - "@deephaven/react-hooks": "0.62.0", - "@deephaven/utils": "0.62.0", + "@adobe/react-spectrum": "^3.34.1", + "@deephaven/chart": "^0.71.0", + "@deephaven/components": "^0.71.0", + "@deephaven/dashboard": "^0.71.0", + "@deephaven/dashboard-core-plugins": "^0.71.0", + "@deephaven/grid": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/iris-grid": "^0.71.0", + "@deephaven/jsapi-bootstrap": "^0.71.0", + "@deephaven/jsapi-components": "^0.71.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.33.3", + "@deephaven/log": "^0.71.0", + "@deephaven/plugin": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/redux": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/react-fontawesome": "^0.2.0", "@react-types/shared": "^3.22.0", "json-rpc-2.0": "^1.6.0", + "react-redux": "^7.x", "shortid": "^2.2.16" }, "devDependencies": { @@ -36280,23 +35436,24 @@ } }, "plugins/ui/src/js/node_modules/@deephaven/chart": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.62.0.tgz", - "integrity": "sha512-zakQjG0V+QYdHsr01ThQS2ffhaCnF2a9GtlUDhw43qYfHeEiC2IkkinizY2pYgSJf2CPLNe7ibiIBflifQSBMQ==", - "dependencies": { - "@deephaven/components": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/jsapi-utils": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.71.0.tgz", + "integrity": "sha512-/dv07HJSMxywWBrdTzhD1/1rDpX3k2FN3PYLlSrXixGhUdNhiYKxgT9mhbZ5ETt5JZ6Tn0oktiiuCjp9u839QA==", + "dependencies": { + "@deephaven/components": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/jsapi-utils": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/utils": "^0.71.0", + "buffer": "^6.0.3", "deep-equal": "^2.0.5", "lodash.debounce": "^4.0.8", "lodash.set": "^4.3.2", "memoize-one": "^5.1.1", "memoizee": "^0.4.15", - "plotly.js": "^2.18.2", + "plotly.js": "^2.29.1", "prop-types": "^15.7.2", "react-plotly.js": "^2.6.0" }, @@ -36304,22 +35461,29 @@ "node": ">=16" }, "peerDependencies": { - "react": "^17.x" + "react": ">=16.8.0" } }, + "plugins/ui/src/js/node_modules/@deephaven/chart/node_modules/@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + }, "plugins/ui/src/js/node_modules/@deephaven/components": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.62.0.tgz", - "integrity": "sha512-VKHZgsOO/VL1o9CS794eeRAa28lMQCLRrFbp3KgMBGvZVC68+rtuNpxWnc4zRZLZJxFiAxJbyJcleZS6QyW5Vg==", - "dependencies": { - "@adobe/react-spectrum": "^3.29.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.71.0.tgz", + "integrity": "sha512-o9NaRpu0BGyd0pdtxDYVva8YoIP5vFU1sQ11wv8SZ8mnCGT9iY2LA8jMpeKlfefAcKp4gGNLHaDh4wQ6F66Gwg==", + "dependencies": { + "@adobe/react-spectrum": "^3.34.1", + "@deephaven/icons": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/react-fontawesome": "^0.2.0", "@react-spectrum/theme-default": "^3.5.1", + "@react-types/shared": "^3.22.1", + "@react-types/textfield": "^3.9.1", "bootstrap": "4.6.2", "classnames": "^2.3.1", "event-target-shim": "^6.0.2", @@ -36339,24 +35503,24 @@ "node": ">=10" }, "peerDependencies": { - "react": "^17.x", - "react-dom": "^17.x" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, "plugins/ui/src/js/node_modules/@deephaven/console": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.62.0.tgz", - "integrity": "sha512-9jDywMHxiNpUjMMXQhQwI6vwnhEseG1Jf+RreZuTKVFJ4VTmhRg/xG14Bd6p/D6ichVQ4jGtMSLHKmYFYZ9HZg==", - "dependencies": { - "@deephaven/chart": "^0.62.0", - "@deephaven/components": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/jsapi-bootstrap": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/storage": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.71.0.tgz", + "integrity": "sha512-eSfRuLAbIsnLLE5tSStGY09apYyM3tJNst/iOuPGNgtSku0UHutr/N9LbK+XU3Mby11D/JQzkbTCD54Ba+R1Yg==", + "dependencies": { + "@deephaven/chart": "^0.71.0", + "@deephaven/components": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/jsapi-bootstrap": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/storage": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", "linkifyjs": "^4.1.0", @@ -36375,21 +35539,26 @@ "node": ">=16" }, "peerDependencies": { - "react": "^17.x", - "react-dom": "^17.x" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, + "plugins/ui/src/js/node_modules/@deephaven/console/node_modules/@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + }, "plugins/ui/src/js/node_modules/@deephaven/dashboard": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.62.0.tgz", - "integrity": "sha512-tBrpe52cl+UK2jtGGz7lIAJdxNm1givhquz4JKEBDJ/k8rqWwucXsxLgJ22nGASzct14xBk2Gb5IeuH/swkUDg==", - "dependencies": { - "@deephaven/components": "^0.62.0", - "@deephaven/golden-layout": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/redux": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.71.0.tgz", + "integrity": "sha512-0u0CqLx0KO5R4kYdlvRJbDNNew4fUAKv37xQCiwOnJCHBBkCiHBxysH/Qr4DZ4yBPCgun5HQw6q1B2pdAlAccQ==", + "dependencies": { + "@deephaven/components": "^0.71.0", + "@deephaven/golden-layout": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/redux": "^0.71.0", + "@deephaven/utils": "^0.71.0", "deep-equal": "^2.0.5", "lodash.ismatch": "^4.1.1", "lodash.throttle": "^4.1.1", @@ -36400,37 +35569,37 @@ "node": ">=16" }, "peerDependencies": { - "react": "^17.0.0", - "react-dom": "^17.0.0", - "react-is": "^17.0.0", + "react": ">=16.8.0", + "react-dom": ">=16.8.0", + "react-is": ">=16.8.0", "react-redux": "^7.2.4" } }, "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.62.0.tgz", - "integrity": "sha512-c5pULTIPABzEJJSZRPBnCmt6OKxt9Vcy4riI0WX7wj+ZDvfo+Sg59ErBpSoY3bHgDsUzV28bmh2Vn+RBQNN8vQ==", - "dependencies": { - "@deephaven/chart": "^0.62.0", - "@deephaven/components": "^0.62.0", - "@deephaven/console": "^0.62.0", - "@deephaven/dashboard": "^0.62.0", - "@deephaven/file-explorer": "^0.62.0", - "@deephaven/filters": "^0.62.0", - "@deephaven/golden-layout": "^0.62.0", - "@deephaven/grid": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/iris-grid": "^0.62.0", - "@deephaven/jsapi-bootstrap": "^0.62.0", - "@deephaven/jsapi-components": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/jsapi-utils": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/plugin": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/redux": "^0.62.0", - "@deephaven/storage": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.71.0.tgz", + "integrity": "sha512-HufxV+hikNlaut0eE1+Hup7hEWX5YTFyzQTZLx4iH/AZY3vBlXoxgMvZOW8oMSXLsJT3vTqqEB6bpI2lG1eC5Q==", + "dependencies": { + "@deephaven/chart": "^0.71.0", + "@deephaven/components": "^0.71.0", + "@deephaven/console": "^0.71.0", + "@deephaven/dashboard": "^0.71.0", + "@deephaven/file-explorer": "^0.71.0", + "@deephaven/filters": "^0.71.0", + "@deephaven/golden-layout": "^0.71.0", + "@deephaven/grid": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/iris-grid": "^0.71.0", + "@deephaven/jsapi-bootstrap": "^0.71.0", + "@deephaven/jsapi-components": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/jsapi-utils": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/plugin": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/redux": "^0.71.0", + "@deephaven/storage": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", "deep-equal": "^2.0.5", @@ -36440,32 +35609,38 @@ "memoize-one": "^5.1.1", "memoizee": "^0.4.15", "prop-types": "^15.7.2", - "react-markdown": "^6.0.2", - "react-transition-group": "^4.4.2", + "react-markdown": "^8.0.7", "redux": "^4.2.0", "redux-thunk": "^2.4.1", - "remark-gfm": "1.0.0", + "rehype-mathjax": "^4.0.3", + "remark-gfm": "^3.0.1", + "remark-math": "^5.1.1", "shortid": "^2.2.16" }, "engines": { "node": ">=16" }, "peerDependencies": { - "react": "^17.0.0", - "react-dom": "^17.0.0", + "react": ">=16.8.0", + "react-dom": ">=16.8.0", "react-redux": "^7.2.4" } }, + "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + }, "plugins/ui/src/js/node_modules/@deephaven/file-explorer": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.62.0.tgz", - "integrity": "sha512-pc6cH34DNkRxeWgy2ofGv/HUIGpI57LWLxVlnPqX7El/Q+Ma3cSBqj1sQH0uz5uNwP5WHv8q0L32JrJXJef0/Q==", - "dependencies": { - "@deephaven/components": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/storage": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.71.0.tgz", + "integrity": "sha512-p1nSlMZgL8lkQHDP+NDQNoY8RV2Vs+KdPNhDqpsAE1bS6ZtpdOEnyoCfrDBoZ4RuV3yj21byFZs/PqXY/GJ6fg==", + "dependencies": { + "@deephaven/components": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/storage": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", @@ -36476,36 +35651,36 @@ "node": ">=16" }, "peerDependencies": { - "react": "^17.0.0" + "react": ">=16.8.0" } }, "plugins/ui/src/js/node_modules/@deephaven/filters": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.62.0.tgz", - "integrity": "sha512-WTa3z250SRoh8xYmL3gdfddPOwqZBj95sVKaj3LBGGepcTO0Me3vCp9nODl8MyUBaOGBsCXIsrnWX6DFjkiGLQ==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.71.0.tgz", + "integrity": "sha512-qt1dYNXPTxWUmaOgyQ5/3z6IViYVlkIG9FqKRmokWtfHabTNLc/eeM6XfUAPBmAgkC8Aawe8xtRrkaPd8knqyg==", "engines": { "node": ">=16" } }, "plugins/ui/src/js/node_modules/@deephaven/golden-layout": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.62.0.tgz", - "integrity": "sha512-eeXz4GHm3JO8S8GNr5SGrdoeyuktwsH8cFwDy5V3WOVut1QwGVkPiTNb63Lt7F55rdLeuOHVdsXDYNDnDUcZtQ==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.71.0.tgz", + "integrity": "sha512-kpqJDJC+cwQlY7YN93kscdkm9Edy68ptRNdiSSPwwcY1hdr/NbdR+NuZNtqy2VOp9AV4GGKsoKlpa+HQb1YDXA==", "dependencies": { - "@deephaven/components": "^0.62.0", + "@deephaven/components": "^0.71.0", "jquery": "^3.6.0" }, "peerDependencies": { - "react": "^17.x", - "react-dom": "^17.x" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, "plugins/ui/src/js/node_modules/@deephaven/grid": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.62.0.tgz", - "integrity": "sha512-rqCfJUtu83ApSSBJPOFx6bUyZG+5PMb+CGx74xg8QQ1OO61whfNOW5+A1DWRPnpK3GdOqmu+KMH39KPCXKVLTg==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.71.0.tgz", + "integrity": "sha512-++oWzFZ4o53q7PgqJlPWnxnXXSgLFU00LTWYTW8qB8nkBkJAW5VjFVTlEmSEwmjbURF0ATNIcH3nMl6oGXaNrQ==", "dependencies": { - "@deephaven/utils": "^0.62.0", + "@deephaven/utils": "^0.71.0", "classnames": "^2.3.1", "color-convert": "^2.0.1", "event-target-shim": "^6.0.2", @@ -36519,13 +35694,13 @@ "node": ">=16" }, "peerDependencies": { - "react": "^17.x" + "react": ">=16.8.0" } }, "plugins/ui/src/js/node_modules/@deephaven/icons": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.62.0.tgz", - "integrity": "sha512-KQUftXbKj5Oww+Fxjto+wDcr8sFUP1ghhl6ZlynfbIx7KJg6QM6LDwyHIfMv+RX1MQID+i9gcGLnPfBYak7d6A==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.71.0.tgz", + "integrity": "sha512-O7ZO+DAM8EXf/GR2sZ/Vl16ciXaTFEoFXMlExj/EXvBAr3ceILuLlh6YLtc12yxI+i3EkBB2DZWIhEURNzH0tQ==", "dependencies": { "@fortawesome/fontawesome-common-types": "^6.1.1" }, @@ -36535,25 +35710,25 @@ } }, "plugins/ui/src/js/node_modules/@deephaven/iris-grid": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.62.0.tgz", - "integrity": "sha512-LkEbiCEE7MlBC0coaA6gw0tTG77+sV2FDmmK4MuTf0R6PE+EwXCtRdRPrknbBq4DsZynAsWRKB5PIBszQdt3Cw==", - "dependencies": { - "@deephaven/components": "^0.62.0", - "@deephaven/console": "^0.62.0", - "@deephaven/filters": "^0.62.0", - "@deephaven/grid": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/jsapi-components": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/jsapi-utils": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/storage": "^0.62.0", - "@deephaven/utils": "^0.62.0", - "@dnd-kit/core": "^6.0.5", - "@dnd-kit/sortable": "^7.0.0", - "@dnd-kit/utilities": "^3.2.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.71.0.tgz", + "integrity": "sha512-G6VpMuWCV3zzfKmaH9RbfGvq5pcCNpSp+fHpUO+bN3xAOFhB66u48xSS1Ep90YyjCve73QMSju99Uknkh13ILw==", + "dependencies": { + "@deephaven/components": "^0.71.0", + "@deephaven/console": "^0.71.0", + "@deephaven/filters": "^0.71.0", + "@deephaven/grid": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/jsapi-components": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/jsapi-utils": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/storage": "^0.71.0", + "@deephaven/utils": "^0.71.0", + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^7.0.2", + "@dnd-kit/utilities": "^3.2.2", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", "deep-equal": "^2.0.5", @@ -36572,39 +35747,49 @@ "node": ">=10" }, "peerDependencies": { - "react": "^17.x", - "react-dom": "^17.x" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, + "plugins/ui/src/js/node_modules/@deephaven/iris-grid/node_modules/@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + }, "plugins/ui/src/js/node_modules/@deephaven/jsapi-bootstrap": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.62.0.tgz", - "integrity": "sha512-LjXAn2nIyjiIyV7zsjAp921IPrknori6Yzh3RhgqTh8fWLF2x8RNWFpk7AGF/WKfzDJbMrpQ36u3B79PecmTaw==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.71.0.tgz", + "integrity": "sha512-0SEH75x1RwvV2T5c2cLzpOezDy+Dbwg7hg9JCyd9UJQEwY4e7wQVlRE2YRowKWvKvMk6Pd0967K/8ly0c16NRg==", "dependencies": { - "@deephaven/components": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0" + "@deephaven/components": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0" }, "engines": { "node": ">=16" }, "peerDependencies": { - "react": "^17.x" + "react": ">=16.8.0" } }, + "plugins/ui/src/js/node_modules/@deephaven/jsapi-bootstrap/node_modules/@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + }, "plugins/ui/src/js/node_modules/@deephaven/jsapi-components": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.62.0.tgz", - "integrity": "sha512-S1zouiD9Imd6g+UsSmrRRykA3IbHw7LLWxoG26sA6ITuNCXw76vpM++mPWsHkAau3WQNxI9QVEUuhHEWkrnK+g==", - "dependencies": { - "@deephaven/components": "^0.62.0", - "@deephaven/jsapi-bootstrap": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/jsapi-utils": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.71.0.tgz", + "integrity": "sha512-7UF/MVBbp1B0n5Crf4e/ZuCasFaz2mPW7HXt5bEdoIHXA25u9ev32J6lXGDE1xIiZKilvKs6rMDc8o9nPDdiAQ==", + "dependencies": { + "@deephaven/components": "^0.71.0", + "@deephaven/jsapi-bootstrap": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/jsapi-utils": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@types/js-cookie": "^3.0.3", "classnames": "^2.3.2", "js-cookie": "^3.0.5", @@ -36615,26 +35800,28 @@ "node": ">=16" }, "peerDependencies": { - "react": "^17.x" + "react": ">=16.8.0" } }, + "plugins/ui/src/js/node_modules/@deephaven/jsapi-components/node_modules/@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + }, "plugins/ui/src/js/node_modules/@deephaven/jsapi-types": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.62.0.tgz", - "integrity": "sha512-5R/SdTsID37S+tn+l62xOeecSccmnhJtn0/+VOP1taPAZGRcOak36gVJnEos/4hJruiJK1Dri3v9M8P/GfLn8g==", - "engines": { - "node": ">=16" - } + "version": "1.0.0-dev0.33.3", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.3.tgz", + "integrity": "sha512-N0TAylzPpEkPsOgEiWbz5Wm8GMXOzgLXsSDTUmExykveh+/CkBtbZY7W1ZVe6vgvy0Fvikiymd9VIUHQFwsJ5w==" }, "plugins/ui/src/js/node_modules/@deephaven/jsapi-utils": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.62.0.tgz", - "integrity": "sha512-yWAk+zo2DOViROdpWRmA56xDwZotskIgyJCSO+9wFNxIo2YMUJNydtkB0vLWxXj/+lWWo0qTnbbDD+wNFoFTtg==", - "dependencies": { - "@deephaven/filters": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.71.0.tgz", + "integrity": "sha512-8BcMPqApg2w3cL2WgUCggkGHvYkAcqcVkFZxspkx5TOBHiJhXMsazrDwcU8Ss3Cgy8wWh+KS8oP7kMuRoHG/YQ==", + "dependencies": { + "@deephaven/filters": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/log": "^0.71.0", + "@deephaven/utils": "^0.71.0", "lodash.clamp": "^4.0.3", "shortid": "^2.2.16" }, @@ -36642,10 +35829,15 @@ "node": ">=16" } }, + "plugins/ui/src/js/node_modules/@deephaven/jsapi-utils/node_modules/@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + }, "plugins/ui/src/js/node_modules/@deephaven/log": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.62.0.tgz", - "integrity": "sha512-k3CDUJ21u1MzEb/C15qQCGKkXuVzO4Pc3KUTHSYMCyRDyskKbpcyQM88rYiQKFtp2Igyb6mvAdKIj7uubPc8Aw==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.71.0.tgz", + "integrity": "sha512-sHgDLtrl8KRKythq/vnfq0S5sTTWlhJRxJ1YLu9DcfakBefigwWdz1HWoHoKAIS1Y0cBHhrxgoGkpmNZykKsTA==", "dependencies": { "event-target-shim": "^6.0.2" }, @@ -36654,17 +35846,17 @@ } }, "plugins/ui/src/js/node_modules/@deephaven/plugin": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.62.0.tgz", - "integrity": "sha512-IokazAXbWLoITsAlnK+VM3HXtL5zpjH1DWY0mETpJwlMP6kAolhbc/UfDC2bRFYlQzTTHEPjVPVtRskse4JRAA==", - "dependencies": { - "@deephaven/components": "^0.62.0", - "@deephaven/golden-layout": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/iris-grid": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.71.0.tgz", + "integrity": "sha512-zY5Qen0fv6u4TAyi6+fha4tBXSfApC6/KVt2qeDDKYjJPGbbaFqP5PE9aGD1PW+5ilS/txsl1z2CqxGkdnDTPQ==", + "dependencies": { + "@deephaven/components": "^0.71.0", + "@deephaven/golden-layout": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/iris-grid": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", "@fortawesome/fontawesome-common-types": "^6.1.1", "@fortawesome/react-fontawesome": "^0.2.0" }, @@ -36672,17 +35864,22 @@ "node": ">=16" }, "peerDependencies": { - "react": "^17.x" + "react": ">=16.8.0" } }, + "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + }, "plugins/ui/src/js/node_modules/@deephaven/react-hooks": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.62.0.tgz", - "integrity": "sha512-jlCqhSWa9V/jyfynZjPc+WlbQQAnhIilpQvI7bdU9q4fTRDfQvd0nSqr0sA0xODgGq8kBgz+6yzZ9yVWsg7IIA==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.71.0.tgz", + "integrity": "sha512-Jw6PeoYSUGoWzTH4NQyZbUIf/SayaycbMyCLc87925BIdrcdvIXuqEHey1gZAJ9PvER5RvcB/mHOds+jAnkV1g==", "dependencies": { - "@adobe/react-spectrum": "^3.29.0", - "@deephaven/log": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "@adobe/react-spectrum": "^3.34.1", + "@deephaven/log": "^0.71.0", + "@deephaven/utils": "^0.71.0", "lodash.debounce": "^4.0.8", "shortid": "^2.2.16" }, @@ -36690,18 +35887,18 @@ "node": ">=16" }, "peerDependencies": { - "react": "^17.x" + "react": ">=16.8.0" } }, "plugins/ui/src/js/node_modules/@deephaven/redux": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.62.0.tgz", - "integrity": "sha512-vmbSAKymKrPlgo3NJ8S/fl/ifjBv3R9pC0Ms/1HqsfNOftXKVlUKSRv/crZPcNWoLsD7fSufPs2lLVQijgXvjg==", - "dependencies": { - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/jsapi-utils": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/plugin": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.71.0.tgz", + "integrity": "sha512-CVL6YAmJedwkxaeBRvxKoX5f15SpfQPjU1ew7AZ7sG4Ycz0CrlXWFvpK4J95hciBro45nxRjd6JXBsue4GB1Bg==", + "dependencies": { + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/jsapi-utils": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/plugin": "^0.71.0", "deep-equal": "^2.0.5", "redux-thunk": "2.4.1" }, @@ -36712,30 +35909,58 @@ "redux": "^4.2.0" } }, + "plugins/ui/src/js/node_modules/@deephaven/redux/node_modules/@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + }, "plugins/ui/src/js/node_modules/@deephaven/storage": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.62.0.tgz", - "integrity": "sha512-4ALHUPLTkNxmI3rxtjQ46631SIMQZlCI4lwamjQufg06f/KNPOkS2VIp2ZRoyiHhha0pnGADaOWqB6bAdKMMFA==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.71.0.tgz", + "integrity": "sha512-JgWPlIjPmdqu8yIFOTEzGdM596ie197579box2BYpNa9qoiBjZSxPdSlhGiKA9eyEYtt7KU/K+27k8O8PCedDw==", "dependencies": { - "@deephaven/filters": "^0.62.0", - "@deephaven/log": "^0.62.0", + "@deephaven/filters": "^0.71.0", + "@deephaven/log": "^0.71.0", "lodash.throttle": "^4.1.1" }, "engines": { "node": ">=16" }, "peerDependencies": { - "react": "^17.x" + "react": ">=16.8.0" } }, "plugins/ui/src/js/node_modules/@deephaven/utils": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.62.0.tgz", - "integrity": "sha512-faAhWYpMBSXNVD9hw9VP88pIbNkcPqQkodTdSEitc5MguYg65pP2a63ylYkR0xCgWM5jViy797LY1w3c8ZGgIA==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.71.0.tgz", + "integrity": "sha512-Cf9vlo7n41GdsitP8V+m5hOc0cy/BRUt3hjud/TE/KdYrLy9QHHJxPa3DyQ8gs1/J7EE0J8Ld6djhyOQrCpa4Q==", "engines": { "node": ">=16" } }, + "plugins/ui/src/js/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "plugins/ui/src/js/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -36763,12 +35988,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "plugins/ui/src/js/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "peer": true - }, "plugins/ui/src/js/node_modules/redux-thunk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", @@ -36804,66 +36023,80 @@ "dev": true }, "@adobe/react-spectrum": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.32.2.tgz", - "integrity": "sha512-dKDJquOlpATCe09Tf+hWwPRCFZOtIFQB0Sj79lf4ypUHONuHZCTzBz287OmnzflbvlRD8igUVru76e+xORD+YQ==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-spectrum/actionbar": "^3.4.0", - "@react-spectrum/actiongroup": "^3.10.0", - "@react-spectrum/avatar": "^3.0.7", - "@react-spectrum/badge": "^3.1.8", - "@react-spectrum/breadcrumbs": "^3.9.2", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/buttongroup": "^3.6.8", - "@react-spectrum/calendar": "^3.4.3", - "@react-spectrum/checkbox": "^3.9.0", - "@react-spectrum/combobox": "^3.11.2", - "@react-spectrum/contextualhelp": "^3.6.5", - "@react-spectrum/datepicker": "^3.9.0", - "@react-spectrum/dialog": "^3.8.5", - "@react-spectrum/divider": "^3.5.8", - "@react-spectrum/dnd": "^3.3.5", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/icon": "^3.7.8", - "@react-spectrum/illustratedmessage": "^3.4.8", - "@react-spectrum/image": "^3.4.8", - "@react-spectrum/inlinealert": "^3.2.0", - "@react-spectrum/labeledvalue": "^3.1.8", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/link": "^3.6.2", - "@react-spectrum/list": "^3.7.4", - "@react-spectrum/listbox": "^3.12.4", - "@react-spectrum/menu": "^3.16.0", - "@react-spectrum/meter": "^3.4.8", - "@react-spectrum/numberfield": "^3.8.0", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/picker": "^3.13.2", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/provider": "^3.9.2", - "@react-spectrum/radio": "^3.7.0", - "@react-spectrum/searchfield": "^3.8.0", - "@react-spectrum/slider": "^3.6.4", - "@react-spectrum/statuslight": "^3.5.8", - "@react-spectrum/switch": "^3.5.0", - "@react-spectrum/table": "^3.12.4", - "@react-spectrum/tabs": "^3.8.4", - "@react-spectrum/tag": "^3.2.0", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/textfield": "^3.11.0", - "@react-spectrum/theme-dark": "^3.5.7", - "@react-spectrum/theme-default": "^3.5.7", - "@react-spectrum/theme-light": "^3.4.7", - "@react-spectrum/tooltip": "^3.6.2", - "@react-spectrum/view": "^3.6.5", - "@react-spectrum/well": "^3.4.8", - "@react-stately/collections": "^3.10.3", - "@react-stately/data": "^3.11.0", - "@react-types/shared": "^3.22.0" - } + "version": "3.34.1", + "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.34.1.tgz", + "integrity": "sha512-J1HOjntW+H8xusfc5xLnIlUXNOzllp4f7qzh3LlDOsZuH8oBH8sIYmBVp4ijVhRFUKa10qg088role1On3UGbg==", + "requires": { + "@internationalized/string": "^3.2.1", + "@react-aria/i18n": "^3.10.2", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-spectrum/actionbar": "^3.4.3", + "@react-spectrum/actiongroup": "^3.10.3", + "@react-spectrum/avatar": "^3.0.10", + "@react-spectrum/badge": "^3.1.11", + "@react-spectrum/breadcrumbs": "^3.9.5", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/buttongroup": "^3.6.11", + "@react-spectrum/calendar": "^3.4.7", + "@react-spectrum/checkbox": "^3.9.4", + "@react-spectrum/combobox": "^3.12.3", + "@react-spectrum/contextualhelp": "^3.6.9", + "@react-spectrum/datepicker": "^3.9.4", + "@react-spectrum/dialog": "^3.8.9", + "@react-spectrum/divider": "^3.5.11", + "@react-spectrum/dnd": "^3.3.8", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/icon": "^3.7.11", + "@react-spectrum/illustratedmessage": "^3.4.11", + "@react-spectrum/image": "^3.4.11", + "@react-spectrum/inlinealert": "^3.2.3", + "@react-spectrum/labeledvalue": "^3.1.12", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/link": "^3.6.5", + "@react-spectrum/list": "^3.7.8", + "@react-spectrum/listbox": "^3.12.7", + "@react-spectrum/menu": "^3.18.1", + "@react-spectrum/meter": "^3.4.11", + "@react-spectrum/numberfield": "^3.9.1", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/picker": "^3.14.3", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/provider": "^3.9.5", + "@react-spectrum/radio": "^3.7.4", + "@react-spectrum/searchfield": "^3.8.4", + "@react-spectrum/slider": "^3.6.7", + "@react-spectrum/statuslight": "^3.5.11", + "@react-spectrum/switch": "^3.5.3", + "@react-spectrum/table": "^3.12.8", + "@react-spectrum/tabs": "^3.8.8", + "@react-spectrum/tag": "^3.2.4", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/textfield": "^3.11.4", + "@react-spectrum/theme-dark": "^3.5.8", + "@react-spectrum/theme-default": "^3.5.8", + "@react-spectrum/theme-light": "^3.4.8", + "@react-spectrum/tooltip": "^3.6.5", + "@react-spectrum/view": "^3.6.8", + "@react-spectrum/well": "^3.4.11", + "@react-stately/collections": "^3.10.5", + "@react-stately/data": "^3.11.2", + "@react-types/shared": "^3.22.1", + "client-only": "^0.0.1" + } + }, + "@adobe/react-spectrum-ui": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-ui/-/react-spectrum-ui-1.2.0.tgz", + "integrity": "sha512-os3EdjfyJbrukLcZ5uYtdFRiDlLB3zq2JoXp19J/IDpZ8btibJeRZYSwjL+LscEiT2pOYaF2McMQdkZTIwnllw==", + "requires": {} + }, + "@adobe/react-spectrum-workflow": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-workflow/-/react-spectrum-workflow-2.3.4.tgz", + "integrity": "sha512-XPLzIBl58HdLF9WIPB7RDAvVXvCE3SjG+HaWQhW2P9MnxSz1DEA9O7mlTlYblJkMbfk10T/+RFaSupc1yoN+TA==", + "requires": {} }, "@ampproject/remapping": { "version": "2.2.1", @@ -38259,32 +37492,32 @@ } }, "@csstools/css-parser-algorithms": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz", - "integrity": "sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", + "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", "dev": true, "peer": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz", - "integrity": "sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", + "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", "dev": true, "peer": true }, "@csstools/media-query-list-parser": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz", - "integrity": "sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", + "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", "dev": true, "peer": true, "requires": {} }, "@csstools/selector-specificity": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", - "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz", + "integrity": "sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==", "dev": true, "peer": true, "requires": {} @@ -38764,21 +37997,6 @@ "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.64.0.tgz", "integrity": "sha512-lt9cXEw0j2KMmUvR/+jmrpmWihrkYxNmhClW778WLFf0oi6Y4V/hsJxiNz+QvFvNbg3HqU6ZBMPHOtCNjKe7bQ==" }, - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" - }, - "ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" - }, - "comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" - }, "escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -38794,26 +38012,6 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" }, - "longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" - }, - "markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==" - }, - "mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - } - }, "mdast-util-find-and-replace": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", @@ -38968,57 +38166,6 @@ } } }, - "mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "requires": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "dependencies": { - "micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==" - }, - "micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==" - }, - "micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==" - } - } - }, "mdast-util-to-markdown": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", @@ -39172,69 +38319,6 @@ "micromark-util-types": "^2.0.0" } }, - "micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "dependencies": { - "micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==" - }, - "micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==" - } - } - }, - "micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "dependencies": { - "micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==" - }, - "micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==" - } - } - }, "micromark-factory-space": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", @@ -39244,88 +38328,6 @@ "micromark-util-types": "^2.0.0" } }, - "micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "dependencies": { - "micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==" - }, - "micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==" - } - } - }, - "micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "dependencies": { - "micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==" - }, - "micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==" - } - } - }, "micromark-util-character": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", @@ -39335,11 +38337,6 @@ "micromark-util-types": "^2.0.0" } }, - "micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==" - }, "micromark-util-symbol": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", @@ -39350,40 +38347,6 @@ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==" }, - "property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==" - }, - "react-markdown": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", - "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", - "requires": { - "@types/hast": "^2.0.0", - "@types/prop-types": "^15.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "prop-types": "^15.0.0", - "property-information": "^6.0.0", - "react-is": "^18.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" - }, - "dependencies": { - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - } - } - }, "redux-thunk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", @@ -39462,264 +38425,6 @@ } } }, - "remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "dependencies": { - "mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - } - }, - "mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "requires": { - "@types/mdast": "^3.0.0" - } - }, - "micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==" - }, - "micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "requires": { - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==" - }, - "micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==" - }, - "unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "requires": { - "@types/unist": "^2.0.0" - } - } - } - }, - "remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "requires": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - } - }, - "space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" - }, - "style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" - }, - "unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - } - }, - "unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==" - }, "unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -39735,14 +38440,6 @@ } } }, - "unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "requires": { - "@types/unist": "^2.0.0" - } - }, "unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -39758,35 +38455,6 @@ } } }, - "unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "dependencies": { - "unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "requires": { - "@types/unist": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - } - } - } - }, "unist-util-visit-parents": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", @@ -39802,51 +38470,6 @@ "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" } } - }, - "vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "dependencies": { - "unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "requires": { - "@types/unist": "^2.0.0" - } - } - } - }, - "vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "dependencies": { - "unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "requires": { - "@types/unist": "^2.0.0" - } - } - } - }, - "zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" } } }, @@ -40973,7 +39596,7 @@ "@deephaven/utils": "^0.40.0", "@types/react": "^17.0.2", "@vitejs/plugin-react-swc": "^3.0.0", - "plotly.js-dist-min": "^2.20.0", + "plotly.js-dist-min": "^2.29.1", "prop-types": "^15.8.1", "react": "^17.0.2", "react-plotly.js": "^2.4.0", @@ -41008,8 +39631,8 @@ "@types/react-plotly.js": "^2.6.0", "@vitejs/plugin-react-swc": "^3.0.0", "deep-equal": "^2.2.1", - "plotly.js": "^2.23.0", - "plotly.js-dist-min": "^2.23.0", + "plotly.js": "^2.29.1", + "plotly.js-dist-min": "^2.29.1", "react": "^17.0.2", "react-plotly.js": "^2.4.0", "react-redux": "^7.2.9", @@ -41167,20 +39790,22 @@ "@deephaven/js-plugin-ui": { "version": "file:plugins/ui/src/js", "requires": { - "@adobe/react-spectrum": "^3.29.0", - "@deephaven/chart": "0.62.0", - "@deephaven/components": "0.62.0", - "@deephaven/dashboard": "0.62.0", - "@deephaven/dashboard-core-plugins": "0.62.0", - "@deephaven/icons": "0.62.0", - "@deephaven/iris-grid": "0.62.0", - "@deephaven/jsapi-bootstrap": "0.62.0", - "@deephaven/jsapi-components": "0.62.0", - "@deephaven/jsapi-types": "0.62.0", - "@deephaven/log": "0.62.0", - "@deephaven/plugin": "0.62.0", - "@deephaven/react-hooks": "0.62.0", - "@deephaven/utils": "0.62.0", + "@adobe/react-spectrum": "^3.34.1", + "@deephaven/chart": "^0.71.0", + "@deephaven/components": "^0.71.0", + "@deephaven/dashboard": "^0.71.0", + "@deephaven/dashboard-core-plugins": "^0.71.0", + "@deephaven/grid": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/iris-grid": "^0.71.0", + "@deephaven/jsapi-bootstrap": "^0.71.0", + "@deephaven/jsapi-components": "^0.71.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.33.3", + "@deephaven/log": "^0.71.0", + "@deephaven/plugin": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/redux": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/react-fontawesome": "^0.2.0", "@react-types/shared": "^3.22.0", "@types/react": "^17.0.2", @@ -41188,46 +39813,57 @@ "json-rpc-2.0": "^1.6.0", "react": "^17.0.2", "react-dom": "^17.0.2", + "react-redux": "^7.x", "shortid": "^2.2.16", "typescript": "^4.5.4", "vite": "~4.1.4" }, "dependencies": { "@deephaven/chart": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.62.0.tgz", - "integrity": "sha512-zakQjG0V+QYdHsr01ThQS2ffhaCnF2a9GtlUDhw43qYfHeEiC2IkkinizY2pYgSJf2CPLNe7ibiIBflifQSBMQ==", - "requires": { - "@deephaven/components": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/jsapi-utils": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.71.0.tgz", + "integrity": "sha512-/dv07HJSMxywWBrdTzhD1/1rDpX3k2FN3PYLlSrXixGhUdNhiYKxgT9mhbZ5ETt5JZ6Tn0oktiiuCjp9u839QA==", + "requires": { + "@deephaven/components": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/jsapi-utils": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/utils": "^0.71.0", + "buffer": "^6.0.3", "deep-equal": "^2.0.5", "lodash.debounce": "^4.0.8", "lodash.set": "^4.3.2", "memoize-one": "^5.1.1", "memoizee": "^0.4.15", - "plotly.js": "^2.18.2", + "plotly.js": "^2.29.1", "prop-types": "^15.7.2", "react-plotly.js": "^2.6.0" + }, + "dependencies": { + "@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + } } }, "@deephaven/components": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.62.0.tgz", - "integrity": "sha512-VKHZgsOO/VL1o9CS794eeRAa28lMQCLRrFbp3KgMBGvZVC68+rtuNpxWnc4zRZLZJxFiAxJbyJcleZS6QyW5Vg==", - "requires": { - "@adobe/react-spectrum": "^3.29.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.71.0.tgz", + "integrity": "sha512-o9NaRpu0BGyd0pdtxDYVva8YoIP5vFU1sQ11wv8SZ8mnCGT9iY2LA8jMpeKlfefAcKp4gGNLHaDh4wQ6F66Gwg==", + "requires": { + "@adobe/react-spectrum": "^3.34.1", + "@deephaven/icons": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/react-fontawesome": "^0.2.0", "@react-spectrum/theme-default": "^3.5.1", + "@react-types/shared": "^3.22.1", + "@react-types/textfield": "^3.9.1", "bootstrap": "4.6.2", "classnames": "^2.3.1", "event-target-shim": "^6.0.2", @@ -41245,19 +39881,19 @@ } }, "@deephaven/console": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.62.0.tgz", - "integrity": "sha512-9jDywMHxiNpUjMMXQhQwI6vwnhEseG1Jf+RreZuTKVFJ4VTmhRg/xG14Bd6p/D6ichVQ4jGtMSLHKmYFYZ9HZg==", - "requires": { - "@deephaven/chart": "^0.62.0", - "@deephaven/components": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/jsapi-bootstrap": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/storage": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.71.0.tgz", + "integrity": "sha512-eSfRuLAbIsnLLE5tSStGY09apYyM3tJNst/iOuPGNgtSku0UHutr/N9LbK+XU3Mby11D/JQzkbTCD54Ba+R1Yg==", + "requires": { + "@deephaven/chart": "^0.71.0", + "@deephaven/components": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/jsapi-bootstrap": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/storage": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", "linkifyjs": "^4.1.0", @@ -41271,19 +39907,26 @@ "prop-types": "^15.7.2", "shell-quote": "^1.7.2", "shortid": "^2.2.16" + }, + "dependencies": { + "@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + } } }, "@deephaven/dashboard": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.62.0.tgz", - "integrity": "sha512-tBrpe52cl+UK2jtGGz7lIAJdxNm1givhquz4JKEBDJ/k8rqWwucXsxLgJ22nGASzct14xBk2Gb5IeuH/swkUDg==", - "requires": { - "@deephaven/components": "^0.62.0", - "@deephaven/golden-layout": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/redux": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.71.0.tgz", + "integrity": "sha512-0u0CqLx0KO5R4kYdlvRJbDNNew4fUAKv37xQCiwOnJCHBBkCiHBxysH/Qr4DZ4yBPCgun5HQw6q1B2pdAlAccQ==", + "requires": { + "@deephaven/components": "^0.71.0", + "@deephaven/golden-layout": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/redux": "^0.71.0", + "@deephaven/utils": "^0.71.0", "deep-equal": "^2.0.5", "lodash.ismatch": "^4.1.1", "lodash.throttle": "^4.1.1", @@ -41292,30 +39935,30 @@ } }, "@deephaven/dashboard-core-plugins": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.62.0.tgz", - "integrity": "sha512-c5pULTIPABzEJJSZRPBnCmt6OKxt9Vcy4riI0WX7wj+ZDvfo+Sg59ErBpSoY3bHgDsUzV28bmh2Vn+RBQNN8vQ==", - "requires": { - "@deephaven/chart": "^0.62.0", - "@deephaven/components": "^0.62.0", - "@deephaven/console": "^0.62.0", - "@deephaven/dashboard": "^0.62.0", - "@deephaven/file-explorer": "^0.62.0", - "@deephaven/filters": "^0.62.0", - "@deephaven/golden-layout": "^0.62.0", - "@deephaven/grid": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/iris-grid": "^0.62.0", - "@deephaven/jsapi-bootstrap": "^0.62.0", - "@deephaven/jsapi-components": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/jsapi-utils": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/plugin": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/redux": "^0.62.0", - "@deephaven/storage": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.71.0.tgz", + "integrity": "sha512-HufxV+hikNlaut0eE1+Hup7hEWX5YTFyzQTZLx4iH/AZY3vBlXoxgMvZOW8oMSXLsJT3vTqqEB6bpI2lG1eC5Q==", + "requires": { + "@deephaven/chart": "^0.71.0", + "@deephaven/components": "^0.71.0", + "@deephaven/console": "^0.71.0", + "@deephaven/dashboard": "^0.71.0", + "@deephaven/file-explorer": "^0.71.0", + "@deephaven/filters": "^0.71.0", + "@deephaven/golden-layout": "^0.71.0", + "@deephaven/grid": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/iris-grid": "^0.71.0", + "@deephaven/jsapi-bootstrap": "^0.71.0", + "@deephaven/jsapi-components": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/jsapi-utils": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/plugin": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/redux": "^0.71.0", + "@deephaven/storage": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", "deep-equal": "^2.0.5", @@ -41325,24 +39968,32 @@ "memoize-one": "^5.1.1", "memoizee": "^0.4.15", "prop-types": "^15.7.2", - "react-markdown": "^6.0.2", - "react-transition-group": "^4.4.2", + "react-markdown": "^8.0.7", "redux": "^4.2.0", "redux-thunk": "^2.4.1", - "remark-gfm": "1.0.0", + "rehype-mathjax": "^4.0.3", + "remark-gfm": "^3.0.1", + "remark-math": "^5.1.1", "shortid": "^2.2.16" + }, + "dependencies": { + "@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + } } }, "@deephaven/file-explorer": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.62.0.tgz", - "integrity": "sha512-pc6cH34DNkRxeWgy2ofGv/HUIGpI57LWLxVlnPqX7El/Q+Ma3cSBqj1sQH0uz5uNwP5WHv8q0L32JrJXJef0/Q==", - "requires": { - "@deephaven/components": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/storage": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.71.0.tgz", + "integrity": "sha512-p1nSlMZgL8lkQHDP+NDQNoY8RV2Vs+KdPNhDqpsAE1bS6ZtpdOEnyoCfrDBoZ4RuV3yj21byFZs/PqXY/GJ6fg==", + "requires": { + "@deephaven/components": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/storage": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", @@ -41351,25 +40002,25 @@ } }, "@deephaven/filters": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.62.0.tgz", - "integrity": "sha512-WTa3z250SRoh8xYmL3gdfddPOwqZBj95sVKaj3LBGGepcTO0Me3vCp9nODl8MyUBaOGBsCXIsrnWX6DFjkiGLQ==" + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.71.0.tgz", + "integrity": "sha512-qt1dYNXPTxWUmaOgyQ5/3z6IViYVlkIG9FqKRmokWtfHabTNLc/eeM6XfUAPBmAgkC8Aawe8xtRrkaPd8knqyg==" }, "@deephaven/golden-layout": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.62.0.tgz", - "integrity": "sha512-eeXz4GHm3JO8S8GNr5SGrdoeyuktwsH8cFwDy5V3WOVut1QwGVkPiTNb63Lt7F55rdLeuOHVdsXDYNDnDUcZtQ==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.71.0.tgz", + "integrity": "sha512-kpqJDJC+cwQlY7YN93kscdkm9Edy68ptRNdiSSPwwcY1hdr/NbdR+NuZNtqy2VOp9AV4GGKsoKlpa+HQb1YDXA==", "requires": { - "@deephaven/components": "^0.62.0", + "@deephaven/components": "^0.71.0", "jquery": "^3.6.0" } }, "@deephaven/grid": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.62.0.tgz", - "integrity": "sha512-rqCfJUtu83ApSSBJPOFx6bUyZG+5PMb+CGx74xg8QQ1OO61whfNOW5+A1DWRPnpK3GdOqmu+KMH39KPCXKVLTg==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.71.0.tgz", + "integrity": "sha512-++oWzFZ4o53q7PgqJlPWnxnXXSgLFU00LTWYTW8qB8nkBkJAW5VjFVTlEmSEwmjbURF0ATNIcH3nMl6oGXaNrQ==", "requires": { - "@deephaven/utils": "^0.62.0", + "@deephaven/utils": "^0.71.0", "classnames": "^2.3.1", "color-convert": "^2.0.1", "event-target-shim": "^6.0.2", @@ -41381,33 +40032,33 @@ } }, "@deephaven/icons": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.62.0.tgz", - "integrity": "sha512-KQUftXbKj5Oww+Fxjto+wDcr8sFUP1ghhl6ZlynfbIx7KJg6QM6LDwyHIfMv+RX1MQID+i9gcGLnPfBYak7d6A==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.71.0.tgz", + "integrity": "sha512-O7ZO+DAM8EXf/GR2sZ/Vl16ciXaTFEoFXMlExj/EXvBAr3ceILuLlh6YLtc12yxI+i3EkBB2DZWIhEURNzH0tQ==", "requires": { "@fortawesome/fontawesome-common-types": "^6.1.1" } }, "@deephaven/iris-grid": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.62.0.tgz", - "integrity": "sha512-LkEbiCEE7MlBC0coaA6gw0tTG77+sV2FDmmK4MuTf0R6PE+EwXCtRdRPrknbBq4DsZynAsWRKB5PIBszQdt3Cw==", - "requires": { - "@deephaven/components": "^0.62.0", - "@deephaven/console": "^0.62.0", - "@deephaven/filters": "^0.62.0", - "@deephaven/grid": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/jsapi-components": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/jsapi-utils": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/storage": "^0.62.0", - "@deephaven/utils": "^0.62.0", - "@dnd-kit/core": "^6.0.5", - "@dnd-kit/sortable": "^7.0.0", - "@dnd-kit/utilities": "^3.2.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.71.0.tgz", + "integrity": "sha512-G6VpMuWCV3zzfKmaH9RbfGvq5pcCNpSp+fHpUO+bN3xAOFhB66u48xSS1Ep90YyjCve73QMSju99Uknkh13ILw==", + "requires": { + "@deephaven/components": "^0.71.0", + "@deephaven/console": "^0.71.0", + "@deephaven/filters": "^0.71.0", + "@deephaven/grid": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/jsapi-components": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/jsapi-utils": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/storage": "^0.71.0", + "@deephaven/utils": "^0.71.0", + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^7.0.2", + "@dnd-kit/utilities": "^3.2.2", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", "deep-equal": "^2.0.5", @@ -41421,119 +40072,170 @@ "react-beautiful-dnd": "^13.1.0", "react-transition-group": "^4.4.2", "shortid": "^2.2.16" + }, + "dependencies": { + "@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + } } }, "@deephaven/jsapi-bootstrap": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.62.0.tgz", - "integrity": "sha512-LjXAn2nIyjiIyV7zsjAp921IPrknori6Yzh3RhgqTh8fWLF2x8RNWFpk7AGF/WKfzDJbMrpQ36u3B79PecmTaw==", - "requires": { - "@deephaven/components": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0" + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.71.0.tgz", + "integrity": "sha512-0SEH75x1RwvV2T5c2cLzpOezDy+Dbwg7hg9JCyd9UJQEwY4e7wQVlRE2YRowKWvKvMk6Pd0967K/8ly0c16NRg==", + "requires": { + "@deephaven/components": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0" + }, + "dependencies": { + "@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + } } }, "@deephaven/jsapi-components": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.62.0.tgz", - "integrity": "sha512-S1zouiD9Imd6g+UsSmrRRykA3IbHw7LLWxoG26sA6ITuNCXw76vpM++mPWsHkAau3WQNxI9QVEUuhHEWkrnK+g==", - "requires": { - "@deephaven/components": "^0.62.0", - "@deephaven/jsapi-bootstrap": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/jsapi-utils": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.71.0.tgz", + "integrity": "sha512-7UF/MVBbp1B0n5Crf4e/ZuCasFaz2mPW7HXt5bEdoIHXA25u9ev32J6lXGDE1xIiZKilvKs6rMDc8o9nPDdiAQ==", + "requires": { + "@deephaven/components": "^0.71.0", + "@deephaven/jsapi-bootstrap": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/jsapi-utils": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@types/js-cookie": "^3.0.3", "classnames": "^2.3.2", "js-cookie": "^3.0.5", "lodash.debounce": "^4.0.8", "prop-types": "^15.8.1" + }, + "dependencies": { + "@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + } } }, "@deephaven/jsapi-types": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.62.0.tgz", - "integrity": "sha512-5R/SdTsID37S+tn+l62xOeecSccmnhJtn0/+VOP1taPAZGRcOak36gVJnEos/4hJruiJK1Dri3v9M8P/GfLn8g==" + "version": "1.0.0-dev0.33.3", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.3.tgz", + "integrity": "sha512-N0TAylzPpEkPsOgEiWbz5Wm8GMXOzgLXsSDTUmExykveh+/CkBtbZY7W1ZVe6vgvy0Fvikiymd9VIUHQFwsJ5w==" }, "@deephaven/jsapi-utils": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.62.0.tgz", - "integrity": "sha512-yWAk+zo2DOViROdpWRmA56xDwZotskIgyJCSO+9wFNxIo2YMUJNydtkB0vLWxXj/+lWWo0qTnbbDD+wNFoFTtg==", - "requires": { - "@deephaven/filters": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.71.0.tgz", + "integrity": "sha512-8BcMPqApg2w3cL2WgUCggkGHvYkAcqcVkFZxspkx5TOBHiJhXMsazrDwcU8Ss3Cgy8wWh+KS8oP7kMuRoHG/YQ==", + "requires": { + "@deephaven/filters": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/log": "^0.71.0", + "@deephaven/utils": "^0.71.0", "lodash.clamp": "^4.0.3", "shortid": "^2.2.16" + }, + "dependencies": { + "@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + } } }, "@deephaven/log": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.62.0.tgz", - "integrity": "sha512-k3CDUJ21u1MzEb/C15qQCGKkXuVzO4Pc3KUTHSYMCyRDyskKbpcyQM88rYiQKFtp2Igyb6mvAdKIj7uubPc8Aw==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.71.0.tgz", + "integrity": "sha512-sHgDLtrl8KRKythq/vnfq0S5sTTWlhJRxJ1YLu9DcfakBefigwWdz1HWoHoKAIS1Y0cBHhrxgoGkpmNZykKsTA==", "requires": { "event-target-shim": "^6.0.2" } }, "@deephaven/plugin": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.62.0.tgz", - "integrity": "sha512-IokazAXbWLoITsAlnK+VM3HXtL5zpjH1DWY0mETpJwlMP6kAolhbc/UfDC2bRFYlQzTTHEPjVPVtRskse4JRAA==", - "requires": { - "@deephaven/components": "^0.62.0", - "@deephaven/golden-layout": "^0.62.0", - "@deephaven/icons": "^0.62.0", - "@deephaven/iris-grid": "^0.62.0", - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/react-hooks": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.71.0.tgz", + "integrity": "sha512-zY5Qen0fv6u4TAyi6+fha4tBXSfApC6/KVt2qeDDKYjJPGbbaFqP5PE9aGD1PW+5ilS/txsl1z2CqxGkdnDTPQ==", + "requires": { + "@deephaven/components": "^0.71.0", + "@deephaven/golden-layout": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/iris-grid": "^0.71.0", + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/log": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", "@fortawesome/fontawesome-common-types": "^6.1.1", "@fortawesome/react-fontawesome": "^0.2.0" + }, + "dependencies": { + "@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + } } }, "@deephaven/react-hooks": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.62.0.tgz", - "integrity": "sha512-jlCqhSWa9V/jyfynZjPc+WlbQQAnhIilpQvI7bdU9q4fTRDfQvd0nSqr0sA0xODgGq8kBgz+6yzZ9yVWsg7IIA==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.71.0.tgz", + "integrity": "sha512-Jw6PeoYSUGoWzTH4NQyZbUIf/SayaycbMyCLc87925BIdrcdvIXuqEHey1gZAJ9PvER5RvcB/mHOds+jAnkV1g==", "requires": { - "@adobe/react-spectrum": "^3.29.0", - "@deephaven/log": "^0.62.0", - "@deephaven/utils": "^0.62.0", + "@adobe/react-spectrum": "^3.34.1", + "@deephaven/log": "^0.71.0", + "@deephaven/utils": "^0.71.0", "lodash.debounce": "^4.0.8", "shortid": "^2.2.16" } }, "@deephaven/redux": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.62.0.tgz", - "integrity": "sha512-vmbSAKymKrPlgo3NJ8S/fl/ifjBv3R9pC0Ms/1HqsfNOftXKVlUKSRv/crZPcNWoLsD7fSufPs2lLVQijgXvjg==", - "requires": { - "@deephaven/jsapi-types": "^0.62.0", - "@deephaven/jsapi-utils": "^0.62.0", - "@deephaven/log": "^0.62.0", - "@deephaven/plugin": "^0.62.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.71.0.tgz", + "integrity": "sha512-CVL6YAmJedwkxaeBRvxKoX5f15SpfQPjU1ew7AZ7sG4Ycz0CrlXWFvpK4J95hciBro45nxRjd6JXBsue4GB1Bg==", + "requires": { + "@deephaven/jsapi-types": "1.0.0-dev0.33.1", + "@deephaven/jsapi-utils": "^0.71.0", + "@deephaven/log": "^0.71.0", + "@deephaven/plugin": "^0.71.0", "deep-equal": "^2.0.5", "redux-thunk": "2.4.1" + }, + "dependencies": { + "@deephaven/jsapi-types": { + "version": "1.0.0-dev0.33.1", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.33.1.tgz", + "integrity": "sha512-1f0ZsR7zpXGQFs6vyRovBUECUPg7tNYrzCuHA0iJCrTlJ0FfFDVcDg8uZxsH+11cERcAEs5xdSHXqpo/fM6dKQ==" + } } }, "@deephaven/storage": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.62.0.tgz", - "integrity": "sha512-4ALHUPLTkNxmI3rxtjQ46631SIMQZlCI4lwamjQufg06f/KNPOkS2VIp2ZRoyiHhha0pnGADaOWqB6bAdKMMFA==", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.71.0.tgz", + "integrity": "sha512-JgWPlIjPmdqu8yIFOTEzGdM596ie197579box2BYpNa9qoiBjZSxPdSlhGiKA9eyEYtt7KU/K+27k8O8PCedDw==", "requires": { - "@deephaven/filters": "^0.62.0", - "@deephaven/log": "^0.62.0", + "@deephaven/filters": "^0.71.0", + "@deephaven/log": "^0.71.0", "lodash.throttle": "^4.1.1" } }, "@deephaven/utils": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.62.0.tgz", - "integrity": "sha512-faAhWYpMBSXNVD9hw9VP88pIbNkcPqQkodTdSEitc5MguYg65pP2a63ylYkR0xCgWM5jViy797LY1w3c8ZGgIA==" + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.71.0.tgz", + "integrity": "sha512-Cf9vlo7n41GdsitP8V+m5hOc0cy/BRUt3hjud/TE/KdYrLy9QHHJxPa3DyQ8gs1/J7EE0J8Ld6djhyOQrCpa4Q==" + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } }, "color-convert": { "version": "2.0.1", @@ -41553,11 +40255,6 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz", "integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==" }, - "react-is": { - "version": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "peer": true - }, "redux-thunk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", @@ -41875,6 +40572,13 @@ "tslib": "^2.0.0" } }, + "@dual-bundle/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-ZKXyJeFAzcpKM2kk8ipoGIPUqx9BX52omTGnfwjJvxOCaZTM2wtDK7zN0aIgPRbT9XYAlha0HtmZ+XKteuh0Gw==", + "dev": true, + "peer": true + }, "@esbuild/aix-ppc64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", @@ -42092,11 +40796,11 @@ "dev": true }, "@formatjs/ecma402-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.0.tgz", - "integrity": "sha512-PEVLoa3zBevWSCZzPIM/lvPCi8P5l4G+NXQMc/CjEiaCWgyHieUoo0nM7Bs0n/NbuQ6JpXEolivQ9pKSBHaDlA==", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", + "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", "requires": { - "@formatjs/intl-localematcher": "0.5.2", + "@formatjs/intl-localematcher": "0.5.4", "tslib": "^2.4.0" } }, @@ -42109,28 +40813,28 @@ } }, "@formatjs/icu-messageformat-parser": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.3.tgz", - "integrity": "sha512-X/jy10V9S/vW+qlplqhMUxR8wErQ0mmIYSq4mrjpjDl9mbuGcCILcI1SUYkL5nlM4PJqpc0KOS0bFkkJNPxYRw==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz", + "integrity": "sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==", "requires": { - "@formatjs/ecma402-abstract": "1.18.0", - "@formatjs/icu-skeleton-parser": "1.7.0", + "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/icu-skeleton-parser": "1.8.0", "tslib": "^2.4.0" } }, "@formatjs/icu-skeleton-parser": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.7.0.tgz", - "integrity": "sha512-Cfdo/fgbZzpN/jlN/ptQVe0lRHora+8ezrEeg2RfrNjyp+YStwBy7cqDY8k5/z2LzXg6O0AdzAV91XS0zIWv+A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz", + "integrity": "sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==", "requires": { - "@formatjs/ecma402-abstract": "1.18.0", + "@formatjs/ecma402-abstract": "1.18.2", "tslib": "^2.4.0" } }, "@formatjs/intl-localematcher": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.2.tgz", - "integrity": "sha512-txaaE2fiBMagLrR4jYhxzFO6wEdEG4TPMqrzBAcbr4HFUYzH/YC+lg6OIzKCHm8WgDdyQevxbAAV1OgcXctuGw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", "requires": { "tslib": "^2.4.0" } @@ -42192,34 +40896,34 @@ "dev": true }, "@internationalized/date": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.0.tgz", - "integrity": "sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.2.tgz", + "integrity": "sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==", "requires": { "@swc/helpers": "^0.5.0" } }, "@internationalized/message": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.1.tgz", - "integrity": "sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.2.tgz", + "integrity": "sha512-MHAWsZWz8jf6jFPZqpTudcCM361YMtPIRu9CXkYmKjJ/0R3pQRScV5C0zS+Qi50O5UAm8ecKhkXx6mWDDcF6/g==", "requires": { "@swc/helpers": "^0.5.0", "intl-messageformat": "^10.1.0" } }, "@internationalized/number": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.4.0.tgz", - "integrity": "sha512-8TvotW3qVDHC4uv/BVoN6Qx0Dm8clHY1/vpH+dh+XRiPW/9NVpKn1P8d1A+WLphWrMwyqyWXI7uWehJPviaeIw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.1.tgz", + "integrity": "sha512-N0fPU/nz15SwR9IbfJ5xaS9Ss/O5h1sVXMZf43vc9mxEG48ovglvvzBjF53aHlq20uoR6c+88CrIXipU/LSzwg==", "requires": { "@swc/helpers": "^0.5.0" } }, "@internationalized/string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.1.1.tgz", - "integrity": "sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.1.tgz", + "integrity": "sha512-vWQOvRIauvFMzOO+h7QrdsJmtN1AXAFVcaLWP9AseRN2o7iHceZ6bIXhBD4teZl8i91A3gxKnWBlGgjCwU6MFQ==", "requires": { "@swc/helpers": "^0.5.0" } @@ -44418,6 +43122,15 @@ "dev": true, "optional": true }, + "@playwright/test": { + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.41.2.tgz", + "integrity": "sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==", + "dev": true, + "requires": { + "playwright": "1.41.2" + } + }, "@plotly/d3": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.1.tgz", @@ -44444,6 +43157,35 @@ "elementary-circuits-directed-graph": "^1.0.4" } }, + "@plotly/mapbox-gl": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@plotly/mapbox-gl/-/mapbox-gl-1.13.4.tgz", + "integrity": "sha512-sR3/Pe5LqT/fhYgp4rT4aSFf1rTsxMbGiH6Hojc7PH36ny5Bn17iVFUjpzycafETURuFbLZUfjODO8LvSI+5zQ==", + "requires": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^1.5.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.1.1", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.2", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.2.1", + "grid-index": "^1.1.0", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^7.1.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + } + }, "@plotly/point-cluster": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", @@ -44469,1583 +43211,1584 @@ } }, "@react-aria/actiongroup": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-aria/actiongroup/-/actiongroup-3.7.0.tgz", - "integrity": "sha512-PAOoZbmvcEDy7qpYSXK+lxs7Jl0/7LpRQ+wze2muhsn8bHdPKl67lbUx8qY2L7fcamXNl4sCx/5w/MiS33HbDA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/list": "^3.10.1", - "@react-types/actiongroup": "^3.4.6", - "@react-types/shared": "^3.22.0", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@react-aria/actiongroup/-/actiongroup-3.7.3.tgz", + "integrity": "sha512-o1qw7w7GdL8vsOuzBc2mil+MM1CWWDDZ1+VhWnVwoDVt5Pxj36981leTh/WTS58IQ34N7p/jVdQMraQ25EJJyA==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/list": "^3.10.3", + "@react-types/actiongroup": "^3.4.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/breadcrumbs": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.8.tgz", - "integrity": "sha512-jeek23igeqXct7S3ShW2jtFUc5g3fS9ZEBZkF64FWBrwfCiaZwb8TcKkK/xFw36/q5mxEt+seNiqnNzvsICJuQ==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/link": "^3.6.2", - "@react-aria/utils": "^3.22.0", - "@react-types/breadcrumbs": "^3.7.2", - "@react-types/shared": "^3.22.0", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.11.tgz", + "integrity": "sha512-bQz4g2tKvcWxeqPGj9O0RQf++Ka8f2o/pJMJB+QQ27DVQWhxpQpND//oFku2aFYkxHB/fyD9qVoiqpQR25bidw==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/link": "^3.6.5", + "@react-aria/utils": "^3.23.2", + "@react-types/breadcrumbs": "^3.7.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/button": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.9.0.tgz", - "integrity": "sha512-Jri4OCN+4YmpJDPNQvk1DJoskKD9sdTxZaWWWJdAwoSIunZk3IEBXVvRfKzsEAVtI+UJN25zC2kyjXbVPS2XAA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/toggle": "^3.7.0", - "@react-types/button": "^3.9.1", - "@react-types/shared": "^3.22.0", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.9.3.tgz", + "integrity": "sha512-ZXo2VGTxfbaTEnfeIlm5ym4vYpGAy8sGrad8Scv+EyDAJWLMKokqctfaN6YSWbqUApC3FN63IvMqASflbmnYig==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/toggle": "^3.7.2", + "@react-types/button": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/calendar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.5.3.tgz", - "integrity": "sha512-jW48jk0TIe0HAJS+z8zqd8M86FEuqrk1qEIjMWnf8rFnA7hPPpjdjUrY9vSIeC95NcbyZbFnr1bHzQjAIzosQw==", - "requires": { - "@internationalized/date": "^3.5.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/utils": "^3.22.0", - "@react-stately/calendar": "^3.4.2", - "@react-types/button": "^3.9.1", - "@react-types/calendar": "^3.4.2", - "@react-types/shared": "^3.22.0", + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.5.6.tgz", + "integrity": "sha512-PA0Ur5WcODMn7t2gCUvq61YktkB+WlSZjzDr5kcY3sdl53ZjiyqCa2hYgrb6R0J859LVJXAp+5Qaproz8g1oLA==", + "requires": { + "@internationalized/date": "^3.5.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/utils": "^3.23.2", + "@react-stately/calendar": "^3.4.4", + "@react-types/button": "^3.9.2", + "@react-types/calendar": "^3.4.4", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/checkbox": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.12.0.tgz", - "integrity": "sha512-CyFZoI+z9hhyB3wb7IBsZxE30vXfYO2vSyET16zlkJ4qiFMqMiVLE4ekq034MHltCdpAczgP5yfKgNnJOmj7vQ==", - "requires": { - "@react-aria/form": "^3.0.0", - "@react-aria/label": "^3.7.3", - "@react-aria/toggle": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/checkbox": "^3.6.0", - "@react-stately/form": "^3.0.0", - "@react-stately/toggle": "^3.7.0", - "@react-types/checkbox": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.14.1.tgz", + "integrity": "sha512-b4rtrg5SpRSa9jBOqzJMmprJ+jDi3KyVvUh+DsvISe5Ti7gVAhMBgnca1D0xBp22w2jhk/o4gyu1bYxGLum0GA==", + "requires": { + "@react-aria/form": "^3.0.3", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/toggle": "^3.10.2", + "@react-aria/utils": "^3.23.2", + "@react-stately/checkbox": "^3.6.3", + "@react-stately/form": "^3.0.1", + "@react-stately/toggle": "^3.7.2", + "@react-types/checkbox": "^3.7.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/combobox": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.8.0.tgz", - "integrity": "sha512-lInzzZrH4vFlxmvDpXgQRkkREm7YIx258IRpQqll8Bny2vKMmZoF06zWMbcHP0CjFqYxExQeTjSYx0OTRRxkCQ==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/listbox": "^3.11.2", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/menu": "^3.11.2", - "@react-aria/overlays": "^3.19.0", - "@react-aria/selection": "^3.17.2", - "@react-aria/textfield": "^3.13.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/collections": "^3.10.3", - "@react-stately/combobox": "^3.8.0", - "@react-stately/form": "^3.0.0", - "@react-types/button": "^3.9.1", - "@react-types/combobox": "^3.9.0", - "@react-types/shared": "^3.22.0", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.8.4.tgz", + "integrity": "sha512-HyTWIo2B/0xq0Of+sDEZCfJyf4BvCvDYIWG4UhjqL1kHIHIGQyyr+SldbVUjXVYnk8pP1eGB3ttiREujjjALPQ==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/listbox": "^3.11.5", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/menu": "^3.13.1", + "@react-aria/overlays": "^3.21.1", + "@react-aria/selection": "^3.17.5", + "@react-aria/textfield": "^3.14.3", + "@react-aria/utils": "^3.23.2", + "@react-stately/collections": "^3.10.5", + "@react-stately/combobox": "^3.8.2", + "@react-stately/form": "^3.0.1", + "@react-types/button": "^3.9.2", + "@react-types/combobox": "^3.10.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/datepicker": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.9.0.tgz", - "integrity": "sha512-FIpiJxwBNOM8a6hLOqQJ4JrvRiGL6Zr44E1mHtAWStp2kBEJ6+O2JRm4PQ5Pzvdw6xnCpOBdfESdNdlXN7lVqQ==", - "requires": { - "@internationalized/date": "^3.5.0", - "@internationalized/number": "^3.4.0", - "@internationalized/string": "^3.1.1", - "@react-aria/focus": "^3.15.0", - "@react-aria/form": "^3.0.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/spinbutton": "^3.6.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/datepicker": "^3.9.0", - "@react-stately/form": "^3.0.0", - "@react-types/button": "^3.9.1", - "@react-types/calendar": "^3.4.2", - "@react-types/datepicker": "^3.7.0", - "@react-types/dialog": "^3.5.7", - "@react-types/shared": "^3.22.0", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.9.3.tgz", + "integrity": "sha512-1AjCAizd88ACKjVNhFazX4HZZFwWi2rsSlGCTm66Nx6wm5N/Cpbm466dpYEFyQUsKSOG4CC65G1zfYoMPe48MQ==", + "requires": { + "@internationalized/date": "^3.5.2", + "@internationalized/number": "^3.5.1", + "@internationalized/string": "^3.2.1", + "@react-aria/focus": "^3.16.2", + "@react-aria/form": "^3.0.3", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/spinbutton": "^3.6.3", + "@react-aria/utils": "^3.23.2", + "@react-stately/datepicker": "^3.9.2", + "@react-stately/form": "^3.0.1", + "@react-types/button": "^3.9.2", + "@react-types/calendar": "^3.4.4", + "@react-types/datepicker": "^3.7.2", + "@react-types/dialog": "^3.5.8", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/dialog": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.8.tgz", - "integrity": "sha512-KIc1FORdHhZ3bWom4qHO0hmlL4e5Hup6N25EY8HP5I7Ftv9EBBGaO5grtxZ2fX8kiCJNI4y+k67ZZ71wKJvMiA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-types/dialog": "^3.5.7", - "@react-types/shared": "^3.22.0", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.12.tgz", + "integrity": "sha512-7UJR/h/Y364u6Ltpw0bT51B48FybTuIBacGpEJN5IxZlpxvQt0KQcBDiOWfAa/GQogw4B5hH6agaOO0nJcP49Q==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-types/dialog": "^3.5.8", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/dnd": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.5.0.tgz", - "integrity": "sha512-6IuqmXwnfgRfeXDbfsPZzScapCmtRIkphTBPoLT575uEbZC7ROLgRJ/4NIKxvtTA6IIBqUGcvaqU9Mpg8j4U5Q==", - "requires": { - "@internationalized/string": "^3.1.1", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/dnd": "^3.2.6", - "@react-types/button": "^3.9.1", - "@react-types/shared": "^3.22.0", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.5.3.tgz", + "integrity": "sha512-0gi6sRnr97fSQnGy+CMt+99/+vVqr+qv2T9Ts8X9TAzxHNokz5QfSL88QSlTU36EnAVLxPY18iZQWCExSjKpEQ==", + "requires": { + "@internationalized/string": "^3.2.1", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/dnd": "^3.2.8", + "@react-types/button": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/focus": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.15.0.tgz", - "integrity": "sha512-nnxRyfqHuAjRwdQ4BpQyZPtGFKZmRU6cnaIb3pqWFCqEyJQensV7MA3TJ4Jhadq67cy1Ji5SYSlr1duBwjoYvw==", + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.16.2.tgz", + "integrity": "sha512-Rqo9ummmgotESfypzFjI3uh58yMpL+E+lJBbQuXkBM0u0cU2YYzu0uOrFrq3zcHk997udZvq1pGK/R+2xk9B7g==", "requires": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0", - "clsx": "^1.1.1" + "clsx": "^2.0.0" } }, "@react-aria/form": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.0.tgz", - "integrity": "sha512-APeGph9oTO8nro4ZObuy1hk+0hpF/ji9O3odPGhLkzP/HvW2J7NI9pjKJOINfgtYr2yvVUZf/MbTMxPwtAxhaQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.3.tgz", + "integrity": "sha512-5Q2BHE4TTPDzGY2npCzpRRYshwWUb3SMUA/Cbz7QfEtBk+NYuVaq3KjvqLqgUUdyKtqLZ9Far0kIAexloOC4jw==", "requires": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/form": "^3.0.0", - "@react-types/shared": "^3.22.0", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/form": "^3.0.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/grid": { - "version": "3.8.5", - "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.8.5.tgz", - "integrity": "sha512-0p+Bbs9rpQeOy8b75DamlzVPKylBoe/z0XwkeeTChHP2TK3TwPXh6J5EmisQx6K8zsb3iZULQRcP4QibvnMbrg==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/collections": "^3.10.3", - "@react-stately/grid": "^3.8.3", - "@react-stately/selection": "^3.14.1", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/checkbox": "^3.6.0", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", + "version": "3.8.8", + "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.8.8.tgz", + "integrity": "sha512-7Bzbya4tO0oIgqexwRb8D6ZdC0GASYq9f/pnkrqocgvG9e1SCld4zOioKbYQDvAK/NnbCgXmmdqFAcLM/iazaA==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/collections": "^3.10.5", + "@react-stately/grid": "^3.8.5", + "@react-stately/selection": "^3.14.3", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/checkbox": "^3.7.1", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/gridlist": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.7.2.tgz", - "integrity": "sha512-9keGYZz0yILVqAnFzF6hGRtHm1vfSD1mNnH8oyn7mKjyr7qOln7s5f8Nl85ueMolfrV3H2rCZgM2itNQ+Ezzgg==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/grid": "^3.8.5", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/list": "^3.10.1", - "@react-types/shared": "^3.22.0", + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.7.5.tgz", + "integrity": "sha512-RmHEJ++vngHYEWbUCtLLmGh7H3vNd2Y9S0q/9SgHFPbqPZycT5mxDZ2arqpOXeHRVRvPBaW9ZlMxI2bPOePrYw==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/grid": "^3.8.8", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/list": "^3.10.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/i18n": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.9.0.tgz", - "integrity": "sha512-ebGP/sVG0ZtNF4RNFzs/W01tl7waYpBManh1kKWgA4roDPFt/odkgkDBzKGl+ggBb7TQRHsfUFHuqKsrsMy9TA==", - "requires": { - "@internationalized/date": "^3.5.0", - "@internationalized/message": "^3.1.1", - "@internationalized/number": "^3.4.0", - "@internationalized/string": "^3.1.1", - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.10.2.tgz", + "integrity": "sha512-Z1ormoIvMOI4mEdcFLYsoJy9w/EzBdBmgfLP+S/Ah+1xwQOXpgwZxiKOhYHpWa0lf6hkKJL34N9MHJvCJ5Crvw==", + "requires": { + "@internationalized/date": "^3.5.2", + "@internationalized/message": "^3.1.2", + "@internationalized/number": "^3.5.1", + "@internationalized/string": "^3.2.1", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/interactions": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.20.0.tgz", - "integrity": "sha512-JCCEyK2Nb4mEHucrgmqhTHTNAEqhsiM07jJmmY22eikxnCQnsEfdwXyg9cgZLG79D5V7jyqVRqOp2OsG7Qx7kQ==", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.1.tgz", + "integrity": "sha512-AlHf5SOzsShkHfV8GLLk3v9lEmYqYHURKcXWue0JdYbmquMRkUsf/+Tjl1+zHVAQ8lKqRnPYbTmc4AcZbqxltw==", "requires": { - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/label": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.3.tgz", - "integrity": "sha512-v1zuqbpYyYaPjrBWpceGjMpwP4ne6fLoOXdoIZoKLux2jkAcyIF2kIJFiyYoPQYQJWGRNo7q1oSwamxmng4xJw==", + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.6.tgz", + "integrity": "sha512-ap9iFS+6RUOqeW/F2JoNpERqMn1PvVIo3tTMrJ1TY1tIwyJOxdCBRgx9yjnPBnr+Ywguep+fkPNNi/m74+tXVQ==", "requires": { - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/link": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.6.2.tgz", - "integrity": "sha512-v9gXgQ3Gev0JOlg2MAXcubDMgX+0BlJ+hTyFYFMuN/4jVBlAe426WKbjg+6MMzxwukWg9C3Q08JzqdFTi4cBng==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-types/link": "^3.5.2", - "@react-types/shared": "^3.22.0", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.6.5.tgz", + "integrity": "sha512-kg8CxKqkciQFzODvLAfxEs8gbqNXFZCW/ISOE2LHYKbh9pA144LVo71qO3SPeYVVzIjmZeW4vEMdZwqkNozecw==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-types/link": "^3.5.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/listbox": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.11.2.tgz", - "integrity": "sha512-FXdoqYLUTJn16OxodyS518PIcwzFkCfW5bxQepoy88NDMGtqp6u8fvEPpAoZbomvw/pV9MuEaMAw9qLyfkD4DA==", - "requires": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/collections": "^3.10.3", - "@react-stately/list": "^3.10.1", - "@react-types/listbox": "^3.4.6", - "@react-types/shared": "^3.22.0", + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.11.5.tgz", + "integrity": "sha512-y3a3zQYjT+JKgugCMMKS7K9sRoCoP1Z6Fiiyfd77OHXWzh9RlnvWGsseljynmbxLzSuPwFtCYkU1Jz4QwsPUIg==", + "requires": { + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/collections": "^3.10.5", + "@react-stately/list": "^3.10.3", + "@react-types/listbox": "^3.4.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/live-announcer": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.1.tgz", - "integrity": "sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.2.tgz", + "integrity": "sha512-aOyPcsfyY9tLCBhuUaYCruwcd1IrYLc47Ou+J7wMzjeN9v4lsaEfiN12WFl8pDqOwfy6/7It2wmlm5hOuZY8wQ==", "requires": { "@swc/helpers": "^0.5.0" } }, "@react-aria/menu": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.11.2.tgz", - "integrity": "sha512-I4R5FOvRtwIQW+0naXav5giZBp935X2tXB2xBg/cSAYDXgfLmFPLHkyPbO77hR6FwazfFfJoKdn0pVcRox3lrQ==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/collections": "^3.10.3", - "@react-stately/menu": "^3.5.7", - "@react-stately/tree": "^3.7.4", - "@react-types/button": "^3.9.1", - "@react-types/menu": "^3.9.6", - "@react-types/shared": "^3.22.0", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.13.1.tgz", + "integrity": "sha512-jF80YIcvD16Fgwm5pj7ViUE3Dj7z5iewQixLaFVdvpgfyE58SD/ZVU9/JkK5g/03DYM0sjpUKZGkdFxxw8eKnw==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/overlays": "^3.21.1", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/collections": "^3.10.5", + "@react-stately/menu": "^3.6.1", + "@react-stately/tree": "^3.7.6", + "@react-types/button": "^3.9.2", + "@react-types/menu": "^3.9.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/meter": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.8.tgz", - "integrity": "sha512-u/pNisFs8UottonYlwqaS2i/NhHIw9LcApHo55XP7XMFCnaHPlq3mJzpSsr0zuCTvat2djoKelj41jT6Fhuw+A==", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.11.tgz", + "integrity": "sha512-P1G3Jdh0f/uieUDqvc3Ee4wzqBJa7H077BVSC3KPRqEp6YY7JimZGWjOwbFlO2PXhryXm/dI8EzUmh+4ZXjq/g==", "requires": { - "@react-aria/progress": "^3.4.8", - "@react-types/meter": "^3.3.6", - "@react-types/shared": "^3.22.0", + "@react-aria/progress": "^3.4.11", + "@react-types/meter": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/numberfield": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.10.0.tgz", - "integrity": "sha512-ixkvkPTn18RNPnbaT726CHA+Wpr/qTYWboq8hSaJK0LiAtiEWCKg0pmVtJ4lFntAQ5GNp02xudTwhQdLN5WRig==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/spinbutton": "^3.6.0", - "@react-aria/textfield": "^3.13.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/form": "^3.0.0", - "@react-stately/numberfield": "^3.7.0", - "@react-types/button": "^3.9.1", - "@react-types/numberfield": "^3.7.0", - "@react-types/shared": "^3.22.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.11.1.tgz", + "integrity": "sha512-JQ1Z+Ho5H+jeav7jt9A4vBsIQR/Dd2CFbObrULjGkqSrnWjARFZBv3gZwmfGCtplEPeAv9buYKHAqebPtJNUww==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/spinbutton": "^3.6.3", + "@react-aria/textfield": "^3.14.3", + "@react-aria/utils": "^3.23.2", + "@react-stately/form": "^3.0.1", + "@react-stately/numberfield": "^3.9.1", + "@react-types/button": "^3.9.2", + "@react-types/numberfield": "^3.8.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/overlays": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.19.0.tgz", - "integrity": "sha512-VN5GkB8+uZ2cfXljBtkqmrsAhBdGoj4un/agH0Qyihi2dazsMeafczSNnqzbpVgB4Zt2UHPJUkKwihgzXRxJJA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-stately/overlays": "^3.6.4", - "@react-types/button": "^3.9.1", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.21.1.tgz", + "integrity": "sha512-djEBDF+TbIIOHWWNpdm19+z8xtY8U+T+wKVQg/UZ6oWnclSqSWeGl70vu73Cg4HVBJ4hKf1SRx4Z/RN6VvH4Yw==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-stately/overlays": "^3.6.5", + "@react-types/button": "^3.9.2", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/progress": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.8.tgz", - "integrity": "sha512-Nah3aj5BNRa0+urQZimzb0vuKQK7lsc8BrUwJuHTwGRBSWUjCADExrJYdhDIR/nLUV2TCmAQl+GJtTgbEEj0DQ==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/label": "^3.7.3", - "@react-aria/utils": "^3.22.0", - "@react-types/progress": "^3.5.1", - "@react-types/shared": "^3.22.0", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.11.tgz", + "integrity": "sha512-RePHbS15/KYFiApYLdwazwvWKsB9q0Kn5DGCSb0hqCC+k2Eui8iVVOsegswiP+xqkk/TiUCIkBEw22W3Az4kTg==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/label": "^3.7.6", + "@react-aria/utils": "^3.23.2", + "@react-types/progress": "^3.5.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/radio": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.9.0.tgz", - "integrity": "sha512-kr3+OQ1YU/3mURZfCsYaQmJ/c15qOm8uScaDRC39qz97bLNASakQqMImIaS+GluPKx1PEW3y2ErAgLplH28zZw==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/form": "^3.0.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/utils": "^3.22.0", - "@react-stately/radio": "^3.10.0", - "@react-types/radio": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.10.2.tgz", + "integrity": "sha512-CTUTR+qt3BLjmyQvKHZuVm+1kyvT72ZptOty++sowKXgJApTLdjq8so1IpaLAr8JIfzqD5I4tovsYwIQOX8log==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/form": "^3.0.3", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/utils": "^3.23.2", + "@react-stately/radio": "^3.10.2", + "@react-types/radio": "^3.7.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/searchfield": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.6.0.tgz", - "integrity": "sha512-mHaN+sx2SLqluvF0/YIBQ9WA5LakSWl79FgC0sOWEaOZhDswAbJ9tESdi/M/ahtOnVwblE0cpHRlUKV0Oz4gOw==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/textfield": "^3.13.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/searchfield": "^3.5.0", - "@react-types/button": "^3.9.1", - "@react-types/searchfield": "^3.5.2", - "@react-types/shared": "^3.22.0", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.7.3.tgz", + "integrity": "sha512-mnYI969R7tU3yMRIGmY1+peq7tmEW0W3MB/J2ImK36Obz/91tTtspHHEeFtPlQDLIyvVPB0Ucam4LIxCKPJm/Q==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/textfield": "^3.14.3", + "@react-aria/utils": "^3.23.2", + "@react-stately/searchfield": "^3.5.1", + "@react-types/button": "^3.9.2", + "@react-types/searchfield": "^3.5.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/select": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.14.0.tgz", - "integrity": "sha512-ulVFH8K1yr8CxQE7pzhlM3aWBltWfSbWdJV3FXDqM0kA+GHqqPwZVJcqPuegtaiju1z6nRk4q789kJa4o+4M9g==", - "requires": { - "@react-aria/form": "^3.0.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/listbox": "^3.11.2", - "@react-aria/menu": "^3.11.2", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-stately/select": "^3.6.0", - "@react-types/button": "^3.9.1", - "@react-types/select": "^3.9.0", - "@react-types/shared": "^3.22.0", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.14.3.tgz", + "integrity": "sha512-9KCxI41FI+jTxEfUzRsMdJsZvjkCuuhL4UHig8MZXtXs0nsi7Ir3ezUDQ9m5MSG+ooBYM/CA9DyLDvo5Ioef+g==", + "requires": { + "@react-aria/form": "^3.0.3", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/listbox": "^3.11.5", + "@react-aria/menu": "^3.13.1", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-stately/select": "^3.6.2", + "@react-types/button": "^3.9.2", + "@react-types/select": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/selection": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.17.2.tgz", - "integrity": "sha512-AXXY3eOIWnITabMn6c0bpLPXkSX7040LOZU+7pQgtZJwDdZorLuKw4i7WS5i71LcV71ywG4mtqc9mOb/GfhUbg==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/selection": "^3.14.1", - "@react-types/shared": "^3.22.0", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.17.5.tgz", + "integrity": "sha512-gO5jBUkc7WdkiFMlWt3x9pTSuj3Yeegsxfo44qU5NPlKrnGtPRZDWrlACNgkDHu645RNNPhlyoX0C+G8mUg1xA==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/selection": "^3.14.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/separator": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.8.tgz", - "integrity": "sha512-u15HgH2IVKN/mx7Hp9dfNiFpPU/mq2EA7l0e2fsVSjA77nhSctUFBAqaR7FAI/y86RUhq3zplIz4BJek1/3Dvw==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.11.tgz", + "integrity": "sha512-UTla+3P2pELpP73WSfbwZgP1y1wODFBQbEOHnUxxO8ocyaUyQLJdvc07bBLLpPoyutlggRG0v9ACo0Rui7AjOg==", "requires": { - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/slider": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.3.tgz", - "integrity": "sha512-AbrTD9UzMn0CwxFjOhJHz2ms2zdJlBL3XnbvqkpsmpXUl0u8WT1QAEaMnS5+792gnSGZs/ARDmse53o+IO8wTA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/utils": "^3.22.0", - "@react-stately/slider": "^3.4.5", - "@react-types/shared": "^3.22.0", - "@react-types/slider": "^3.7.0", + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.6.tgz", + "integrity": "sha512-ZeZhyHzhk9gxGuThPKgX2K3RKsxPxsFig1iYoJvqP8485NtHYQIPht2YcpEKA9siLxGF0DR9VCfouVhSoW0AEA==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/utils": "^3.23.2", + "@react-stately/slider": "^3.5.2", + "@react-types/shared": "^3.22.1", + "@react-types/slider": "^3.7.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/spinbutton": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.0.tgz", - "integrity": "sha512-I7f1gfwVRcjguEXZijk0z5g8njZ2YWnQzVzcwGf8ocLPxfw1CnSivNCzwVj2ChXPX10uXewXVMLWVCz+BRC9uQ==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/utils": "^3.22.0", - "@react-types/button": "^3.9.1", - "@react-types/shared": "^3.22.0", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.3.tgz", + "integrity": "sha512-IlfhRu/pc9zOt2C5zSEB7NmmzddvWisGx2iGzw8BwIKMD+cN3uy+Qwp+sG6Z/JzFEBN0F6Mxm3l5lhbiqjpICQ==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/utils": "^3.23.2", + "@react-types/button": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/ssr": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.0.tgz", - "integrity": "sha512-Bz6BqP6ZorCme9tSWHZVmmY+s7AU8l6Vl2NUYmBzezD//fVHHfFo4lFBn5tBuAaJEm3AuCLaJQ6H2qhxNSb7zg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.2.tgz", + "integrity": "sha512-0gKkgDYdnq1w+ey8KzG9l+H5Z821qh9vVjztk55rUg71vTk/Eaebeir+WtzcLLwTjw3m/asIjx8Y59y1lJZhBw==", "requires": { "@swc/helpers": "^0.5.0" } }, "@react-aria/switch": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.5.7.tgz", - "integrity": "sha512-zBEsB071zzhQ82RwAA42pFLXHgrpya0OoRAsTO6jHZwiaYMsyqJI2eiXd7F6rqklpgyO6k7jOQklGUuoSJW4pA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.6.2.tgz", + "integrity": "sha512-X5m/omyhXK+V/vhJFsHuRs2zmt9Asa/RuzlldbXnWohLdeuHMPgQnV8C9hg3f+sRi3sh9UUZ64H61pCtRoZNwg==", "requires": { - "@react-aria/toggle": "^3.9.0", - "@react-stately/toggle": "^3.7.0", - "@react-types/switch": "^3.5.0", + "@react-aria/toggle": "^3.10.2", + "@react-stately/toggle": "^3.7.2", + "@react-types/switch": "^3.5.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/table": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.13.2.tgz", - "integrity": "sha512-bJgMx2SZ8SFmTosbv6k1lZ1a0Yw3f8tzWhpIQodCaMHhtI7izA6YqDNx47NeBNYpVm9DFfAoWbb79HFJ+OKIJA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/grid": "^3.8.5", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-stately/collections": "^3.10.3", - "@react-stately/flags": "^3.0.0", - "@react-stately/table": "^3.11.3", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/checkbox": "^3.6.0", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", - "@react-types/table": "^3.9.1", + "version": "3.13.5", + "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.13.5.tgz", + "integrity": "sha512-P2nHEDk2CCoEbMFKNCyBC9qvmv7F/IXARDt/7z/J4mKFgU2iNSK+/zw6yrb38q33Zlk8hDaqSYNxHlMrh+/1MQ==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/grid": "^3.8.8", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-stately/collections": "^3.10.5", + "@react-stately/flags": "^3.0.1", + "@react-stately/table": "^3.11.6", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/checkbox": "^3.7.1", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", + "@react-types/table": "^3.9.3", "@swc/helpers": "^0.5.0" } }, "@react-aria/tabs": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.8.2.tgz", - "integrity": "sha512-zDfeEEyJmcnH9TFvJECWIrJpxX4SmREFV1/P8hN6ZUJPYoeiGMXYYFvjcRb1r3LN8XKlbwR37AQ3Cn1/yhrUwQ==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/tabs": "^3.6.2", - "@react-types/shared": "^3.22.0", - "@react-types/tabs": "^3.3.4", + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.8.5.tgz", + "integrity": "sha512-Jvt33/W+66n5oCxVwHAYarJ3Fit61vULiPcG7uTez0Mf11cq/C72wOrj+ZuNz6PTLTi2veBNQ7MauY72SnOjRg==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/tabs": "^3.6.4", + "@react-types/shared": "^3.22.1", + "@react-types/tabs": "^3.3.5", "@swc/helpers": "^0.5.0" } }, "@react-aria/tag": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.3.0.tgz", - "integrity": "sha512-mANJTcPyut98O4D3cAKaNEV6QFfoljZCDAgC+uJkV/Zn8cU4JOFeNLAyNoLRlPvYw+msqr6wUyPkWNERuO+1Uw==", - "requires": { - "@react-aria/gridlist": "^3.7.2", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/selection": "^3.17.2", - "@react-aria/utils": "^3.22.0", - "@react-stately/list": "^3.10.1", - "@react-types/button": "^3.9.1", - "@react-types/shared": "^3.22.0", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.3.3.tgz", + "integrity": "sha512-tlJD9qj1XcsPIZD7DVJ6tWv8t7Z87/8qkbRDx7ugNqeHso9z0WqH9ZkSt17OFUWE2IQIk3V8D3iBSOtmhXcZGQ==", + "requires": { + "@react-aria/gridlist": "^3.7.5", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/selection": "^3.17.5", + "@react-aria/utils": "^3.23.2", + "@react-stately/list": "^3.10.3", + "@react-types/button": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/textfield": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.13.0.tgz", - "integrity": "sha512-sUlinDE+k/WhbskyqVOkuffuhiQpjgvp+iGRoralStVgb8Tcb+POxgAlw5jS4tNjdivCb3IjVJemUNJM7xsxxA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/form": "^3.0.0", - "@react-aria/label": "^3.7.3", - "@react-aria/utils": "^3.22.0", - "@react-stately/form": "^3.0.0", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@react-types/textfield": "^3.9.0", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.3.tgz", + "integrity": "sha512-wPSjj/mTABspYQdahg+l5YMtEQ3m5iPCTtb5g6nR1U1rzJkvS4i5Pug6PUXeLeMz2H3ToflPWGlNOqBioAFaOQ==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/form": "^3.0.3", + "@react-aria/label": "^3.7.6", + "@react-aria/utils": "^3.23.2", + "@react-stately/form": "^3.0.1", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", + "@react-types/textfield": "^3.9.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/toggle": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.9.0.tgz", - "integrity": "sha512-2YMWYQUEmcoAXtrAE86QXBS9XlmJyV6IFRlMTBNaeLTdH3AmACExgsyU66Tt0sKl6LMDMI376ItMFqAz27BBdQ==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/toggle": "^3.7.0", - "@react-types/checkbox": "^3.6.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.2.tgz", + "integrity": "sha512-DgitscHWgI6IFgnvp2HcMpLGX/cAn+XX9kF5RJQbRQ9NqUgruU5cEEGSOLMrEJ6zXDa2xmOiQ+kINcyNhA+JLg==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/toggle": "^3.7.2", + "@react-types/checkbox": "^3.7.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/tooltip": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.6.5.tgz", - "integrity": "sha512-hXw4Z8nYLOWz3QOQ807wWZdvDwR3gofsmZhAehg2HPRwdRfCQK+1cjVKeUd9cKCAxs0Cay7dV0oUdilLbCQ2Gg==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/tooltip": "^3.4.6", - "@react-types/shared": "^3.22.0", - "@react-types/tooltip": "^3.4.6", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.2.tgz", + "integrity": "sha512-6jXOSGPao3gPgUQWLbH2r/jxGMqIaIKrJgfwu9TQrh+UkwwiTYW20EpEDCYY2nRFlcoi7EYAiPDSEbHCwXS7Lg==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/tooltip": "^3.4.7", + "@react-types/shared": "^3.22.1", + "@react-types/tooltip": "^3.4.7", "@swc/helpers": "^0.5.0" } }, "@react-aria/utils": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.22.0.tgz", - "integrity": "sha512-Qi/m65GFFljXA/ayj1m5g3KZdgbZY3jacSSqD5vNUOEGiKsn4OQcsw8RfC2c0SgtLV1hLzsfvFI1OiryPlGCcw==", + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.23.2.tgz", + "integrity": "sha512-yznR9jJ0GG+YJvTMZxijQwVp+ahP66DY0apZf7X+dllyN+ByEDW+yaL1ewYPIpugxVzH5P8jhnBXsIyHKN411g==", "requires": { - "@react-aria/ssr": "^3.9.0", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", + "@react-aria/ssr": "^3.9.2", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0", - "clsx": "^1.1.1" + "clsx": "^2.0.0" } }, "@react-aria/virtualizer": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-3.9.7.tgz", - "integrity": "sha512-xaLnzRypiJuGi91ns+LXLGfEhi4a2oz2ZUrZmIrMnBF3asEqULX1PEZoeSWrTWENzumM9D49fvB4JqonK0Ktwg==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/shared": "^3.22.0", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-3.9.10.tgz", + "integrity": "sha512-oDvGgexK6phB9XECWvAaKTq/nRKxHjmJSiZ2gv9j72JFoky4iVEHKAV6Qnar0VBcEpk16JcJVI/wf1xr9F+sjQ==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-aria/visually-hidden": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.7.tgz", - "integrity": "sha512-OuIGMVQIt7GC43h4x35BgkZid8lhoPu7Xz4TQRP8nvOJWb1lH7ehrRRuGdUsK3y90nwpxTdNdg4DILblg+VaLw==", + "version": "3.8.10", + "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.10.tgz", + "integrity": "sha512-np8c4wxdbE7ZrMv/bnjwEfpX0/nkWy9sELEb0sK8n4+HJ+WycoXXrVxBUb9tXgL/GCx5ReeDQChjQWwajm/z3A==", "requires": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/actionbar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/actionbar/-/actionbar-3.4.0.tgz", - "integrity": "sha512-Kb0lSo5iFpb4Qeet0fN8Ful7TFtmtHkl1LJuKz53q2qYQll+E+r2VVAdcOQMJRMRAEnecfd5mxAjEVawdOqrdw==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/live-announcer": "^3.3.1", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/actiongroup": "^3.10.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-types/actionbar": "^3.1.4", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/actionbar/-/actionbar-3.4.3.tgz", + "integrity": "sha512-LIg3a5z0bnFIkA1teaGUo/RdT4ZKPpUUF0RxPSm0nHWEzolSgD7BN4ijK5UxsDLA2cfNxv78s+vwHHKkKnsjSA==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/live-announcer": "^3.3.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/actiongroup": "^3.10.3", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-types/actionbar": "^3.1.5", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/actiongroup": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/actiongroup/-/actiongroup-3.10.0.tgz", - "integrity": "sha512-Wz6nD43bSFiUJsGJr8nIlFjiDzh7ZM65a7xnkHHk+wEPU6wDR6pA0fLVsscMMgNDqDaW2RclfIpJ2jBTBqZ7/w==", - "requires": { - "@react-aria/actiongroup": "^3.7.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/menu": "^3.16.0", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/tooltip": "^3.6.2", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/list": "^3.10.1", - "@react-types/actiongroup": "^3.4.6", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", - "@spectrum-icons/workflow": "^4.2.7", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/actiongroup/-/actiongroup-3.10.3.tgz", + "integrity": "sha512-VJASE+Y75Q885z9mx7CVELrX8PuZPbRnGFQnkoRnwZOTpMVZM6wQxA4IcAfsFVvaVIpHgBwtQTI1Ib+gAdtqgw==", + "requires": { + "@react-aria/actiongroup": "^3.7.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/menu": "^3.18.1", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/tooltip": "^3.6.5", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/list": "^3.10.3", + "@react-types/actiongroup": "^3.4.7", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", + "@spectrum-icons/workflow": "^4.2.10", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/avatar": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@react-spectrum/avatar/-/avatar-3.0.7.tgz", - "integrity": "sha512-+WfgiweFfu8rIhTIEKC/4i0X97lqTWxvosjQMmAgDV2m3Z0Qf03stJzZFL9UISEF+EchE6G17bAYfZ5UjmmErQ==", - "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/avatar": "^3.0.4", - "@react-types/shared": "^3.22.0", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@react-spectrum/avatar/-/avatar-3.0.10.tgz", + "integrity": "sha512-PvsCTTcjNN7QSsa3iCc2UF5LeQCwFNaiR0/xvpk+/ViP1wVq+xFR1tfSrbAq7TAF1B3NQNfI+wepy2ol5l8X2g==", + "requires": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/avatar": "^3.0.5", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/badge": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/badge/-/badge-3.1.8.tgz", - "integrity": "sha512-yplVbI2r/JJKVrsoc7cQpGv7JCPOApH6NYvjPo2UI7Vi5qI86BMP51BtHvZaxsmxKIinGBaoX44jcBcJw40Pmg==", - "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/badge": "^3.1.6", - "@react-types/shared": "^3.22.0", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/badge/-/badge-3.1.11.tgz", + "integrity": "sha512-YOuUBdWmqDQQrNI0uUpazWv/qYmFeDCsJVfQnl/K4J0A6/x7wuvz3iLPJKYuvmqG45/I+WXYFFaNuWOm4jCMzA==", + "requires": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-types/badge": "^3.1.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/breadcrumbs": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/breadcrumbs/-/breadcrumbs-3.9.2.tgz", - "integrity": "sha512-JMDeUpvzehx82mNizcc/Hnd1KYJCAnZARn9LJZpDhTqCMZW7OVkaUf8l5EtYPQpy6IAt477rQX4Gh/ipl+niLw==", - "requires": { - "@react-aria/breadcrumbs": "^3.5.8", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/menu": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-types/breadcrumbs": "^3.7.2", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/breadcrumbs/-/breadcrumbs-3.9.5.tgz", + "integrity": "sha512-MV1b077f189biweuI8H1/D6F7Nwrao0phYzAKqjaTa8bhXf180ej3VhtEEhrSyEhhMrHG3pPzCCbNUn2VMXDlg==", + "requires": { + "@react-aria/breadcrumbs": "^3.5.11", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/menu": "^3.18.1", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-types/breadcrumbs": "^3.7.3", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/button": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.15.0.tgz", - "integrity": "sha512-Hr4A2ex9uxg93XsnboCgiFYSD/lh8dK4u7+0I+yZ075kinrQVfbS4x5QZKqTW/BRxMOifHqfzz1CY2FMZ+9FSA==", - "requires": { - "@react-aria/button": "^3.9.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/toggle": "^3.7.0", - "@react-types/button": "^3.9.1", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.16.2.tgz", + "integrity": "sha512-T0B4EUeAAfsocTMZpfKYIsPMIbuwjB1+hfbZyBBvWt8gerLiEiPAwt6+ga1YzV7C6aAz2FPeTT+zd/RxouDTPw==", + "requires": { + "@react-aria/button": "^3.9.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/toggle": "^3.7.2", + "@react-types/button": "^3.9.2", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/buttongroup": { - "version": "3.6.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/buttongroup/-/buttongroup-3.6.8.tgz", - "integrity": "sha512-KyyhNBok0bmAMVYIu7V5sNtw+sywfihF3j60yLwVCGdNl8tekLtZs8bwQY+HhkDMuyM5OPK9ClY5mMZAzDxWoQ==", - "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/buttongroup": "^3.3.6", - "@react-types/shared": "^3.22.0", + "version": "3.6.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/buttongroup/-/buttongroup-3.6.11.tgz", + "integrity": "sha512-yJv6yBZRLIPYdOAch4FVhdrI0xZz5PPuLiSA6HF/9LlIimALj0qBgCsbQPPThz/UV8+8Y1F76wQUsDcj+iub/A==", + "requires": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/buttongroup": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/calendar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@react-spectrum/calendar/-/calendar-3.4.3.tgz", - "integrity": "sha512-UF5lR+zHbur1tjjE+B6dcht9+o7iu+jfCf8sXfU0HSs7DoJGiUazpOuTKG3WQhuTMcuYYewGU7zXdphEM8NGcw==", - "requires": { - "@internationalized/date": "^3.5.0", - "@react-aria/calendar": "^3.5.3", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/calendar": "^3.4.2", - "@react-types/button": "^3.9.1", - "@react-types/calendar": "^3.4.2", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-spectrum/calendar/-/calendar-3.4.7.tgz", + "integrity": "sha512-eBH8SAHHbhprbzk445wnNrW80bnm7Kv5rwmcDBd7/FGb5EhWnQgcQtBo3z79dpCXCl8UtpLsih3eDV9QQSjIDA==", + "requires": { + "@internationalized/date": "^3.5.2", + "@react-aria/calendar": "^3.5.6", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/calendar": "^3.4.4", + "@react-types/button": "^3.9.2", + "@react-types/calendar": "^3.4.4", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/checkbox": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/checkbox/-/checkbox-3.9.0.tgz", - "integrity": "sha512-UDNy1qLSgvBtpsX+Df2GL7hBsnqtNPXj13lX5YflvbxqQhqMK5H838toMtbxM1fgO/JW1lD6mXOLx8TgK5WSOw==", - "requires": { - "@react-aria/checkbox": "^3.12.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/checkbox": "^3.6.0", - "@react-stately/toggle": "^3.7.0", - "@react-types/checkbox": "^3.6.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/checkbox/-/checkbox-3.9.4.tgz", + "integrity": "sha512-PzUaSza13wh7YipWJLd/0q/nkAnEnxso7hdvMzDLYcw0iKhXNTM2fUoouUuY1SsbithlF2GS5REYyMpQ4FNO3g==", + "requires": { + "@react-aria/checkbox": "^3.14.1", + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/checkbox": "^3.6.3", + "@react-stately/toggle": "^3.7.2", + "@react-types/checkbox": "^3.7.1", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/combobox": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/combobox/-/combobox-3.11.2.tgz", - "integrity": "sha512-HSgXm/dleNOG5BJ00Dju0pUlYYXgTMXJ0zgt4yVRyDKpH+vBwL60TYTP/JoVik9YrZkYd3NJ+IgaS5a5MEIXMg==", - "requires": { - "@react-aria/button": "^3.9.0", - "@react-aria/combobox": "^3.8.0", - "@react-aria/dialog": "^3.5.8", - "@react-aria/focus": "^3.15.0", - "@react-aria/form": "^3.0.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/label": "^3.7.3", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/listbox": "^3.12.4", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/textfield": "^3.11.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/combobox": "^3.8.0", - "@react-types/button": "^3.9.1", - "@react-types/combobox": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.12.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/combobox/-/combobox-3.12.3.tgz", + "integrity": "sha512-hskwbdqXSSNEBRYTn3XESSnLGjELU4Lfht3GkZCvcQt02TVvu9NMETSkVe4lwCYV2hwXtPFGyl3jXvmA3MQurQ==", + "requires": { + "@react-aria/button": "^3.9.3", + "@react-aria/combobox": "^3.8.4", + "@react-aria/dialog": "^3.5.12", + "@react-aria/focus": "^3.16.2", + "@react-aria/form": "^3.0.3", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/label": "^3.7.6", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/listbox": "^3.12.7", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/textfield": "^3.11.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/combobox": "^3.8.2", + "@react-types/button": "^3.9.2", + "@react-types/combobox": "^3.10.1", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/contextualhelp": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/contextualhelp/-/contextualhelp-3.6.5.tgz", - "integrity": "sha512-gDxB68DFXPz3odOkyVFFWJZOx5l57JXUuZnrrUXSP4TnX/snXL+1+aIBzMcXqdJJhW8OB9sYmWAkimffLMuzGA==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/dialog": "^3.8.5", - "@react-spectrum/utils": "^3.11.2", - "@react-types/contextualhelp": "^3.2.7", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/workflow": "^4.2.7", + "version": "3.6.9", + "resolved": "https://registry.npmjs.org/@react-spectrum/contextualhelp/-/contextualhelp-3.6.9.tgz", + "integrity": "sha512-M0GUmZSLWm6pBAqy0Wwv1srlUPxBSvhQxTxvxtBcRSQwCIE1BcnQ6VaJxlx6n+Ocr14GwYH6MTpD1ZLMUvWeiA==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/dialog": "^3.8.9", + "@react-spectrum/utils": "^3.11.5", + "@react-types/contextualhelp": "^3.2.8", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/workflow": "^4.2.10", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/datepicker": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/datepicker/-/datepicker-3.9.0.tgz", - "integrity": "sha512-Hqq3/IigL939mbFtUWsr95/rr/IN9r7a2Nvquha6vg9UALk8XnTj0f3fJl6m16GdSavpfOvxz7Ef9+Vqijw0mg==", - "requires": { - "@internationalized/date": "^3.5.0", - "@react-aria/datepicker": "^3.9.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/calendar": "^3.4.3", - "@react-spectrum/dialog": "^3.8.5", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/utils": "^3.11.2", - "@react-spectrum/view": "^3.6.5", - "@react-stately/datepicker": "^3.9.0", - "@react-types/datepicker": "^3.7.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", - "@spectrum-icons/workflow": "^4.2.7", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/datepicker/-/datepicker-3.9.4.tgz", + "integrity": "sha512-NyFIH68WqbGajBMe/UMxZDwNwaPL/AKJeLC9CY+GcLp4uncWjI42LdcoBPSQFoEJHLtJlLhx+r7qWO/PMOhg3Q==", + "requires": { + "@internationalized/date": "^3.5.2", + "@react-aria/datepicker": "^3.9.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/calendar": "^3.4.7", + "@react-spectrum/dialog": "^3.8.9", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/utils": "^3.11.5", + "@react-spectrum/view": "^3.6.8", + "@react-stately/datepicker": "^3.9.2", + "@react-types/datepicker": "^3.7.2", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", + "@spectrum-icons/workflow": "^4.2.10", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/dialog": { - "version": "3.8.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.8.5.tgz", - "integrity": "sha512-lkAgRhzawhOX9yEjnA1tQeb5Yyv9W4CbRYv7ZtY6pr8f35b8JQQUGKCby3A/TArW5zTBvoueoMt27gJDxnGF5w==", - "requires": { - "@react-aria/dialog": "^3.5.8", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/buttongroup": "^3.6.8", - "@react-spectrum/divider": "^3.5.8", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-spectrum/view": "^3.6.5", - "@react-stately/overlays": "^3.6.4", - "@react-types/button": "^3.9.1", - "@react-types/dialog": "^3.5.7", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.8.9", + "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.8.9.tgz", + "integrity": "sha512-CxyARi0qYOJi24YVqXZp7tHVreYQoYc7+VBZzcn8dTbIL1CSxcSGbRGXOpHiaAejZ9/3lPm/PTbrWrKUBLbckA==", + "requires": { + "@react-aria/dialog": "^3.5.12", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/buttongroup": "^3.6.11", + "@react-spectrum/divider": "^3.5.11", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-spectrum/view": "^3.6.8", + "@react-stately/overlays": "^3.6.5", + "@react-types/button": "^3.9.2", + "@react-types/dialog": "^3.5.8", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/divider": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/divider/-/divider-3.5.8.tgz", - "integrity": "sha512-1+uIZW/TO/laTgvUpSaBuKyScpVKDXQhyWd0WyP2UioRA7gIh9rEgoMAIV4WPFUXBLdj6W12uYGOjSS2iXfzYQ==", - "requires": { - "@react-aria/separator": "^3.3.8", - "@react-spectrum/utils": "^3.11.2", - "@react-types/divider": "^3.3.6", - "@react-types/shared": "^3.22.0", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/divider/-/divider-3.5.11.tgz", + "integrity": "sha512-u6pyqBEc4JRpntF+KGuzmkzn+rJh04kfvjJ3Tx4F9IucaY8xCfglhunf6/yvRqQB0VaMdlxKy5BGhHgBJzUBiA==", + "requires": { + "@react-aria/separator": "^3.3.11", + "@react-spectrum/utils": "^3.11.5", + "@react-types/divider": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/dnd": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/dnd/-/dnd-3.3.5.tgz", - "integrity": "sha512-+lPqHd/CSbz/PV2HXIOpKLuBRpee3oz0nO0CRIog7zfIkI/wl2xaov+PdrUKk+58GUNGhz1C69QlPnDCV+t+0w==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/dnd/-/dnd-3.3.8.tgz", + "integrity": "sha512-GfLqduIBpH2LArBsFpNa4i9cYeFg7lJpqwrLVJRl96DbhdXEcwt9a4tqvsegkqKn6KPHDPG7uTX0OqPoQJluXQ==", "requires": { - "@react-aria/dnd": "^3.5.0", - "@react-stately/dnd": "^3.2.6", - "@react-types/shared": "^3.22.0", + "@react-aria/dnd": "^3.5.3", + "@react-stately/dnd": "^3.2.8", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/form": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/form/-/form-3.7.0.tgz", - "integrity": "sha512-TrUUG6D28Ugy/CmiGJJxkr8ue4zRE3wQkC6HScNCLcVGSkrcsWzDDUxRYDrxwlyFNMuZjUDhiLMMPthZqZcIUA==", - "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/form": "^3.0.0", - "@react-types/form": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/form/-/form-3.7.4.tgz", + "integrity": "sha512-xAS6vFM6dzKJc7gkC8Qy76VXLxZ9VqPZq4xxQeySvsO8pOujTFCL97QkS0mDjMOdpu72VDIF5JegK1Edlewr7g==", + "requires": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/form": "^3.0.1", + "@react-types/form": "^3.7.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/icon": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/icon/-/icon-3.7.8.tgz", - "integrity": "sha512-OllOy3+2laBHZNXAsVfy7J7ov9UsT/e6zTeqvWVIhYW8abpIYcCtJWxeaBPubVMcA47NRCLF46sEOuFhnTUxIw==", + "version": "3.7.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/icon/-/icon-3.7.11.tgz", + "integrity": "sha512-CTvbukq0g2oEjMqwMDx2qjfmFAv6u7/KwHRn9pGf6BUiU53Zlnl6Fjtm+c9cw8d9GcwlXyIWYBMIKyMm4+7g5A==", "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/illustratedmessage": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/illustratedmessage/-/illustratedmessage-3.4.8.tgz", - "integrity": "sha512-QHrjAZ9rXv+WpUR0QG3bz/3j1qLkc7qS4AwImZ9aoF7YRWMxLJCB2/b9tPGmWRWjjeH+gSSa4Q4y8FEr2hsYkA==", - "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/illustratedmessage": "^3.3.6", - "@react-types/shared": "^3.22.0", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/illustratedmessage/-/illustratedmessage-3.4.11.tgz", + "integrity": "sha512-KJdcF+YY2rPZBTP5P38MEQBoNLglP1QUaCmbPH8a5dSZ+wj5EsOgseFa0fxAEZ23q9Wo9Fv9P9niRq0/479KTQ==", + "requires": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/utils": "^3.11.5", + "@react-types/illustratedmessage": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/image": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/image/-/image-3.4.8.tgz", - "integrity": "sha512-hdDFjAxF9poKsE820H37C3y8J8NBzNQx8c/Erp2O1LTQP5HynBimYxqezx5KAl9scFsOaHsbY+VdGdFTzOmIsg==", - "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/image": "^3.3.6", - "@react-types/shared": "^3.22.0", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/image/-/image-3.4.11.tgz", + "integrity": "sha512-pzYubgkkC5Ic3eKrNlPUFPbVUTUvZ7DObmGpQvmgmG0xipmUAscYKFEBr4LhCsy/29Sm7Tz4zsGUdA2vM5eA8g==", + "requires": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/image": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/inlinealert": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/inlinealert/-/inlinealert-3.2.0.tgz", - "integrity": "sha512-uRWLLl2M5tc7B3/Lzm2/JLxXOyi+cT6uYkq9eksBM41OMfvgLksT5vaOegiBGHgi2r7QktTMZnDzGk5sGvaQyA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/inlinealert/-/inlinealert-3.2.3.tgz", + "integrity": "sha512-NX1bZvmI3EOBTRWaT4dzVyFxAuePPbXASZeJ4/wAnhvWDN65rKrctn+VZW3x6ZQoZ/WkQl4qW1txjVcLHkRBWg==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/label": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/label/-/label-3.16.0.tgz", - "integrity": "sha512-VLTpsq8wxTSv5eA2LwUVW79gdja3oSAKiTZmU6dMlo3yuBOhTMAsaAbgFhopTvotjUim9JG24BRpajnuA7Jz4w==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/label": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.16.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/label/-/label-3.16.4.tgz", + "integrity": "sha512-38hk6wqUwDCyYeScF1NIaxlPaltkTRTv6/XtIkm528eilLyOMxtMGXcP0Bl7nv0oDLxDZSm9TkgXjN24SyY0KQ==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/utils": "^3.11.5", + "@react-types/label": "^3.9.1", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/labeledvalue": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/labeledvalue/-/labeledvalue-3.1.8.tgz", - "integrity": "sha512-J/LaCVR3pWYbTg7sZg1p0W7jdWongUTjEE+2mlSdtJJaxLTUgOFgm32k/RU7foFK9+ds41S6gfDpv88aR4M+YA==", - "requires": { - "@internationalized/date": "^3.5.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@react-spectrum/labeledvalue/-/labeledvalue-3.1.12.tgz", + "integrity": "sha512-Pa/eYf9FKr8QF7xKLoCv6a+Ezudfi7N1jFJLZ71zaVcDOcNByYKiy1lAquwLB+36PpsWt/EwKLE2/U7OuiWyfQ==", + "requires": { + "@internationalized/date": "^3.5.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/layout": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/layout/-/layout-3.6.0.tgz", - "integrity": "sha512-eOG7u7dqqawMJq/cgr0Iq96Tqt2tuRVStnLgVpWJqKSYxJadd8Ja3mAkWzUq5SfX3r1w3UJWSJPcqYcu4TQ5yQ==", - "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/layout": "^3.3.12", - "@react-types/shared": "^3.22.0", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/layout/-/layout-3.6.3.tgz", + "integrity": "sha512-JsG4KclsgzKfRbe+PyMo8QryG5SmwYlym8JRuSLmZ+nfIKhESVbqSJE3IXblmDDWUb0rabQhSvW4p5h5nOil4w==", + "requires": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/layout": "^3.3.13", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/link": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/link/-/link-3.6.2.tgz", - "integrity": "sha512-Pa3fgGUpxzlWZ6fXVQcdLXDxp6Ui9KtJDSKZYAxQrTL4OzEA8rgF+FeG0d7MDAHW2okW6a/N9dJALrJEtlizGg==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/link": "^3.6.2", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/link": "^3.5.2", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/link/-/link-3.6.5.tgz", + "integrity": "sha512-pnPIzkM0/Nxm460dHuR195bD0BAaIvasqW8TqUFT0Igxfw0NFYyWZr5d4OkHKyypyUoQKaobpOgeAJHXxPtzTg==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/link": "^3.6.5", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/link": "^3.5.3", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/list": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/list/-/list-3.7.4.tgz", - "integrity": "sha512-ccMeyylTWknzZoWHGGDzmaPHKU2hns0UjHBDyNT8hCItO/YL0s2NWY83QO+iYS8Xb6n/EDts7IBrJJYrmxDRWQ==", - "requires": { - "@react-aria/button": "^3.9.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/gridlist": "^3.7.2", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-aria/virtualizer": "^3.9.7", - "@react-aria/visually-hidden": "^3.8.7", - "@react-spectrum/checkbox": "^3.9.0", - "@react-spectrum/dnd": "^3.3.5", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/layout": "^3.13.4", - "@react-stately/list": "^3.10.1", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/list/-/list-3.7.8.tgz", + "integrity": "sha512-w+fxiX+wz8X0bASAtKsf/myMrFI1Z0OXamttPRAJS5Ene6x09kf+K2djpZO1t9nT70IPnCcthhkMaCHk6eyUIw==", + "requires": { + "@react-aria/button": "^3.9.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/gridlist": "^3.7.5", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-aria/virtualizer": "^3.9.10", + "@react-aria/visually-hidden": "^3.8.10", + "@react-spectrum/checkbox": "^3.9.4", + "@react-spectrum/dnd": "^3.3.8", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/layout": "^3.13.7", + "@react-stately/list": "^3.10.3", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0", "react-transition-group": "^4.4.5" } }, "@react-spectrum/listbox": { - "version": "3.12.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/listbox/-/listbox-3.12.4.tgz", - "integrity": "sha512-qmgHbeoFMFAK3AViPWri2z0Aqio0h2pf0ROjjkNPmTIm9xZEFMwArLqWhftmEm+smMTuNLjZv8aYGahKwiQDrg==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/listbox": "^3.11.2", - "@react-aria/utils": "^3.22.0", - "@react-aria/virtualizer": "^3.9.7", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/layout": "^3.13.4", - "@react-stately/list": "^3.10.1", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/listbox": "^3.4.6", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.12.7", + "resolved": "https://registry.npmjs.org/@react-spectrum/listbox/-/listbox-3.12.7.tgz", + "integrity": "sha512-cFUIKPRtz5ViQYS0vO+oQmiFmbJjA04GCpyZKnBJAEonNDiY1RIHfFg/53Mr8IwstwNvGbxHVjMilPy6DtWDjA==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/listbox": "^3.11.5", + "@react-aria/utils": "^3.23.2", + "@react-aria/virtualizer": "^3.9.10", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/layout": "^3.13.7", + "@react-stately/list": "^3.10.3", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/listbox": "^3.4.7", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/menu": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/menu/-/menu-3.16.0.tgz", - "integrity": "sha512-wcUwBLifWvJvMQrdnh7+m9g4maW87zv7yB2D/cnGYIkXL1aNZxa6zHLxSegs1PrqdP77fhEXthVFcMreuIHO6A==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/menu": "^3.11.2", - "@react-aria/overlays": "^3.19.0", - "@react-aria/separator": "^3.3.8", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/menu": "^3.5.7", - "@react-stately/overlays": "^3.6.4", - "@react-stately/tree": "^3.7.4", - "@react-types/menu": "^3.9.6", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", - "@spectrum-icons/workflow": "^4.2.7", + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/@react-spectrum/menu/-/menu-3.18.1.tgz", + "integrity": "sha512-3KutRgn9/uYcRH2IzUT6qiPlS9SK9+4R2W4Z1Ox27lQ30ZgC68kE37uOwZX10bDgTOWV/COYvm6qBBScZ+VFUg==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/menu": "^3.13.1", + "@react-aria/overlays": "^3.21.1", + "@react-aria/separator": "^3.3.11", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/menu": "^3.6.1", + "@react-stately/overlays": "^3.6.5", + "@react-stately/tree": "^3.7.6", + "@react-types/menu": "^3.9.7", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", + "@spectrum-icons/workflow": "^4.2.10", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/meter": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/meter/-/meter-3.4.8.tgz", - "integrity": "sha512-7nFE+B9OE6WyKJpBn8gAulNAlKqG2VFq74UiB/xV37rHXRIjn4waLaxK7s6uHCozOu2Ly5uTDJV5x3AN3W2ldw==", - "requires": { - "@react-aria/meter": "^3.4.8", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/utils": "^3.11.2", - "@react-types/meter": "^3.3.6", - "@react-types/shared": "^3.22.0", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/meter/-/meter-3.4.11.tgz", + "integrity": "sha512-OBYIHnumb2cfeT48py6Qtsfs7m9DmddaHSCVB8MXNnn3fzrpPr5t4Wz2dYUWXnkPPC11D8WarjJ+6EgrNwNvdQ==", + "requires": { + "@react-aria/meter": "^3.4.11", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/utils": "^3.11.5", + "@react-types/meter": "^3.3.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/numberfield": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/numberfield/-/numberfield-3.8.0.tgz", - "integrity": "sha512-uboKuVBDYR5BkGw1qY3udKmsMRipkhQIY1diKK0uu5ETdKrjhXRNQ5L+xfshT/K960tmztwnKk/nj1jePjk6MA==", - "requires": { - "@react-aria/button": "^3.9.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/numberfield": "^3.10.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/textfield": "^3.11.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/numberfield": "^3.7.0", - "@react-types/button": "^3.9.1", - "@react-types/numberfield": "^3.7.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", - "@spectrum-icons/workflow": "^4.2.7", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-spectrum/numberfield/-/numberfield-3.9.1.tgz", + "integrity": "sha512-s6QNRncVrVjOYihKeyQ8fkdD1YJTqYttog/Rj96rD66vfUlI0bTr3q6mK6hZpU1YM29SL24BUCn6NdqOxqVeiQ==", + "requires": { + "@react-aria/button": "^3.9.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/numberfield": "^3.11.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/textfield": "^3.11.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/numberfield": "^3.9.1", + "@react-types/button": "^3.9.2", + "@react-types/numberfield": "^3.8.1", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", + "@spectrum-icons/workflow": "^4.2.10", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/overlays": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-5.5.2.tgz", - "integrity": "sha512-4VXK1HMazuETgSnpPSPszuCB/4WaVhPX0h+1ICllReuvv9mvgWt6KoCkqJSoVMM8qlB4XocGUPsI1pL+Bck78w==", - "requires": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/overlays": "^3.6.4", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-5.5.5.tgz", + "integrity": "sha512-rFwbWuagFo/Tuo45UE8KHUMz1Li1j5CNzsZdIfKZydHd0u4t69yR8bCn3pDUNIYEwclrLGUD2XFJaN9jYq1H4A==", + "requires": { + "@react-aria/interactions": "^3.21.1", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/overlays": "^3.6.5", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0", "react-transition-group": "^4.4.5" } }, "@react-spectrum/picker": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/picker/-/picker-3.13.2.tgz", - "integrity": "sha512-o7t1tnCKrYbDpZ/n3vohok82Yx6iEv8TQXUrXkiqHbRiohN72PB4WJMOlBjMbNaprcC4tdkHVuGlAhSwQHYBdA==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/select": "^3.14.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/listbox": "^3.12.4", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/select": "^3.6.0", - "@react-types/select": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/picker/-/picker-3.14.3.tgz", + "integrity": "sha512-xaewWrOtGt/dQbiSwZe9UYH58berRlxyqIeAZQ7+FCRGoG/gl1p+l+7rfNKFS5OjVy6Adh6BZrrY6A99j4PbQA==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/select": "^3.14.3", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/listbox": "^3.12.7", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/select": "^3.6.2", + "@react-types/select": "^3.9.2", + "@react-types/shared": "^3.22.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/progress": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/progress/-/progress-3.7.2.tgz", - "integrity": "sha512-YtAvWHC4rwBqRagoS/Mmt2NOZo4G6p5rIdhiVp/UjKa1oqEEiut29dMvr/JS30AoNPPSc95ctydgUU6JynyGJQ==", - "requires": { - "@react-aria/progress": "^3.4.8", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/progress": "^3.5.1", - "@react-types/shared": "^3.22.0", + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/progress/-/progress-3.7.5.tgz", + "integrity": "sha512-ku+RTtgXWaxUwjopzWpvgNxJsn/gohMWO4len2K2yDQp6b4SY67ojRFBwyIDZ9Oi9RPTAvZOc3wJu5QPftfVcg==", + "requires": { + "@react-aria/progress": "^3.4.11", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/progress": "^3.5.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/provider": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.9.2.tgz", - "integrity": "sha512-5DZA8UdAXWzLJo7nxO7VgTqvmjN6cbjctMWhLbv81jSLWRqm+O6RhRZjnbEVXqwfyPpxJzDG8ZhjaQe/kFs38A==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/provider": "^3.7.1", - "@react-types/shared": "^3.22.0", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.9.5.tgz", + "integrity": "sha512-FE5RQC1EwMMXUAtslekheyA0IrXSev4flaY4CT3exC/ohB1PuiXUDg4qqaHos2vVhsdUPNq5SeathtHEr8ryJA==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/overlays": "^3.21.1", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/provider": "^3.7.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0", - "clsx": "^1.1.1" + "clsx": "^2.0.0" } }, "@react-spectrum/radio": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/radio/-/radio-3.7.0.tgz", - "integrity": "sha512-AikFzw+aJ1gL6Ysnfb4wXDgsnPp0KB9jbMrqENW6KKZxQ5+au2Xzj28mnKDfAjBXlxQlTAhBo5SnI0WnjTmKWA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/radio": "^3.9.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/radio": "^3.10.0", - "@react-types/radio": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/radio/-/radio-3.7.4.tgz", + "integrity": "sha512-FmWcJlOeo5KsbWYpnEtoB9oC+haUeowfRda8dq0kBptR5WlagWD4Arez55/hjXCHLqQZ4r6vY6rYgMya2xiddQ==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/radio": "^3.10.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/radio": "^3.10.2", + "@react-types/radio": "^3.7.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/searchfield": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/searchfield/-/searchfield-3.8.0.tgz", - "integrity": "sha512-WVI/5ONt1hSm+D/A7J3ICpVOue6J2FBBWKU9zVSK7cwcklWgUGyGkZLD8luVQtcpI5bDLb2tHixs7a1OXPC8Uw==", - "requires": { - "@react-aria/searchfield": "^3.6.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/textfield": "^3.11.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/searchfield": "^3.5.0", - "@react-types/searchfield": "^3.5.2", - "@react-types/textfield": "^3.9.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/searchfield/-/searchfield-3.8.4.tgz", + "integrity": "sha512-O8pM9dGlRZoFhNtZLVFpIOHM2+sy5/t23Lv0z0jXvVYmzHOaib8wPPJELnPRsDUIylqpnVxfiYSz051Gx5Zq8g==", + "requires": { + "@react-aria/searchfield": "^3.7.3", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/textfield": "^3.11.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/searchfield": "^3.5.1", + "@react-types/searchfield": "^3.5.3", + "@react-types/textfield": "^3.9.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/slider": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/slider/-/slider-3.6.4.tgz", - "integrity": "sha512-ckKlRJhDKUIsZepnCzRcCe20Q4MaoC8dLEFNz/f6CItfZNoE8sH5OsHuDFOEbhNOgNyGjj9Dv99iKPAkRrDWkg==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/slider": "^3.7.3", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/slider": "^3.4.5", - "@react-types/shared": "^3.22.0", - "@react-types/slider": "^3.7.0", + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/@react-spectrum/slider/-/slider-3.6.7.tgz", + "integrity": "sha512-mhTG+sGZwQfNW9z+uzvmTQzzV2Qzcack3qYSw8HXEfd4BOjkgwTinS9aN8MLv147TF5RMvI0y3dmNirAoDi+yQ==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/slider": "^3.7.6", + "@react-aria/utils": "^3.23.2", + "@react-aria/visually-hidden": "^3.8.10", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/slider": "^3.5.2", + "@react-types/shared": "^3.22.1", + "@react-types/slider": "^3.7.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/statuslight": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/statuslight/-/statuslight-3.5.8.tgz", - "integrity": "sha512-q0q/JzEmucU83fCGokIQZ09/TsFWKuv+eHm2FKRZNeLcTS1oGNZGsty7iFa7To+b4F3lA7HxEQ936EOjQuDOwQ==", - "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", - "@react-types/statuslight": "^3.3.6", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/statuslight/-/statuslight-3.5.11.tgz", + "integrity": "sha512-zbIrI8rPLmMu3Jnl2fpA/kb0V3azdRBsv1KfhGNQkHM17Gy6ufrzzzh6cmnvQh8FREllMcIjC4eaBkYHFArtyg==", + "requires": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", + "@react-types/statuslight": "^3.3.7", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/switch": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/switch/-/switch-3.5.0.tgz", - "integrity": "sha512-a9SbC3seaU/Ai840q1PZEZraB3EJosDqww0zKU80pDtTqtP4b3KWwvHrVRWOQ2PeJm1bm/aPkuyMa7cM12m2tQ==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/switch": "^3.5.7", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/toggle": "^3.7.0", - "@react-types/shared": "^3.22.0", - "@react-types/switch": "^3.5.0", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/switch/-/switch-3.5.3.tgz", + "integrity": "sha512-NJMk/b/Lrmgl0RB9QPF0wSuD5CgTPODaLuZD1uxXAcESKFVdN58eW8CU99e+ZC0tHgFofroTpEF073Yiz2LnkQ==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/switch": "^3.6.2", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/toggle": "^3.7.2", + "@react-types/shared": "^3.22.1", + "@react-types/switch": "^3.5.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/table": { - "version": "3.12.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/table/-/table-3.12.4.tgz", - "integrity": "sha512-29dWRfs0rZv4PXByyRZPdgPVQiyjZAm4hFhvqmZnpeKQx3+Y63MrO0xdDYIIbopmANhKT/JPO3jIG4gWMvd72A==", - "requires": { - "@react-aria/button": "^3.9.0", - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/table": "^3.13.2", - "@react-aria/utils": "^3.22.0", - "@react-aria/virtualizer": "^3.9.7", - "@react-aria/visually-hidden": "^3.8.7", - "@react-spectrum/checkbox": "^3.9.0", - "@react-spectrum/dnd": "^3.3.5", - "@react-spectrum/layout": "^3.6.0", - "@react-spectrum/menu": "^3.16.0", - "@react-spectrum/progress": "^3.7.2", - "@react-spectrum/tooltip": "^3.6.2", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/flags": "^3.0.0", - "@react-stately/layout": "^3.13.4", - "@react-stately/table": "^3.11.3", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", - "@react-types/table": "^3.9.1", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.12.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/table/-/table-3.12.8.tgz", + "integrity": "sha512-4JyDlvKljhvqqUHYk6X5JjmxXy03IZergKTu//MbELW4v9bwiwf94Ap8zTcUZPh/pcw7IQhpUDLPAi6RFBAUpA==", + "requires": { + "@react-aria/button": "^3.9.3", + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/table": "^3.13.5", + "@react-aria/utils": "^3.23.2", + "@react-aria/virtualizer": "^3.9.10", + "@react-aria/visually-hidden": "^3.8.10", + "@react-spectrum/checkbox": "^3.9.4", + "@react-spectrum/dnd": "^3.3.8", + "@react-spectrum/layout": "^3.6.3", + "@react-spectrum/menu": "^3.18.1", + "@react-spectrum/progress": "^3.7.5", + "@react-spectrum/tooltip": "^3.6.5", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/flags": "^3.0.1", + "@react-stately/layout": "^3.13.7", + "@react-stately/table": "^3.11.6", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", + "@react-types/table": "^3.9.3", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/tabs": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@react-spectrum/tabs/-/tabs-3.8.4.tgz", - "integrity": "sha512-wDMHf8Xa3lCh7vkkpwT3G8Vd6ooo5VSHlMv1NUQsFjlymbZQ88aBkZfJVBxag7fWoO/Yo2IGf5Tb2Gpj1hW99Q==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/tabs": "^3.8.2", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/picker": "^3.13.2", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/list": "^3.10.1", - "@react-stately/tabs": "^3.6.2", - "@react-types/select": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@react-types/tabs": "^3.3.4", + "version": "3.8.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/tabs/-/tabs-3.8.8.tgz", + "integrity": "sha512-oBXKLD7cyCLQV3SUXIjEn9ttdyoGwpiTUfM3DNY3ki097pRdoBgMxPk1Sp7jKQs6tRUg4osK53iOG4LvEs6eTg==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/tabs": "^3.8.5", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/picker": "^3.14.3", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/list": "^3.10.3", + "@react-stately/tabs": "^3.6.4", + "@react-types/select": "^3.9.2", + "@react-types/shared": "^3.22.1", + "@react-types/tabs": "^3.3.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/tag": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/tag/-/tag-3.2.0.tgz", - "integrity": "sha512-BrYpyaoJkaHL/74DzaCJjMzn544TvJbf9uJaZ3TUwt8MQ4rAOdHKn5fI3jiX665WWJPhsI6Dfns/gN/4HlqfJA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/selection": "^3.17.2", - "@react-aria/tag": "^3.3.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/button": "^3.15.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/text": "^3.5.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/collections": "^3.10.3", - "@react-stately/list": "^3.10.1", - "@react-types/shared": "^3.22.0", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/tag/-/tag-3.2.4.tgz", + "integrity": "sha512-d6cqX+n10pokLsBGEC/ksLLHM3vBoR7zc0AAlBAUrBN6VMBWUQRyazDHeXPLLZs/S4+ICL80UXRf8NwWfA7Efg==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/i18n": "^3.10.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/selection": "^3.17.5", + "@react-aria/tag": "^3.3.3", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/button": "^3.16.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/text": "^3.5.3", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/collections": "^3.10.5", + "@react-stately/list": "^3.10.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/text": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/text/-/text-3.5.0.tgz", - "integrity": "sha512-gZ2sqrfz/T8kYhS/TUXoR6ZhC9apU1i+K+8W9LV7LXAraZYQiDTiglTqnxER+qtW/+Xon1ZDoL2TICt63wHFFA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@react-spectrum/text/-/text-3.5.3.tgz", + "integrity": "sha512-28WiSnIPm8WC4JOsHPLudCGjPc3tk7zKm3L+8xqzr374j1+HdMGivrhVOf1t4jbUMcT5dOxR7huuDe7E97qe5A==", "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", - "@react-types/text": "^3.3.6", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", + "@react-types/text": "^3.3.7", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/textfield": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-spectrum/textfield/-/textfield-3.11.0.tgz", - "integrity": "sha512-bAG4hwFUJGWiViaOBXDWvYxsMvzs8+rCfdiLil7b5CPgbZCpvsHVMSt8dOQW18MqrJNGv2Zm8gZYjvFSnfklAA==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/textfield": "^3.13.0", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/form": "^3.7.0", - "@react-spectrum/label": "^3.16.0", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@react-types/textfield": "^3.9.0", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/@react-spectrum/textfield/-/textfield-3.11.4.tgz", + "integrity": "sha512-J70Q1ddpX0v+R7x8w5DaJLixnp5mBWm39lUnekiahEUuA420U1eZCW80GiHXFS/GO6wpwjIZpWHcpBQuF/EDCQ==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/interactions": "^3.21.1", + "@react-aria/textfield": "^3.14.3", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/form": "^3.7.4", + "@react-spectrum/label": "^3.16.4", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", + "@react-types/textfield": "^3.9.1", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/theme-dark": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-dark/-/theme-dark-3.5.7.tgz", - "integrity": "sha512-WaBVkhJKsZNcsHCcm6HQOSV934KLxZK6cbTt/FjUZtNTHcQTb5s2xf2jPeMwcRbRJfzagfTuTr5BkM38B9Zi1Q==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/theme-dark/-/theme-dark-3.5.8.tgz", + "integrity": "sha512-ep78rIrgrXu5MHe6LQAiK8+Us/4PoeHcixm+xFJk8I7AP+6wrh+9+QSWdIi3/NJY9fIjXsMm+VyehFVtEq8PAg==", "requires": { - "@react-types/provider": "^3.7.1", + "@react-types/provider": "^3.7.2", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/theme-default": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-default/-/theme-default-3.5.7.tgz", - "integrity": "sha512-5GgCKfzA1be3pE5XtQ+5hk39I4BhU1qY+fHCDxvE/tndm2I7pCk26d6ifxA0H2RVKH8V3eiH0WG1TNXHcHIO1g==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/theme-default/-/theme-default-3.5.8.tgz", + "integrity": "sha512-vZ9GH4l6H2Ks/PD15k2mx6XgA1EYKxQbB+ai9UZ3ALXf0KYlVIFSoHk4Vp3hP16D12KsuB7V0Gk8SvHlsRNo+Q==", "requires": { - "@react-types/provider": "^3.7.1", + "@react-types/provider": "^3.7.2", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/theme-light": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/@react-spectrum/theme-light/-/theme-light-3.4.7.tgz", - "integrity": "sha512-3NeIDN9QU8c40rqRSzurTdJRTZ5Uag4c2fLlF9Bve/yF7N6KlzK29H3EWNLBizAfozhPe5/HDEYqdArz7bxhlQ==", + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/theme-light/-/theme-light-3.4.8.tgz", + "integrity": "sha512-6kjtQ6IGrh2E0WJKQ9eAR5yhcWFI2mNvd+wi8Uy3rtRdBB1L3iSfr2RmgxgcTCl50DnKqmcFsHbHaKMMKqhkaQ==", "requires": { - "@react-types/provider": "^3.7.1", + "@react-types/provider": "^3.7.2", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/tooltip": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/tooltip/-/tooltip-3.6.2.tgz", - "integrity": "sha512-aZ0CSlWOGgRQe/u41PgCgiXdO7+GowGE8CA46BCA8DEoqrw3JjSOX2JYClrPUra1VxHXId8AeQGU5bRw3abb2g==", - "requires": { - "@react-aria/focus": "^3.15.0", - "@react-aria/overlays": "^3.19.0", - "@react-aria/tooltip": "^3.6.5", - "@react-aria/utils": "^3.22.0", - "@react-spectrum/overlays": "^5.5.2", - "@react-spectrum/utils": "^3.11.2", - "@react-stately/tooltip": "^3.4.6", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0", - "@react-types/tooltip": "^3.4.6", - "@spectrum-icons/ui": "^3.6.2", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/tooltip/-/tooltip-3.6.5.tgz", + "integrity": "sha512-TnVUX8gNx65wOfHE5UIzuzpC4kUd6RuFeDykcu+3OM+fsK6qvDYg2MQq/3UiZHFI0ZHhX89yPf4uLaP0hcT8sg==", + "requires": { + "@react-aria/focus": "^3.16.2", + "@react-aria/overlays": "^3.21.1", + "@react-aria/tooltip": "^3.7.2", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/overlays": "^5.5.5", + "@react-spectrum/utils": "^3.11.5", + "@react-stately/tooltip": "^3.4.7", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1", + "@react-types/tooltip": "^3.4.7", + "@spectrum-icons/ui": "^3.6.5", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/utils": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-spectrum/utils/-/utils-3.11.2.tgz", - "integrity": "sha512-JLv0ntBrrIvloUgqVhAZvTTiBqZ/pHtAWOuIgrii3PFUsds4OVX+YebB88rj639Zi/tFrSdfrlZJNER1ZOq9jw==", - "requires": { - "@react-aria/i18n": "^3.9.0", - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/@react-spectrum/utils/-/utils-3.11.5.tgz", + "integrity": "sha512-V4heIuCBXhYOP3om5B0KNs2+RK6RKwAhHVjjJZ3RBeNqsF9UDxv+D/+dk3sAM2dsM1F8l38BNXQMMWXWW/BZYA==", + "requires": { + "@react-aria/i18n": "^3.10.2", + "@react-aria/ssr": "^3.9.2", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0", - "clsx": "^1.1.1" + "clsx": "^2.0.0" } }, "@react-spectrum/view": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-spectrum/view/-/view-3.6.5.tgz", - "integrity": "sha512-y135Ownoi6Hw466k4hWcYBJmqjTQlKVgXtCT5aKpKm8l9RlpvPvtoUe5OBUxKkHHgB1TCIOpy76hLi9SQc0Omw==", + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@react-spectrum/view/-/view-3.6.8.tgz", + "integrity": "sha512-jAKh22xUjFY5sxPTtLc53fw3C+dki+DEDxArFK06/tF+ntV6lDat91j+YedcOtDT2p7C2PSfaToX5moyEAQ+NA==", "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", - "@react-types/view": "^3.4.6", + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", + "@react-types/view": "^3.4.7", "@swc/helpers": "^0.5.0" } }, "@react-spectrum/well": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/@react-spectrum/well/-/well-3.4.8.tgz", - "integrity": "sha512-A2fJxlT/eAKyPTbCOmoUNB+BjDP8RnViZ7X6/gcxjEAtn5KVnJ6DmZTG8Kw+yPnuLxK+5Lui/dfGI9g19GWohw==", - "requires": { - "@react-aria/utils": "^3.22.0", - "@react-spectrum/utils": "^3.11.2", - "@react-types/shared": "^3.22.0", - "@react-types/well": "^3.3.6", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@react-spectrum/well/-/well-3.4.11.tgz", + "integrity": "sha512-oCQqKKcKXNoF18dNz5GHBdSXrNPsVH5jsH17suqQevzDQkMN2X02Ov0oyOYMAUQM0xSE3ensLdjvLzUL0yl36g==", + "requires": { + "@react-aria/utils": "^3.23.2", + "@react-spectrum/utils": "^3.11.5", + "@react-types/shared": "^3.22.1", + "@react-types/well": "^3.3.7", "@swc/helpers": "^0.5.0" } }, "@react-stately/calendar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.4.2.tgz", - "integrity": "sha512-RfH40rVa2EhUnQgqH3HTZL+YhL+6tZ8T9GbN1K3AbIM5BBEtkb3P8qGhcaI7WpwNy1rlRFFFXGcqFAMUncDg2Q==", - "requires": { - "@internationalized/date": "^3.5.0", - "@react-stately/utils": "^3.9.0", - "@react-types/calendar": "^3.4.2", - "@react-types/shared": "^3.22.0", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.4.4.tgz", + "integrity": "sha512-f9ZOd096gGGD+3LmU1gkmfqytGyQtrgi+Qjn+70GbM2Jy65pwOR4I9YrobbmeAFov5Tff13mQEa0yqWvbcDLZQ==", + "requires": { + "@internationalized/date": "^3.5.2", + "@react-stately/utils": "^3.9.1", + "@react-types/calendar": "^3.4.4", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/checkbox": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.0.tgz", - "integrity": "sha512-e1ChMwGovcOEDcdizqXDT6eDZixIMiPQOzNV5wPQ91SlGaIry9b0lQnK18tHg3yv2iiS6Ipj96cGBUKLJqQ+cQ==", - "requires": { - "@react-stately/form": "^3.0.0", - "@react-stately/utils": "^3.9.0", - "@react-types/checkbox": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.3.tgz", + "integrity": "sha512-hWp0GXVbMI4sS2NbBjWgOnHNrRqSV4jeftP8zc5JsIYRmrWBUZitxluB34QuVPzrBO29bGsF0GTArSiQZt6BWw==", + "requires": { + "@react-stately/form": "^3.0.1", + "@react-stately/utils": "^3.9.1", + "@react-types/checkbox": "^3.7.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/collections": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.3.tgz", - "integrity": "sha512-fA28HIApAIz9sNGeOVXZJPgV5Kig6M72KI1t9sUbnRUr9Xq9OMJTR6ElDMXNe0iTeZffRFDOPYyqnX9zkxof6Q==", + "version": "3.10.5", + "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.5.tgz", + "integrity": "sha512-k8Q29Nnvb7iAia1QvTanZsrWP2aqVNBy/1SlE6kLL6vDqtKZC+Esd1SDLHRmIcYIp5aTdfwIGd0NuiRQA7a81Q==", "requires": { - "@react-types/shared": "^3.22.0", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/combobox": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.0.tgz", - "integrity": "sha512-F74Avf7+8ruRqEB+3Lh6/C5jXc3ESJbRf9ovUxhmNAzBGeFKesPn5HpEpo87C+3OukGb+/Buvi3Rhib9+HVBKA==", - "requires": { - "@react-stately/collections": "^3.10.3", - "@react-stately/form": "^3.0.0", - "@react-stately/list": "^3.10.1", - "@react-stately/menu": "^3.5.7", - "@react-stately/select": "^3.6.0", - "@react-stately/utils": "^3.9.0", - "@react-types/combobox": "^3.9.0", - "@react-types/shared": "^3.22.0", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.2.tgz", + "integrity": "sha512-f+IHuFW848VoMbvTfSakn2WIh2urDxO355LrKxnisXPCkpQHpq3lvT2mJtKJwkPxjAy7xPjpV8ejgga2R6p53Q==", + "requires": { + "@react-stately/collections": "^3.10.5", + "@react-stately/form": "^3.0.1", + "@react-stately/list": "^3.10.3", + "@react-stately/overlays": "^3.6.5", + "@react-stately/select": "^3.6.2", + "@react-stately/utils": "^3.9.1", + "@react-types/combobox": "^3.10.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/data": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.11.0.tgz", - "integrity": "sha512-0BlPT58WrAtUvpiEfUuyvIsGFTzp/9vA5y+pk53kGJhOdc5tqBGHi9cg40pYE/i1vdHJGMpyHGRD9nkQb8wN3Q==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.11.2.tgz", + "integrity": "sha512-yhK2upk2WbJeiLBRWHrh/4G2CvmmozCzoivLaRAPYu53m1J3MyzVGCLJgnZMbMZvAbNcYWZK6IzO6VqZ2y1fOw==", "requires": { - "@react-types/shared": "^3.22.0", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/datepicker": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.0.tgz", - "integrity": "sha512-p6BuxPbDxjIgBZmskdv2dR6XIdPEftCjS7kYe/+iLZxfz1vYiDqpJVb3ascLyBjl84bDDyr4z2vWcKhdDwyhEA==", - "requires": { - "@internationalized/date": "^3.5.0", - "@internationalized/string": "^3.1.1", - "@react-stately/form": "^3.0.0", - "@react-stately/overlays": "^3.6.4", - "@react-stately/utils": "^3.9.0", - "@react-types/datepicker": "^3.7.0", - "@react-types/shared": "^3.22.0", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.2.tgz", + "integrity": "sha512-Z6FrK6Af7R5BizqHhJFCj3Hn32mg5iLSDdEgFQAuO043guOXUKFUAnbxfbQUjL6PGE6QwWMfQD7PPGebHn9Ifw==", + "requires": { + "@internationalized/date": "^3.5.2", + "@internationalized/string": "^3.2.1", + "@react-stately/form": "^3.0.1", + "@react-stately/overlays": "^3.6.5", + "@react-stately/utils": "^3.9.1", + "@react-types/datepicker": "^3.7.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/dnd": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.2.6.tgz", - "integrity": "sha512-ex3Pjn+9uIoqsBb9F4ZFJb3fB0YadN8uYBOEiBb9N4UXWyANibGUYJ2FvIbvq1nFDU7On7MW1J9e3vkGglX4FQ==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.2.8.tgz", + "integrity": "sha512-oSo+2Bzum3Q1/d+3FuaDmpVHqqBB004tycuQDDFtad3N1BKm+fNfmslRK1ioLkPLK4sm1130V+BZBY3JXLe80A==", "requires": { - "@react-stately/selection": "^3.14.1", - "@react-types/shared": "^3.22.0", + "@react-stately/selection": "^3.14.3", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/flags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.0.tgz", - "integrity": "sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.1.tgz", + "integrity": "sha512-h5PcDMj54aipQNO18ig/IMI1kzPwcvSwVq5M6Ib6XE1WIkOH0dIuW2eADdAOhcGi3KXJtXVdD29zh0Eox1TKgQ==", "requires": { "@swc/helpers": "^0.4.14" }, @@ -46062,562 +44805,562 @@ } }, "@react-stately/form": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.0.0.tgz", - "integrity": "sha512-C8wkfFmtx1escizibhdka5JvTy9/Vp173CS9cakjvWTmnjYYC1nOlzwp7BsYWTgerCFbRY/BU/Cf/bJDxPiUKQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.0.1.tgz", + "integrity": "sha512-T1Ul2Ou0uE/S4ECLcGKa0OfXjffdjEHfUFZAk7OZl0Mqq/F7dl5WpoLWJ4d4IyvZzGO6anFNenP+vODWbrF3NA==", "requires": { - "@react-types/shared": "^3.22.0", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/grid": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.8.3.tgz", - "integrity": "sha512-JceGSJcuO6Zv+Aq5s2NZvmbMjdPjTtGNQR9kTgXKC/pOfM6FJ58bJiOmEllyN6oawqh4Ey8Xdqk9NuW4l2ctuw==", + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.8.5.tgz", + "integrity": "sha512-KCzi0x0p1ZKK+OptonvJqMbn6Vlgo6GfOIlgcDd0dNYDP8TJ+3QFJAFre5mCr7Fubx7LcAOio4Rij0l/R8fkXQ==", "requires": { - "@react-stately/collections": "^3.10.3", - "@react-stately/selection": "^3.14.1", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", + "@react-stately/collections": "^3.10.5", + "@react-stately/selection": "^3.14.3", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/layout": { - "version": "3.13.4", - "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-3.13.4.tgz", - "integrity": "sha512-gmtkB+EISfB1Ne/56cd4djJXUwCtcrjzA7BHzBBXcjJNmTc/NQh5+qh66JHkXTKF3PT5FdVtmO2MODqGaWkUeg==", - "requires": { - "@react-stately/collections": "^3.10.3", - "@react-stately/table": "^3.11.3", - "@react-stately/virtualizer": "^3.6.5", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", - "@react-types/table": "^3.9.1", + "version": "3.13.7", + "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-3.13.7.tgz", + "integrity": "sha512-9HH/aSxpEHwUW1T1vGN3+iznkAXQUzoMrsoEepNzesOsUGSm/MFZmEk4+9cdPA7y3ou2eHpGNUB1YIDDVptElg==", + "requires": { + "@react-stately/collections": "^3.10.5", + "@react-stately/table": "^3.11.6", + "@react-stately/virtualizer": "^3.6.8", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", + "@react-types/table": "^3.9.3", "@swc/helpers": "^0.5.0" } }, "@react-stately/list": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.10.1.tgz", - "integrity": "sha512-iVarLMd7FmMT0H20dRWsFOHHX5+c4gK51AXP2BSr1VtDSfbL4dgaGgu7IaAMVc/rO0au1e1tPM2hutiIFvPcnA==", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.10.3.tgz", + "integrity": "sha512-Ul8el0tQy2Ucl3qMQ0fiqdJ874W1ZNjURVSgSxN+pGwVLNBVRjd6Fl7YwZFCXER2YOlzkwg+Zqozf/ZlS0EdXA==", "requires": { - "@react-stately/collections": "^3.10.3", - "@react-stately/selection": "^3.14.1", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", + "@react-stately/collections": "^3.10.5", + "@react-stately/selection": "^3.14.3", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/menu": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.5.7.tgz", - "integrity": "sha512-bzTmAqzcMNatvyruWlvOdZSmMhz3+mkdxtqaZzYHq+DpR6ka57lIRj8dBnZWQGwV3RypMZfz+X6aIX4kruGVbw==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.6.1.tgz", + "integrity": "sha512-3v0vkTm/kInuuG8jG7jbxXDBnMQcoDZKWvYsBQq7+POt0LmijbLdbdZPBoz9TkZ3eo/OoP194LLHOaFTQyHhlw==", "requires": { - "@react-stately/overlays": "^3.6.4", - "@react-types/menu": "^3.9.6", - "@react-types/shared": "^3.22.0", + "@react-stately/overlays": "^3.6.5", + "@react-types/menu": "^3.9.7", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/numberfield": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.7.0.tgz", - "integrity": "sha512-DOz4jL7T30KGUXpGh/z80aHf+DEOQfvCHVDfll+IU7p3sd+bbM5uj7JdwXpZgIYUK8KTf2N49sL6lq5uCoxh8w==", - "requires": { - "@internationalized/number": "^3.4.0", - "@react-stately/form": "^3.0.0", - "@react-stately/utils": "^3.9.0", - "@react-types/numberfield": "^3.7.0", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.9.1.tgz", + "integrity": "sha512-btBIcBEfSVCUm6NwJrMrMygoIu/fQGazzD0RhF7PNsfvkFiWn+TSOyQqSXcsUJVOnBfoS/dVWj6r57KA7zl3FA==", + "requires": { + "@internationalized/number": "^3.5.1", + "@react-stately/form": "^3.0.1", + "@react-stately/utils": "^3.9.1", + "@react-types/numberfield": "^3.8.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/overlays": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.4.tgz", - "integrity": "sha512-tHEaoAGpE9dSnsskqLPVKum59yGteoSqsniTopodM+miQozbpPlSjdiQnzGLroy5Afx5OZYClE616muNHUILXA==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.5.tgz", + "integrity": "sha512-U4rCFj6TPJPXLUvYXAcvh+yP/CO2W+7f0IuqP7ZZGE+Osk9qFkT+zRK5/6ayhBDFpmueNfjIEAzT9gYPQwNHFw==", "requires": { - "@react-stately/utils": "^3.9.0", - "@react-types/overlays": "^3.8.4", + "@react-stately/utils": "^3.9.1", + "@react-types/overlays": "^3.8.5", "@swc/helpers": "^0.5.0" } }, "@react-stately/radio": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.0.tgz", - "integrity": "sha512-d8IgZtUq/4vhE7YhyBVg1QdVoFS0caIcvPumXqtp/5vlDgpUsVy9jSeWtbk0H4FyUcmJlQhRcTylKB9THXY1YQ==", - "requires": { - "@react-stately/form": "^3.0.0", - "@react-stately/utils": "^3.9.0", - "@react-types/radio": "^3.6.0", - "@react-types/shared": "^3.22.0", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.2.tgz", + "integrity": "sha512-JW5ZWiNMKcZvMTsuPeWJQLHXD5rlqy7Qk6fwUx/ZgeibvMBW/NnW19mm2+IMinzmbtERXvR6nsiA837qI+4dew==", + "requires": { + "@react-stately/form": "^3.0.1", + "@react-stately/utils": "^3.9.1", + "@react-types/radio": "^3.7.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/searchfield": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.0.tgz", - "integrity": "sha512-SStjChkn/33pEn40slKQPnBnmQYyxVazVwPjiBkdeVejC42lUVairUTrGJgF0PNoZTbxn0so2/XzjqTC9T8iCw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.1.tgz", + "integrity": "sha512-9A8Wghx1avRHhMpNH1Nj+jFfiF1bhsff2GEC5PZgWYzhCykw3G5bywn3JAuUS4kh7Vpqhbu4KpHAhmWPSv4B/Q==", "requires": { - "@react-stately/utils": "^3.9.0", - "@react-types/searchfield": "^3.5.2", + "@react-stately/utils": "^3.9.1", + "@react-types/searchfield": "^3.5.3", "@swc/helpers": "^0.5.0" } }, "@react-stately/select": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.0.tgz", - "integrity": "sha512-GvSE4DXmcvdRNUc+ciPU7gedt7LfRO8FFFIzhB/bCQhUlK6/xihUPrGXayzqxLeTQKttMH323LuYFKfwpJRhsA==", - "requires": { - "@react-stately/form": "^3.0.0", - "@react-stately/list": "^3.10.1", - "@react-stately/menu": "^3.5.7", - "@react-types/select": "^3.9.0", - "@react-types/shared": "^3.22.0", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.2.tgz", + "integrity": "sha512-duOxdHKol93h6Ew6fap6Amz+zngoERKZLSKVm/8I8uaBgkoBhEeTFv7mlpHTgINxymMw3mMrvy6GL/gfKFwkqg==", + "requires": { + "@react-stately/form": "^3.0.1", + "@react-stately/list": "^3.10.3", + "@react-stately/overlays": "^3.6.5", + "@react-types/select": "^3.9.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/selection": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.14.1.tgz", - "integrity": "sha512-96/CerrB6yH4Ad9FkzBzyVerSPjcIj1NBTWTFHo1N+oHECvyGsDxZl7Y4LQR++teFK66FhX5KjCJQGae4IZd6A==", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.14.3.tgz", + "integrity": "sha512-d/t0rIWieqQ7wjLoMoWnuHEUSMoVXxkPBFuSlJF3F16289FiQ+b8aeKFDzFTYN7fFD8rkZTnpuE4Tcxg3TmA+w==", "requires": { - "@react-stately/collections": "^3.10.3", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", + "@react-stately/collections": "^3.10.5", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/slider": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.4.5.tgz", - "integrity": "sha512-lJPZC8seYbnZDqAlZm3/QC95I5iluG8ouwkPMmvtWCz1baayV/jJtfxA/74zR7Vcob9Fe7O57g8Edhz/hv9xOQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.5.2.tgz", + "integrity": "sha512-ntH3NLRG+AwVC7q4Dx9DcmMkMh9vmHjHNXAgaoqNjhvwfSIae7sQ69CkVe6XeJjIBy6LlH81Kgapz+ABe5a1ZA==", "requires": { - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", - "@react-types/slider": "^3.7.0", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", + "@react-types/slider": "^3.7.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/table": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.11.3.tgz", - "integrity": "sha512-r0rzSKbtMG4tjFpCGtXb8p6hOuek03c6rheJE88z4I/ujZ5EmEO6Ps8q0JMNEDCY2qigvKM+ODisMBeZCEkIJg==", - "requires": { - "@react-stately/collections": "^3.10.3", - "@react-stately/flags": "^3.0.0", - "@react-stately/grid": "^3.8.3", - "@react-stately/selection": "^3.14.1", - "@react-stately/utils": "^3.9.0", - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0", - "@react-types/table": "^3.9.1", + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.11.6.tgz", + "integrity": "sha512-34YsfOILXusj3p6QNcKEaDWVORhM6WEhwPSLCZlkwAJvkxuRQFdih5rQKoIDc0uV5aZsB6bYBqiFhnjY0VERhw==", + "requires": { + "@react-stately/collections": "^3.10.5", + "@react-stately/flags": "^3.0.1", + "@react-stately/grid": "^3.8.5", + "@react-stately/selection": "^3.14.3", + "@react-stately/utils": "^3.9.1", + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1", + "@react-types/table": "^3.9.3", "@swc/helpers": "^0.5.0" } }, "@react-stately/tabs": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.2.tgz", - "integrity": "sha512-f+U4D1FAVfVVcNRbtKIv4GrO37CLFClYQlXx9zIuSXjHsviapVD2IQSyAmpKo/CbgXhYRMdGwENZdOsmF/Ns7g==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.4.tgz", + "integrity": "sha512-WZJgMBqzLgN88RN8AxhY4aH1+I+4w1qQA0Lh3LRSDegaytd+NHixCWaP3IPjePgCB5N1UsPe96Xglw75zjHmDg==", "requires": { - "@react-stately/list": "^3.10.1", - "@react-types/shared": "^3.22.0", - "@react-types/tabs": "^3.3.4", + "@react-stately/list": "^3.10.3", + "@react-types/shared": "^3.22.1", + "@react-types/tabs": "^3.3.5", "@swc/helpers": "^0.5.0" } }, "@react-stately/toggle": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.0.tgz", - "integrity": "sha512-TRksHkCJk/Xogq4181g3CYgJf+EfsJCqX5UZDSw1Z1Kgpvonjmdf6FAfQfCh9QR2OuXUL6hOLUDVLte5OPI+5g==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.2.tgz", + "integrity": "sha512-SHCF2btcoK57c4lyhucRbyPBAFpp0Pdp0vcPdn3hUgqbu6e5gE0CwG/mgFmZRAQoc7PRc7XifL0uNw8diJJI0Q==", "requires": { - "@react-stately/utils": "^3.9.0", - "@react-types/checkbox": "^3.6.0", + "@react-stately/utils": "^3.9.1", + "@react-types/checkbox": "^3.7.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/tooltip": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.6.tgz", - "integrity": "sha512-uL93bmsXf+OOgpKLPEKfpDH4z+MK2CuqlqVxx7rshN0vjWOSoezE5nzwgee90+RpDrLNNNWTNa7n+NkDRpI1jA==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.7.tgz", + "integrity": "sha512-ACtRgBQ8rphBtsUaaxvEAM0HHN9PvMuyvL0vUHd7jvBDCVZJ6it1BKu9SBKjekBkoBOw9nemtkplh9R2CA6V8Q==", "requires": { - "@react-stately/overlays": "^3.6.4", - "@react-types/tooltip": "^3.4.6", + "@react-stately/overlays": "^3.6.5", + "@react-types/tooltip": "^3.4.7", "@swc/helpers": "^0.5.0" } }, "@react-stately/tree": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.7.4.tgz", - "integrity": "sha512-0yvVODBS8WnSivLFX5ccEjCl2NA/8lbEt1E48wVcY1xcXgISNpw5MSGK5jC6YrtJPIqVolQIkNSbMreXGBktIg==", - "requires": { - "@react-stately/collections": "^3.10.3", - "@react-stately/selection": "^3.14.1", - "@react-stately/utils": "^3.9.0", - "@react-types/shared": "^3.22.0", + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.7.6.tgz", + "integrity": "sha512-y8KvEoZX6+YvqjNCVGS3zA/BKw4D3XrUtUKIDme3gu5Mn6z97u+hUXKdXVCniZR7yvV3fHAIXwE5V2K8Oit4aw==", + "requires": { + "@react-stately/collections": "^3.10.5", + "@react-stately/selection": "^3.14.3", + "@react-stately/utils": "^3.9.1", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-stately/utils": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.0.tgz", - "integrity": "sha512-yPKFY1F88HxuZ15BG2qwAYxtpE4HnIU0Ofi4CuBE0xC6I8mwo4OQjDzi+DZjxQngM9D6AeTTD6F1V8gkozA0Gw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.1.tgz", + "integrity": "sha512-yzw75GE0iUWiyps02BOAPTrybcsMIxEJlzXqtvllAb01O9uX5n0i3X+u2eCpj2UoDF4zS08Ps0jPgWxg8xEYtA==", "requires": { "@swc/helpers": "^0.5.0" } }, "@react-stately/virtualizer": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.6.5.tgz", - "integrity": "sha512-v0cZeNCGPMeo3LP4UrGuDo3Xpq7ufNaZyGObgSvdrIW49qK5F02kczcKy6NKg+QfOgC/+Nc9Tof/2S8dcxDrCA==", + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.6.8.tgz", + "integrity": "sha512-Pf06ihTwExRJltGhi72tmLIo0pcjkL55nu7ifMafAAdxZK4ONxRLSuUjjpvYf/0Rs92xRZy2t/XmHREnfirdkQ==", "requires": { - "@react-aria/utils": "^3.22.0", - "@react-types/shared": "^3.22.0", + "@react-aria/utils": "^3.23.2", + "@react-types/shared": "^3.22.1", "@swc/helpers": "^0.5.0" } }, "@react-types/actionbar": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@react-types/actionbar/-/actionbar-3.1.4.tgz", - "integrity": "sha512-/z9N7ztd/MOdEDQNHTCNviYe0+rqy1s19Xg3tv/PV1oUCOsjrnja85VVxoa+AWR8IbwgDNIfpXg2Wa66b1FDbw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@react-types/actionbar/-/actionbar-3.1.5.tgz", + "integrity": "sha512-Z3hfIoaOaW8wJxQm1NyWVvSftpNDYv9iWqpEWBEdhxuqsUkOVszZ7KcNaF4qsm4bJIcJWn3FNKhaTKGwISZcdQ==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/actiongroup": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/actiongroup/-/actiongroup-3.4.6.tgz", - "integrity": "sha512-Dho2mEDCU9ZAW+QX2HZkZhyxHK/EGfTvSWdHBFaCYsh4CPI/6PcvtirpSKMrzNNaZ97Exthv3GcLpAnLwM9jZw==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-types/actiongroup/-/actiongroup-3.4.7.tgz", + "integrity": "sha512-VsyHn6mGqEHKEIGFiHTq7rSuzuQjGVZGtnhh/9jQXW6zoSJyoM4fAnHEt+RE92NdiRv5e3+OzzrwG0TZsi87cQ==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/avatar": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@react-types/avatar/-/avatar-3.0.4.tgz", - "integrity": "sha512-fQ+qGce0EqcX0s2glnFjfvxSq42GHaqvl+eL8TnsDz0OIvB8KKzTO/rV/q1CIy/LtMP8fjCb6oqVFQcLfuODfw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@react-types/avatar/-/avatar-3.0.5.tgz", + "integrity": "sha512-/hM/BnRoUhusT16G4hf2hfe4FocxaM5H/a7aetUrmlr9e5ppX3n0VsU0btIwxdh+aJL8u2BBt2scoiJaujQPNg==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/badge": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@react-types/badge/-/badge-3.1.6.tgz", - "integrity": "sha512-6xjgfRnCVSBI6l/RQkI4u3tXiXw1aeFKRqXPcyIyt/kuu7rP0nKeYcM2XYyXXQp7vHfBdOEL2f6LwIHR/lx4uQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@react-types/badge/-/badge-3.1.7.tgz", + "integrity": "sha512-2Q5W9gleI83WpL1i6qPdcPC8l1V7364dpkNLcMi9DFmM2l69+QcPvSWVQMQLevmRo4cnaQ+TYsOgYv8I4rRJCg==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/breadcrumbs": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.2.tgz", - "integrity": "sha512-esl6RucDW2CNMsApJxNYfMtDaUcfLlwKMPH/loYsOBbKxGl2HsgVLMcdpjEkTRs2HCTNCbBXWpeU8AY77t+bsw==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.3.tgz", + "integrity": "sha512-eFto/+6J+JR58vThNcALZRA1OlqlG3GzQ/bq3q8IrrkOZcrfbEJJCWit/+53Ia98siJKuF4OJHnotxIVIz5I3w==", "requires": { - "@react-types/link": "^3.5.2", - "@react-types/shared": "^3.22.0" + "@react-types/link": "^3.5.3", + "@react-types/shared": "^3.22.1" } }, "@react-types/button": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.1.tgz", - "integrity": "sha512-bf9iTar3PtqnyV9rA+wyFyrskZKhwmOuOd/ifYIjPs56YNVXWH5Wfqj6Dx3xdFBgtKx8mEVQxVhoX+WkHX+rtw==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.2.tgz", + "integrity": "sha512-EnPTkGHZRtiwAoJy5q9lDjoG30bEzA/qnvKG29VVXKYAGeqY2IlFs1ypmU+z1X/CpJgPcG3I5cakM7yTVm3pSg==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/buttongroup": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/buttongroup/-/buttongroup-3.3.6.tgz", - "integrity": "sha512-aKFDzAWM6bk2+EBDSZe3zq4NMuguXsPyZ9OexN0YLleK4IkRKE2S51PdChY/GAFhfs7VsOKgjHrYWUnrmCCYvw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/buttongroup/-/buttongroup-3.3.7.tgz", + "integrity": "sha512-EZ/1k66GtDtWfE/udNRz2UBbt4YJumeyW1SGcZEO3jketvpms58WapLsMkCezlLz7WYaa5ADV0kU8v88APjI6g==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/calendar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.2.tgz", - "integrity": "sha512-tCZ21un/8OAhpNtmSXDkOVvS5Pzp+y/JwNr6VGFi8HBC5F/c8SzuwV0jKN8ymsZSWbDQ68xXGNWxFaG43Bw8Pg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.4.tgz", + "integrity": "sha512-hV1Thmb/AES5OmfPvvmyjSkmsEULjiDfA7Yyy70L/YKuSNKb7Su+Bf2VnZuDW3ec+GxO4JJNlpJ0AkbphWBvcg==", "requires": { - "@internationalized/date": "^3.5.0", - "@react-types/shared": "^3.22.0" + "@internationalized/date": "^3.5.2", + "@react-types/shared": "^3.22.1" } }, "@react-types/checkbox": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.6.0.tgz", - "integrity": "sha512-vgbuJzQpVCNT5AZWV0OozXCnihqrXxoZKfJFIw0xro47pT2sn3t5UC4RA9wfjDGMoK4frw1K/4HQLsQIOsPBkw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.7.1.tgz", + "integrity": "sha512-kuGqjQFex0As/3gfWyk+e9njCcad/ZdnYLLiNvhlk15730xfa0MmnOdpqo9jfuFSXBjOcpxoofvEhvrRMtEdUA==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/combobox": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.9.0.tgz", - "integrity": "sha512-VAQWM2jrIWROgcTKxj4k37WWpK/1zRjj1HfGeuenAQyOQwImqDwCHx5YxQR1GiUEFne4v1yXe2khT0T5Kt2vDg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.10.1.tgz", + "integrity": "sha512-XMno1rgVRNta49vf5nV7VJpVSVAV20tt79t618gG1qRKH5Kt2Cy8lz2fQ5vHG6UTv/6jUOvU8g5Pc93sLaTmoA==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/contextualhelp": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@react-types/contextualhelp/-/contextualhelp-3.2.7.tgz", - "integrity": "sha512-BHwBSBhPekKc/PxDpnkvfcEgpaYLMrV6WYgMfUz2/BMYOjdm+pb1y80vpNkWtrJKytyqp1zeZ+Ca+xzX1HdazA==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@react-types/contextualhelp/-/contextualhelp-3.2.8.tgz", + "integrity": "sha512-Yb0zOqkWfjKCO+gpfVj69CfWPhVq6RTgwLBV47ntIlHitpbh7RDYwDVulPyaVoopPbNSFUoV4YIJZPlOgpbKjg==", "requires": { - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" } }, "@react-types/datepicker": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.0.tgz", - "integrity": "sha512-Uh+p6pZpMFc5ZBOns5TXCBbUvJp1KVROLBn2gk5dMEFVq78Qs1VFuAt4lwr9gQBOJrX5I/l65pRTwwWwAKxYtQ==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.2.tgz", + "integrity": "sha512-zThqFAdhQL1dqyVDsDSSTdfCjoD6634eyg/B0ZJfQxcLUR/5pch3v/gxBhbyCVDGMNHRWUWIJvY9DVOepuoSug==", "requires": { - "@internationalized/date": "^3.5.0", - "@react-types/calendar": "^3.4.2", - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" + "@internationalized/date": "^3.5.2", + "@react-types/calendar": "^3.4.4", + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" } }, "@react-types/dialog": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.7.tgz", - "integrity": "sha512-geYoqAyQaTLG43AaXdMUVqZXYgkSifrD9cF7lR2kPAT0uGFv0YREi6ieU+aui8XJ83EW0xcxP+EPWd2YkN4D4w==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.8.tgz", + "integrity": "sha512-RX8JsMvty8ADHRqVEkppoynXLtN4IzUh8d5z88UEBbcvWKlHfd6bOBQjQcBH3AUue5wjfpPIt6brw2VzgBY/3Q==", "requires": { - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" } }, "@react-types/divider": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/divider/-/divider-3.3.6.tgz", - "integrity": "sha512-Iwwe349IiCX7ZQK1Oz4AN5kWwiXG0DECSN4qB3h+14n97JKy3chWJC7UA+V6+2p5DbxmLVZm4XxDRgx7y0lVTg==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/divider/-/divider-3.3.7.tgz", + "integrity": "sha512-enAlzHVwzqBPpmE+/VAO5IGVPxPrscHkdbnEkTqW9JQeMUGXd4L0TdHOGd+vtcA+gILJMnhUfT3XE4wQ4HlpVw==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/form": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.6.0.tgz", - "integrity": "sha512-+k6IpjQE+sVi/xoK5lnRGyeISkOQ+CKfuH8IeGcYVHr2voDxSJC5WZsp+L5zeoxuSorKokeEPKGOX2HFj9BG/A==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.7.2.tgz", + "integrity": "sha512-6/isEJY4PsYoHdMaGQtqQyquXGTwB1FqCBOPKQjI/vBGWG3fL7FGfWm4Z62eTbCH4Xyv3FZuNywlT8UjPMQyKA==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/grid": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.3.tgz", - "integrity": "sha512-GQM4RDmYhstcYZ0Odjq+xUwh1fhLmRebG6qMM8OXHTPQ77nhl3wc1UTGRhZm6mzEionplSRx4GCpEMEHMJIU0w==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.4.tgz", + "integrity": "sha512-sDVoyQcH7MoGdx5nBi5ZOU/mVFBt9YTxhvr0PZ97dMdEHZtJC1w9SuezwWS34f50yb8YAXQRTICbZYcK4bAlDA==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/illustratedmessage": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/illustratedmessage/-/illustratedmessage-3.3.6.tgz", - "integrity": "sha512-1FdJl1tR6mirmXT8yaTFeHNWdLXV6Dll66Mv1liEtTYsmCgn2anxwM73jK63t3jdT6ez/M1wGiwMlMtyiqo+ZQ==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/illustratedmessage/-/illustratedmessage-3.3.7.tgz", + "integrity": "sha512-r8WAv+w0WQSDRmDmG6jL0dXK8MjMr/lr2gBpVYVvC45Gu+fqf4VL+4zphgwASRysWclFbjQhgkgC7OEXk3GUKg==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/image": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/image/-/image-3.3.6.tgz", - "integrity": "sha512-GSb0deyquS3kFt0e9SfPP9I/YaYYUToYYPzx9As0R0mzuVn6qTHhUtpKhBqQAOpE1Cd8XdEQeYsDB3sdOurI+A==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/image/-/image-3.3.7.tgz", + "integrity": "sha512-ty6wuan6p3Z8OzSrbjtL2k8yXHW+n0qiYKyqKpSA8TcRLDLhtvRceI7X12RuDfbAiEN6/zfLCuF47O3y7OeKug==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/label": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.9.0.tgz", - "integrity": "sha512-nTmPf5ED8aLGqvFsZHIHwMPrRX0cfbOyayva//Rdis41KWQoKUB80DIQjE+iUDOgTivIxGBkpqdIZVqRuehTnw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.9.1.tgz", + "integrity": "sha512-0N/UOhwrKjE9VjVbUoJCsH5UwTzSu3d5B3xtvhH8YFqSbJCI+HMKILby8i8ys55RA9fQDMScIjCJafEFWW7UWA==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/layout": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/@react-types/layout/-/layout-3.3.12.tgz", - "integrity": "sha512-Ai6limgTVYQoGiXUvsXg8MHik+YAtRWEVLQhT5E1nQkDkNkQyccB+waUSfORhRkjJcnp+KMcbmPZ8V5ZO42rvQ==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@react-types/layout/-/layout-3.3.13.tgz", + "integrity": "sha512-Y3pmSsfDB+bV299F5SJannR6m/XM5IyfdqjPS0/Qx8KBBf0A3UWfL6qUr4BMEAKsEJuIXA7zT3RSo/AbGSbSyg==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/link": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.5.2.tgz", - "integrity": "sha512-/s51/WejmpLiyxOgP89s4txgxYoGaPe8pVDItVo1h4+BhU1Puyvgv/Jx8t9dPvo6LUXbraaN+SgKk/QDxaiirw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.5.3.tgz", + "integrity": "sha512-yVafjW3IejyVnK3oMBNjFABCGG6J27EUG8rvkaGaI1uB6srGUEhpJ97XLv11aj1QkXHBy3VGXqxEV3S7wn4HTw==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/listbox": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.6.tgz", - "integrity": "sha512-XOQvrTqNh5WIPDvKiWiep8T07RAsMfjAXTjDbnjxVlKACUXkcwpts9kFaLnJ9LJRFt6DwItfP+WMkzvmx63/NQ==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.7.tgz", + "integrity": "sha512-68y5H9CVSPFiwO6MOFxTbry9JQMK/Lb1M9i3M8TDyq1AbJxBPpgAvJ9RaqIMCucsnqCzpY/zA3D/X417zByL1w==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/menu": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.6.tgz", - "integrity": "sha512-w/RbFInOf4nNayQDv5c2L8IMJbcFOkBhsT3xvvpTy+CHvJcQdjggwaV1sRiw7eF/PwB81k2CwigmidUzHJhKDg==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.7.tgz", + "integrity": "sha512-K6KhloJVoGsqwkdeez72fkNI9dfrmLI/sNrB4XuOKo2crDQ/eyZYWyJmzz8giz/tHME9w774k487rVoefoFh5w==", "requires": { - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" } }, "@react-types/meter": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.3.6.tgz", - "integrity": "sha512-1XYp1fA9UU0lO6kjf3TwVE8mppOJa64mBKAcLWtTyq1e/cYIAbx5o6CsuUx0YDpXKF6gdtvIWvfmxeWsmqJ1jQ==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.3.7.tgz", + "integrity": "sha512-p+YJ0+Lpn5MLmlbFZbDH1P0ILv1+AuMcUbxLcXMIVMGn7o0FO7eVZnFuq76D+qTDm9all+TRLJix7bctOrP+5Q==", "requires": { - "@react-types/progress": "^3.5.1" + "@react-types/progress": "^3.5.2" } }, "@react-types/numberfield": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.7.0.tgz", - "integrity": "sha512-gaGi+vqm1Y8LCWRsWYUjcGftPIzl+8W2VOfkgKMLM8y76nnwTPtmAqs+Ap1cg7sEJSfsiKMq93e9yvP3udrC2w==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.1.tgz", + "integrity": "sha512-GaCjLQgXUGCt40SLjKk3/COMWFlN2vV/3Xs3VSLAEdFZpk99b+Ik1oR21+7ZP5/iMHuQDc1MJRWdFfIjxCvVDQ==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/overlays": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.4.tgz", - "integrity": "sha512-pfgNlQnbF6RB/R2oSxyqAP3Uzz0xE/k5q4n5gUeCDNLjY5qxFHGE8xniZZ503nZYw6VBa9XMN1efDOKQyeiO0w==", + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.5.tgz", + "integrity": "sha512-4D7EEBQigD/m8hE68Ys8eloyyZFHHduqykSIgINJ0edmo0jygRbWlTwuhWFR9USgSP4dK54duN0Mvq0m4HEVEw==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/progress": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.1.tgz", - "integrity": "sha512-CqsUjczUK/SfuFzDcajBBaXRTW0D3G9S/yqLDj9e8E0ii+lGDLt1PHj24t1J7E88U2rVYqmM9VL4NHTt8o3IYA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.2.tgz", + "integrity": "sha512-aQql22kusEudsHwDEzq6y/Mh29AM+ftRDKdS5E5g4MkCY5J4FMbOYco1T5So83NIvvG9+eKcxPoJUMjQQACAyA==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/provider": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-types/provider/-/provider-3.7.1.tgz", - "integrity": "sha512-WKwHwG5b0LkI570tbHCy4hBhT/E+OrdgIybScDxM713B2OwmMKKyaPKdV05SeoomP8oiPvkaAeXhLZa1ah7CYg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@react-types/provider/-/provider-3.7.2.tgz", + "integrity": "sha512-nzxbfuh/ZJXt/blGAiRPkxi9jAUnnBkHcvljqdfizfLJlN5epaYYaTWNUSde27Oe1tAnpm2WDlLQo5+0C6C0FA==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/radio": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.6.0.tgz", - "integrity": "sha512-VOZzegxxZS55gHRVyWu278Q4y/rEQGiAVQCUqi25GmpbMe4MlHrzg16c76RiZMUK9PPoyv+XNUgAaPmxebkn7g==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.7.1.tgz", + "integrity": "sha512-Zut3rN1odIUBLZdijeyou+UqsLeRE76d9A+npykYGu29ndqmo3w4sLn8QeQcdj1IR71ZnG0pW2Y2BazhK5XrrQ==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/searchfield": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.5.2.tgz", - "integrity": "sha512-JAK2/Kg4Dr393FYfbRw0TlXKnJPX77sq1x/ZBxtO6p64+MuuIYKqw0i9PwDlo1PViw2QI5u8GFhKA2TgemY9uA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.5.3.tgz", + "integrity": "sha512-gBfsT1WpY8UIb74yyYmnjiHpVasph2mdmGj9i8cGF2HUYwx5p+Fr85mtCGDph0uirvRoM5ExMp4snD+ueNAVCg==", "requires": { - "@react-types/shared": "^3.22.0", - "@react-types/textfield": "^3.9.0" + "@react-types/shared": "^3.22.1", + "@react-types/textfield": "^3.9.1" } }, "@react-types/select": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.0.tgz", - "integrity": "sha512-0nalGmcoma4jreICLSJae/uKAuMiVyWgqWjGrGiUGGcdDchH4limKVEqNDaBwLvxVT6NB5LLsaipCTCAEEl4Rg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.2.tgz", + "integrity": "sha512-fGFrunednY3Pq/BBwVOf87Fsuyo/SlevL0wFIE9OOl2V5NXVaTY7/7RYA8hIOHPzmvsMbndy419BEudiNGhv4A==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/shared": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.0.tgz", - "integrity": "sha512-yVOekZWbtSmmiThGEIARbBpnmUIuePFlLyctjvCbgJgGhz8JnEJOipLQ/a4anaWfzAgzSceQP8j/K+VOOePleA==", + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.1.tgz", + "integrity": "sha512-PCpa+Vo6BKnRMuOEzy5zAZ3/H5tnQg1e80khMhK2xys0j6ZqzkgQC+fHMNZ7VDFNLqqNMj/o0eVeSBDh2POjkw==", "requires": {} }, "@react-types/slider": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.0.tgz", - "integrity": "sha512-uyQXUVFfqc9SPUW0LZLMan2n232F/OflRafiHXz9viLFa9tVOupVa7GhASRAoHojwkjoJ1LjFlPih7g5dOZ0/Q==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.1.tgz", + "integrity": "sha512-FKO3YZYdrBs00XbBW5acP+0L1cCdevl/uRJiXbnLpGysO5PrSFIRS7Wlv4M7ztf6gT7b1Ao4FNC9crbxBr6BzA==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/statuslight": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/statuslight/-/statuslight-3.3.6.tgz", - "integrity": "sha512-MB/CnsbaE6reOrnpowJfgkpeSNY0ZuqA6g/k8331a+TP2yIO6X0cUYyEGG8S/k9hFyFCMKlcmmm4pwMrX4sZtQ==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/statuslight/-/statuslight-3.3.7.tgz", + "integrity": "sha512-PFctvM8NJFENNWHydEK4pCMXKmjrHB2PJ/fdJ2Bi6ABRcTBXzi/qgUUdbeTG7STXlA+P2/xNgKtHheus8K+K3g==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/switch": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.0.tgz", - "integrity": "sha512-/wNmUGjk69bP6t5k2QkAdrNN5Eb9Rz4dOyp0pCPmoeE+5haW6sV5NmtkvWX1NSc4DQz1xL/a5b+A0vxPCP22Jw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.1.tgz", + "integrity": "sha512-2LFEKMGeufqyYmeN/5dtkDkCPG6x9O4eu6aaBaJmPGon7C/l3yiFEgRue6oCUYc1HixR7Qlp0sPxk0tQeWzrSg==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/table": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.9.1.tgz", - "integrity": "sha512-3e+Oouw9jGqNDg+JRg7v7fgPqDZd6DtST9S/UPp81f32ntnQ8Wsu7S/J4eyLHu5CVQDqcHkf4xPeeXBgPx4qmw==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.9.3.tgz", + "integrity": "sha512-Hs/pMbxJdga2zBol4H5pV1FVIiRjCuSTXst6idJjkctanTexR4xkyrtBwl+rdLNoGwQ2pGii49vgklc5bFK7zA==", "requires": { - "@react-types/grid": "^3.2.3", - "@react-types/shared": "^3.22.0" + "@react-types/grid": "^3.2.4", + "@react-types/shared": "^3.22.1" } }, "@react-types/tabs": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.4.tgz", - "integrity": "sha512-4mCTtFrwMRypyGTZCvNYVT9CkknexO/UYvqwDm2jMYb8JgjRvxnomu776Yh7uyiYKWyql2upm20jqasEOm620w==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.5.tgz", + "integrity": "sha512-6NTSZBOWekCtApdZrhu5tHhE/8q52oVohQN+J5T7shAXd6ZAtu8PABVR/nH4BWucc8FL0OUajRqunqzQMU13gA==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/text": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/text/-/text-3.3.6.tgz", - "integrity": "sha512-cO3IQ/DQ/xUGGskJ8/zCLkbzvrjlQbRnrJl95BEGs97CmiN+zqGoCqvDhjWEbuPRtfGXJ27CYZDC2oVZetUG4w==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/text/-/text-3.3.7.tgz", + "integrity": "sha512-URkJHS314ppyq6JjMPZbg/P4j9vey0H/Lc2+YB96qIcebBKy8iNN0IlwRsLFXimlGDp7dgn6tv+51bdJh+CRCQ==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/textfield": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.0.tgz", - "integrity": "sha512-D/DiwzsfkwlAg3uv8hoIfwju+zhB/hWDEdTvxQbPkntDr0kmN/QfI17NMSzbOBCInC4ABX87ViXLGxr940ykGA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.1.tgz", + "integrity": "sha512-JBHY9M2CkL6xFaGSfWmUJVu3tEK09FaeB1dU3IEh6P41xxbFnPakYHSSAdnwMXBtXPoSHIVsUBickW/pjgfe5g==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/tooltip": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.6.tgz", - "integrity": "sha512-RaZewdER7ZcsNL99RhVHs8kSLyzIBkwc0W6eFZrxST2MD9J5GzkVWRhIiqtFOd5U1aYnxdJ6woq72Ef+le6Vfw==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.7.tgz", + "integrity": "sha512-rV4HZRQxLRNhe24yATOxnFQtGRUmsR7mqxMupXCmd1vrw8h+rdKlQv1zW2q8nALAKNmnRXZJHxYQ1SFzb98fgg==", "requires": { - "@react-types/overlays": "^3.8.4", - "@react-types/shared": "^3.22.0" + "@react-types/overlays": "^3.8.5", + "@react-types/shared": "^3.22.1" } }, "@react-types/view": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@react-types/view/-/view-3.4.6.tgz", - "integrity": "sha512-GAdvvabJAYrVCgOUsZp8KkmNLfkKnDmoMNmwCN9I2OnSS+5JyjTrgNIOiznMjDEqhXTbaefcsVofoUfTYXjtyQ==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@react-types/view/-/view-3.4.7.tgz", + "integrity": "sha512-AcgLrlaZkCXH+pD4I7pTPB52Rstg1M+V2yKPP29lnqg/rOjsqLjN/gLLy/EBi97cQ+TbDbg0854vcxAKs6qclg==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@react-types/well": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@react-types/well/-/well-3.3.6.tgz", - "integrity": "sha512-NX4+bMmNYrbjllKR9Xxg0YHNWrscHzZQmcdYiM/Z8qZ1TNVPhXeLmKxCDamlmUSZudCqwui4q5xwzuUyrRRA6w==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@react-types/well/-/well-3.3.7.tgz", + "integrity": "sha512-BaZ4utlEeweD8+mAYdqwq2bS8aDrXqi4xFPdfqZpHcpbSJjmGBCCS+GU2y/N2Yl1aODu5l0+gcrvxxr63bV+GA==", "requires": { - "@react-types/shared": "^3.22.0" + "@react-types/shared": "^3.22.1" } }, "@rollup/rollup-android-arm-eabi": { @@ -46852,39 +45595,23 @@ } }, "@spectrum-icons/ui": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.6.2.tgz", - "integrity": "sha512-X13fgmi3h0fzolZF+cVJ6NvA91VCb055eBGkhhkQ+vjvUZrHZ8ACD2YUfaDt44BX+fsGUBOZ4fwOrdXnAaVhDQ==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.6.5.tgz", + "integrity": "sha512-L1QISmlzoA4xuBdMpWT2vkR7NDxuROjSwC5BxS8R2SAZR4oKs0dPfODaw2uju6D/xqJIqVrSM6yQDhV51lPKyA==", "requires": { "@adobe/react-spectrum-ui": "1.2.0", - "@react-spectrum/icon": "^3.7.8", + "@react-spectrum/icon": "^3.7.11", "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@adobe/react-spectrum-ui": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-ui/-/react-spectrum-ui-1.2.0.tgz", - "integrity": "sha512-os3EdjfyJbrukLcZ5uYtdFRiDlLB3zq2JoXp19J/IDpZ8btibJeRZYSwjL+LscEiT2pOYaF2McMQdkZTIwnllw==", - "requires": {} - } } }, "@spectrum-icons/workflow": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.2.7.tgz", - "integrity": "sha512-Qrl2VPDsNd6WyEbqSvcMHPPRKHr6hhFcYXuh26h7XosmIf1irHZqvhpBGEJun2ADao4EQkwMUDy+3VSzvxuGIQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.2.10.tgz", + "integrity": "sha512-CaDYaGMe2bYDozzHztrgEy0tljQWn4OBE9hJC2fAM5cMTve4viiWhcmHYYWFv3MZQyavHy1UwCL1jlXg7bK3PA==", "requires": { "@adobe/react-spectrum-workflow": "2.3.4", - "@react-spectrum/icon": "^3.7.8", + "@react-spectrum/icon": "^3.7.11", "@swc/helpers": "^0.5.0" - }, - "dependencies": { - "@adobe/react-spectrum-workflow": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-workflow/-/react-spectrum-workflow-2.3.4.tgz", - "integrity": "sha512-XPLzIBl58HdLF9WIPB7RDAvVXvCE3SjG+HaWQhW2P9MnxSz1DEA9O7mlTlYblJkMbfk10T/+RFaSupc1yoN+TA==", - "requires": {} - } } }, "@swc/core": { @@ -46999,9 +45726,9 @@ "dev": true }, "@testing-library/dom": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", - "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", "dev": true, "peer": true, "requires": { @@ -47532,9 +46259,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "@types/node": { - "version": "20.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz", - "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==", + "version": "20.11.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", + "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", "dev": true, "requires": { "undici-types": "~5.26.4" @@ -48536,9 +47263,9 @@ } }, "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" }, "balanced-match": { "version": "1.0.2", @@ -48551,6 +47278,11 @@ "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" }, + "base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==" + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -48854,9 +47586,9 @@ } }, "ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" }, "chalk": { "version": "2.4.2", @@ -48875,21 +47607,6 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -48978,6 +47695,11 @@ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, + "client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -49055,9 +47777,9 @@ } }, "clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==" }, "cmd-shim": { "version": "5.0.0", @@ -49180,9 +47902,9 @@ } }, "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" }, "commander": { "version": "2.20.3", @@ -50293,9 +49015,9 @@ } }, "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "dev": true, "peer": true, "requires": { @@ -51757,9 +50479,9 @@ } }, "get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", "dev": true, "peer": true, "requires": { @@ -52386,23 +51108,6 @@ "hast-util-parse-selector": "^3.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0" - }, - "dependencies": { - "comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" - }, - "property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==" - }, - "space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" - } } }, "hoist-non-react-statics": { @@ -52526,9 +51231,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true }, "ignore-walk": { @@ -52576,13 +51281,6 @@ "resolve-from": "^4.0.0" } }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "peer": true - }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -52798,13 +51496,13 @@ } }, "intl-messageformat": { - "version": "10.5.8", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.8.tgz", - "integrity": "sha512-NRf0jpBWV0vd671G5b06wNofAN8tp7WWDogMZyaU8GUAsmbouyvgwmFJI7zLjfAMpm3zK+vSwRP3jzaoIcMbaA==", + "version": "10.5.11", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.11.tgz", + "integrity": "sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==", "requires": { - "@formatjs/ecma402-abstract": "1.18.0", + "@formatjs/ecma402-abstract": "1.18.2", "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.3", + "@formatjs/icu-messageformat-parser": "2.7.6", "tslib": "^2.4.0" } }, @@ -52814,20 +51512,6 @@ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -52936,11 +51620,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -53002,11 +51681,6 @@ "is-extglob": "^2.1.1" } }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, "is-iexplorer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", @@ -55357,9 +54031,9 @@ "dev": true }, "known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.30.0.tgz", + "integrity": "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==", "dev": true, "peer": true }, @@ -56072,9 +54746,9 @@ } }, "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" }, "loose-envify": { "version": "1.4.0", @@ -56336,43 +55010,10 @@ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, - "mapbox-gl": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.10.1.tgz", - "integrity": "sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==", - "requires": { - "@mapbox/geojson-rewind": "^0.5.0", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "minimist": "^1.2.5", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.0.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - } - }, "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "requires": { - "repeat-string": "^1.0.0" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==" }, "math-log2": { "version": "1.0.1", @@ -56398,62 +55039,124 @@ "peer": true }, "mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", "requires": { - "unist-util-visit": "^2.0.0" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" } }, "mdast-util-find-and-replace": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", - "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", "requires": { - "escape-string-regexp": "^4.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" }, "dependencies": { "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" } } }, "mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", "requires": { "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "dependencies": { + "micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + } } }, "mdast-util-gfm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", - "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", "requires": { - "mdast-util-gfm-autolink-literal": "^0.1.0", - "mdast-util-gfm-strikethrough": "^0.2.0", - "mdast-util-gfm-table": "^0.1.0", - "mdast-util-gfm-task-list-item": "^0.1.0", - "mdast-util-to-markdown": "^0.6.1" + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "dependencies": { + "mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + } + }, + "micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + } } }, "mdast-util-gfm-autolink-literal": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz", - "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", "requires": { - "ccount": "^1.0.0", - "mdast-util-find-and-replace": "^1.1.0", - "micromark": "^2.11.3" + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" } }, "mdast-util-gfm-footnote": { @@ -56481,11 +55184,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" - }, "mdast-util-from-markdown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", @@ -56614,37 +55312,36 @@ "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } - }, - "zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" } } }, "mdast-util-gfm-strikethrough": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz", - "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", "requires": { - "mdast-util-to-markdown": "^0.6.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" } }, "mdast-util-gfm-table": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz", - "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", "requires": { - "markdown-table": "^2.0.0", - "mdast-util-to-markdown": "~0.6.0" + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" } }, "mdast-util-gfm-task-list-item": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz", - "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", "requires": { - "mdast-util-to-markdown": "~0.6.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" } }, "mdast-util-math": { @@ -56655,96 +55352,6 @@ "@types/mdast": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" - }, - "dependencies": { - "longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" - }, - "mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "requires": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - } - }, - "mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" - } - }, - "mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "requires": { - "@types/mdast": "^3.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "requires": { - "@types/unist": "^2.0.0" - } - }, - "unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - } - }, - "unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - } - }, - "zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" - } } }, "mdast-util-phrasing": { @@ -56780,37 +55387,89 @@ } }, "mdast-util-to-hast": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", - "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", "requires": { + "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "dependencies": { + "micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==" + }, + "micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + } } }, "mdast-util-to-markdown": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", - "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", "requires": { + "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "dependencies": { + "mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "requires": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + } } }, "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "requires": { + "@types/mdast": "^3.0.0" + } }, "mdn-data": { "version": "2.0.30", @@ -56819,11 +55478,6 @@ "dev": true, "peer": true }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, "memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", @@ -57040,12 +55694,177 @@ "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==" }, "micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", "requires": { + "@types/debug": "^4.0.0", "debug": "^4.0.0", - "parse-entities": "^2.0.0" + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + }, + "dependencies": { + "micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==" + }, + "micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==" + }, + "micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + } } }, "micromark-core-commonmark": { @@ -57102,24 +55921,203 @@ } }, "micromark-extension-gfm": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", - "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==", - "requires": { - "micromark": "~2.11.0", - "micromark-extension-gfm-autolink-literal": "~0.5.0", - "micromark-extension-gfm-strikethrough": "~0.6.5", - "micromark-extension-gfm-table": "~0.4.0", - "micromark-extension-gfm-tagfilter": "~0.3.0", - "micromark-extension-gfm-task-list-item": "~0.3.0" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "requires": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "dependencies": { + "micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "requires": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==" + }, + "micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==" + }, + "micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + } } }, "micromark-extension-gfm-autolink-literal": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz", - "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", "requires": { - "micromark": "~2.11.3" + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "dependencies": { + "micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==" + }, + "micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + } } }, "micromark-extension-gfm-footnote": { @@ -57168,32 +56166,76 @@ } }, "micromark-extension-gfm-strikethrough": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz", - "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", "requires": { - "micromark": "~2.11.0" + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "dependencies": { + "micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "requires": { + "micromark-util-types": "^1.0.0" + } + } } }, "micromark-extension-gfm-table": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz", - "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", "requires": { - "micromark": "~2.11.0" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" } }, "micromark-extension-gfm-tagfilter": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz", - "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "requires": { + "micromark-util-types": "^1.0.0" + } }, "micromark-extension-gfm-task-list-item": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz", - "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", "requires": { - "micromark": "~2.11.0" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" } }, "micromark-extension-math": { @@ -59390,19 +58432,6 @@ "just-diff-apply": "^5.2.0" } }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -59617,17 +58646,44 @@ } } }, + "playwright": { + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.41.2.tgz", + "integrity": "sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==", + "dev": true, + "requires": { + "fsevents": "2.3.2", + "playwright-core": "1.41.2" + }, + "dependencies": { + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + } + } + }, + "playwright-core": { + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.2.tgz", + "integrity": "sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==", + "dev": true + }, "plotly.js": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.27.1.tgz", - "integrity": "sha512-XeE0zTJWTxURYrUJqzf73l8lTb+HnyRvvhHkoSIEvWf58ins4saopo9l25kCm+xHAGz8E/2EOncE4DyXsJ34kA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.29.1.tgz", + "integrity": "sha512-+XirhgCh42JF/iVu/RtBRbhcs328ipinajy7hd3mnZdnQv2Th6F441DSXer5S+P0nNluNs10vAFTELo4k/icjg==", "requires": { "@plotly/d3": "3.8.1", "@plotly/d3-sankey": "0.7.2", "@plotly/d3-sankey-circular": "0.33.1", + "@plotly/mapbox-gl": "v1.13.4", "@turf/area": "^6.4.0", "@turf/bbox": "^6.4.0", "@turf/centroid": "^6.0.2", + "base64-arraybuffer": "^1.0.2", "canvas-fit": "^1.5.0", "color-alpha": "1.0.4", "color-normalize": "1.5.0", @@ -59649,7 +58705,6 @@ "has-hover": "^1.0.1", "has-passive-events": "^1.0.0", "is-mobile": "^4.0.0", - "mapbox-gl": "1.10.1", "mouse-change": "^1.4.0", "mouse-event-offset": "^3.0.2", "mouse-wheel": "^1.2.0", @@ -59661,7 +58716,7 @@ "regl": "npm:@plotly/regl@^2.1.2", "regl-error2d": "^2.0.12", "regl-line2d": "^3.1.2", - "regl-scatter2d": "^3.2.9", + "regl-scatter2d": "^3.3.1", "regl-splom": "^1.0.14", "strongly-connected-components": "^1.0.1", "superscript-text": "^1.0.0", @@ -59674,9 +58729,9 @@ } }, "plotly.js-dist-min": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/plotly.js-dist-min/-/plotly.js-dist-min-2.27.1.tgz", - "integrity": "sha512-fFPFityhOkDtjoIVd/9IJQbEEuKEjfmNALBVLZyHwLIkry5ygE4ZC/XENRqLnWR3rNJdTtEaxhM5zflcWTRlDA==" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/plotly.js-dist-min/-/plotly.js-dist-min-2.29.1.tgz", + "integrity": "sha512-YvqX5TISWsJVTDIaUh2Qgt9uhLl0bWcQhO2rLPF0/hIY9BlinFa1JwSO2jFKcEmG0AJXSo4DnVdgKpsk9/8Apg==" }, "point-in-polygon": { "version": "1.1.0", @@ -59694,14 +58749,14 @@ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" }, "postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" } }, "postcss-resolve-nested-selector": { @@ -59712,17 +58767,17 @@ "peer": true }, "postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", + "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", "dev": true, "peer": true, "requires": {} }, "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -59882,12 +58937,9 @@ } }, "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "requires": { - "xtend": "^4.0.0" - } + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==" }, "proto-list": { "version": "1.2.4", @@ -60049,23 +59101,32 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-markdown": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-6.0.3.tgz", - "integrity": "sha512-kQbpWiMoBHnj9myLlmZG9T1JdoT/OEyHK7hqM6CqFT14MAkgWiWBUYijLyBmxbntaN6dCDicPcUhWhci1QYodg==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", "requires": { "@types/hast": "^2.0.0", - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "prop-types": "^15.7.2", - "property-information": "^5.3.0", - "react-is": "^17.0.0", - "remark-parse": "^9.0.0", - "remark-rehype": "^8.0.0", - "space-separated-tokens": "^1.1.0", - "style-to-object": "^0.3.0", - "unified": "^9.0.0", - "unist-util-visit": "^2.0.0", - "vfile": "^4.0.0" + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } } }, "react-plotly.js": { @@ -60569,9 +59630,9 @@ } }, "regl-scatter2d": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.2.9.tgz", - "integrity": "sha512-PNrXs+xaCClKpiB2b3HZ2j3qXQXhC5kcTh/Nfgx9rLO0EpEhab0BSQDqAsbdbpdf+pSHSJvbgitB7ulbGeQ+Fg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.3.1.tgz", + "integrity": "sha512-seOmMIVwaCwemSYz/y4WE0dbSO9svNFSqtTh5RE57I7PjGo3tcUYKtH0MTSoshcAsreoqN8HoCtnn8wfHXXfKQ==", "requires": { "@plotly/point-cluster": "^3.1.9", "array-range": "^1.0.1", @@ -60618,101 +59679,17 @@ "mathjax-full": "^3.0.0", "unified": "^10.0.0", "unist-util-visit": "^4.0.0" - }, - "dependencies": { - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" - }, - "is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" - }, - "trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" - }, - "unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - } - }, - "unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "requires": { - "@types/unist": "^2.0.0" - } - }, - "unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "requires": { - "@types/unist": "^2.0.0" - } - }, - "unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - } - }, - "unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - } - }, - "vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - } - }, - "vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - } - } } }, "remark-gfm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", - "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", "requires": { - "mdast-util-gfm": "^0.1.0", - "micromark-extension-gfm": "^0.3.0" + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" } }, "remark-math": { @@ -60724,81 +59701,27 @@ "mdast-util-math": "^2.0.0", "micromark-extension-math": "^2.0.0", "unified": "^10.0.0" - }, - "dependencies": { - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" - }, - "is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" - }, - "trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" - }, - "unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - } - }, - "unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "requires": { - "@types/unist": "^2.0.0" - } - }, - "vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - } - }, - "vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - } - } } }, "remark-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", - "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", "requires": { - "mdast-util-from-markdown": "^0.8.0" + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" } }, "remark-rehype": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-8.1.0.tgz", - "integrity": "sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", "requires": { - "mdast-util-to-hast": "^10.2.0" + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" } }, "remark-stringify": { @@ -60824,21 +59747,11 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" - }, "is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" }, - "longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" - }, "mdast-util-to-markdown": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", @@ -60862,11 +59775,6 @@ "@types/mdast": "^4.0.0" } }, - "trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" - }, "unified": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", @@ -60934,19 +59842,9 @@ "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } - }, - "zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" } } }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -61459,9 +60357,9 @@ "devOptional": true }, "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true }, "source-map-support": { @@ -61475,9 +60373,9 @@ } }, "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" }, "spdx-correct": { "version": "3.2.0", @@ -61891,70 +60789,69 @@ "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==" }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true, - "peer": true - }, "style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", "requires": { "inline-style-parser": "0.1.1" } }, "stylelint": { - "version": "15.11.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", - "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.3.1.tgz", + "integrity": "sha512-/JOwQnBvxEKOT2RtNgGpBVXnCSMBgKOL2k7w0K52htwCyJls4+cHvc4YZgXlVoAZS9QJd2DgYAiRnja96pTgxw==", "dev": true, "peer": true, "requires": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/media-query-list-parser": "^2.1.4", - "@csstools/selector-specificity": "^3.0.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/media-query-list-parser": "^2.1.9", + "@csstools/selector-specificity": "^3.0.2", + "@dual-bundle/import-meta-resolve": "^4.0.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^8.2.0", + "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.1", "css-tree": "^2.3.1", "debug": "^4.3.4", - "fast-glob": "^3.3.1", + "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^7.0.0", + "file-entry-cache": "^8.0.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.2.4", - "import-lazy": "^4.0.0", + "ignore": "^5.3.1", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.29.0", + "known-css-properties": "^0.30.0", "mathml-tag-names": "^2.1.3", - "meow": "^10.1.5", + "meow": "^13.2.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.28", + "postcss": "^8.4.38", "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.13", + "postcss-safe-parser": "^7.0.0", + "postcss-selector-parser": "^6.0.16", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", + "strip-ansi": "^7.1.0", "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", "table": "^6.8.1", "write-file-atomic": "^5.0.1" }, "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "peer": true + }, "balanced-match": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", @@ -61962,160 +60859,47 @@ "dev": true, "peer": true }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true - }, - "camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "dev": true, - "peer": true, - "requires": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - } - }, "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "peer": true, "requires": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" } }, - "decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true, - "peer": true - }, "file-entry-cache": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", - "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", - "dev": true, - "peer": true, - "requires": { - "flat-cache": "^3.2.0" - } - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "peer": true, "requires": { - "lru-cache": "^6.0.0" + "flat-cache": "^4.0.0" } }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "peer": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "peer": true, "requires": { - "yallist": "^4.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" } }, "meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "peer": true, - "requires": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "peer": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, "peer": true }, - "read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "peer": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - } - }, - "read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "peer": true, - "requires": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - } - }, - "redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "peer": true, - "requires": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - } - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -62123,16 +60907,6 @@ "dev": true, "peer": true }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -62140,30 +60914,16 @@ "dev": true, "peer": true }, - "strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "peer": true, "requires": { - "min-indent": "^1.0.1" + "ansi-regex": "^6.0.1" } }, - "trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", - "dev": true, - "peer": true - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "peer": true - }, "write-file-atomic": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", @@ -62174,20 +60934,6 @@ "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "peer": true } } }, @@ -62299,9 +61045,9 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "peer": true, "requires": { @@ -62590,9 +61336,9 @@ "dev": true }, "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" }, "tsconfig-paths": { "version": "3.14.2", @@ -62882,22 +61628,23 @@ "dev": true }, "unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", "requires": { - "bail": "^1.0.0", + "@types/unist": "^2.0.0", + "bail": "^2.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" }, "dependencies": { "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" } } }, @@ -62928,11 +61675,6 @@ "crypto-random-string": "^2.0.0" } }, - "unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" - }, "unist-util-find-after": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz", @@ -62940,58 +61682,54 @@ "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" - }, - "dependencies": { - "unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "requires": { - "@types/unist": "^2.0.0" - } - } } }, "unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==" }, "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "requires": { + "@types/unist": "^2.0.0" + } }, "unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "requires": { + "@types/unist": "^2.0.0" + } }, "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "requires": { - "@types/unist": "^2.0.2" + "@types/unist": "^2.0.0" } }, "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", "requires": { "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" } }, "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", "requires": { "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" + "unist-util-is": "^5.0.0" } }, "universal-user-agent": { @@ -63142,23 +61880,23 @@ } }, "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" } }, "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", "requires": { "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "unist-util-stringify-position": "^3.0.0" } }, "vite": { @@ -63651,9 +62389,9 @@ "dev": true }, "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" } } } diff --git a/package.json b/package.json index 9315490c6..6e62cd333 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,10 @@ "./plugins/*/src/js/" ], "scripts": { - "docker": "docker compose up --build", + "docker": "docker compose up deephaven-plugins --build", "start": "run-p \"start:packages -- {@}\" serve:plugins --", "build": "lerna run build --stream", + "watch:types": "tsc -p . --watch --emitDeclarationOnly false --noEmit", "serve:plugins": "vite", "start:packages": "lerna run start --stream", "test": "jest --watch --changedSince origin/main", @@ -14,18 +15,24 @@ "test:lint": "jest --config jest.config.lint.cjs", "test:ci": "run-p test:ci:*", "test:ci:unit": "jest --config jest.config.unit.cjs --ci --cacheDirectory $PWD/.jest-cache", - "test:ci:lint": "jest --config jest.config.lint.cjs --ci --cacheDirectory $PWD/.jest-cache" + "test:ci:lint": "jest --config jest.config.lint.cjs --ci --cacheDirectory $PWD/.jest-cache", + "e2e": "playwright run", + "e2e:docker": "DEEPHAVEN_PORT=10001 ./tools/run_docker.sh e2e-tests", + "e2e:update-snapshots": "./tools/run_docker.sh update-snapshots", + "update-dh-packages": "lerna run --concurrency 1 update-dh-packages" }, "devDependencies": { "@deephaven/babel-preset": "^0.40.0", "@deephaven/eslint-config": "^0.40.0", "@deephaven/prettier-config": "^0.40.0", "@deephaven/tsconfig": "^0.40.0", + "@playwright/test": "^1.41.2", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "^14.4.3", "@types/jest": "^29.2.5", + "@types/node": "^20.11.17", "@types/prop-types": "^15.7.10", "@types/shortid": "^0.0.29", "eslint": "^8.37.0", diff --git a/playwright-docker.config.ts b/playwright-docker.config.ts new file mode 100644 index 000000000..1151d0fe5 --- /dev/null +++ b/playwright-docker.config.ts @@ -0,0 +1,13 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; +import DefaultConfig from './playwright.config'; + +const config: PlaywrightTestConfig = { + ...DefaultConfig, + use: { + ...DefaultConfig.use, + baseURL: 'http://deephaven-plugins:10000/ide/', + }, + reporter: process.env.CI ? [['github'], ['html']] : DefaultConfig.reporter, +}; + +export default config; diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 000000000..abdb97233 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,94 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; +import { devices } from '@playwright/test'; + + +const config: PlaywrightTestConfig = { + testDir: './tests', + /* Maximum time one test can run for. */ + timeout: 120 * 1000, + expect: { + /** + * Maximum time expect() should wait for the condition to be met. + * For example in `await expect(locator).toHaveText();` + */ + timeout: 15000, + }, + /* Default to run each suite in parallel, suites and optional opt out */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 1 : 0, + /* Default to 50% of cores, don't want too many as core or web will become bottleneck */ + workers: undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + /* Use host 0.0.0.0 so it can be forwarded from within docker */ + reporter: [['html', { host: '0.0.0.0', port: 9323 }]], + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ + actionTimeout: 0, + + /* Navigation timeout for how long it takes to navigate to a page */ + navigationTimeout: 60 * 1000, + + /* Base URL to use in actions like `await page.goto('')`. */ + baseURL: 'http://localhost:10000/ide/', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + + /* Retain videos on failure for easier debugging */ + video: 'retain-on-failure', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + }, + }, + + { + name: 'firefox', + use: { + ...devices['Desktop Firefox'], + // https://playwright.dev/docs/test-use-options#more-browser-and-context-options + launchOptions: { + // https://playwright.dev/docs/api/class-browsertype#browser-type-launch-option-firefox-user-prefs + firefoxUserPrefs: { + // By default, headless Firefox runs as though no pointers capabilities + // are available. + // https://github.com/microsoft/playwright/issues/7769#issuecomment-966098074 + // + // This impacts React Spectrum which uses an '(any-pointer: fine)' + // media query to determine font size. It also causes certain chart + // elements to always be visible that should only be visible on + // hover. + // + // Available values for pointer capabilities: + // NO_POINTER = 0x00; + // COARSE_POINTER = 0x01; + // FINE_POINTER = 0x02; + // HOVER_CAPABLE_POINTER = 0x04; + // + // Setting to 0x02 | 0x04 says the system supports a mouse + 'ui.primaryPointerCapabilities': 0x02 | 0x04, + 'ui.allPointerCapabilities': 0x02 | 0x04, + }, + }, + }, + }, + + { + name: 'webkit', + use: { + ...devices['Desktop Safari'], + }, + }, + ], +}; + +export default config; diff --git a/plugins/auth-keycloak/src/js/package.json b/plugins/auth-keycloak/src/js/package.json index faf03d6d6..cba564a3c 100644 --- a/plugins/auth-keycloak/src/js/package.json +++ b/plugins/auth-keycloak/src/js/package.json @@ -23,7 +23,8 @@ "homepage": "https://github.com/deephaven/deephaven-js-plugins", "scripts": { "start": "vite build --watch", - "build": "vite build" + "build": "vite build", + "update-dh-packages": "node ../../../../tools/update-dh-packages.mjs" }, "devDependencies": { "@types/plotly.js": "^2.12.18", diff --git a/plugins/dashboard-object-viewer/src/js/package.json b/plugins/dashboard-object-viewer/src/js/package.json index ff52fd1dc..31edb95b3 100644 --- a/plugins/dashboard-object-viewer/src/js/package.json +++ b/plugins/dashboard-object-viewer/src/js/package.json @@ -15,7 +15,8 @@ ], "scripts": { "start": "vite build --watch", - "build": "vite build" + "build": "vite build", + "update-dh-packages": "node ../../../../tools/update-dh-packages.mjs" }, "dependencies": { "@deephaven/components": "^0.40.0", diff --git a/plugins/example-theme/src/js/README.md b/plugins/example-theme/src/js/README.md index 3b54aea93..f1ad3d97d 100644 --- a/plugins/example-theme/src/js/README.md +++ b/plugins/example-theme/src/js/README.md @@ -19,7 +19,7 @@ Refer to the main [README](../../README.md) for instructions on how to build and - Add your plugin's name to the `./plugins/manifest.json` to enable your plugin in development previews. - You should also update the `name` key in the `.//src/js/src/index.ts` file with a unique name that will appear in the theme selector UI. -To preview themes during development, you'll need to start three separate processes. The first is a deephaven server, the second is a plugins server, and the third is a development version of the web-client-ui server. This is only necessary if you would like to preview your changes during development. +To preview themes during development, you'll need to start three separate processes: The first is a Deephaven server, the second is a plugins server, and the third is a development version of the web-client-ui server. Starting a web-client-ui server version is only necessary if you would like to preview your changes during development. 1. Start a deephaven-core server on port 10000. You can follow the instructions here in [deephaven-core](https://deephaven.io/core/docs/tutorials/quickstart/). 2. In a separate terminal, start a plugins server that will proxy your plugins. This is so you don't have to re-install it each time you make a change while developing your custom theme. From the deephaven-plugins project repository root directory, run: @@ -37,14 +37,16 @@ To preview themes during development, you'll need to start three separate proces VITE_JS_PLUGINS_DEV_PORT=4100 ``` - In a separate terminal from the the web-client-ui project repository root directory, run: + From the the web-client-ui project repository root directory, in a terminal run: ``` npm install npm run start ``` -Then visit http://localhost:4000 to preview in the app, or http://localhost:4000/ide/styleguide for a preview of all the components in the web-client-ui library. You can change the theme by clicking on the theme selector in the top right corner of the styleguide, or in the settings menu from the app. If you make changes to your styles, you will need to refresh the page to see the changes. +Then visit http://localhost:4000 to preview in the app, or http://localhost:4000/ide/styleguide for a preview of all the components in the web-client-ui library. + +You can change the theme by clicking on the theme selector in the top right corner of the styleguide, or in the Deephaven **Settings** menu from the app. If you change your styles, you will need to refresh the page to see the changes. ## Creating your theme diff --git a/plugins/example-theme/src/js/package.json b/plugins/example-theme/src/js/package.json index e84282fcc..1da28d1e5 100644 --- a/plugins/example-theme/src/js/package.json +++ b/plugins/example-theme/src/js/package.json @@ -7,11 +7,13 @@ "dev": "vite", "build": "tsc && vite build", "preview": "vite preview", - "start": "npm run build -- -w" + "start": "npm run build -- -w", + "update-dh-packages": "node ../../../../tools/update-dh-packages.mjs" }, "devDependencies": { "@deephaven/plugin": "^0.58.0", "typescript": "^5.2.2", "vite": "^5.0.8" - } + }, + "private": true } diff --git a/plugins/json/setup.cfg b/plugins/json/setup.cfg index db54ea426..362d8bbb4 100644 --- a/plugins/json/setup.cfg +++ b/plugins/json/setup.cfg @@ -3,7 +3,7 @@ name = deephaven-plugin-json description = Deephaven Plugin for json long_description = file: README.md long_description_content_type = text/markdown -version = attr:deephaven.plugin.json.__version__ +version = 0.0.2.dev0 url = https://github.com/deephaven/deephaven-plugins project_urls = Source Code = https://github.com/deephaven/deephaven-plugins diff --git a/plugins/json/src/deephaven/plugin/json/__init__.py b/plugins/json/src/deephaven/plugin/json/__init__.py index 1bf18e00c..562422e8a 100644 --- a/plugins/json/src/deephaven/plugin/json/__init__.py +++ b/plugins/json/src/deephaven/plugin/json/__init__.py @@ -5,8 +5,6 @@ from deephaven.plugin import Registration, Callback, object_type -__version__ = "0.0.2.dev0" - class Node: def __init__(self, object, is_ref=False, **kw) -> None: diff --git a/plugins/json/test/test_json_plugin.py b/plugins/json/test/test_json_plugin.py index 8507959af..fc3791df0 100644 --- a/plugins/json/test/test_json_plugin.py +++ b/plugins/json/test/test_json_plugin.py @@ -1,12 +1,16 @@ import unittest import importlib.resources import json +import sys from deephaven.plugin.json import Encoder from deephaven.plugin.object_type import Exporter, Reference def read_text(resource: str): + if sys.version_info < (3, 9): + # Need to use legacy behaviour on Python < 3.9 + return importlib.resources.read_text(__package__, resource) return importlib.resources.files(__package__).joinpath(resource).read_bytes() diff --git a/plugins/matplotlib/pyproject.toml b/plugins/matplotlib/pyproject.toml index 62df2b006..54e217464 100644 --- a/plugins/matplotlib/pyproject.toml +++ b/plugins/matplotlib/pyproject.toml @@ -1,3 +1,3 @@ [build-system] -requires = ["setuptools>=43.0.0", "wheel"] +requires = ["setuptools>=43.0.0", "wheel", "deephaven-plugin-packaging"] build-backend = "setuptools.build_meta" diff --git a/plugins/matplotlib/setup.cfg b/plugins/matplotlib/setup.cfg index 5052d68f7..2f1f71a99 100644 --- a/plugins/matplotlib/setup.cfg +++ b/plugins/matplotlib/setup.cfg @@ -29,6 +29,7 @@ install_requires = jpy>=0.14.0 deephaven-plugin>=0.5.0 matplotlib + deephaven-plugin-utilities include_package_data = True [options.extras_require] @@ -38,9 +39,6 @@ seaborn = [options.packages.find] where=src -[options.package_data] -* = *.mplstyle - [options.entry_points] deephaven.plugin = - registration_cls = deephaven.plugin.matplotlib:MatplotlibRegistration \ No newline at end of file + registration_cls = deephaven.plugin.matplotlib._register:MatplotlibRegistration \ No newline at end of file diff --git a/plugins/matplotlib/setup.py b/plugins/matplotlib/setup.py new file mode 100644 index 000000000..b8d654031 --- /dev/null +++ b/plugins/matplotlib/setup.py @@ -0,0 +1,16 @@ +from setuptools import setup +import os + +from deephaven.plugin.packaging import package_js + +js_dir = "src/js/" +dest_dir = os.path.join("src/deephaven/plugin/matplotlib/_js") + +package_js(js_dir, dest_dir) + +setup( + package_data={ + "deephaven.plugin.matplotlib._js": ["**"], + "deephaven.plugin.matplotlib": ["deephaven.mplstyle"], + } +) diff --git a/plugins/matplotlib/src/deephaven/plugin/matplotlib/.gitignore b/plugins/matplotlib/src/deephaven/plugin/matplotlib/.gitignore new file mode 100644 index 000000000..fd2ac954b --- /dev/null +++ b/plugins/matplotlib/src/deephaven/plugin/matplotlib/.gitignore @@ -0,0 +1 @@ +_js/ \ No newline at end of file diff --git a/plugins/matplotlib/src/deephaven/plugin/matplotlib/__init__.py b/plugins/matplotlib/src/deephaven/plugin/matplotlib/__init__.py index 17491fe08..590530d9e 100644 --- a/plugins/matplotlib/src/deephaven/plugin/matplotlib/__init__.py +++ b/plugins/matplotlib/src/deephaven/plugin/matplotlib/__init__.py @@ -1,32 +1,9 @@ from deephaven import numpy as dhnp -from deephaven.plugin import Registration, Callback from deephaven.table_listener import listen -from importlib import resources -import matplotlib.pyplot as plt from matplotlib.animation import Animation import itertools -def _init_theme(): - # Set the Deephaven style globally. - # We use the savefig function to export the Figure, and that uses the Figure's properties for colours rather than temporary styling. - # The Figure's properties are set on creation time of the Figure, rather than when the Figure is exported - # We do not have hooks into when a user creates a new Figure, so we set the theme globally ahead of time - # https://github.com/matplotlib/matplotlib/issues/6592/ - with resources.path(__package__, "deephaven.mplstyle") as p: - plt.style.use(["dark_background", p]) - - -class MatplotlibRegistration(Registration): - @classmethod - def register_into(cls, callback: Callback) -> None: - _init_theme() - plt.switch_backend("AGG") - from . import figure_type - - callback.register(figure_type.FigureType) - - class TableEventSource: """ Makes an event source for matplotlib that triggers whenever Deephaven Table updates. diff --git a/plugins/matplotlib/src/deephaven/plugin/matplotlib/_js_plugin.py b/plugins/matplotlib/src/deephaven/plugin/matplotlib/_js_plugin.py new file mode 100644 index 000000000..7c2e9bf65 --- /dev/null +++ b/plugins/matplotlib/src/deephaven/plugin/matplotlib/_js_plugin.py @@ -0,0 +1,32 @@ +import pathlib + +from deephaven.plugin.js import JsPlugin + + +class MatplotlibJsPlugin(JsPlugin): + def __init__( + self, + name: str, + version: str, + main: str, + path: pathlib.Path, + ) -> None: + self._name = name + self._version = version + self._main = main + self._path = path + + @property + def name(self) -> str: + return self._name + + @property + def version(self) -> str: + return self._version + + @property + def main(self) -> str: + return self._main + + def path(self) -> pathlib.Path: + return self._path diff --git a/plugins/matplotlib/src/deephaven/plugin/matplotlib/_register.py b/plugins/matplotlib/src/deephaven/plugin/matplotlib/_register.py new file mode 100644 index 000000000..33d18567a --- /dev/null +++ b/plugins/matplotlib/src/deephaven/plugin/matplotlib/_register.py @@ -0,0 +1,39 @@ +from importlib import resources +import matplotlib.pyplot as plt +from deephaven.plugin import Registration, Callback +from deephaven.plugin.utilities import create_js_plugin, DheSafeCallbackWrapper +from ._js_plugin import MatplotlibJsPlugin + +PACKAGE_NAMESPACE = "deephaven.plugin.matplotlib" +JS_NAME = "_js" +PLUGIN_CLASS = MatplotlibJsPlugin + + +def _init_theme(): + # Set the Deephaven style globally. + # We use the savefig function to export the Figure, and that uses the Figure's properties for colours rather than temporary styling. + # The Figure's properties are set on creation time of the Figure, rather than when the Figure is exported + # We do not have hooks into when a user creates a new Figure, so we set the theme globally ahead of time + # https://github.com/matplotlib/matplotlib/issues/6592/ + with resources.path(__package__, "deephaven.mplstyle") as p: + plt.style.use(["dark_background", p]) + + +class MatplotlibRegistration(Registration): + @classmethod + def register_into(cls, callback: Callback) -> None: + _init_theme() + plt.switch_backend("AGG") + from . import figure_type + + callback = DheSafeCallbackWrapper(callback) + + callback.register(figure_type.FigureType) + + js_plugin = create_js_plugin( + PACKAGE_NAMESPACE, + JS_NAME, + PLUGIN_CLASS, + ) + + callback.register(js_plugin) diff --git a/plugins/matplotlib/src/js/package.json b/plugins/matplotlib/src/js/package.json index 713a809bb..23281a503 100644 --- a/plugins/matplotlib/src/js/package.json +++ b/plugins/matplotlib/src/js/package.json @@ -21,7 +21,8 @@ "homepage": "https://github.com/deephaven/web-client-ui", "scripts": { "start": "vite build --watch", - "build": "vite build" + "build": "vite build", + "update-dh-packages": "node ../../../../tools/update-dh-packages.mjs" }, "devDependencies": { "@types/react": "^17.0.2", diff --git a/plugins/packaging/.gitignore b/plugins/packaging/.gitignore new file mode 100644 index 000000000..3356dc1ce --- /dev/null +++ b/plugins/packaging/.gitignore @@ -0,0 +1,8 @@ +build/ +dist/ +.venv/ +/venv +*.egg-info/ +.idea +.DS_store +__pycache__/ \ No newline at end of file diff --git a/plugins/packaging/LICENSE b/plugins/packaging/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/plugins/packaging/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/plugins/packaging/README.md b/plugins/packaging/README.md new file mode 100644 index 000000000..6f83ea754 --- /dev/null +++ b/plugins/packaging/README.md @@ -0,0 +1,25 @@ +# Deephaven Plugin Packaging + +This is a Python package that stores cross-plugin utilities for packaging Deephaven plugins. +This package is used by the Deephaven plugin build process to create wheels for plugins. +If the functions need to be available at runtime, they should be added to `utilities` instead. +This is not a plugin on its own. + +## Build + +To create your build / development environment (skip the first two lines if you already have a venv): + +```sh +python -m venv .venv +source .venv/bin/activate +pip install --upgrade pip setuptools +pip install build +``` + +To build: + +```sh +python -m build --wheel +``` + +The wheel is stored in `dist/`. diff --git a/plugins/packaging/pyproject.toml b/plugins/packaging/pyproject.toml new file mode 100644 index 000000000..62df2b006 --- /dev/null +++ b/plugins/packaging/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools>=43.0.0", "wheel"] +build-backend = "setuptools.build_meta" diff --git a/plugins/packaging/setup.cfg b/plugins/packaging/setup.cfg new file mode 100644 index 000000000..1d2e14b16 --- /dev/null +++ b/plugins/packaging/setup.cfg @@ -0,0 +1,29 @@ +[metadata] +name = deephaven-plugin-packaging +description = Deephaven Plugin Packaging +long_description = file: README.md +long_description_content_type = text/markdown +version = 0.0.1.dev0 +url = https://github.com/deephaven/deephaven-plugins +project_urls = + Source Code = https://github.com/deephaven/deephaven-plugins + Bug Tracker = https://github.com/deephaven/deephaven-plugins/issues +classifiers = + Programming Language :: Python :: 3 + License :: OSI Approved :: Apache Software License + Operating System :: OS Independent + Environment :: Plugins + Development Status :: 3 - Alpha +keywords = deephaven, plugin, packaging +author = Joe Numainville +author_email = josephnumainville@deephaven.io +platforms = any + +[options] +package_dir= + =src +packages=find_namespace: +include_package_data = True + +[options.packages.find] +where=src diff --git a/plugins/packaging/src/deephaven/plugin/packaging/__init__.py b/plugins/packaging/src/deephaven/plugin/packaging/__init__.py new file mode 100644 index 000000000..16281fe0b --- /dev/null +++ b/plugins/packaging/src/deephaven/plugin/packaging/__init__.py @@ -0,0 +1 @@ +from .utils import * diff --git a/plugins/packaging/src/deephaven/plugin/packaging/utils.py b/plugins/packaging/src/deephaven/plugin/packaging/utils.py new file mode 100644 index 000000000..cfb1aa66d --- /dev/null +++ b/plugins/packaging/src/deephaven/plugin/packaging/utils.py @@ -0,0 +1,43 @@ +import shutil +import os +import subprocess + +__all__ = ["package_js"] + + +def package_js(js_dir: str, dest_dir: str) -> None: + """ + Package the built JS files at the given JS directory and unpack them into the destination directory. + + Args: + js_dir: + The directory containing the JS files + dest_dir: + The directory to unpack the JS files into + """ + dist_dir = os.path.join(js_dir, "dist") + build_dir = os.path.join(js_dir, "build") + package_dir = os.path.join(build_dir, "package") + + # copy the bundle to the directory + # the path may not exist (e.g. when running tests) + # so it is not strictly necessary to copy the bundle + if os.path.exists(dist_dir): + # ignore errors as the directory may not exist + shutil.rmtree(build_dir, ignore_errors=True) + shutil.rmtree(dest_dir, ignore_errors=True) + + os.makedirs(build_dir, exist_ok=True) + + # pack and unpack into the js directory + subprocess.run( + ["npm", "pack", "--pack-destination", "build"], cwd=js_dir, check=True + ) + # it is assumed that there is only one tarball in the directory + files = os.listdir(build_dir) + for file in files: + subprocess.run(["tar", "-xzf", file], cwd=build_dir, check=True) + os.remove(os.path.join(build_dir, file)) + + # move the package directory to the expected package location + shutil.move(package_dir, dest_dir) diff --git a/plugins/plotly-express/CHANGELOG.md b/plugins/plotly-express/CHANGELOG.md index c0bd1c3f3..7b1d15aaa 100644 --- a/plugins/plotly-express/CHANGELOG.md +++ b/plugins/plotly-express/CHANGELOG.md @@ -2,6 +2,37 @@ All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines. - - - +## plotly-express-v0.7.0 - 2024-04-03 +#### Bug Fixes +- Ensure title is added to default figure (#396) - (2f0a8a0) - Joe +- Deephaven express chart title does not update dynamically (#386) - (556d07c) - Matthew Runyon +#### Features +- combine plotly plots into plotly-express plugin (#358) - (7a1893d) - Joe +- Add python 3.12 testing (#398) - (241348f) - devinrsmith + +- - - + +## plotly-express-v0.6.0 - 2024-03-19 +#### Features +- Package matplotlib and ui JS with wheel (#343) - (7724e55) - Joe + +- - - + +## plotly-express-v0.5.0 - 2024-03-06 +#### Build system +- Update dh ui packages to ^0.66.1 (#330) - (9433a98) - bmingles +#### Features +- Export plotly-express as a dashboard plugin (#329) - (6212bd5) - vbabich + +- - - + +## plotly-express-v0.4.1 - 2024-02-28 +#### Bug Fixes +- Scatter plots rendering at the wrong location (#324) - (dfe5c48) - mofojed +- Type fixes and require pyright (#302) - (d5d003d) - Joe + +- - - + ## plotly-express-v0.4.0 - 2024-02-20 #### Bug Fixes - Deephaven express memory leak (#277) - (ff6ad50) - Matthew Runyon diff --git a/plugins/plotly-express/pyproject.toml b/plugins/plotly-express/pyproject.toml index 62df2b006..54e217464 100644 --- a/plugins/plotly-express/pyproject.toml +++ b/plugins/plotly-express/pyproject.toml @@ -1,3 +1,3 @@ [build-system] -requires = ["setuptools>=43.0.0", "wheel"] +requires = ["setuptools>=43.0.0", "wheel", "deephaven-plugin-packaging"] build-backend = "setuptools.build_meta" diff --git a/plugins/plotly-express/setup.cfg b/plugins/plotly-express/setup.cfg index cb392eaf3..472e24b0a 100644 --- a/plugins/plotly-express/setup.cfg +++ b/plugins/plotly-express/setup.cfg @@ -3,7 +3,7 @@ name = deephaven-plugin-plotly-express description = Deephaven Chart Plugin long_description = file: README.md long_description_content_type = text/markdown -version = 0.4.0.dev0 +version = 0.7.0.dev0 url = https://github.com/deephaven/deephaven-plugins project_urls = Source Code = https://github.com/deephaven/deephaven-plugins @@ -27,6 +27,7 @@ packages=find_namespace: install_requires = deephaven-plugin>=0.6.0 plotly + deephaven-plugin-utilities include_package_data = True [options.packages.find] diff --git a/plugins/plotly-express/setup.py b/plugins/plotly-express/setup.py index 730690ce9..484dcc8aa 100644 --- a/plugins/plotly-express/setup.py +++ b/plugins/plotly-express/setup.py @@ -1,38 +1,10 @@ -import shutil from setuptools import setup import os -import subprocess - -# Uses npm pack to create a tarball of the package and unpacks it into a build directory -# Then uses that to add to the wheel +from deephaven.plugin.packaging import package_js js_dir = "src/js/" -dist_dir = os.path.join(js_dir, "dist") -build_dir = os.path.join(js_dir, "build") dest_dir = os.path.join("src/deephaven/plot/express/_js") -package_dir = os.path.join(build_dir, "package") - -# copy the bundle to the plotly-express directory -# the path may not exist (e.g. when running tests) -# so it is not strictly necessary to copy the bundle -if os.path.exists(dist_dir): - # ignore errors as the directory may not exist - shutil.rmtree(build_dir, ignore_errors=True) - shutil.rmtree(dest_dir, ignore_errors=True) - - os.makedirs(build_dir, exist_ok=True) - - # pack and unpack into the js plotly-express directory - subprocess.run( - ["npm", "pack", "--pack-destination", "build"], cwd=js_dir, check=True - ) - # it is assumed that there is only one tarball in the directory - files = os.listdir(build_dir) - for file in files: - subprocess.run(["tar", "-xzf", file], cwd=build_dir, check=True) - os.remove(os.path.join(build_dir, file)) - # move the package directory to the expected package location - shutil.move(package_dir, dest_dir) +package_js(js_dir, dest_dir) setup(package_data={"deephaven.plot.express._js": ["**"]}) diff --git a/plugins/plotly-express/src/deephaven/plot/express/__init__.py b/plugins/plotly-express/src/deephaven/plot/express/__init__.py index b04a7a7c8..cca071669 100644 --- a/plugins/plotly-express/src/deephaven/plot/express/__init__.py +++ b/plugins/plotly-express/src/deephaven/plot/express/__init__.py @@ -4,6 +4,7 @@ from typing import Any from deephaven.plugin.object_type import BidirectionalObjectType, MessageStream +from plotly.graph_objs import Figure from .communication.DeephavenFigureConnection import DeephavenFigureConnection from .deephaven_figure import DeephavenFigure @@ -66,7 +67,8 @@ def name(self) -> str: def is_type(self, obj: Any) -> bool: """ - Check if an object is a DeephavenFigure + Check if an object is a DeephavenFigure or Plotly Figure + Plotly figures are wrapped in DeephavenFigure when sent to the client Args: obj: The object to check @@ -74,7 +76,7 @@ def is_type(self, obj: Any) -> bool: Returns: True if the object is of the correct type, False otherwise """ - return isinstance(obj, DeephavenFigure) + return isinstance(obj, DeephavenFigure) or isinstance(obj, Figure) def create_client_connection( self, obj: DeephavenFigure, connection: MessageStream @@ -90,6 +92,10 @@ def create_client_connection( Returns: The client connection """ + if isinstance(obj, Figure): + # this is a plotly figure, it will never be updated, so wrap once and send + obj = DeephavenFigure(obj, is_plotly_fig=True) + figure_connection = DeephavenFigureConnection(obj, connection) initial_message = json.dumps( { diff --git a/plugins/plotly-express/src/deephaven/plot/express/_js_plugin.py b/plugins/plotly-express/src/deephaven/plot/express/_js_plugin.py index 3df3011f9..f1df67cba 100644 --- a/plugins/plotly-express/src/deephaven/plot/express/_js_plugin.py +++ b/plugins/plotly-express/src/deephaven/plot/express/_js_plugin.py @@ -1,8 +1,4 @@ -import importlib.resources -import json import pathlib -import sys -from typing import Callable, ContextManager from deephaven.plugin.js import JsPlugin @@ -34,40 +30,3 @@ def main(self) -> str: def path(self) -> pathlib.Path: return self._path - - -def _create_from_npm_package_json( - path_provider: Callable[[], ContextManager[pathlib.Path]] -) -> JsPlugin: - with path_provider() as tmp_js_path: - js_path = tmp_js_path - if not js_path.exists(): - raise Exception( - f"Package is not installed in a normal python filesystem, '{js_path}' does not exist" - ) - with (js_path / "package.json").open("rb") as f: - package_json = json.load(f) - return ExpressJsPlugin( - package_json["name"], - package_json["version"], - package_json["main"], - js_path, - ) - - -def _resource_js_path() -> ContextManager[pathlib.Path]: - namespace = "deephaven.plot.express" - name = "_js" - if sys.version_info < (3, 9): - return importlib.resources.path(namespace, name) - else: - return importlib.resources.as_file( - importlib.resources.files(namespace).joinpath(name) - ) - - -def create_js_plugin() -> JsPlugin: - # TODO: Include developer instructions for installing in editable mode - # https://github.com/deephaven/deephaven-plugins/issues/93 - # TBD what editable mode looks like for JsPlugin - return _create_from_npm_package_json(_resource_js_path) diff --git a/plugins/plotly-express/src/deephaven/plot/express/_register.py b/plugins/plotly-express/src/deephaven/plot/express/_register.py index f3f638ba5..4a2f27bb7 100644 --- a/plugins/plotly-express/src/deephaven/plot/express/_register.py +++ b/plugins/plotly-express/src/deephaven/plot/express/_register.py @@ -1,8 +1,12 @@ -import os +from plotly import io as pio +from deephaven.plugin import Registration, Callback +from deephaven.plugin.utilities import create_js_plugin, DheSafeCallbackWrapper from . import DeephavenFigureType -from ._js_plugin import create_js_plugin +from ._js_plugin import ExpressJsPlugin -from deephaven.plugin import Registration, Callback +PACKAGE_NAMESPACE = "deephaven.plot.express" +JS_NAME = "_js" +PLUGIN_CLASS = ExpressJsPlugin class ExpressRegistration(Registration): @@ -21,8 +25,16 @@ def register_into(cls, callback: Callback) -> None: A function to call after registration """ + # Disable default renderer to ignore figure.show() + pio.renderers.default = None + callback = DheSafeCallbackWrapper(callback) + callback.register(DeephavenFigureType) - # Only register the JS plugins if the environment variable is set - if os.getenv("DEEPHAVEN_ENABLE_PY_JS", "False").lower() in ("true", "1"): - callback.register(create_js_plugin()) + js_plugin = create_js_plugin( + PACKAGE_NAMESPACE, + JS_NAME, + PLUGIN_CLASS, + ) + + callback.register(js_plugin) diff --git a/plugins/plotly-express/src/deephaven/plot/express/deephaven_figure/DeephavenFigure.py b/plugins/plotly-express/src/deephaven/plot/express/deephaven_figure/DeephavenFigure.py index 3166bfdc0..d70828519 100644 --- a/plugins/plotly-express/src/deephaven/plot/express/deephaven_figure/DeephavenFigure.py +++ b/plugins/plotly-express/src/deephaven/plot/express/deephaven_figure/DeephavenFigure.py @@ -394,6 +394,7 @@ def __init__( has_color: bool = False, trace_generator: Generator[dict[str, Any], None, None] | None = None, has_subplots: bool = False, + is_plotly_fig: bool = False, ): """ Create a new DeephavenFigure @@ -407,6 +408,7 @@ def __init__( has_color: If this figure has color trace_generator: The trace generator has_subplots: If this figure has subplots + is_plotly_fig: If this is a plotly figure """ # keep track of function that called this, and it's args self._head_node = DeephavenHeadNode() @@ -428,6 +430,8 @@ def __init__( self._has_subplots = has_subplots + self._is_plotly_fig = is_plotly_fig + self._liveness_scope = LivenessScope() def copy_mappings(self: DeephavenFigure, offset: int = 0) -> list[DataMapping]: @@ -584,6 +588,10 @@ def get_figure(self) -> DeephavenFigure | None: Returns: The figure """ + if self._is_plotly_fig: + # a plotly figure was passed directly + # just return this figure since it will never be updated + return self return self._head_node.get_figure() def get_plotly_fig(self) -> Figure | None: @@ -676,6 +684,7 @@ def copy(self) -> DeephavenFigure: self._has_color, self._trace_generator, self._has_subplots, + self._is_plotly_fig, ) new_figure._head_node = self._head_node.copy_graph() return new_figure diff --git a/plugins/plotly-express/src/deephaven/plot/express/plots/PartitionManager.py b/plugins/plotly-express/src/deephaven/plot/express/plots/PartitionManager.py index 19265fe4b..2377d0bfa 100644 --- a/plugins/plotly-express/src/deephaven/plot/express/plots/PartitionManager.py +++ b/plugins/plotly-express/src/deephaven/plot/express/plots/PartitionManager.py @@ -603,7 +603,9 @@ def default_figure(self) -> DeephavenFigure: # this is very hacky but it's needed to prevent errors when # there are no partitions until a better solution can be done # also need the px template to be set - default_fig = px.scatter(x=[0], y=[0]) + # the title can also be set here as it will never change + title = self.args.get("title") + default_fig = px.scatter(x=[0], y=[0], title=title) default_fig.update_traces(x=[], y=[]) return DeephavenFigure(default_fig) diff --git a/plugins/plotly-express/src/js/package.json b/plugins/plotly-express/src/js/package.json index a79537d3c..9724848ac 100644 --- a/plugins/plotly-express/src/js/package.json +++ b/plugins/plotly-express/src/js/package.json @@ -1,6 +1,6 @@ { "name": "@deephaven/js-plugin-plotly-express", - "version": "0.4.0", + "version": "0.7.0", "description": "Deephaven plotly express plugin", "keywords": [ "Deephaven", @@ -32,7 +32,8 @@ "homepage": "https://github.com/deephaven/deephaven-js-plugins", "scripts": { "start": "vite build --watch", - "build": "tsc && vite build" + "build": "tsc && vite build", + "update-dh-packages": "node ../../../../tools/update-dh-packages.mjs" }, "devDependencies": { "@deephaven/jsapi-types": "0.64.0", @@ -60,8 +61,8 @@ "@deephaven/plugin": "0.64.0", "@deephaven/utils": "0.64.0", "deep-equal": "^2.2.1", - "plotly.js": "^2.23.0", - "plotly.js-dist-min": "^2.23.0", + "plotly.js": "^2.29.1", + "plotly.js-dist-min": "^2.29.1", "react-plotly.js": "^2.4.0", "react-redux": "^7.2.9", "shortid": "^2.2.16" diff --git a/plugins/plotly-express/src/js/src/DashboardPlugin.tsx b/plugins/plotly-express/src/js/src/DashboardPlugin.tsx new file mode 100644 index 000000000..53b335620 --- /dev/null +++ b/plugins/plotly-express/src/js/src/DashboardPlugin.tsx @@ -0,0 +1,77 @@ +import { useCallback, DragEvent, useEffect } from 'react'; +import shortid from 'shortid'; +import { + DashboardPluginComponentProps, + LayoutUtils, + PanelEvent, + useListener, +} from '@deephaven/dashboard'; +import type { VariableDescriptor } from '@deephaven/jsapi-types'; +import PlotlyExpressChartPanel from './PlotlyExpressChartPanel.js'; +import type { PlotlyChartWidget } from './PlotlyExpressChartUtils.js'; + +export function DashboardPlugin( + props: DashboardPluginComponentProps +): JSX.Element | null { + const { id, layout, registerComponent } = props; + + const handlePanelOpen = useCallback( + async ({ + dragEvent, + fetch, + metadata = {}, + panelId = shortid.generate(), + widget, + }: { + dragEvent?: DragEvent; + fetch: () => Promise; + metadata?: Record; + panelId?: string; + widget: VariableDescriptor; + }) => { + const { type, name } = widget; + if (type !== 'deephaven.plot.express.DeephavenFigure') { + return; + } + + const config = { + type: 'react-component' as const, + component: 'PlotlyPanel', + props: { + localDashboardId: id, + id: panelId, + metadata: { + ...metadata, + ...widget, + figure: name, + }, + fetch, + }, + title: name, + id: panelId, + }; + + const { root } = layout; + LayoutUtils.openComponent({ root, config, dragEvent }); + }, + [id, layout] + ); + + useEffect( + function registerComponentsAndReturnCleanup() { + const cleanups = [ + registerComponent('PlotlyPanel', PlotlyExpressChartPanel), + ]; + return () => { + cleanups.forEach(cleanup => cleanup()); + }; + }, + [registerComponent] + ); + + useListener(layout.eventHub, PanelEvent.OPEN, handlePanelOpen); + + return null; +} + +export default DashboardPlugin; diff --git a/plugins/plotly-express/src/js/src/PlotlyExpressChart.tsx b/plugins/plotly-express/src/js/src/PlotlyExpressChart.tsx index 7f8f546be..2d7bace4a 100644 --- a/plugins/plotly-express/src/js/src/PlotlyExpressChart.tsx +++ b/plugins/plotly-express/src/js/src/PlotlyExpressChart.tsx @@ -14,6 +14,7 @@ export function PlotlyExpressChart( const { fetch } = props; const containerRef = useRef(null); const [model, setModel] = useState(); + const [widgetRevision, setWidgetRevision] = useState(0); // Used to force a clean chart state on widget change useEffect(() => { let cancelled = false; @@ -21,6 +22,7 @@ export function PlotlyExpressChart( const widgetData = await fetch(); if (!cancelled) { setModel(new PlotlyExpressChartModel(dh, widgetData, fetch)); + setWidgetRevision(r => r + 1); } } @@ -37,6 +39,7 @@ export function PlotlyExpressChart( }[]; + addEventListener( + type: string, + fn: (event: CustomEvent) => () => void + ): void; +} export interface PlotlyChartWidgetData { type: string; diff --git a/plugins/plotly-express/src/js/src/index.ts b/plugins/plotly-express/src/js/src/index.ts index 9d83e0884..312a2bc95 100644 --- a/plugins/plotly-express/src/js/src/index.ts +++ b/plugins/plotly-express/src/js/src/index.ts @@ -1,5 +1,7 @@ import { PlotlyExpressPlugin } from './PlotlyExpressPlugin.js'; +// Export legacy dashboard plugin as named export for backwards compatibility +export * from './DashboardPlugin.js'; export * from './PlotlyExpressChartModel.js'; export * from './PlotlyExpressChartUtils.js'; diff --git a/plugins/plotly-express/test/deephaven/plot/express/plots/test_layout.py b/plugins/plotly-express/test/deephaven/plot/express/plots/test_layout.py new file mode 100644 index 000000000..1d5ebf80e --- /dev/null +++ b/plugins/plotly-express/test/deephaven/plot/express/plots/test_layout.py @@ -0,0 +1,26 @@ +import unittest + +from ..BaseTest import BaseTestCase + + +class ScatterTestCase(BaseTestCase): + def setUp(self) -> None: + from deephaven import empty_table + + self.source = empty_table(0).update(["x=i", "y=i*Math.random()*i", "z=i%5"]) + + def test_empty_title(self): + import src.deephaven.plot.express as dx + + chart = dx.line( + self.source, x="x", y="y", by=["z"], title="Hello World0" + ).to_dict(self.exporter) + plotly, deephaven = chart["plotly"], chart["deephaven"] + + expected_title = {"text": "Hello World0"} + + self.assertEqual(plotly["layout"]["title"], expected_title) + + +if __name__ == "__main__": + unittest.main() diff --git a/plugins/plotly-express/tox.ini b/plugins/plotly-express/tox.ini index 689009121..b214f738a 100644 --- a/plugins/plotly-express/tox.ini +++ b/plugins/plotly-express/tox.ini @@ -3,6 +3,6 @@ isolated_build = True [testenv] deps = - deephaven-server==0.31.0 + deephaven-server commands = python -m unittest discover \ No newline at end of file diff --git a/plugins/plotly/CHANGELOG.md b/plugins/plotly/CHANGELOG.md new file mode 100644 index 000000000..04ff2f538 --- /dev/null +++ b/plugins/plotly/CHANGELOG.md @@ -0,0 +1,17 @@ +# Changelog +All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines. + +- - - +## plotly-v0.1.0 - 2024-04-03 +#### Bug Fixes +- Scatter plots rendering at the wrong location (#324) - (dfe5c48) - mofojed +#### Build system +- Update dh ui packages to ^0.66.1 (#330) - (9433a98) - bmingles +#### Features +- combine plotly plots into plotly-express plugin (#358) - (7a1893d) - Joe +- Support lerna scopes in npm start (#203) - (aab9591) - bmingles +- Auth keycloak plugin (#19) - (8e77e7d) - mofojed + +- - - + +Changelog generated by [cocogitto](https://github.com/cocogitto/cocogitto). \ No newline at end of file diff --git a/plugins/plotly/README.md b/plugins/plotly/README.md index 1befec30d..3d069d4a8 100644 --- a/plugins/plotly/README.md +++ b/plugins/plotly/README.md @@ -1,3 +1,7 @@ +# Deprecated +This plugin is deprecated and will be removed in a future release. +Please use the plotly-express plugin instead, which will render Plotly plots in the same way as this plugin. + # Deephaven Plugin for Plotly The Deephaven Plugin for Plotly. Allows for opening Plotly plots in a Deephaven environment. Any Plotly plot diff --git a/plugins/plotly/setup.cfg b/plugins/plotly/setup.cfg index 64b135cc4..69e225d5d 100644 --- a/plugins/plotly/setup.cfg +++ b/plugins/plotly/setup.cfg @@ -3,7 +3,7 @@ name = deephaven-plugin-plotly description = Deephaven Plugin for Plotly long_description = file: README.md long_description_content_type = text/markdown -version = attr:deephaven.plugin.plotly.__version__ +version = 0.1.0.dev0 url = https://github.com/deephaven/deephaven-plugins project_urls = Source Code = https://github.com/deephaven/deephaven-plugins diff --git a/plugins/plotly/src/deephaven/plugin/plotly/__init__.py b/plugins/plotly/src/deephaven/plugin/plotly/__init__.py index d520ce352..c4a18cf16 100644 --- a/plugins/plotly/src/deephaven/plugin/plotly/__init__.py +++ b/plugins/plotly/src/deephaven/plugin/plotly/__init__.py @@ -1,8 +1,6 @@ from deephaven.plugin import Registration, Callback from plotly import io as pio -__version__ = "0.3.0.dev0" - def _init_theme(): # Set the Deephaven style globally diff --git a/plugins/plotly/src/js/package.json b/plugins/plotly/src/js/package.json index 62288c08d..68059ff86 100644 --- a/plugins/plotly/src/js/package.json +++ b/plugins/plotly/src/js/package.json @@ -1,6 +1,6 @@ { "name": "@deephaven/js-plugin-plotly", - "version": "0.3.0", + "version": "0.1.0", "description": "Deephaven plotly plugin", "keywords": [ "Deephaven", @@ -21,7 +21,8 @@ "homepage": "https://github.com/deephaven/deephaven-js-plugins", "scripts": { "start": "vite build --watch", - "build": "vite build" + "build": "vite build", + "update-dh-packages": "node ../../../../tools/update-dh-packages.mjs" }, "devDependencies": { "@types/react": "^17.0.2", @@ -39,7 +40,7 @@ "@deephaven/jsapi-types": "^0.40.0", "@deephaven/log": "^0.40.0", "@deephaven/utils": "^0.40.0", - "plotly.js-dist-min": "^2.20.0", + "plotly.js-dist-min": "^2.29.1", "prop-types": "^15.8.1", "react-plotly.js": "^2.4.0", "shortid": "^2.2.16" diff --git a/plugins/ui/CHANGELOG.md b/plugins/ui/CHANGELOG.md index 669beb87e..525bff8b8 100644 --- a/plugins/ui/CHANGELOG.md +++ b/plugins/ui/CHANGELOG.md @@ -2,6 +2,67 @@ All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines. - - - +## ui-v0.11.0 - 2024-04-03 +#### Bug Fixes +- Re-opening widgets after re-hydrated (#379) - (42242a5) - mofojed +- Wrap primitive Item children in Text (#370) - (c733932) - bmingles +#### Documentation +- Updating examples for consistency (#378) - (6292b3a) - mofojed +- pydocs for ui.text_field (#357) - (d795c8d) - ethanalvizo +#### Features +- Picker table support (#382) - (2f84c96) - bmingles +- Add Python list_view implementation (#359) - (f0b8759) - Joe +- only require typing_extension for python < 3.11 (#397) - (e31dc6f) - devinrsmith +- sets the default flex gap to "size-100" (#347) - (5898502) - Don + +- - - + +## ui-v0.10.0 - 2024-03-15 +#### Bug Fixes +- Tighten use_memo dependency types (#356) - (48dea18) - Joe +#### Build system +- Fix npm package update (#361) - (cabbcab) - mofojed +#### Documentation +- list_view spec (#352) - (bca3880) - Joe +- Fix the demo script (#354) - (7e7302e) - mofojed +#### Features +- Store server-side state for rehydration (#338) - (bb28df3) - mofojed +- Package matplotlib and ui JS with wheel (#343) - (7724e55) - Joe + +- - - + +## ui-v0.9.0 - 2024-03-09 +#### Bug Fixes +- Tab Panels contents should take up the full height (#340) - (6028195) - mofojed +- Remove tooltip prop (#334) - (cbe2140) - Joe +- add missing dependencies params for liveness scope and table listener hooks (#291) - (9d6b7de) - niloc132 +- added missing picker imports (#332) - (272cdf9) - Joe +#### Build system +- Update dh ui packages to ^0.66.1 (#330) - (9433a98) - bmingles +#### Features +- Add ui.table press event listener support (#346) - (b805683) - mofojed +- UI Picker JS (#333) - (e3af9f5) - bmingles + +- - - + +## ui-v0.8.0 - 2024-02-28 +#### Bug Fixes +- Use correct formatting settings for ui.table (#326) - (4762053) - mofojed +- Call listener when do_replay is True for use_table_listener_hook (#313) - (86d2572) - Joe +- Type fixes and require pyright (#302) - (d5d003d) - Joe +- Could not assign built-in Callables as callbacks (#305) - (5334e4d) - mofojed +#### Documentation +- button_group (#306) - (fee31f8) - ethanalvizo +- Picker spec (#247) - (07f2cf5) - Joe +- Remove the warning about using the plugin at your own risk (#303) - (e342341) - mofojed +#### Features +- Widget re-hydration (#288) - (13bb5ea) - mofojed +- Add python picker (#311) - (05d1c4a) - Joe +#### Tests +- Bumping test listener timeout from 1 to 2 seconds (#312) - (43ddf75) - Joe + +- - - + ## ui-v0.7.0 - 2024-02-21 #### Bug Fixes - Hooks accepting liveness objects and functions should manage their lifetime (#258) - (8d2a945) - niloc132 diff --git a/plugins/ui/DESIGN.md b/plugins/ui/DESIGN.md index edfaf2b77..8432c79d0 100644 --- a/plugins/ui/DESIGN.md +++ b/plugins/ui/DESIGN.md @@ -1024,11 +1024,11 @@ ui.item( ``` ###### Parameters -| Parameter | Type | Description | -|----------------|--------------|----------------------------------------| -| `*children` | `Stringable` | The options to render within the item. | -| `**props` | `Any` | Any other Item prop | +| Parameter | Type | Description | +| ----------- | ------------ | -------------------------------------- | +| `*children` | `Stringable` | The options to render within the item. | +| `**props` | `Any` | Any other Item prop | ##### ui.section @@ -1037,30 +1037,32 @@ A section that can be added to a menu, such as a `ui.picker`. Children are the d ```py import deephaven.ui as ui ui.section( - *children: PickerOption, + *children: PickerItem, title: str | None = None, **props: Any ) -> SectionElement ``` ###### Parameters -| Parameter | Type | Description | -|-----------------------|-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| -| `*children` | `PickerOption` | The options to render within the section. | -| `title` | `str \| None` | The title of the section. | -| `**props` | `Any` | Any other Section prop | + +| Parameter | Type | Description | +| ----------- | ------------- | ----------------------------------------- | +| `*children` | `PickerItem` | The options to render within the section. | +| `title` | `str \| None` | The title of the section. | +| `**props` | `Any` | Any other Section prop | ##### ui.picker + A picker that can be used to select from a list. Children should be one of four types: -If children are of type `PickerOption`, they are the dropdown options. +If children are of type `PickerItem`, they are the dropdown options. If children are of type `SectionElement`, they are the dropdown sections. -If children are of type `Table`, the values in the table are the dropdown options. There can only be one child, the `Table`. -If children are of type `PartitionedTable`, the values in the table are the dropdown options and the partitions create multiple sections. There can only be one child, the `PartitionedTable`. +If children are of type `Table`, the values in the table are the dropdown options. There can only be one child, the `Table`. +If children are of type `PartitionedTable`, the values in the table are the dropdown options and the partitions create multiple sections. There can only be one child, the `PartitionedTable`. ```py import deephaven.ui as ui ui.picker( - *children: PickerOption | SectionElement | Table | PartitionedTable, + *children: PickerItem | SectionElement | Table | PartitionedTable, key_column: ColumnName | None = None, label_column: ColumnName | None = None, description_column: ColumnName | None = None, @@ -1068,24 +1070,27 @@ ui.picker( title_column: ColumnName | None = None, default_selected_key: Key | None = None, selected_key: Key | None = None, - on_selection_change: Callable[[Key], None] | None = None, + on_selection_change: Callable[[Key], None] | None = None, + on_change: Callable[[Key], None] | None = None, **props: Any -) -> ItemElement +) -> PickerElement ``` ###### Parameters -| Parameter | Type | Description | -|------------------------|---------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `*children` | `PickerOption \| SectionElement \| Table \| PartitionedTable` | The options to render within the picker. | -| `key_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to use as item keys. Defaults to the first column. | -| `label_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to display as primary text. Defaults to the `key_column` value. | -| `description_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to display as descriptions. | -| `icon_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to map to icons. | -| `title_column` | `ColumnName \| None` | Only valid if children is of type `PartitionedTable`. The column of values to display as section names. Should be the same for all values in the constituent `Table`. If not specified, the section titles will be created from the `key_columns` of the `PartitionedTable`. | -| `default_selected_key` | `Key \| None` | The initial selected key in the collection (uncontrolled). | -| `selected_key` | `Key \| None` | The currently selected key in the collection (controlled). | -| `on_selection_change` | `Callable[[Key], None] \| None` | Handler that is called when the selection changes. | -| `**props` | `Any` | Any other [Picker](https://react-spectrum.adobe.com/react-spectrum/Picker.html) prop, with the exception of `items` | + +| Parameter | Type | Description | +| ---------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `*children` | `PickerItem \| SectionElement \| Table \| PartitionedTable` | The options to render within the picker. | +| `key_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to use as item keys. Defaults to the first column. | +| `label_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to display as primary text. Defaults to the `key_column` value. | +| `description_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to display as descriptions. | +| `icon_column` | `ColumnName \| None` | Only valid if children are of type `Table` or `PartitionedTable`. The column of values to map to icons. | +| `title_column` | `ColumnName \| None` | Only valid if children is of type `PartitionedTable`. The column of values to display as section names. Should be the same for all values in the constituent `Table`. If not specified, the section titles will be created from the `key_columns` of the `PartitionedTable`. | +| `default_selected_key` | `Key \| None` | The initial selected key in the collection (uncontrolled). | +| `selected_key` | `Key \| None` | The currently selected key in the collection (controlled). | +| `on_selection_change` | `Callable[[Key], None] \| None` | Handler that is called when the selection changes. | +| `on_change` | `Callable[[Key], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selection changes. | +| `**props` | `Any` | Any other [Picker](https://react-spectrum.adobe.com/react-spectrum/Picker.html) prop, with the exception of `items`, `validate`, `errorMessage` (as a callback) and `onLoadMore` | ```py import deephaven.ui as ui @@ -1178,11 +1183,177 @@ picker7 = ui.picker( description_column="Descriptions", icon_column="Icons", title_column="SectionNames", - selected_key=option, + selected_key=color, on_selection_change=set_color ) ``` +###### ui.list_action_group +A group of action buttons that can be used to create a list of actions. +This component should be used within the actions prop of a `ListView` component. + +```py +def list_action_group( + *children: ActionGroupItem, + on_action: Callable[[ActionKey, Key], None] | None = None, + on_selection_change: Callable[[Selection, Key], None] | None = None, + **props: Any +) -> ListActionGroupElement: +``` + +###### Parameters +| Parameter | Type | Description | +|-------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `ActionGroupItem` | The actions to render within the action group. | +| `on_action` | `Callable[[ActionKey, Key], None] \| None` | Handler that is called when an item is pressed. The first argument is the key of the action, the second argument is the key of the list_view item. | +| `on_selection_change` | `Callable[[Selection, Key], None] \| None` | Handler that is called when the selection changes. The first argument is the selection, the second argument is the key of the list_view item. | +| `**props` | `Any` | Any other [ActionGroup](https://react-spectrum.adobe.com/react-spectrum/ActionGroup.html) prop. | + + + +###### ui.list_action_menu +A group of action buttons that can be used to create a list of actions. +This component should be used within the actions prop of a `ListView` component. + +```py +def list_action_menu( + *children: ActionMenuItem, + on_action: Callable[[ActionKey, Key], None] | None = None, + on_open_change: Callable[[bool, Key], None] | None = None, + **props: Any +) -> ListActionMenuElement: +``` + +###### Parameters +| Parameter | Type | Description | +|-------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `ActionMenuItem` | The options to render within the picker. | +| `on_action` | `Callable[[ActionKey, Key], None] \| None` | Handler that is called when an item is pressed. The first argument is the key of the action, the second argument is the key of the list_view item. | +| `on_open_change` | `Callable[[bool, Key], None] \| None` | The first argument is a boolean indicating if the menu is open, the second argument is the key of the list_view item. | +| `**props` | `Any` | Any other [ActionMenu](https://react-spectrum.adobe.com/react-spectrum/ActionMenu.html) prop. | + +###### ui.list_view +A list view that can be used to create a list of items. Children should be one of two types: +1. If children are of type `ListViewItem`, they are the list items. +2. If children are of type `Table`, the values in the table are the list items. There can only be one child, the `Table`. + +```py +import deephaven.ui as ui +ui.list_view( + *children: ListViewItem | Table, + key_column: ColumnName | None = None, + label_column: ColumnName | None = None, + description_column: ColumnName | None = None, + icon_column: ColumnName | None = None, + actions: ListActionGroupElement | ListActionMenuElement | None = None, + default_selected_keys: Selection | None = None, + selected_keys: Selection | None = None, + render_empty_state: Element | None = None, + on_selection_change: Callable[[Selection], None] | None = None, + on_change: Callable[[Selection], None] | None = None, + **props: Any +) -> ListViewElement +``` + +###### Parameters +| Parameter | Type | Description | +|-------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `*children` | `ListViewItem \| Table` | The options to render within the picker. | +| `key_column` | `ColumnName \| None` | Only valid if children are of type `Table`. The column of values to use as item keys. Defaults to the first column. | +| `label_column` | `ColumnName \| None` | Only valid if children are of type `Table`. The column of values to display as primary text. Defaults to the `key_column` value. | +| `description_column` | `ColumnName \| None` | Only valid if children are of type `Table`. The column of values to display as descriptions. | +| `icon_column` | `ColumnName \| None` | Only valid if children are of type `Table`. The column of values to map to icons. | +| `actions` | `ListActionGroupElement \| ListActionMenuElement \| None` | Only valid if children are of type Table. The action group or menus to render for all elements within the list view. | +| `default_selected_keys` | `Selection \| None` | The initial selected keys in the collection (uncontrolled). | +| `selected_keys` | `Selection \| None` | The currently selected keys in the collection (controlled). | +| `render_empty_state` | `Element \| None` | Sets what the `list_view` should render when there is no content to display. | +| `on_selection_change` | `Callable[[Selection], None] \| None` | Handler that is called when the selections changes. | +| `on_change` | `Callable[[Selection], None] \| None` | Alias of `on_selection_change`. Handler that is called when the selections changes. | +| `**props` | `Any` | Any other [ListView](https://react-spectrum.adobe.com/react-spectrum/ListView.html) prop, with the exception of `items`, `dragAndDropHooks`, and `onLoadMore`. | + + +```py +import deephaven.ui as ui + +# simple list_view that takes ui.items and is uncontrolled +list_view1 = ui.list_view( + ui.item("Option 1"), + ui.item("Option 2"), + ui.item("Option 3"), + ui.item("Option 4"), + default_selected_keys=["Option 2", "Option 3"] +) + +# simple list_view that takes list view items directly and is controlled +selection, set_selection = ui.use_state(["Option 1", "Option 2"]) + +list_view2 = ui.list_view( + "Option 1", + "Option 2", + "Option 3", + "Option 4", + selected_keys=selection, + on_selection_change=selection +) + +from deephaven import empty_table + +table1 = empty_table(4).update_view("data=i") + +# data hooks can be used to create a list view from a table +# this should be avoided as it is not as performant as just passing in the table directly +options = ui.use_column_data(table1) + +list_view3 = ui.list_view( + children=options +) + +# instead, pass in the table directly +list_view4 = ui.list_view( + table1 +) + +from deephaven import new_table +from deephaven.column import string_col, int_col + +color_table = new_table([ + int_col("Keys", ["salmon", "lemonchiffon", "black"]), + string_col("Labels", ["Salmon", "Lemon Chiffon", "Black"]), + string_col("Descriptions", ["An interesting color", "Another interesting color", "A color"]), + string_col("Icons", ["Amusementpark", "Teapot", "Sentiment Negative"]), + string_col("SectionKeys", ["Interesting Colors", "Interesting Colors", "Other Colors"]), + string_col("SectionLabels", ["Favorites", "Favorites", "Other"]), + string_col("SectionDescriptions", ["Favorite colors", "Favorite colors", "Other colors"]), + string_col("SectionIcons", ["Folder", "Folder", "Not Found"]) +]) + +colors, set_colors = ui.use_state(["salmon", "lemonchiffon"]) + +# this will create a controlled list_view with color_table +list_view5 = ui.list_view( + color_table, + key_column="Keys", + label_column="Labels", + description_column="Descriptions", + icon_column="Icons", + selected_keys=colors, + on_selection_change=set_colors +) + + +# Buttons can be embedded in the list view. Note key is added to the on_press handler, but is not required. +on_button_action = lambda action_key, key: print(f"Action {action_key} was pressed for list item {key}") +button = ui.list_action_group("Print Item", on_action=on_button_action) + +list_view7 = ui.list_view( + "Option 1", + "Option 2", + "Option 3", + "Option 4", + actions=button, +) +``` + #### ui.table `ui.table` is a wrapper for a Deephaven `Table` object that allows you to add UI customizations or callbacks. The basic syntax for creating a `UITable` is: @@ -1217,7 +1388,7 @@ Other props that can be passed into `ui.table` are defined below. ```py ui_table( - table: Table, + table: Table, always_fetch_columns: ColumnNameCombination | None, back_columns: ColumnNameCombination | None, freeze_columns: ColumnNameCombination | None, @@ -1237,8 +1408,8 @@ ui_table( column_display_names: dict[ColumnName, ColumnNameCombination] | None, on_row_press: Callable[[RowIndex, RowData], None] | None, on_row_double_press: Callable[[RowIndex, RowData], None] | None - on_cell_press: Callable[[CellIndex, Any], None] | None, - on_cell_double_press: Callable[[CellIndex, Any], None] | None + on_cell_press: Callable[[CellIndex, CellData], None] | None, + on_cell_double_press: Callable[[CellIndex, CellData], None] | None on_column_press: Callable[[ColumnName], None] | None, on_columns_double_press: Callable[[ColumnName], None] | None, on_search: Callable[[str], None], @@ -1249,36 +1420,36 @@ ui_table( ) -> UITable ``` -| Parameter | Type | Description | -|-----------------------------------|---------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `always_fetch_columns` | `ColumnNameCombination \| None` | The columns to always fetch from the server. May be a single column name. These will not be affected by the users current viewport/horizontal scrolling. Useful if you have a column with key value data that you want to always include in the data sent for row click operations. | -| `back_columns` | `ColumnNameCombination \| None` | The columns to show at the back of the table. May be a single column name. These will not be moveable in the UI. | -| `freeze_columns` | `ColumnNameCombination \| None` | The columns to freeze to the front of the table. May be a single column name. These will always be visible and not affected by horizontal scrolling. | -| `front_columns` | `ColumnNameCombination \| None` | The columns to show at the front of the table. May be a single column name. These will not be moveable in the UI. | -| `hide_columns` | `ColumnNameCombination \| None` | The columns to hide by default from the table. May be a single column name. The user can still resize the columns to view them. | -| `quick_filters` | `dict[ColumnName, QuickFilterExpression] \| None` | Quick filters for the UI to apply to the table. | -| `show_search` | `bool \| None` | `True` to show the search bar by default, `False` to not. | -| `show_quick_filters` | `bool \| None` | `True` to show the quick filters by default, `False` to not. | -| `show_column_headers` | `bool \| None` | `True` to show the column headers by default, `False` to not. | -| `selection_mode` | `SelectionMode \| None` | Can be `MULTIPLE` to allow multiple selection or `SINGLE` to not allow it. | -| `selection_area` | `SelectionArea \| None` | The unit that is selected on press. Can be `ROW`, `COLUMN`, or `CELL`. | -| `selection_style` | `SelectionStyleCombination \| None` | The style of the selection. Can be `HIGHLIGHT`, `CHECKBOX`, or a combination of those. | -| `selected_rows` | `RowIndexCombination \| None` | The rows that are selected by default. Only valid if `selection_area` is `ROW`. | -| `selected_columns` | `ColumnIndexCombination \| None` | The columns that are selected by default. Only valid if `selection_area` is `COLUMN`. | -| `selected_cells` | `CellIndexCombination \| None` | The cells that are selected by default. Only valid if `selection_area` is `CELL`. | -| `density` | `DensityMode \| None` | The density of the table. Can be `COMPACT`, `REGULAR`, or `SPACIOUS`. | -| `column_display_names` | `dict[ColumnName, ColumnNameCombination] \| None` | The display names. If a sequence of column names is provided for a column, the display name will be set to the longest column name that can be fully displayed. | -| `on_row_press` | `Callable[[RowIndex, RowData], None] \| None` | The callback function to run when a cell in a row is released (such as a click). The first parameter is the row index, and the second is the row data provided in a dictionary where the column names are the keys. | -| `on_row_double_press` | `Callable[[RowIndex, RowData], None] \| None` | The callback function to run when a cell in a row is double pressed. The first parameter is the row index, and the second is the row data provided in a dictionary where the column names are the keys. | -| `on_cell_press` | `Callable[[CellIndex, Any], None] \| None` | The callback function to run when a cell is released (such as a click). The first parameter is the cell index, and the second is the cell data. | -| `on_cell_double_press` | `Callable[[CellIndex, Any], None] \| None` | The callback function to run when a cell is double pressed. The first parameter is the cell index, and the second is the cell data. | -| `on_column_press` | `Callable[[ColumnName], None] \| None` | The callback function to run when a column is released (such as a click). The only parameter is the column name. | -| `on_column_double_press` | `Callable[[ColumnName], None] \| None` | The callback function to run when a cell in a column is double pressed. The only parameter is the column name. | -| `on_search` | `Callable[[str], None] \| None` | The callback function to run when the search bar is used. The only parameter is the search string. | -| `on_quick_filter` | `Callable[[ColumnName, QuickFilterExpression], None] \| None` | The callback function to run when a quick filter is applied. The first parameter is the column name, and the second is the quick filter expression. | -| `on_freeze_column` | `Callable[[ColumnName], None] \| None` | The callback function to run when a column is frozen. The only parameter is the frozen column name. | -| `on_hide_column` | `Callable[[ColumnName], None] \| None` | The callback function to run when a column is hidden. The only parameter is the hidden column name. | -| `on_sort` | `Callable[[ColumnName, LiteralSortDirection], None] \| None` | The callback function to run when a column is sorted. The first parameter is the column name, and the second is the sort direction. | +| Parameter | Type | Description | +| ------------------------ | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `always_fetch_columns` | `ColumnNameCombination \| None` | The columns to always fetch from the server. May be a single column name. These will not be affected by the users current viewport/horizontal scrolling. Useful if you have a column with key value data that you want to always include in the data sent for row click operations. | +| `back_columns` | `ColumnNameCombination \| None` | The columns to show at the back of the table. May be a single column name. These will not be moveable in the UI. | +| `freeze_columns` | `ColumnNameCombination \| None` | The columns to freeze to the front of the table. May be a single column name. These will always be visible and not affected by horizontal scrolling. | +| `front_columns` | `ColumnNameCombination \| None` | The columns to show at the front of the table. May be a single column name. These will not be moveable in the UI. | +| `hide_columns` | `ColumnNameCombination \| None` | The columns to hide by default from the table. May be a single column name. The user can still resize the columns to view them. | +| `quick_filters` | `dict[ColumnName, QuickFilterExpression] \| None` | Quick filters for the UI to apply to the table. | +| `show_search` | `bool \| None` | `True` to show the search bar by default, `False` to not. | +| `show_quick_filters` | `bool \| None` | `True` to show the quick filters by default, `False` to not. | +| `show_column_headers` | `bool \| None` | `True` to show the column headers by default, `False` to not. | +| `selection_mode` | `SelectionMode \| None` | Can be `MULTIPLE` to allow multiple selection or `SINGLE` to not allow it. | +| `selection_area` | `SelectionArea \| None` | The unit that is selected on press. Can be `ROW`, `COLUMN`, or `CELL`. | +| `selection_style` | `SelectionStyleCombination \| None` | The style of the selection. Can be `HIGHLIGHT`, `CHECKBOX`, or a combination of those. | +| `selected_rows` | `RowIndexCombination \| None` | The rows that are selected by default. Only valid if `selection_area` is `ROW`. | +| `selected_columns` | `ColumnIndexCombination \| None` | The columns that are selected by default. Only valid if `selection_area` is `COLUMN`. | +| `selected_cells` | `CellIndexCombination \| None` | The cells that are selected by default. Only valid if `selection_area` is `CELL`. | +| `density` | `DensityMode \| None` | The density of the table. Can be `COMPACT`, `REGULAR`, or `SPACIOUS`. | +| `column_display_names` | `dict[ColumnName, ColumnNameCombination] \| None` | The display names. If a sequence of column names is provided for a column, the display name will be set to the longest column name that can be fully displayed. | +| `on_row_press` | `Callable[[RowIndex, RowData], None] \| None` | The callback function to run when a cell in a row is released (such as a click). The first parameter is the row index, and the second is the row data provided in a dictionary where the column names are the keys. | +| `on_row_double_press` | `Callable[[RowIndex, RowData], None] \| None` | The callback function to run when a cell in a row is double pressed. The first parameter is the row index, and the second is the row data provided in a dictionary where the column names are the keys. | +| `on_cell_press` | `Callable[[CellIndex, CellData], None] \| None` | The callback function to run when a cell is released (such as a click). The first parameter is the cell index, and the second is the cell data. | +| `on_cell_double_press` | `Callable[[CellIndex, CellData], None] \| None` | The callback function to run when a cell is double pressed. The first parameter is the cell index, and the second is the cell data. | +| `on_column_press` | `Callable[[ColumnName], None] \| None` | The callback function to run when a column is released (such as a click). The only parameter is the column name. | +| `on_column_double_press` | `Callable[[ColumnName], None] \| None` | The callback function to run when a cell in a column is double pressed. The only parameter is the column name. | +| `on_search` | `Callable[[str], None] \| None` | The callback function to run when the search bar is used. The only parameter is the search string. | +| `on_quick_filter` | `Callable[[ColumnName, QuickFilterExpression], None] \| None` | The callback function to run when a quick filter is applied. The first parameter is the column name, and the second is the quick filter expression. | +| `on_freeze_column` | `Callable[[ColumnName], None] \| None` | The callback function to run when a column is frozen. The only parameter is the frozen column name. | +| `on_hide_column` | `Callable[[ColumnName], None] \| None` | The callback function to run when a column is hidden. The only parameter is the hidden column name. | +| `on_sort` | `Callable[[ColumnName, LiteralSortDirection], None] \| None` | The callback function to run when a column is sorted. The first parameter is the column name, and the second is the sort direction. | `ui.table` will also support the below methods. @@ -1502,7 +1673,7 @@ ui_fragment = ui.fragment(*children: Element) -> Element The functionality provided my `ui.table` replaces some of the existing functions on `Table`. Below are the functions that are planned for deprecation/deletion of the `Table` interface, and their replacements with the new `ui.table` interface. | Table Function | ui.table Replacement | -| ----------------------------------------------------------------- |-----------------------------------------------------------------------------------------------------------------------------------------------------------| +| ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | `format_columns`
`format_column_where`
`format_row_where` | [color_column](#color_column)
[color_row](#color_row)
[format](#format) | | `layout_hints` | [Props](#Parameters-5) of back_columns, front_columns, freeze_columns, hide_columns, and show_search, as well as method of [column_group](#column_groups) | | `dropColumnFormats` | No replacement | @@ -1522,6 +1693,7 @@ Call a callback function or `on_update` in a `TableListener` when the table is u use_table_listener( table: Table, listener: Callable[[TableUpdate, bool], None] | TableListener, + dependencies: set[Any], description: str | None = None, do_replay: bool = False, replay_lock: LockType = "shared", @@ -1657,18 +1829,17 @@ use_cell_data( | `table` | `Table` | The table to create a viewport on. | | `sentinel` | `Sentinel` | A sentinel value to return if the cell is still loading. Default `None`. | - - #### Custom Types Below are some of the custom types that are used in the above API definitions: ```py AggregationOperation = Literal["COUNT", "COUNT_DISTINCT", "DISTINCT", "MIN", "MAX", "SUM", "ABS_SUM", "VAR", "AVG", "STD", "FIRST", "LAST", "UNIQUE", "SKIP"] -CellIndex = [RowIndex, ColumnIndex] +# An index of None means a header was selected +GridIndex = [ColumnIndex | None, RowIndex | None] +CellIndex = [ColumnIndex, RowIndex] Color = DeephavenColor | HexColor -# A ColumnIndex of None indicates a header row -ColumnIndex = int | None +ColumnIndex = int ColumnName = str ColumnData = list[Any] # ID of a component. Used for linking. @@ -1684,10 +1855,9 @@ DeephavenColor = Literal[...] HexColor = str LockType = Literal["shared", "exclusive"] QuickFilterExpression = str -RowData = dict[ColumnName, Any] -# A RowIndex of None indicates a header column -RowIndex = int | None -SelectionStyle = Literal["HIGHLIGHT", "CHECKBOX"] +RowData = dict[ColumnName, RowDataValue] +RowIndex = int +SelectionStyle = Literal["HIGHLIGHT", "CHECKBOX"] SelectionArea = Literal["CELL", "ROW", "COLUMN"] SelectionMode = Literal["SINGLE", "MULTIPLE"] DensityMode = Literal["COMPACT", "REGULAR", "SPACIOUS"] @@ -1698,8 +1868,11 @@ TableData = dict[ColumnName, ColumnData] TransformedData = Any # Stringable is a type that is naturally convertible to a string Stringable = str | int | float | bool -PickerOption = Stringable | ItemElement -Key = Any +PickerItem = Stringable | ItemElement +Key = Stringable +ActionKey = Key +Selection = Sequence[Key] +ListViewItem = Stringable | ItemElement T = TypeVar("T") Combination: TypeAlias = T | set[T] | Sequence[T] @@ -1710,7 +1883,16 @@ ColumnIndexCombination = Combination[ColumnIndex] CellIndexCombination = Combination[CellIndex] SelectionStyleCombination = Combination[SelectionStyle] -``` +# Data for one cell. Returned with click handlers. +class CellData(TypedDict): + type: str + text: str + value: Any + +# Data for value of one column in a row. Returned with row press handlers. +class RowDataValue(CellData): + isExpandable: bool + isGrouped: bool # Set a filter for a dashboard. Filter will apply to all items with a matching column/type, except for items specified in the `exclude_ids` parameter class DashboardFilter(TypedDict): @@ -1747,7 +1929,6 @@ class LinkPoint(TypedDict): # Column to link to column: str - ``` #### Context @@ -1828,31 +2009,35 @@ The above examples are all in Python, and particularly take some advantage of la ##### Rendering -When you call a function decorated by `@ui.component`, it will return a `UiNode` object that has a reference to the function it is decorated; that is to say, the function does _not_ get run immediately. The function is only run when the `UiNode` is rendered by the client, and the result is sent back to the client. This allows the `@ui.component` decorator to execute the function with the appropriate rendering context, and also allows for memoization of the function (e.g. if the function is called multiple times with the same arguments, it will only be executed once - akin to a [memoized component](https://react.dev/reference/react/memo) or PureComponent in React). +When you call a function decorated by `@ui.component`, it will return an `Element` object that has a reference to the function it is decorated; that is to say, the function does _not_ get run immediately. The function is only run when the `Element` is rendered by the client, and the result is sent back to the client. This allows the `@ui.component` decorator to execute the function with the appropriate rendering context. The client must also set the initial state before rendering, allowing the client to persist the state and re-render in the future. Let's say we execute the following, where a table is filtered based on the value of a text input: ```python +from deephaven import ui + + @ui.component def text_filter_table(source, column, initial_value=""): - value, set_value = use_state(initial_value) - ti = ui.text_field(value, on_change=set_value) + value, set_value = ui.use_state(initial_value) + ti = ui.text_field(value=value, on_change=set_value) tt = source.where(f"{column}=`{value}`") return [ti, tt] +# This will render two panels, one filtering the table by Sym, and the other by Exchange @ui.component -def sym_exchange(source): - tft1 = text_filter_table(source, "Sym") - tft2 = text_filter_table(source, "Exchange") - return ui.flex(tft1, tft2, direction="row") +def double_text_filter_table(source): + tft1 = text_filter_table(source, "sym") + tft2 = text_filter_table(source, "exchange") + return ui.panel(tft1, title="Sym"), ui.panel(tft2, title="Exchange") import deephaven.plot.express as dx -t = dx.data.stocks() +_stocks = dx.data.stocks() -tft = text_filter_table(t, "sym") +tft = double_text_filter_table(_stocks) ``` Which should result in a UI like this: @@ -1877,21 +2062,21 @@ sequenceDiagram W->>UIP: Open tft UIP->>C: Export tft - C-->>UIP: tft (UiNode) + C-->>UIP: tft (Element) - Note over UIP: UI knows about object tft
sym_exchange not executed yet + Note over UIP: UI knows about object tft
double_text_filter_table not executed yet - UIP->>SP: Render tft - SP->>SP: Run sym_exchange - Note over SP: sym_exchange executes, running text_filter_table twice - SP-->>UIP: Result (document=flex([tft1, tft2]), exported_objects=[tft1, tft2]) + UIP->>SP: Render tft (initialState) + SP->>SP: Run double_text_filter_table + Note over SP: double_text_filter_table executes, running text_filter_table twice + SP-->>UIP: Result (document=[panel(tft1), pane(tft2)], exported_objects=[tft1, tft2]) UIP-->>W: Display Result U->>UIP: Change text input 1 UIP->>SP: Change state - SP->>SP: Run sym_exchange - Note over SP: sym_exchange executes, text_filter_table only
runs once for the one changed input
only exports the new table, as client already has previous tables - SP-->>UIP: Result (document=flex([tft1', tft2], exported_objects=[tft1'])) + SP->>SP: Run double_text_filter_table + Note over SP: double_text_filter_table executes, text_filter_table only
runs once for the one changed input
only exports the new table, as client already has previous tables + SP-->>UIP: Result (document=[panel(tft1'), panel(tft2)], state={}, exported_objects=[tft1']) UIP-->>W: Display Result ``` @@ -1904,14 +2089,15 @@ sequenceDiagram participant UIP as UI Plugin participant SP as Server Plugin - UIP->>SP: obj.getDataAsString() - Note over UIP, SP: Uses json-rpc - SP-->>UIP: documentUpdated(Document) + Note over UIP, SP: Uses JSON-RPC + UIP->>SP: setState(initialState) + SP-->>UIP: documentUpdated(Document, State) loop Callback UIP->>SP: foo(params) SP-->>UIP: foo result - SP->>UIP: documentUpdated(Document) + SP->>UIP: documentUpdated(Document, State) + Note over UIP: Client can store State to restore the same state later end ``` diff --git a/plugins/ui/examples/README.md b/plugins/ui/examples/README.md index 0ef3bd55b..e1e4002b7 100644 --- a/plugins/ui/examples/README.md +++ b/plugins/ui/examples/README.md @@ -13,73 +13,184 @@ docker run --rm --name deephaven-ui -p 10000:10000 --pull=always ghcr.io/deephav You'll need to find the link to open the UI in the Docker logs: ![docker](assets/docker.png) -# Basic `use_state` Examples +# Using components -deephaven.ui uses functional components with "hooks" to create components. The most useful and basic hook is the `use_state` hook, which allows you to create a stateful component. The `use_state` hook returns a tuple of the current value of the state and a function to update the state. The function returned by `use_state` can be called with a new value to update the state, and the component will re-render with the new value. People familiar with React will be familiar with this paradigm. +Get started by importing the `deephaven.ui` package as `ui`: -The below examples show a simple usage of the `use_state` hook, building some of the basic examples on the [React useState docs](https://react.dev/reference/react/useState#examples-basic). +```python +from deephaven import ui +``` + +The `ui` package contains many _components_, which you can display in the UI: + +```python +hello_world = ui.heading("Hello World!") +``` + +![Basic Hello World example.](assets/hello_world.png) -## Counter (number) +By assigning the component to the `hello_world` variable, it displays in the UI in a panel named `hello_world`. -A simple example to demonstrate how state can be used using the `use_state` hook. `count` holds the value of the counter, and pressing the button increments the number. +## Handling events -We define our `counter` component as a function using the `@ui.component` decorator. This decorator allows the component to be rendered in the UI, when we assign the result of it to a value with the `c = counter()` line. The `counter` function returns a `ui.action_button` component, which is a [button that can be pressed](https://react-spectrum.adobe.com/react-spectrum/ActionButton.html). The `on_press` argument is a callback that is called when the button is pressed. In this case, we call the `set_count` function returned by `use_state` to update the value of `count`. +Write functions to handle events. To write a button that will print event details to the console when clicked: ```python -import deephaven.ui as ui -from deephaven.ui import use_state +my_button = ui.button("Click Me!", on_press=lambda e: print(f"Button was clicked! {e}")) +``` + +![Whenever the button is pressed, event details are printed to the console.](assets/handling_events.png) + +## Creating components + +Use the `@ui.component` decorator to create your own custom components. This decorator wraps the function provided as a Deephaven component. For more details on the architecture, see [TODO: Link to architecture](). +We can display a heading above a button as our custom component: +```python @ui.component -def counter(): - count, set_count = use_state(0) - return ui.action_button( - f"You pressed me {count} times", on_press=lambda _: set_count(count + 1) - ) +def ui_foo_bar(): + return [ + ui.heading("Click button below"), + ui.button("Click Me!", on_press=lambda: print("Button was clicked!")), + ] -c = counter() +foo_bar = ui_foo_bar() ``` -![Counter](assets/counter.png) +![Custom component being displayed.](assets/foo_bar.png) -## Text field (string) +## Using state -You can create a [TextField](https://react-spectrum.adobe.com/react-spectrum/TextField.html) that takes input from the user. You can also use a [Flex](https://react-spectrum.adobe.com/react-spectrum/Flex.html) component to display multiple components in a row (or column, depending on the `direction` argument). +Often, you'll want to react to the button presses and update the display. For example, to count the number of times a button has been pressed, use `ui.use_state` to introduce a _state variable_ in your custom component: ```python -import deephaven.ui as ui -from deephaven.ui import use_state +@ui.component +def ui_counter(): + count, set_count = ui.use_state(0) + # ... +``` +Returned from `ui.use_state` is a tuple with two values: the current state (`count`), and a function to update that state (`set_count`). +The first time the button is displayed, the count will be `0` because that is the initial value passed into `ui.use_state`. Call `set_count` to update the state: + +```python @ui.component -def my_input(): - text, set_text = use_state("hello") +def ui_counter(): + count, set_count = ui.use_state(0) + return ui.button(f"Pressed {count} times", on_press=lambda: set_count(count + 1)) +``` - return ui.flex( - ui.text_field(value=text, on_change=set_text), - ui.text(f"You typed {text}"), - direction="column", - ) +When state is updated, deephaven.ui will call your component again to re-render with the new value. After clicking once, it will re-render with `count` set to `1`, then set to `2`, and so on. +Each individual component has its own state: -mi = my_input() +```python +@ui.component +def ui_counter(): + count, set_count = ui.use_state(0) + return ui.button(f"Pressed {count} times", on_press=lambda: set_count(count + 1)) + + +c1 = ui_counter() +c2 = ui_counter() ``` -![Text Field](assets/text_field.png) +![Each counter has its own state.](assets/counter.png) -## Checkbox (boolean) +> [!NOTE] +> Functions are prefixed with `use_` are called _hooks_. `use_state` is built-in to deephaven.ui, and there are other hooks built-in shown below. You can also create your own hooks. +> Hooks are special functions. They must only be used at the _top_ of a `@ui.component` or another hook. If you want to use one in a conditional or a loop, extract that logic to a new component and put it there. -You can use a [checkbox](https://react-spectrum.adobe.com/react-spectrum/Checkbox.html) to get a boolean value from the user. +## Sharing state + +In the previous example, the two buttons incremented their counter independently. State was stored within the counter components: + +```mermaid +stateDiagram-v2 + + state c1 { + count=1 + } + + state c2 { + count=3 + } +``` + +What if we wanted to have two buttons share the same count? To do this, move the state `count` upward to a parent component: + +```mermaid +stateDiagram-v2 + c1: ui_controlled_counter + c2: ui_controlled_counter + + ui_shared_state --> c1 : count=4 + ui_shared_state --> c2 : count=4 + + state ui_shared_state { + count=4 + } +``` + +In the example below, we create a parent component `ui_shared_state` that contains the state, and then passes the state down into two `ui_controlled_counter` components. Now the buttons will always be in sync: + +```python +@ui.component +def ui_controlled_counter(count, operation, on_press): + return ui.button(f"Value is {count}, press to {operation}", on_press=on_press) + + +@ui.component +def ui_shared_state(): + count, set_count = ui.use_state(0) + + def handle_press(): + set_count(count + 1) + + return [ + ui.heading(f"Value is {count}"), + ui_controlled_counter(count, "increment", lambda: set_count(count + 1)), + ui_controlled_counter(count, "decrement", lambda: set_count(count - 1)), + ] + + +shared_state = ui_shared_state() +``` + +![Buttons will always be in sync with shared state.](assets/shared_state.png) + +# Examples + +Below are some examples building custom components using deephaven.ui. + +## Text field (string) + +You can create a [TextField](https://react-spectrum.adobe.com/react-spectrum/TextField.html) that takes input from the user. You can also use a [Flex](https://react-spectrum.adobe.com/react-spectrum/Flex.html) component to display multiple components in a row (or column, depending on the `direction` argument). ```python -import deephaven.ui as ui -from deephaven.ui import use_state +@ui.component +def ui_input(): + text, set_text = ui.use_state("hello") + + return [ui.text_field(value=text, on_change=set_text), ui.text(f"You typed {text}")] + + +my_input = ui_input() +``` + +![Text field.](assets/text_field.png) +## Checkbox (boolean) + +You can use a [checkbox](https://react-spectrum.adobe.com/react-spectrum/Checkbox.html) to get a boolean value from the user. +```python @ui.component -def checkbox_example(): - liked, set_liked = use_state(True) +def ui_checkbox(): + liked, set_liked = ui.use_state(True) return ui.flex( ui.checkbox("I liked this", is_selected=liked, on_change=set_liked), ui.text("You liked this" if liked else "You didn't like this"), @@ -87,24 +198,57 @@ def checkbox_example(): ) -ce = checkbox_example() +my_checkbox = ui_checkbox() ``` ![Checkbox](assets/checkbox.png) -## Form (two variables) +## Picker (string values) -You can have state with multiple different variables in one component. In this example, we have a [text field](https://react-spectrum.adobe.com/react-spectrum/TextField.html) and a [slider](https://react-spectrum.adobe.com/react-spectrum/Slider.html), and we display the values of both of them. +The `ui.picker` component can be used to select from a list of items. Here's a basic example for selecting from a list of string values and displaying the selected key in a text field. ```python -import deephaven.ui as ui -from deephaven.ui import use_state +@ui.component +def ui_picker(): + value, set_value = ui.use_state("") + + # Picker for selecting values + pick = ui.picker( + "Text 1", + "Text 2", + "Text 3", + label="Text", + on_selection_change=set_value, + selected_key=value, + ) + # Show current selection in a ui.text component + text = ui.text("Selection: " + value) + # Display picker and output in a flex column + return ui.flex( + pick, + text, + direction="column", + margin=10, + gap=10, + ) + + +my_picker = ui_picker() +``` + +![Use a picker to select from a list of items](assets/picker.png) + +## Form (two variables) + +You can have state with multiple different variables in one component. This example creates a [text field](https://react-spectrum.adobe.com/react-spectrum/TextField.html) and a [slider](https://react-spectrum.adobe.com/react-spectrum/Slider.html), and we display the values of both of them. + +```python @ui.component -def form_example(): - name, set_name = use_state("Homer") - age, set_age = use_state(36) +def ui_form(): + name, set_name = ui.use_state("Homer") + age, set_age = ui.use_state(36) return ui.flex( ui.text_field(value=name, on_change=set_name), @@ -114,19 +258,18 @@ def form_example(): ) -fe = form_example() +my_form = ui_form() ``` -## Form with Submit +![Form with multiple inputs.](assets/form.png) -You can also create a form that user can click Submit on and react to that on a callback you specify. In this example, we create a [Form](https://react-spectrum.adobe.com/react-spectrum/forms.html) that takes a name and age, and when the user clicks Submit, the values entered in the form are sent to the user on the forms `on_submit` callback. - -```python -from deephaven import ui +## Form with submit +You can also create a form on which the user can click **Submit** and react to that on a specified callback. In this example, we create a [Form](https://react-spectrum.adobe.com/react-spectrum/forms.html) that takes a name and age, and when the user clicks **Submit**, the values entered in the form are sent to the user on the form's `on_submit` callback. +```python @ui.component -def form_submit_example(): +def ui_form_submit(): def handle_submit(data): print(f"Hello {data['name']}, you are {data['age']} years old") @@ -138,20 +281,19 @@ def form_submit_example(): ) -fs = form_submit_example() +my_form_submit = ui_form_submit() ``` -## Events +![Submitting a form and printing out the data.](assets/form_submit.png) + +## Button events Included with events are many details about the action itself, e.g. modifier keys held down, or the name of the target element. In this example, we create a custom component that prints all press, key, and focus events to the console, and add two of them to a panel to show interaction with both of them (e.g. when focus switches from one button to another): ```python -import deephaven.ui as ui - - @ui.component -def button_event_printer(*children, id="My Button"): - return ui.action_button( +def ui_button_event_printer(*children, id="My Button"): + return ui.button( *children, on_key_down=print, on_key_up=print, @@ -168,17 +310,17 @@ def button_event_printer(*children, id="My Button"): @ui.component -def button_events(): +def ui_button_events(): return [ - button_event_printer("1", id="My Button 1"), - button_event_printer("2", id="My Button 2"), + ui_button_event_printer("1", id="My Button 1"), + ui_button_event_printer("2", id="My Button 2"), ] -be = button_events() +my_button_events = ui_button_events() ``` -![Events](assets/events.png) +![Print the details of all events when pressing a button.](assets/button_events.png) # Data Examples @@ -192,16 +334,12 @@ stocks = dx.data.stocks() ## Table with input filter -You can take input from a user to filter a table using the `where` method. In this example, we have a [text field](https://react-spectrum.adobe.com/react-spectrum/TextField.html) that takes input from the user, and we filter the table based on the input. By simply returning the table `t` from the component, it will be displayed in the UI (as if we had set it to a variable name). +User input can filter a table using the `where` method. In this example, a [text field](https://react-spectrum.adobe.com/react-spectrum/TextField.html) takes input from the user, and we filter the table based on the input. Simply returning the table `t` from the component will display it in the UI (as if we had set it to a variable name). ```python -import deephaven.ui as ui -from deephaven.ui import use_state - - @ui.component -def text_filter_table(source, column): - value, set_value = use_state("FISH") +def ui_text_filter_table(source, column): + value, set_value = ui.use_state("FISH") t = source.where(f"{column}=`{value}`") return ui.flex( ui.text_field(value=value, on_change=set_value), @@ -211,23 +349,19 @@ def text_filter_table(source, column): ) -pp = text_filter_table(stocks, "sym") +my_text_filter_table = ui_text_filter_table(stocks, "sym") ``` -![Text Filter Table](assets/text_filter_table.png) +![Table with a text field for filtering.](assets/text_filter_table.png) ## Table with range filter -You can also filter a table based on a range. In this example, we have a [range slider](https://react-spectrum.adobe.com/react-spectrum/RangeSlider.html) that takes input from the user, and we filter the table by price based on the input. By simply returning the table `t` from the component, it will be displayed in the UI (as if we had set it to a variable name). +You can also filter a table based on a range. In this example, a [range slider](https://react-spectrum.adobe.com/react-spectrum/RangeSlider.html) takes input from the user, and we filter the table by price based on the input. Simply returning the table `t` from the component will display it in the UI (as if we had set it to a variable name). ```python -import deephaven.ui as ui -from deephaven.ui import use_state - - @ui.component -def range_table(source, column): - range, set_range = use_state({"start": 1000, "end": 10000}) +def ui_range_table(source, column): + range, set_range = ui.use_state({"start": 1000, "end": 10000}) t = source.where(f"{column} >= {range['start']} && {column} <= {range['end']}") return ui.flex( ui.range_slider( @@ -239,26 +373,24 @@ def range_table(source, column): ) -srt = range_table(stocks, "size") +my_range_table = ui_range_table(stocks, "size") ``` +![Table with a slider for selecting the range.](range_table.png) + ## Table with required filters -In the previous example, we took a users input. But we didn't display anything if the user didn't enter any text. We can display a different message prompting the user for input if they haven't entered anything. We use a few new components in this example: +In the previous example, we took a user's input. Nothing was displayed if the user didn't enter any text. Instead, we can display a different message prompting the user for input. We use a few new components in this example: - [IllustratedMessage](https://react-spectrum.adobe.com/react-spectrum/IllustratedMessage.html) (ui.illustrated_message): A component that displays an icon, heading, and content. In this case, we display a warning icon, a heading, and some content. - [Icon](https://react-spectrum.adobe.com/react-spectrum/Icon.html) (ui.icon): A component that displays an icon. In this case, we display the warning icon, and set the font size to 48px so it appears large in the UI. - [Flex](https://react-spectrum.adobe.com/react-spectrum/Flex.html) (ui.flex): A component that displays its children in a row. In this case, we display the input text fields beside eachother in a row. ```python -import deephaven.ui as ui -from deephaven.ui import use_state - - @ui.component -def stock_widget_table(source, default_sym="", default_exchange=""): - sym, set_sym = use_state(default_sym) - exchange, set_exchange = use_state(default_exchange) +def ui_stock_widget_table(source, default_sym="", default_exchange=""): + sym, set_sym = ui.use_state(default_sym) + exchange, set_exchange = ui.use_state(default_exchange) ti1 = ui.text_field( label="Sym", label_position="side", value=sym, on_change=set_sym @@ -280,7 +412,7 @@ def stock_widget_table(source, default_sym="", default_exchange=""): return ui.flex(ui.flex(ti1, ti2), t1, direction="column", flex_grow=1) -swt = stock_widget_table(stocks, "", "") +my_stock_widget_table = ui_stock_widget_table(stocks, "", "") ``` ![Stock Widget Table Invalid Input](assets/stock_widget_table_invalid.png) @@ -292,15 +424,13 @@ swt = stock_widget_table(stocks, "", "") You can also do plots as you would expect. ```python -import deephaven.ui as ui -from deephaven.ui import use_state from deephaven.plot.figure import Figure @ui.component -def stock_widget_plot(source, default_sym="", default_exchange=""): - sym, set_sym = use_state(default_sym) - exchange, set_exchange = use_state(default_exchange) +def ui_stock_widget_plot(source, default_sym="", default_exchange=""): + sym, set_sym = ui.use_state(default_sym) + exchange, set_exchange = ui.use_state(default_exchange) ti1 = ui.text_field( label="Sym", label_position="side", value=sym, on_change=set_sym @@ -318,7 +448,7 @@ def stock_widget_plot(source, default_sym="", default_exchange=""): return ui.flex(ui.flex(ti1, ti2), t1, p, direction="column", flex_grow=1) -swp = stock_widget_plot(stocks, "CAT", "TPET") +my_stock_widget_plot = ui_stock_widget_plot(stocks, "CAT", "TPET") ``` ![Stock Widget Plot](assets/stock_widget_plot.png) @@ -391,7 +521,6 @@ We can also create our own components and add them to a dashboard. In this examp ```python from deephaven import ui, time_table -from deephaven.ui import use_memo, use_state from deephaven.plot.figure import Figure @@ -400,9 +529,9 @@ def use_wave_input(): Demonstrating a custom hook. Creates an input panel that controls the amplitude, frequency, and phase for a wave """ - amplitude, set_amplitude = use_state(1.0) - frequency, set_frequency = use_state(1.0) - phase, set_phase = use_state(1.0) + amplitude, set_amplitude = ui.use_state(1.0) + frequency, set_frequency = ui.use_state(1.0) + phase, set_phase = ui.use_state(1.0) input_panel = ui.flex( ui.slider( @@ -439,8 +568,8 @@ def use_wave_input(): def multiwave(): amplitude, frequency, phase, wave_input = use_wave_input() - tt = use_memo(lambda: time_table("PT1s").update("x=i"), []) - t = use_memo( + tt = ui.use_memo(lambda: time_table("PT1s").update("x=i"), []) + t = ui.use_memo( lambda: tt.update( [ f"y_sin={amplitude}*Math.sin({frequency}*x+{phase})", @@ -450,14 +579,14 @@ def multiwave(): ), [amplitude, frequency, phase], ) - p_sin = use_memo( + p_sin = ui.use_memo( lambda: Figure().plot_xy(series_name="Sine", t=t, x="x", y="y_sin").show(), [t] ) - p_cos = use_memo( + p_cos = ui.use_memo( lambda: Figure().plot_xy(series_name="Cosine", t=t, x="x", y="y_cos").show(), [t], ) - p_tan = use_memo( + p_tan = ui.use_memo( lambda: Figure().plot_xy(series_name="Tangent", t=t, x="x", y="y_tan").show(), [t], ) @@ -488,21 +617,20 @@ mw = ui.dashboard(multiwave()) ## Memoization -We can use the `use_memo` hook to memoize a value. This is useful if you have a value that is expensive to compute, and you only want to compute it when the inputs change. In this example, we create a time table with a new column `y_sin` that is a sine wave. We use `use_memo` to memoize the time table, so that it is only re-computed when the inputs to the `use_memo` function change (in this case, the function is a lambda that takes no arguments, so it will only re-compute when the dependencies change, which is never). We then use the `update` method to update the table with the new column, based on the values inputted on the sliders. +We can use the `use_memo` hook to memoize a value. This is useful if you have a value that is expensive to compute and you only want to compute it when the inputs change. In this example, we create a time table with a new column, `y_sin,` which is a sine wave. We use `use_memo` to memoize the time table, so that it is only re-computed when the inputs to the `use_memo` function change (in this case, the function is a lambda that takes no arguments, so it will only re-compute when the dependencies change, which is never). We then use the `update` method to update the table with the new column, based on the values inputted on the sliders. ```python -import deephaven.ui as ui -from deephaven.ui import use_memo, use_state +from deephaven import ui from deephaven import time_table @ui.component def waves(): - amplitude, set_amplitude = use_state(1) - frequency, set_frequency = use_state(1) - phase, set_phase = use_state(1) + amplitude, set_amplitude = ui.use_state(1) + frequency, set_frequency = ui.use_state(1) + phase, set_phase = ui.use_state(1) - tt = use_memo(lambda: time_table("PT1s").update("x=i"), []) + tt = ui.use_memo(lambda: time_table("PT1s").update("x=i"), []) t = tt.update_view([f"y_sin={amplitude}*Math.sin({frequency}*x+{phase})"]) return ui.flex( @@ -545,8 +673,7 @@ w = waves() We can write custom hooks that can be re-used. In this example, we create a custom hook that creates an input panel that controls the amplitude, frequency, and phase for a wave. We then use this custom hook in our `waves` component. ```python -import deephaven.ui as ui -from deephaven.ui import use_memo, use_state +from deephaven import ui from deephaven import time_table @@ -555,9 +682,9 @@ def use_wave_input(): Demonstrating a custom hook. Creates an input panel that controls the amplitude, frequency, and phase for a wave """ - amplitude, set_amplitude = use_state(1.0) - frequency, set_frequency = use_state(1.0) - phase, set_phase = use_state(1.0) + amplitude, set_amplitude = ui.use_state(1.0) + frequency, set_frequency = ui.use_state(1.0) + phase, set_phase = ui.use_state(1.0) input_panel = ui.flex( ui.slider( @@ -594,7 +721,7 @@ def use_wave_input(): def waves(): amplitude, frequency, phase, wave_input = use_wave_input() - tt = use_memo(lambda: time_table("PT1s").update("x=i"), []) + tt = ui.use_memo(lambda: time_table("PT1s").update("x=i"), []) t = tt.update([f"y_sin={amplitude}*Math.sin({frequency}*x+{phase})"]) return ui.flex(wave_input, t, flex_grow=1) @@ -608,8 +735,7 @@ w = waves() We can then re-use that hook to make a component that displays a plot as well: ```python -import deephaven.ui as ui -from deephaven.ui import use_memo +from deephaven import ui from deephaven.plot.figure import Figure @@ -617,8 +743,8 @@ from deephaven.plot.figure import Figure def waves_with_plot(): amplitude, frequency, phase, wave_input = use_wave_input() - tt = use_memo(lambda: time_table("PT1s").update("x=i"), []) - t = use_memo( + tt = ui.use_memo(lambda: time_table("PT1s").update("x=i"), []) + t = ui.use_memo( lambda: tt.update( [ f"y_sin={amplitude}*Math.sin({frequency}*x+{phase})", @@ -626,7 +752,7 @@ def waves_with_plot(): ), [amplitude, frequency, phase], ) - p = use_memo( + p = ui.use_memo( lambda: Figure().plot_xy(series_name="Sine", t=t, x="x", y="y_sin").show(), [t] ) @@ -644,7 +770,6 @@ When you return an array of elements, they automatically get created as individu ```python from deephaven import ui -from deephaven.ui import use_state from deephaven.plot.figure import Figure @@ -652,8 +777,8 @@ from deephaven.plot.figure import Figure def multiwave(): amplitude, frequency, phase, wave_input = use_wave_input() - tt = use_memo(lambda: time_table("PT1s").update("x=i"), []) - t = use_memo( + tt = ui.use_memo(lambda: time_table("PT1s").update("x=i"), []) + t = ui.use_memo( lambda: tt.update( [ f"y_sin={amplitude}*Math.sin({frequency}*x+{phase})", @@ -663,14 +788,14 @@ def multiwave(): ), [amplitude, frequency, phase], ) - p_sin = use_memo( + p_sin = ui.use_memo( lambda: Figure().plot_xy(series_name="Sine", t=t, x="x", y="y_sin").show(), [t] ) - p_cos = use_memo( + p_cos = ui.use_memo( lambda: Figure().plot_xy(series_name="Cosine", t=t, x="x", y="y_cos").show(), [t], ) - p_tan = use_memo( + p_tan = ui.use_memo( lambda: Figure().plot_xy(series_name="Tangent", t=t, x="x", y="y_tan").show(), [t], ) @@ -689,11 +814,10 @@ mw = multiwave() ## Using ui.table -You can use `ui.table` to add interactivity to a table, or give other instructions to the UI. Here's an example that will create two tables and a plot. The first table `t1` is an unfiltered view of the stocks table, with a row double-press listener so if you double-click on a row, it will filter the second table `t2` to only show that row and the plot to show that selected sym and exchange. +You can use `ui.table` to add interactivity to a table, or give other instructions to the UI. Here's an example that creates two tables and a plot. The first table, `t1`, is an unfiltered view of the stocks table, with a row double-press listener so if you double-click on a row, it will filter the second table, `t2`, to show that row only and the plot to show that selected sym and exchange. ```py -import deephaven.ui as ui -from deephaven.ui import use_state +from deephaven import ui from deephaven.plot.figure import Figure import deephaven.plot.express as dx @@ -702,8 +826,8 @@ stocks = dx.data.stocks() @ui.component def stock_table_input(source, default_sym="", default_exchange=""): - sym, set_sym = use_state(default_sym) - exchange, set_exchange = use_state(default_exchange) + sym, set_sym = ui.use_state(default_sym) + exchange, set_exchange = ui.use_state(default_exchange) t1 = source t2 = source.where([f"sym=`{sym.upper()}`", f"exchange=`{exchange}`"]) @@ -719,7 +843,7 @@ def stock_table_input(source, default_sym="", default_exchange=""): return [ ui.panel( - ui.table(t1).on_row_double_press(handle_row_double_press), + ui.table(t1, on_row_double_press=handle_row_double_press), title="Stock Table Input", ), ui.panel(t2, title="Stock Filtered Table"), @@ -730,18 +854,40 @@ def stock_table_input(source, default_sym="", default_exchange=""): sti = stock_table_input(stocks, "CAT", "TPET") ``` +### ui.table Events + +The `ui.table` component has a few events that you can listen to. You can listen to different kinds of press events that include the data about the region pressed. + +```py +from deephaven import ui +import deephaven.plot.express as dx + +te = ui.table( + dx.data.stocks(), + on_row_press=lambda row, data: print(f"Row Press: {row}, {data}"), + on_row_double_press=lambda row, data: print(f"Row Double Press: {row}, {data}"), + on_cell_press=lambda cell_index, data: print(f"Cell Press: {cell_index}, {data}"), + on_cell_double_press=lambda cell_index, data: print( + f"Cell Double Press: {cell_index}, {data}" + ), + on_column_press=lambda column: print(f"Column Press: {column}"), + on_column_double_press=lambda column: print(f"Column Double Press: {column}"), +) +``` + +![Table events](table_events.png) + ## Re-using components In a previous example, we created a text_filter_table component. We can re-use that component, and display two tables with an input filter side-by-side: ```python -import deephaven.ui as ui -from deephaven.ui import use_state +from deephaven import ui @ui.component def text_filter_table(source, column, default_value=""): - value, set_value = use_state(default_value) + value, set_value = ui.use_state(default_value) return ui.flex( ui.text_field( label=column, label_position="side", value=value, on_change=set_value @@ -771,8 +917,7 @@ dt = double_table(stocks) You can use the `rollup` method to create a rollup table. In this example, we create a rollup table that shows the average price of each stock and/or exchange. You can toggle the rollup by clicking on the [ToggleButton](https://react-spectrum.adobe.com/react-spectrum/ToggleButton.html). You can also highlight a specific stock by entering the symbol in the text field, but only when a rollup option isn't selected. We wrap the highlight input field with a `ui.fragment` that is conditionally used so that it doesn't appear when the rollup is selected. We also use the `ui.contextual_help` component to display a help message when you hover over the help icon. ```python -import deephaven.ui as ui -from deephaven.ui import use_memo, use_state +from deephaven import ui from deephaven import agg import deephaven.plot.express as dx @@ -793,18 +938,18 @@ def get_by_filter(**byargs): @ui.component def stock_table(source): - is_sym, set_is_sym = use_state(False) - is_exchange, set_is_exchange = use_state(False) - highlight, set_highlight = use_state("") - aggs, set_aggs = use_state(agg.avg(cols=["size", "price", "dollars"])) + is_sym, set_is_sym = ui.use_state(False) + is_exchange, set_is_exchange = ui.use_state(False) + highlight, set_highlight = ui.use_state("") + aggs, set_aggs = ui.use_state(agg.avg(cols=["size", "price", "dollars"])) by = get_by_filter(sym=is_sym, exchange=is_exchange) - formatted_table = use_memo( + formatted_table = ui.use_memo( lambda: source.format_row_where(f"sym=`{highlight}`", "LEMONCHIFFON"), [source, highlight], ) - rolled_table = use_memo( + rolled_table = ui.use_memo( lambda: ( formatted_table if len(by) == 0 @@ -858,7 +1003,7 @@ You can use the `use_table_listener` hook to listen to changes to a table. In th This is an advanced feature, requiring understanding of how the [table listeners](https://deephaven.io/core/docs/how-to-guides/table-listeners-python/) work, and limitations of running code while the Update Graph is running. Most usages of this are more appropriate to implement with [the table data hooks](#using-table-data-hooks). ```python -import deephaven.ui as ui +from deephaven import ui from deephaven.table import Table from deephaven import time_table, empty_table, merge from deephaven import pandas as dhpd @@ -899,7 +1044,7 @@ def monitor_changed_data(source: Table): else: set_changed(empty_table(0)) - ui.use_table_listener(source, listener) + ui.use_table_listener(source, listener, []) added_check = ui.checkbox( "Show Added", isSelected=show_added, on_change=set_show_added @@ -930,7 +1075,7 @@ from deephaven import ui, time_table @ui.component def resetable_table(): table, set_table = ui.use_state(lambda: time_table("PT1s")) - handle_press = ui.use_liveness_scope(lambda _: set_table(time_table("PT1s"))) + handle_press = ui.use_liveness_scope(lambda _: set_table(time_table("PT1s")), []) return [ ui.action_button( "Reset", @@ -997,7 +1142,7 @@ There are five different hooks that can be used to get data from a table: In this example, the hooks are used to display various pieces of information about LIZARD trades. ```python -import deephaven.ui as ui +from deephaven import ui from deephaven.table import Table from deephaven import time_table, agg import deephaven.plot.express as dx diff --git a/plugins/ui/examples/assets/button_events.png b/plugins/ui/examples/assets/button_events.png new file mode 100644 index 000000000..b69b3bdd4 Binary files /dev/null and b/plugins/ui/examples/assets/button_events.png differ diff --git a/plugins/ui/examples/assets/checkbox.png b/plugins/ui/examples/assets/checkbox.png index 52d71ac6c..a4bcfb9af 100644 Binary files a/plugins/ui/examples/assets/checkbox.png and b/plugins/ui/examples/assets/checkbox.png differ diff --git a/plugins/ui/examples/assets/counter.png b/plugins/ui/examples/assets/counter.png index 3fad032f0..a0b944914 100644 Binary files a/plugins/ui/examples/assets/counter.png and b/plugins/ui/examples/assets/counter.png differ diff --git a/plugins/ui/examples/assets/events.png b/plugins/ui/examples/assets/events.png deleted file mode 100644 index bac0734d5..000000000 Binary files a/plugins/ui/examples/assets/events.png and /dev/null differ diff --git a/plugins/ui/examples/assets/foo_bar.png b/plugins/ui/examples/assets/foo_bar.png new file mode 100644 index 000000000..1e6f7302b Binary files /dev/null and b/plugins/ui/examples/assets/foo_bar.png differ diff --git a/plugins/ui/examples/assets/form.png b/plugins/ui/examples/assets/form.png new file mode 100644 index 000000000..e7bfcb4a9 Binary files /dev/null and b/plugins/ui/examples/assets/form.png differ diff --git a/plugins/ui/examples/assets/form_submit.png b/plugins/ui/examples/assets/form_submit.png new file mode 100644 index 000000000..82cf6ac3f Binary files /dev/null and b/plugins/ui/examples/assets/form_submit.png differ diff --git a/plugins/ui/examples/assets/handling_events.png b/plugins/ui/examples/assets/handling_events.png new file mode 100644 index 000000000..5a6a19453 Binary files /dev/null and b/plugins/ui/examples/assets/handling_events.png differ diff --git a/plugins/ui/examples/assets/hello_world.png b/plugins/ui/examples/assets/hello_world.png new file mode 100644 index 000000000..1087ac14a Binary files /dev/null and b/plugins/ui/examples/assets/hello_world.png differ diff --git a/plugins/ui/examples/assets/picker.png b/plugins/ui/examples/assets/picker.png new file mode 100644 index 000000000..5c014713d Binary files /dev/null and b/plugins/ui/examples/assets/picker.png differ diff --git a/plugins/ui/examples/assets/range_table.png b/plugins/ui/examples/assets/range_table.png new file mode 100644 index 000000000..d8e467d4a Binary files /dev/null and b/plugins/ui/examples/assets/range_table.png differ diff --git a/plugins/ui/examples/assets/shared_state.png b/plugins/ui/examples/assets/shared_state.png new file mode 100644 index 000000000..aaa4bff61 Binary files /dev/null and b/plugins/ui/examples/assets/shared_state.png differ diff --git a/plugins/ui/examples/assets/stock_widget_table_invalid.png b/plugins/ui/examples/assets/stock_widget_table_invalid.png index 2377707de..bc59f036c 100644 Binary files a/plugins/ui/examples/assets/stock_widget_table_invalid.png and b/plugins/ui/examples/assets/stock_widget_table_invalid.png differ diff --git a/plugins/ui/examples/assets/stock_widget_table_valid.png b/plugins/ui/examples/assets/stock_widget_table_valid.png index 7fdecb551..9c804a3af 100644 Binary files a/plugins/ui/examples/assets/stock_widget_table_valid.png and b/plugins/ui/examples/assets/stock_widget_table_valid.png differ diff --git a/plugins/ui/examples/assets/table_events.png b/plugins/ui/examples/assets/table_events.png new file mode 100644 index 000000000..121c830f8 Binary files /dev/null and b/plugins/ui/examples/assets/table_events.png differ diff --git a/plugins/ui/examples/assets/text_field.png b/plugins/ui/examples/assets/text_field.png index d196ba108..9d75806e1 100644 Binary files a/plugins/ui/examples/assets/text_field.png and b/plugins/ui/examples/assets/text_field.png differ diff --git a/plugins/ui/examples/assets/text_filter_table.png b/plugins/ui/examples/assets/text_filter_table.png index 143c1671f..d13d5059c 100644 Binary files a/plugins/ui/examples/assets/text_filter_table.png and b/plugins/ui/examples/assets/text_filter_table.png differ diff --git a/plugins/ui/pyproject.toml b/plugins/ui/pyproject.toml index 62df2b006..54e217464 100644 --- a/plugins/ui/pyproject.toml +++ b/plugins/ui/pyproject.toml @@ -1,3 +1,3 @@ [build-system] -requires = ["setuptools>=43.0.0", "wheel"] +requires = ["setuptools>=43.0.0", "wheel", "deephaven-plugin-packaging"] build-backend = "setuptools.build_meta" diff --git a/plugins/ui/setup.cfg b/plugins/ui/setup.cfg index cc9bb3235..a4a8753e5 100644 --- a/plugins/ui/setup.cfg +++ b/plugins/ui/setup.cfg @@ -3,7 +3,7 @@ name = deephaven-plugin-ui description = deephaven.ui plugin long_description = file: README.md long_description_content_type = text/markdown -version = attr:deephaven.ui.__version__ +version = 0.11.0.dev0 url = https://github.com/deephaven/deephaven-plugins project_urls = Source Code = https://github.com/deephaven/deephaven-plugins @@ -28,6 +28,8 @@ install_requires = deephaven-core>=0.31.0 deephaven-plugin>=0.6.0 json-rpc + deephaven-plugin-utilities + typing_extensions;python_version<'3.11' include_package_data = True [options.packages.find] @@ -35,4 +37,4 @@ where=src [options.entry_points] deephaven.plugin = - registration_cls = deephaven.ui:UIRegistration + registration_cls = deephaven.ui._register:UIRegistration diff --git a/plugins/ui/setup.py b/plugins/ui/setup.py new file mode 100644 index 000000000..29b112d5b --- /dev/null +++ b/plugins/ui/setup.py @@ -0,0 +1,10 @@ +from setuptools import setup +import os +from deephaven.plugin.packaging import package_js + +js_dir = "src/js/" +dest_dir = os.path.join("src/deephaven/ui/_js") + +package_js(js_dir, dest_dir) + +setup(package_data={"deephaven.ui._js": ["**"]}) diff --git a/plugins/ui/src/deephaven/ui/.gitignore b/plugins/ui/src/deephaven/ui/.gitignore new file mode 100644 index 000000000..fd2ac954b --- /dev/null +++ b/plugins/ui/src/deephaven/ui/.gitignore @@ -0,0 +1 @@ +_js/ \ No newline at end of file diff --git a/plugins/ui/src/deephaven/ui/__init__.py b/plugins/ui/src/deephaven/ui/__init__.py index ff607c414..3b5ab4f7a 100644 --- a/plugins/ui/src/deephaven/ui/__init__.py +++ b/plugins/ui/src/deephaven/ui/__init__.py @@ -4,17 +4,7 @@ The API is designed to be similar to React, but with some differences to make it more Pythonic. """ -from deephaven.plugin import Registration, Callback from .components import * from .elements import * from .hooks import * from .object_types import * - -__version__ = "0.7.0.dev0" - - -class UIRegistration(Registration): - @classmethod - def register_into(cls, callback: Callback) -> None: - callback.register(DashboardType) - callback.register(ElementType) diff --git a/plugins/ui/src/deephaven/ui/_internal/RenderContext.py b/plugins/ui/src/deephaven/ui/_internal/RenderContext.py index ea4a9a4d2..28e89c298 100644 --- a/plugins/ui/src/deephaven/ui/_internal/RenderContext.py +++ b/plugins/ui/src/deephaven/ui/_internal/RenderContext.py @@ -5,13 +5,13 @@ from typing import ( Any, Callable, + Dict, Optional, TypeVar, Union, Generator, Generic, cast, - Set, ) from functools import partial from deephaven import DHError @@ -48,11 +48,16 @@ A function that takes the old value and returns the new value for a state. """ -ContextKey = Union[str, int] +ContextKey = str """ The key for a child context. """ +ChildrenContextDict = Dict[ContextKey, "RenderContext"] +""" +The child contexts for a RenderContext. +""" + @dataclass class ValueWithLiveness(Generic[T]): @@ -62,6 +67,17 @@ class ValueWithLiveness(Generic[T]): liveness_scope: Union[LivenessScope, None] +ContextState = Dict[StateKey, ValueWithLiveness[Any]] +""" +The state for a context. +""" + +ExportedRenderState = Dict[str, Any] +""" +The serializable state of a RenderContext. Used to serialize the state for the client. +""" + + def _value_or_call( value: T | None | Callable[[], T | None] ) -> ValueWithLiveness[T | None]: @@ -83,6 +99,19 @@ def _value_or_call( return ValueWithLiveness(value=value, liveness_scope=None) +def _should_retain_value(value: ValueWithLiveness[T | None]) -> bool: + """ + Determine if the given value should be retained by the current context. + + Args: + value: The value to check. + + Returns: + True if the value should be retained, False otherwise. + """ + return value.liveness_scope is None and isinstance(value.value, (str, int, float)) + + _local_data = threading.local() @@ -133,12 +162,12 @@ class RenderContext: Count of hooks used in the render. Should only be set after initial render. """ - _state: dict[StateKey, ValueWithLiveness[Any]] + _state: ContextState """ The state for this context. """ - _children_context: dict[ContextKey, "RenderContext"] + _children_context: ChildrenContextDict """ The child contexts for this context. """ @@ -354,3 +383,52 @@ def manage(self, liveness_scope: LivenessScope) -> None: """ assert self is get_context() self._collected_scopes.add(cast(LivenessScope, liveness_scope.j_scope)) + + def export_state(self) -> ExportedRenderState: + """ + Export the state of this context. This is used to serialize the state for the client. + + Returns: + The exported serializable state of this context. + """ + exported_state: ExportedRenderState = {} + + # We need to iterate through all of our state and export anything that doesn't have a LivenessScope right now (anything serializable) + def retained_values(state: ContextState): + for key, value in state.items(): + if _should_retain_value(value): + yield key, value.value + + if len(state := dict(retained_values(self._state))) > 0: + exported_state["state"] = state + + # Now iterate through all the children contexts, and only include them in the export if they're not empty + def retained_children(children: ChildrenContextDict): + for key, child in children.items(): + if len(child_state := child.export_state()) > 0: + yield key, child_state + + if len(children_state := dict(retained_children(self._children_context))) > 0: + exported_state["children"] = children_state + + return exported_state + + def import_state(self, state: dict[str, Any]) -> None: + """ + Import the state of this context. This is used to deserialize the state from the client. + + Args: + state: The state to import. + """ + self._state.clear() + self._children_context.clear() + if "state" in state: + for key, value in state["state"].items(): + # When python dict is converted to JSON, all keys are converted to strings. We convert them back to int here. + self._state[int(key)] = ValueWithLiveness( + value=value, liveness_scope=None + ) + if "children" in state: + for key, child_state in state["children"].items(): + self.get_child_context(key).import_state(child_state) + logger.debug("New state is %s", self._state) diff --git a/plugins/ui/src/deephaven/ui/_internal/__init__.py b/plugins/ui/src/deephaven/ui/_internal/__init__.py index b618b0466..88a725643 100644 --- a/plugins/ui/src/deephaven/ui/_internal/__init__.py +++ b/plugins/ui/src/deephaven/ui/_internal/__init__.py @@ -8,6 +8,7 @@ get_context, NoContextException, ValueWithLiveness, + ExportedRenderState, ) from .utils import ( get_component_name, diff --git a/plugins/ui/src/deephaven/ui/_internal/utils.py b/plugins/ui/src/deephaven/ui/_internal/utils.py index abbcf5c4a..1cd6b66e3 100644 --- a/plugins/ui/src/deephaven/ui/_internal/utils.py +++ b/plugins/ui/src/deephaven/ui/_internal/utils.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Callable, Set, cast +from typing import Any, Callable, Set, cast, Sequence from inspect import signature import sys from functools import partial @@ -182,3 +182,18 @@ def wrap_callable(func: Callable) -> Callable: # This function has no signature, so we can't wrap it # Return the original function should be okay return func + + +def create_props(args: dict[str, Any]) -> tuple[tuple[Any], dict[str, Any]]: + """ + Create props from the args. Combines the named props with the kwargs props. + + Args: + args: A dictionary of arguments, from locals() + + Returns: + A tuple of children and props + """ + children, props = args.pop("children"), args.pop("props") + props.update(args) + return children, props diff --git a/plugins/ui/src/deephaven/ui/_js_plugin.py b/plugins/ui/src/deephaven/ui/_js_plugin.py new file mode 100644 index 000000000..fa3b9a05e --- /dev/null +++ b/plugins/ui/src/deephaven/ui/_js_plugin.py @@ -0,0 +1,32 @@ +import pathlib + +from deephaven.plugin.js import JsPlugin + + +class UiJsPlugin(JsPlugin): + def __init__( + self, + name: str, + version: str, + main: str, + path: pathlib.Path, + ) -> None: + self._name = name + self._version = version + self._main = main + self._path = path + + @property + def name(self) -> str: + return self._name + + @property + def version(self) -> str: + return self._version + + @property + def main(self) -> str: + return self._main + + def path(self) -> pathlib.Path: + return self._path diff --git a/plugins/ui/src/deephaven/ui/_register.py b/plugins/ui/src/deephaven/ui/_register.py new file mode 100644 index 000000000..3dfe4502b --- /dev/null +++ b/plugins/ui/src/deephaven/ui/_register.py @@ -0,0 +1,27 @@ +from . import DashboardType, ElementType +from deephaven.plugin import Registration, Callback +from deephaven.plugin.utilities import create_js_plugin, DheSafeCallbackWrapper + +from ._js_plugin import UiJsPlugin + +PACKAGE_NAMESPACE = "deephaven.ui" +JS_NAME = "_js" +PLUGIN_CLASS = UiJsPlugin + + +class UIRegistration(Registration): + @classmethod + def register_into(cls, callback: Callback) -> None: + + callback = DheSafeCallbackWrapper(callback) + + callback.register(DashboardType) + callback.register(ElementType) + + js_plugin = create_js_plugin( + PACKAGE_NAMESPACE, + JS_NAME, + PLUGIN_CLASS, + ) + + callback.register(js_plugin) diff --git a/plugins/ui/src/deephaven/ui/components/__init__.py b/plugins/ui/src/deephaven/ui/components/__init__.py index 95b918345..f0678f892 100644 --- a/plugins/ui/src/deephaven/ui/components/__init__.py +++ b/plugins/ui/src/deephaven/ui/components/__init__.py @@ -8,6 +8,12 @@ from .row import row from .column import column from .stack import stack +from .picker import picker +from .section import section +from .item import item +from .list_view import list_view +from .list_action_group import list_action_group +from .list_action_menu import list_action_menu from . import html @@ -29,13 +35,18 @@ "heading", "icon", "icon_wrapper", + "item", "illustrated_message", + "list_view", + "list_action_group", + "list_action_menu", "html", "number_field", - "item", "panel", + "picker", "range_slider", "row", + "section", "slider", "spectrum_element", "stack", diff --git a/plugins/ui/src/deephaven/ui/components/item.py b/plugins/ui/src/deephaven/ui/components/item.py new file mode 100644 index 000000000..d0daed2e0 --- /dev/null +++ b/plugins/ui/src/deephaven/ui/components/item.py @@ -0,0 +1,17 @@ +from typing import Any + +from ..elements import BaseElement +from ..types import Stringable + +ItemElement = BaseElement + + +def item(*children: Stringable, **props: Any) -> ItemElement: + """ + An item that can be added to a menu, such as a picker + + Args: + children: The options to render within the item. + **props: Any other Item prop. + """ + return BaseElement("deephaven.ui.components.Item", *children, **props) diff --git a/plugins/ui/src/deephaven/ui/components/list_action_group.py b/plugins/ui/src/deephaven/ui/components/list_action_group.py new file mode 100644 index 000000000..c7f9840db --- /dev/null +++ b/plugins/ui/src/deephaven/ui/components/list_action_group.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from typing import Callable, Any, Union + +from .item import ItemElement +from ..elements import BaseElement, Element +from .._internal.utils import create_props +from ..types import Stringable, Selection, Key, ActionKey + +ActionGroupItem = Union[Stringable, ItemElement] +ListActionGroupElement = Element + + +def list_action_group( + *children: ActionGroupItem, + on_action: Callable[[ActionKey, Key], None] | None = None, + on_selection_change: Callable[[Selection, Key], None] | None = None, + **props: Any, +) -> ListActionGroupElement: + """ + A group of action buttons that can be used to create a list of actions. + This component should be used within the actions prop of a `ListView` component. + + Args: + *children: The options to render within the list_action_group. + on_action: Handler that is called when an item is pressed. + The first argument is the key of the action, the second argument is the key of the list_view item. + on_selection_change: Handler that is called when the selection changes. + The first argument is the selection, the second argument is the key of the list_view item. + **props: Any other ActionGroup prop. + + Returns: + A ListActionGroup that can be used within the actions prop of a `ListView` component. + """ + children, props = create_props(locals()) + + return BaseElement("deephaven.ui.components.ListActionGroup", *children, **props) diff --git a/plugins/ui/src/deephaven/ui/components/list_action_menu.py b/plugins/ui/src/deephaven/ui/components/list_action_menu.py new file mode 100644 index 000000000..7a9eb0af5 --- /dev/null +++ b/plugins/ui/src/deephaven/ui/components/list_action_menu.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +from typing import Callable, Any, Union + + +from .item import ItemElement +from ..elements import BaseElement, Element +from .._internal.utils import create_props +from ..types import Stringable, Key, ActionKey + +ActionMenuItem = Union[Stringable, ItemElement] +ListActionMenuElement = Element + + +def list_action_menu( + *children: ActionMenuItem, + on_action: Callable[[ActionKey, Key], None] | None = None, + on_open_change: Callable[[bool, Key], None] | None = None, + **props: Any, +) -> ListActionMenuElement: + """ + A menu of action buttons that can be used to create a list of actions. + This component should be used within the actions prop of a `ListView` component. + + Args: + *children: The options to render within the list_action_menu. + on_action: Handler that is called when an item is selected. + The first argument is the key of the action, the second argument is the key of the list_view item. + on_open_change: Handler that is called when the menu is opened or closed. + The first argument is a boolean indicating if the menu is open, the second argument is the key of the list_view item. + **props: Any other ActionMenu prop. + + Returns: + A ListActionMenu that can be used within the actions prop of a `ListView` component. + """ + children, props = create_props(locals()) + + return BaseElement("deephaven.ui.components.ListActionMenu", *children, **props) diff --git a/plugins/ui/src/deephaven/ui/components/list_view.py b/plugins/ui/src/deephaven/ui/components/list_view.py new file mode 100644 index 000000000..f467ba0de --- /dev/null +++ b/plugins/ui/src/deephaven/ui/components/list_view.py @@ -0,0 +1,73 @@ +from __future__ import annotations + +from typing import Callable, Any, Union + +from deephaven.table import Table + +from .item import ItemElement +from .list_action_group import ListActionGroupElement +from .list_action_menu import ListActionMenuElement +from ..elements import BaseElement, Element +from .._internal.utils import create_props +from ..types import ColumnName, Stringable, Selection + +ListViewItem = Union[Stringable, ItemElement] +ListViewElement = Element + + +def list_view( + *children: ListViewItem | Table, + key_column: ColumnName | None = None, + label_column: ColumnName | None = None, + description_column: ColumnName | None = None, + icon_column: ColumnName | None = None, + actions: ListActionGroupElement | ListActionMenuElement | None = None, + default_selected_keys: Selection | None = None, + selected_keys: Selection | None = None, + render_empty_state: Element | None = None, + on_selection_change: Callable[[Selection], None] | None = None, + on_change: Callable[[Selection], None] | None = None, + **props: Any, +) -> ListViewElement: + """ + A list view that can be used to create a list of items. Children should be one of two types: + 1. If children are of type `ListViewItem`, they are the list items. + 2. If children are of type `Table`, the values in the table are the list items. + There can only be one child, the `Table`. + + + Args: + *children: The options to render within the list_view. + key_column: + Only valid if children are of type Table. + The column of values to use as item keys. Defaults to the first column. + label_column: + Only valid if children are of type Table. + The column of values to display as primary text. Defaults to the key_column value. + description_column: + Only valid if children are of type Table. + The column of values to display as descriptions. + icon_column: Only valid if children are of type Table. + The column of values to map to icons. + actions: + Only valid if children are of type Table. + The action group or menus to render for all elements within the list view. + default_selected_keys: + The initial selected keys in the collection (uncontrolled). + selected_keys: + The currently selected keys in the collection (controlled). + render_empty_state: + Sets what the `list_view` should render when there is no content to display. + on_selection_change: + Handler that is called when the selection changes. + on_change: + Alias of `on_selection_change`. Handler that is called when the selection changes. + **props: + Any other ListView prop, except items, dragAndDropHooks, and onLoadMore. + + Returns: + The rendered ListView. + """ + children, props = create_props(locals()) + + return BaseElement("deephaven.ui.components.ListView", *children, **props) diff --git a/plugins/ui/src/deephaven/ui/components/picker.py b/plugins/ui/src/deephaven/ui/components/picker.py new file mode 100644 index 000000000..f060b2ee4 --- /dev/null +++ b/plugins/ui/src/deephaven/ui/components/picker.py @@ -0,0 +1,70 @@ +from __future__ import annotations + +from typing import Callable, Any + +from deephaven.table import Table, PartitionedTable +from .section import SectionElement, PickerItem +from ..elements import BaseElement +from .._internal.utils import create_props +from ..types import ColumnName, Key + +PickerElement = BaseElement + + +def picker( + *children: PickerItem | SectionElement | Table | PartitionedTable, + key_column: ColumnName | None = None, + label_column: ColumnName | None = None, + description_column: ColumnName | None = None, + icon_column: ColumnName | None = None, + title_column: ColumnName | None = None, + default_selected_key: Key | None = None, + selected_key: Key | None = None, + on_selection_change: Callable[[Key], None] | None = None, + on_change: Callable[[Key], None] | None = None, + **props: Any, +) -> PickerElement: + """ + A picker that can be used to select from a list. Children should be one of four types: + If children are of type PickerItem, they are the dropdown options. + If children are of type SectionElement, they are the dropdown sections. + If children are of type Table, the values in the table are the dropdown options. + There can only be one child, the Table. + If children are of type PartitionedTable, the values in the table are the dropdown options + and the partitions create multiple sections. There can only be one child, the PartitionedTable. + + Args: + *children: The options to render within the picker. + key_column: + Only valid if children are of type Table or PartitionedTable. + The column of values to use as item keys. Defaults to the first column. + label_column: + Only valid if children are of type Table or PartitionedTable. + The column of values to display as primary text. Defaults to the key_column value. + description_column: + Only valid if children are of type Table or PartitionedTable. + The column of values to display as descriptions. + icon_column: Only valid if children are of type Table or PartitionedTable. + The column of values to map to icons. + title_column: + Only valid if children is of type PartitionedTable. + The column of values to display as section names. + Should be the same for all values in the constituent Table. + If not specified, the section titles will be created from the key_columns of the PartitionedTable. + default_selected_key: + The initial selected key in the collection (uncontrolled). + selected_key: + The currently selected key in the collection (controlled). + on_selection_change: + Handler that is called when the selection changes. + on_change: + Alias of `on_selection_change`. Handler that is called when the selection changes. + **props: + Any other Picker prop, except items. + + Returns: + The rendered Picker. + """ + children, props = create_props(locals()) + + return BaseElement("deephaven.ui.components.Picker", *children, **props) diff --git a/plugins/ui/src/deephaven/ui/components/section.py b/plugins/ui/src/deephaven/ui/components/section.py new file mode 100644 index 000000000..4b78d28af --- /dev/null +++ b/plugins/ui/src/deephaven/ui/components/section.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +from typing import Union, Any + +from .._internal.utils import create_props +from ..elements import Element, BaseElement +from ..types import Stringable +from .item import ItemElement + +PickerItem = Union[Stringable, ItemElement] +SectionElement = Element + + +def section( + *children: PickerItem, title: str | None = None, **props: Any +) -> SectionElement: + """ + A section that can be added to a menu, such as a picker. Children are the dropdown options. + + Args: + *children: The options to render within the section. + title: The title of the section. + **props: Any other Section prop. + + Returns: + The rendered Section. + """ + + children, props = create_props(locals()) + + return BaseElement("deephaven.ui.components.Section", *children, **props) diff --git a/plugins/ui/src/deephaven/ui/components/spectrum/action_button.py b/plugins/ui/src/deephaven/ui/components/spectrum/action_button.py index 3b322b5cf..d8d99d9b2 100644 --- a/plugins/ui/src/deephaven/ui/components/spectrum/action_button.py +++ b/plugins/ui/src/deephaven/ui/components/spectrum/action_button.py @@ -20,6 +20,8 @@ from .basic import spectrum_element from ...elements import Element +ActionButtonElement = Element + def action_button( *children: Any, @@ -86,7 +88,7 @@ def action_button( aria_details: str | None = None, UNSAFE_class_name: str | None = None, UNSAFE_style: CSSProperties | None = None, -) -> Element: +) -> ActionButtonElement: """ ActionButtons allow users to perform an action. They're used for similar, task-based options within a workflow, and are ideal for interfaces where buttons aren't meant to draw a lot of attention. Python implementation for the Adobe React Spectrum ActionButton component: https://react-spectrum.adobe.com/react-spectrum/ActionButton.html diff --git a/plugins/ui/src/deephaven/ui/components/spectrum/basic.py b/plugins/ui/src/deephaven/ui/components/spectrum/basic.py index f9cb30f76..4b3269828 100644 --- a/plugins/ui/src/deephaven/ui/components/spectrum/basic.py +++ b/plugins/ui/src/deephaven/ui/components/spectrum/basic.py @@ -61,14 +61,6 @@ def icon_wrapper(*children, **props): return spectrum_element("Icon", *children, **props) -def item(*children, **props): - """ - Python implementation for the Adobe React Spectrum Item component. - Used with Tabs: https://react-spectrum.adobe.com/react-spectrum/Tabs.html - """ - return spectrum_element("Item", *children, **props) - - def illustrated_message(*children, **props): """ Python implementation for the Adobe React Spectrum IllustratedMessage component. diff --git a/plugins/ui/src/deephaven/ui/components/spectrum/flex.py b/plugins/ui/src/deephaven/ui/components/spectrum/flex.py index 7634ebab0..91f5f2f69 100644 --- a/plugins/ui/src/deephaven/ui/components/spectrum/flex.py +++ b/plugins/ui/src/deephaven/ui/components/spectrum/flex.py @@ -18,7 +18,7 @@ def flex( justify_content: JustifyContent | None = None, align_content: AlignContent | None = None, align_items: AlignItems | None = None, - gap: DimensionValue | None = None, + gap: DimensionValue | None = "size-100", column_gap: DimensionValue | None = None, row_gap: DimensionValue | None = None, **props: Any, diff --git a/plugins/ui/src/deephaven/ui/components/spectrum/validate.py b/plugins/ui/src/deephaven/ui/components/spectrum/validate.py index b7d8d4047..222ec33c7 100644 --- a/plugins/ui/src/deephaven/ui/components/spectrum/validate.py +++ b/plugins/ui/src/deephaven/ui/components/spectrum/validate.py @@ -9,4 +9,3 @@ ] TextFieldValidationState = Literal["valid", "invalid"] TextFieldNecessityIndicator = Literal["icon", "label"] -Behavior = Literal["aria", "native"] diff --git a/plugins/ui/src/deephaven/ui/components/table.py b/plugins/ui/src/deephaven/ui/components/table.py index 4f0200c6a..9f4e8226a 100644 --- a/plugins/ui/src/deephaven/ui/components/table.py +++ b/plugins/ui/src/deephaven/ui/components/table.py @@ -1,9 +1,46 @@ +from __future__ import annotations + from deephaven.table import Table from ..elements import UITable +from ..types import ( + CellPressCallback, + ColumnPressCallback, + RowPressCallback, +) -def table(table: Table) -> UITable: +def table( + table: Table, + *, + on_row_press: RowPressCallback | None = None, + on_row_double_press: RowPressCallback | None = None, + on_cell_press: CellPressCallback | None = None, + on_cell_double_press: CellPressCallback | None = None, + on_column_press: ColumnPressCallback | None = None, + on_column_double_press: ColumnPressCallback | None = None, +) -> UITable: """ - Add some extra methods to the Table class for giving hints to displaying a table + Customization to how a table is displayed, how it behaves, and listen to UI events. + + Args: + table: The table to wrap + on_row_press: The callback function to run when a row is clicked. + The first parameter is the row index, and the second is the row data provided in a dictionary where the + column names are the keys. + on_row_double_press: The callback function to run when a row is double clicked. + The first parameter is the row index, and the second is the row data provided in a dictionary where the + column names are the keys. + on_cell_press: The callback function to run when a cell is clicked. + The first parameter is the cell index, and the second is the row data provided in a dictionary where the + column names are the keys. + on_cell_double_press: The callback function to run when a cell is double clicked. + The first parameter is the cell index, and the second is the row data provided in a dictionary where the + column names are the keys. + on_column_press: The callback function to run when a column is clicked. + The first parameter is the column name. + on_column_double_press: The callback function to run when a column is double clicked. + The first parameter is the column name. """ - return UITable(table) + props = locals() + del props["table"] + return UITable(table, **props) diff --git a/plugins/ui/src/deephaven/ui/elements/UITable.py b/plugins/ui/src/deephaven/ui/elements/UITable.py index 45dd51a5c..19084f3a8 100644 --- a/plugins/ui/src/deephaven/ui/elements/UITable.py +++ b/plugins/ui/src/deephaven/ui/elements/UITable.py @@ -1,8 +1,15 @@ from __future__ import annotations -import collections import logging +import sys from typing import Callable, Literal, Sequence, Any, cast +from warnings import warn + +if sys.version_info < (3, 11): + from typing_extensions import TypedDict, NotRequired +else: + from typing import TypedDict, NotRequired + from deephaven.table import Table from deephaven import SortDirection from .Element import Element @@ -14,6 +21,8 @@ Color, ContextMenuAction, CellIndex, + CellPressCallback, + ColumnPressCallback, RowData, ContextMenuMode, DataBarAxis, @@ -48,33 +57,83 @@ def remap_sort_direction(direction: TableSortDirection | str) -> Literal["ASC", raise ValueError(f"Invalid table sort direction: {direction}") -class UITable(Element): +class UITableProps(TypedDict): + can_search: NotRequired[bool] """ - Wrap a Table with some extra props for giving hints to displaying a table + Whether the search bar is accessible or not. Use the system default if no value set. + """ + + on_row_press: NotRequired[RowPressCallback] + """ + Callback function to run when a row is clicked. + The first parameter is the row index, and the second is the row data provided in a dictionary where the + column names are the keys. + """ + + on_row_double_press: NotRequired[RowPressCallback] + """ + The callback function to run when a row is double clicked. + The first parameter is the row index, and the second is the row data provided in a dictionary where the + column names are the keys. """ - _table: Table + on_cell_press: NotRequired[CellPressCallback] """ - The table that is wrapped with some extra props + The callback function to run when a cell is clicked. + The first parameter is the cell index, and the second is the row data provided in a dictionary where the + column names are the keys. """ - _props: dict[str, Any] + on_cell_double_press: NotRequired[CellPressCallback] """ - The extra props that are added by each method + The callback function to run when a cell is double clicked. + The first parameter is the cell index, and the second is the row data provided in a dictionary where the + column names are the keys. """ - def __init__(self, table: Table, props: dict[str, Any] = {}): + on_column_press: NotRequired[ColumnPressCallback] + """ + The callback function to run when a column is clicked. + The first parameter is the column name. + """ + + on_column_double_press: NotRequired[ColumnPressCallback] + """ + The callback function to run when a column is double clicked. + The first parameter is the column name. + """ + + table: Table + """ + The table to wrap + """ + + +class UITable(Element): + """ + Wrap a Table with some extra props for giving hints to displaying a table + """ + + _props: UITableProps + """ + The props that are passed to the frontend + """ + + def __init__( + self, + table: Table, + **props: Any, + ): """ Create a UITable from the passed in table. UITable provides an [immutable fluent interface](https://en.wikipedia.org/wiki/Fluent_interface#Immutability) for adding UI hints to a table. Args: table: The table to wrap + props: UITableProps props to pass to the frontend. """ - self._table = table - # Store the extra props that are added by each method - # This is a shallow copy of the props so that we don't mutate the passed in props dict - self._props = {**props} + # Store all the props that were passed in + self._props = UITableProps(**props, table=table) @property def name(self): @@ -92,7 +151,7 @@ def _with_prop(self, key: str, value: Any) -> "UITable": A new UITable with the passed in prop added to the existing props """ logger.debug("_with_prop(%s, %s)", key, value) - return UITable(self._table, {**self._props, key: value}) + return UITable(**{**self._props, key: value}) def _with_appendable_prop(self, key: str, value: Any) -> "UITable": """ @@ -114,9 +173,9 @@ def _with_appendable_prop(self, key: str, value: Any) -> "UITable": value = value if isinstance(value, list) else [value] - return UITable(self._table, {**self._props, key: existing + value}) + return UITable(**{**self._props, key: existing + value}) - def _with_dict_prop(self, prop_name: str, value: dict) -> "UITable": + def _with_dict_prop(self, key: str, value: dict[str, Any]) -> "UITable": """ Create a new UITable with the passed in prop in a dictionary. This will override any existing prop with the same key within @@ -130,14 +189,13 @@ def _with_dict_prop(self, prop_name: str, value: dict) -> "UITable": Returns: A new UITable with the passed in prop added to the existing props """ - logger.debug("_with_dict_prop(%s, %s)", prop_name, value) - existing = self._props.get(prop_name, {}) - new = {**existing, **value} - return UITable(self._table, {**self._props, prop_name: new}) + logger.debug("_with_dict_prop(%s, %s)", key, value) + existing = self._props.get(key, {}) + return UITable(**{**self._props, key: {**existing, **value}}) # type: ignore def render(self, context: RenderContext) -> dict[str, Any]: logger.debug("Returning props %s", self._props) - return dict_to_camel_case({**self._props, "table": self._table}) + return dict_to_camel_case({**self._props}) def aggregations( self, @@ -278,9 +336,13 @@ def color_row( def context_menu( self, - items: ContextMenuAction - | list[ContextMenuAction] - | Callable[[CellIndex, RowData], ContextMenuAction | list[ContextMenuAction]], + items: ( + ContextMenuAction + | list[ContextMenuAction] + | Callable[ + [CellIndex, RowData], ContextMenuAction | list[ContextMenuAction] + ] + ), mode: ContextMenuMode = "CELL", ) -> "UITable": """ @@ -395,23 +457,10 @@ def hide_columns(self, columns: str | list[str]) -> "UITable": """ raise NotImplementedError() - def on_row_press(self, callback: RowPressCallback) -> "UITable": - """ - Add a callback for when a press on a row is released (e.g. a row is clicked). - - Args: - callback: The callback function to run when a row is clicked. - The first parameter is the row index, and the second is the row data provided in a dictionary where the - column names are the keys. - - Returns: - A new UITable - """ - raise NotImplementedError() - def on_row_double_press(self, callback: RowPressCallback) -> "UITable": """ Add a callback for when a row is double clicked. + *Deprecated: Use the on_row_double_press keyword arg instead. Args: callback: The callback function to run when a row is double clicked. @@ -421,6 +470,11 @@ def on_row_double_press(self, callback: RowPressCallback) -> "UITable": Returns: A new UITable """ + warn( + "on_row_double_press function is deprecated. Use the on_row_double_press keyword arg instead.", + DeprecationWarning, + stacklevel=2, + ) return self._with_prop("on_row_double_press", callback) def quick_filter( @@ -481,7 +535,7 @@ def sort( remap_sort_direction(direction) for direction in direction_list_unmapped ] - by_list = by if isinstance(by, Sequence) else [by] + by_list = [by] if isinstance(by, str) else by if direction and len(direction_list) != len(by_list): raise ValueError("by and direction must be the same length") diff --git a/plugins/ui/src/deephaven/ui/hooks/use_callback.py b/plugins/ui/src/deephaven/ui/hooks/use_callback.py index 7496e1205..a5fedf436 100644 --- a/plugins/ui/src/deephaven/ui/hooks/use_callback.py +++ b/plugins/ui/src/deephaven/ui/hooks/use_callback.py @@ -3,9 +3,10 @@ from typing import Callable, Any, Sequence from .use_ref import use_ref, Ref +from ..types import Dependencies -def use_callback(func: Callable, dependencies: set[Any] | Sequence[Any]) -> Callable: +def use_callback(func: Callable, dependencies: Dependencies) -> Callable: """ Create a stable handle for a callback function. The callback will only be recreated if the dependencies change. diff --git a/plugins/ui/src/deephaven/ui/hooks/use_effect.py b/plugins/ui/src/deephaven/ui/hooks/use_effect.py index 713c3324e..e11e05fa6 100644 --- a/plugins/ui/src/deephaven/ui/hooks/use_effect.py +++ b/plugins/ui/src/deephaven/ui/hooks/use_effect.py @@ -4,9 +4,10 @@ from .use_ref import use_ref, Ref from deephaven.liveness_scope import LivenessScope from .._internal import get_context +from ..types import Dependencies -def use_effect(func: Callable[[], Any], dependencies: set[Any] | Sequence[Any]): +def use_effect(func: Callable[[], Any], dependencies: Dependencies): """ Call a function when the dependencies change. Optionally return a cleanup function to be called when dependencies change again or component is unmounted. diff --git a/plugins/ui/src/deephaven/ui/hooks/use_execution_context.py b/plugins/ui/src/deephaven/ui/hooks/use_execution_context.py index 93f1c9045..2cfc808a1 100644 --- a/plugins/ui/src/deephaven/ui/hooks/use_execution_context.py +++ b/plugins/ui/src/deephaven/ui/hooks/use_execution_context.py @@ -35,6 +35,6 @@ def use_execution_context( Returns: A callable that will take any callable and invoke it within the current exec context """ - exec_ctx = use_memo(lambda: exec_ctx if exec_ctx else get_exec_ctx(), {exec_ctx}) - exec_fn = use_memo(lambda: partial(func_with_ctx, exec_ctx), {exec_ctx}) + exec_ctx = use_memo(lambda: exec_ctx if exec_ctx else get_exec_ctx(), [exec_ctx]) + exec_fn = use_memo(lambda: partial(func_with_ctx, exec_ctx), [exec_ctx]) return exec_fn diff --git a/plugins/ui/src/deephaven/ui/hooks/use_liveness_scope.py b/plugins/ui/src/deephaven/ui/hooks/use_liveness_scope.py index 8c4233df4..87acd3958 100644 --- a/plugins/ui/src/deephaven/ui/hooks/use_liveness_scope.py +++ b/plugins/ui/src/deephaven/ui/hooks/use_liveness_scope.py @@ -1,12 +1,14 @@ from __future__ import annotations from .._internal import get_context +from .use_memo import use_memo from .use_ref import use_ref, Ref from typing import Callable from deephaven.liveness_scope import LivenessScope +from ..types import Dependencies -def use_liveness_scope(func: Callable) -> Callable: +def use_liveness_scope(func: Callable, dependencies: Dependencies) -> Callable: """ Wraps a Callable in a liveness scope, and ensures that when invoked, if that callable causes the component to render, the scope will be retained by that render pass. It is @@ -15,25 +17,30 @@ def use_liveness_scope(func: Callable) -> Callable: Args: func: The function to wrap + dependencies: Dependencies of the provided function, so the hook knows when to re-wrap it Returns: The wrapped Callable """ scope_ref: Ref[LivenessScope | None] = use_ref(None) - # If the value is set, the wrapped callable was invoked since we were last called - the current render - # cycle now will manage it, and release it when appropriate. - if scope_ref.current: - get_context().manage(scope_ref.current) - scope_ref.current = None - - def wrapped(*args, **kwargs): - # If one does not exist, create a liveness scope, to hold actions from running the provided callable. - # Instead of releasing it right away, we leave it open until the render queue picks up any changes in - # that callable, see above. - if scope_ref.current is None: - scope_ref.current = LivenessScope() - with scope_ref.current.open(): - func(*args, **kwargs) - - return wrapped + def make_wrapper(): + + # If the value is set, the wrapped callable was invoked since we were last called - the current render + # cycle now will manage it, and release it when appropriate. + if scope_ref.current: + get_context().manage(scope_ref.current) + scope_ref.current = None + + def wrapped(*args, **kwargs): + # If one does not exist, create a liveness scope, to hold actions from running the provided callable. + # Instead of releasing it right away, we leave it open until the render queue picks up any changes in + # that callable, see above. + if scope_ref.current is None: + scope_ref.current = LivenessScope() + with scope_ref.current.open(): + func(*args, **kwargs) + + return wrapped + + return use_memo(make_wrapper, dependencies) diff --git a/plugins/ui/src/deephaven/ui/hooks/use_memo.py b/plugins/ui/src/deephaven/ui/hooks/use_memo.py index 39b384449..406714539 100644 --- a/plugins/ui/src/deephaven/ui/hooks/use_memo.py +++ b/plugins/ui/src/deephaven/ui/hooks/use_memo.py @@ -4,11 +4,12 @@ from .._internal import ValueWithLiveness, get_context from typing import Any, Callable, TypeVar, cast, Union, Sequence from deephaven.liveness_scope import LivenessScope +from ..types import Dependencies T = TypeVar("T") -def use_memo(func: Callable[[], T], dependencies: set[Any] | Sequence[Any]) -> T: +def use_memo(func: Callable[[], T], dependencies: Dependencies) -> T: """ Memoize the result of a function call. The function will only be called again if the dependencies change. @@ -19,6 +20,11 @@ def use_memo(func: Callable[[], T], dependencies: set[Any] | Sequence[Any]) -> T Returns: The memoized result of the function call. """ + if not isinstance(dependencies, (list, tuple)): + raise TypeError( + f"dependencies must be a list or tuple, got {type(dependencies)}" + ) + deps_ref: Ref[set[Any] | Sequence[Any] | None] = use_ref(None) value_ref: Ref[ValueWithLiveness[T | None]] = use_ref( ValueWithLiveness(value=cast(Union[T, None], None), liveness_scope=None) diff --git a/plugins/ui/src/deephaven/ui/hooks/use_table_data.py b/plugins/ui/src/deephaven/ui/hooks/use_table_data.py index e4dc1dce0..3f2714612 100644 --- a/plugins/ui/src/deephaven/ui/hooks/use_table_data.py +++ b/plugins/ui/src/deephaven/ui/hooks/use_table_data.py @@ -142,6 +142,8 @@ def use_table_data( table_updated = lambda: _set_new_data(table, sentinel, set_data, set_is_sentinel) - ui.use_table_listener(table, partial(_on_update, ctx, table_updated, executor_name)) + ui.use_table_listener( + table, partial(_on_update, ctx, table_updated, executor_name), [] + ) return transform(data, is_sentinel) diff --git a/plugins/ui/src/deephaven/ui/hooks/use_table_listener.py b/plugins/ui/src/deephaven/ui/hooks/use_table_listener.py index 40fad4ce6..a7eef4ad5 100644 --- a/plugins/ui/src/deephaven/ui/hooks/use_table_listener.py +++ b/plugins/ui/src/deephaven/ui/hooks/use_table_listener.py @@ -1,14 +1,14 @@ from __future__ import annotations from functools import partial -from typing import Callable +from typing import Any, Callable, Sequence from deephaven.table import Table from deephaven.table_listener import listen, TableUpdate, TableListener from deephaven.execution_context import get_exec_ctx, ExecutionContext from .use_effect import use_effect -from ..types import LockType +from ..types import LockType, Dependencies def listener_with_ctx( @@ -67,6 +67,7 @@ def wrap_listener( def use_table_listener( table: Table, listener: Callable[[TableUpdate, bool], None] | TableListener, + dependencies: Dependencies, description: str | None = None, do_replay: bool = False, replay_lock: LockType = "shared", @@ -78,6 +79,7 @@ def use_table_listener( table: The table to listen to. listener: Either a function or a TableListener with an on_update function. The function must take a TableUpdate and is_replay bool. + dependencies: Dependencies of the listener function, so the hook knows when to recreate the listener description: An optional description for the UpdatePerformanceTracker to append to the listener’s entry description, default is None. do_replay: Whether to replay the initial snapshot of the table, default is False. @@ -105,4 +107,7 @@ def start_listener() -> Callable[[], None]: return lambda: handle.stop() - use_effect(start_listener, {table, listener, description, do_replay, replay_lock}) + use_effect( + start_listener, + [table, listener, description, do_replay, replay_lock] + list(dependencies), + ) diff --git a/plugins/ui/src/deephaven/ui/object_types/ElementMessageStream.py b/plugins/ui/src/deephaven/ui/object_types/ElementMessageStream.py index 3efd1ca93..5d4d1c593 100644 --- a/plugins/ui/src/deephaven/ui/object_types/ElementMessageStream.py +++ b/plugins/ui/src/deephaven/ui/object_types/ElementMessageStream.py @@ -16,7 +16,7 @@ from .._internal import wrap_callable from ..elements import Element from ..renderer import NodeEncoder, Renderer, RenderedNode -from .._internal import RenderContext, StateUpdateCallable +from .._internal import RenderContext, StateUpdateCallable, ExportedRenderState logger = logging.getLogger(__name__) @@ -132,7 +132,7 @@ def __init__(self, element: Element, connection: MessageStream): self._connection = connection self._message_id = 0 self._manager = JSONRPCResponseManager() - self._dispatcher = Dispatcher() + self._dispatcher = self._make_dispatcher() self._encoder = NodeEncoder(separators=(",", ":")) self._context = RenderContext(self._queue_state_update, self._queue_callable) self._renderer = Renderer(self._context) @@ -155,40 +155,43 @@ def _render(self) -> None: try: node = self._renderer.render(self._element) + state = self._context.export_state() + self._send_document_update(node, state) except Exception as e: logger.exception("Error rendering %s", self._element.name) raise e - self._send_document_update(node) - def _process_callable_queue(self) -> None: """ Process any queued callables, then re-renders the element if it is dirty. """ - with self._exec_context: - with self._render_lock: - self._render_thread = threading.current_thread() - self._render_state = _RenderState.RENDERING - - while not self._callable_queue.empty(): - item = self._callable_queue.get() - with liveness_scope(): - try: - item() - except Exception as e: - logger.exception(e) - - if self._is_dirty: - self._render() - - with self._render_lock: - self._render_thread = None - if not self._callable_queue.empty() or self._is_dirty: - # There are still callables to process, so queue up another render - self._render_state = _RenderState.QUEUED - submit_task("concurrent", self._process_callable_queue) - else: - self._render_state = _RenderState.IDLE + try: + with self._exec_context: + with self._render_lock: + self._render_thread = threading.current_thread() + self._render_state = _RenderState.RENDERING + + while not self._callable_queue.empty(): + item = self._callable_queue.get() + with liveness_scope(): + try: + item() + except Exception as e: + logger.exception(e) + + if self._is_dirty: + self._render() + + with self._render_lock: + self._render_thread = None + if not self._callable_queue.empty() or self._is_dirty: + # There are still callables to process, so queue up another render + self._render_state = _RenderState.QUEUED + submit_task("concurrent", self._process_callable_queue) + else: + self._render_state = _RenderState.IDLE + except Exception as e: + logger.exception(e) def _mark_dirty(self) -> None: """ @@ -232,9 +235,9 @@ def _queue_callable(self, callable: Callable[[], None]) -> None: def start(self) -> None: """ - Start the message stream. This will start the render loop and queue up the initial render. + Start the message stream. All we do is send a blank message to start. Client will respond with the initial state. """ - self._mark_dirty() + self._connection.on_data(b"", []) def on_close(self) -> None: pass @@ -302,12 +305,31 @@ def _make_request(self, method: str, *params: Any) -> dict[str, Any]: "id": self._get_next_message_id(), } - def _send_document_update(self, root: RenderedNode) -> None: + def _make_dispatcher(self) -> Dispatcher: + dispatcher = Dispatcher() + dispatcher["setState"] = self._set_state + return dispatcher + + def _set_state(self, state: ExportedRenderState) -> None: + """ + Set the state of the element. This is called by the client on initial load. + + Args: + state: The state to set + """ + logger.debug("Setting state: %s", state) + self._context.import_state(state) + self._mark_dirty() + + def _send_document_update( + self, root: RenderedNode, state: ExportedRenderState + ) -> None: """ Send a document update to the client. Currently just sends the entire document for each update. Args: root: The root node of the document to send + state: The state of the node to preserve """ # TODO(#67): Send a diff of the document instead of the entire document. @@ -316,11 +338,16 @@ def _send_document_update(self, root: RenderedNode) -> None: new_objects = encoder_result["new_objects"] callable_id_dict = encoder_result["callable_id_dict"] - request = self._make_notification("documentUpdated", encoded_document) + logger.debug("Exported state: %s", state) + encoded_state = json.dumps(state) + + request = self._make_notification( + "documentUpdated", encoded_document, encoded_state + ) payload = json.dumps(request) logger.debug(f"Sending payload: {payload}") - dispatcher = Dispatcher() + dispatcher = self._make_dispatcher() for callable, callable_id in callable_id_dict.items(): logger.debug("Registering callable %s", callable_id) dispatcher[callable_id] = wrap_callable(callable) diff --git a/plugins/ui/src/deephaven/ui/object_types/ElementType.py b/plugins/ui/src/deephaven/ui/object_types/ElementType.py index b677839ac..02d07ad8e 100644 --- a/plugins/ui/src/deephaven/ui/object_types/ElementType.py +++ b/plugins/ui/src/deephaven/ui/object_types/ElementType.py @@ -17,7 +17,11 @@ def name(self) -> str: def is_type(self, obj: Any) -> bool: return isinstance(obj, Element) - def create_client_connection(self, obj: Element, connection: MessageStream): + def create_client_connection( + self, obj: object, connection: MessageStream + ) -> MessageStream: + if not isinstance(obj, Element): + raise TypeError(f"Expected Element, got {type(obj)}") client_connection = ElementMessageStream(obj, connection) client_connection.start() return client_connection diff --git a/plugins/ui/src/deephaven/ui/renderer/Renderer.py b/plugins/ui/src/deephaven/ui/renderer/Renderer.py index 218b53f0f..4052b9b28 100644 --- a/plugins/ui/src/deephaven/ui/renderer/Renderer.py +++ b/plugins/ui/src/deephaven/ui/renderer/Renderer.py @@ -47,7 +47,7 @@ def _render_list( """ logger.debug("_render_list %s", item) return [ - _render_item(value, context.get_child_context(key)) + _render_item(value, context.get_child_context(str(key))) for key, value in enumerate(item) ] diff --git a/plugins/ui/src/deephaven/ui/types/types.py b/plugins/ui/src/deephaven/ui/types/types.py index f727104f5..90bfd8480 100644 --- a/plugins/ui/src/deephaven/ui/types/types.py +++ b/plugins/ui/src/deephaven/ui/types/types.py @@ -1,9 +1,70 @@ -from typing import Any, Dict, Literal, Union, List, Tuple, Optional, Callable +from typing import Any, Dict, Literal, Union, List, Tuple, Callable, TypedDict, Sequence from deephaven import SortDirection -RowIndex = Optional[int] + +class CellData(TypedDict): + """ + Data for one cell. Returned with click handlers. + """ + + type: str + """ + Type of the cell data + """ + + text: str + """ + Text of the cell data + """ + + value: Any + """ + Raw value of the cell data + """ + + +class RowDataValue(CellData): + """ + Data for value of one column in a row. Returned with row press handlers. + """ + + isExpandable: bool + """ + Whether this row is expandable. + """ + + isGrouped: bool + """ + Whether this row is grouped. + """ + + +ColumnIndex = int +""" +Index of a column in a table. +""" + +RowIndex = int +""" +Index of a row in a table. +""" + +CellIndex = Tuple[ColumnIndex, RowIndex] +""" +Index of a cell in a table. +""" + +GridIndex = Tuple[Union[ColumnIndex, None], Union[RowIndex, None]] +""" +Index of a spot on the grid. A value of None indicates a header row or column. +""" + + +ColumnName = str RowDataMap = Dict[str, Any] RowPressCallback = Callable[[RowIndex, RowDataMap], None] +CellPressCallback = Callable[[CellIndex, CellData], None] +ColumnPressCallback = Callable[[ColumnName], None] AggregationOperation = Literal[ "COUNT", "COUNT_DISTINCT", @@ -20,13 +81,9 @@ "UNIQUE", "SKIP", ] -ColumnIndex = Union[int, None] -CellIndex = Tuple[RowIndex, ColumnIndex] DeephavenColor = Literal["salmon", "lemonchiffon"] HexColor = str Color = Union[DeephavenColor, HexColor] -# A ColumnIndex of None indicates a header row -ColumnName = str ContextMenuAction = Dict[str, Any] ContextMenuModeOption = Literal["CELL", "ROW_HEADER", "COLUMN_HEADER"] ContextMenuMode = Union[ContextMenuModeOption, List[ContextMenuModeOption], None] @@ -37,8 +94,6 @@ LockType = Literal["shared", "exclusive"] QuickFilterExpression = str RowData = Dict[ColumnName, Any] -# A RowIndex of None indicates a header column -RowIndex = Optional[int] ColumnData = List[Any] TableData = Dict[ColumnName, ColumnData] SearchMode = Literal["SHOW", "HIDE", "DEFAULT"] @@ -47,3 +102,10 @@ TransformedData = Any StringSortDirection = Literal["ASC", "DESC"] TableSortDirection = Union[StringSortDirection, SortDirection] +# Stringable is a type that is naturally convertible to a string +Stringable = Union[str, int, float, bool] +Key = Stringable +ActionKey = Key + +Dependencies = Union[Tuple[Any], List[Any]] +Selection = Sequence[Key] diff --git a/plugins/ui/src/js/__mocks__/@deephaven/dashboard.js b/plugins/ui/src/js/__mocks__/@deephaven/dashboard.js index 31e53b69b..6e03f2e07 100644 --- a/plugins/ui/src/js/__mocks__/@deephaven/dashboard.js +++ b/plugins/ui/src/js/__mocks__/@deephaven/dashboard.js @@ -1,7 +1,10 @@ // Mock LayoutUtils, useListener, and PanelEvent from @deephaven/dashboard package const mockLayout = { root: { contentItems: [], addChild: jest.fn() }, - eventHub: {}, + eventHub: { + on: jest.fn(), + off: jest.fn(), + }, createContentItem: jest.fn(() => ({ setSize: jest.fn() })), }; @@ -10,6 +13,9 @@ module.exports = { ...DashboardActual, LayoutUtils: { getComponentName: jest.fn(), + getContentItemInStack: jest.fn(), + getStackForConfig: jest.fn(), + getIdFromContainer: DashboardActual.LayoutUtils.getIdFromContainer, openComponent: jest.fn(), closeComponent: jest.fn(), }, diff --git a/plugins/ui/src/js/package.json b/plugins/ui/src/js/package.json index 8a704586b..45b39cc45 100644 --- a/plugins/ui/src/js/package.json +++ b/plugins/ui/src/js/package.json @@ -1,6 +1,6 @@ { "name": "@deephaven/js-plugin-ui", - "version": "0.7.0", + "version": "0.11.0", "description": "Deephaven UI plugin", "keywords": [ "Deephaven", @@ -25,7 +25,8 @@ "homepage": "https://github.com/deephaven/deephaven-plugins/tree/main/plugins/ui", "scripts": { "start": "vite build --watch", - "build": "vite build" + "build": "vite build", + "update-dh-packages": "node ../../../../tools/update-dh-packages.mjs" }, "devDependencies": { "@types/react": "^17.0.2", @@ -40,23 +41,26 @@ "react-dom": "^17.0.2" }, "dependencies": { - "@adobe/react-spectrum": "^3.29.0", - "@deephaven/chart": "0.62.0", - "@deephaven/components": "0.62.0", - "@deephaven/dashboard": "0.62.0", - "@deephaven/dashboard-core-plugins": "0.62.0", - "@deephaven/icons": "0.62.0", - "@deephaven/iris-grid": "0.62.0", - "@deephaven/jsapi-bootstrap": "0.62.0", - "@deephaven/jsapi-components": "0.62.0", - "@deephaven/jsapi-types": "0.62.0", - "@deephaven/log": "0.62.0", - "@deephaven/plugin": "0.62.0", - "@deephaven/react-hooks": "0.62.0", - "@deephaven/utils": "0.62.0", + "@adobe/react-spectrum": "^3.34.1", + "@deephaven/chart": "^0.71.0", + "@deephaven/components": "^0.71.0", + "@deephaven/dashboard": "^0.71.0", + "@deephaven/dashboard-core-plugins": "^0.71.0", + "@deephaven/grid": "^0.71.0", + "@deephaven/icons": "^0.71.0", + "@deephaven/iris-grid": "^0.71.0", + "@deephaven/jsapi-bootstrap": "^0.71.0", + "@deephaven/jsapi-components": "^0.71.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.33.3", + "@deephaven/log": "^0.71.0", + "@deephaven/plugin": "^0.71.0", + "@deephaven/react-hooks": "^0.71.0", + "@deephaven/redux": "^0.71.0", + "@deephaven/utils": "^0.71.0", "@fortawesome/react-fontawesome": "^0.2.0", "@react-types/shared": "^3.22.0", "json-rpc-2.0": "^1.6.0", + "react-redux": "^7.x", "shortid": "^2.2.16" }, "publishConfig": { diff --git a/plugins/ui/src/js/src/DashboardPlugin.tsx b/plugins/ui/src/js/src/DashboardPlugin.tsx index c3040c7df..49c655c7a 100644 --- a/plugins/ui/src/js/src/DashboardPlugin.tsx +++ b/plugins/ui/src/js/src/DashboardPlugin.tsx @@ -3,6 +3,7 @@ import shortid from 'shortid'; import { DashboardPluginComponentProps, LayoutManagerContext, + LayoutUtils, PanelEvent, useListener, useDashboardPluginData, @@ -10,21 +11,31 @@ import { WidgetDescriptor, PanelOpenEventDetail, DEFAULT_DASHBOARD_ID, + useDashboardPanel, } from '@deephaven/dashboard'; import Log from '@deephaven/log'; import { DeferredApiBootstrap, useObjectFetcher, } from '@deephaven/jsapi-bootstrap'; -import { Widget } from '@deephaven/jsapi-types'; +import { dh } from '@deephaven/jsapi-types'; import { ErrorBoundary } from '@deephaven/components'; +import { useDebouncedCallback } from '@deephaven/react-hooks'; import styles from './styles.scss?inline'; -import { WidgetWrapper } from './widget/WidgetTypes'; +import { + ReadonlyWidgetData, + WidgetDataUpdate, + WidgetFetch, + WidgetId, +} from './widget/WidgetTypes'; import PortalPanel from './layout/PortalPanel'; -import WidgetHandler from './widget/WidgetHandler'; +import PortalPanelManager from './layout/PortalPanelManager'; +import DashboardWidgetHandler from './widget/DashboardWidgetHandler'; +import { getPreservedData } from './widget/WidgetUtils'; const NAME_ELEMENT = 'deephaven.ui.Element'; const DASHBOARD_ELEMENT = 'deephaven.ui.Dashboard'; +const PLUGIN_NAME = '@deephaven/js-plugin-ui.DashboardPlugin'; const log = Log.module('@deephaven/js-plugin-ui.DashboardPlugin'); @@ -32,27 +43,45 @@ const log = Log.module('@deephaven/js-plugin-ui.DashboardPlugin'); * The data stored in redux when the user creates a ui.dashboard. */ interface DashboardPluginData { - type: string; - title: string; - id: string; + /** Map of open widgets, along with any data that is stored with them. */ + openWidgets?: Record< + WidgetId, + { + descriptor: WidgetDescriptor; + data?: ReadonlyWidgetData; + } + >; +} + +interface WidgetWrapper { + /** Function to fetch the widget instance from the server */ + fetch: WidgetFetch; + + /** ID of this widget */ + id: WidgetId; + + /** Descriptor for the widget. */ widget: WidgetDescriptor; + + /** Data for the widget */ + data?: ReadonlyWidgetData; } -export function DashboardPlugin({ - id, - layout, - registerComponent, -}: DashboardPluginComponentProps): JSX.Element | null { - const [pluginData] = useDashboardPluginData( +export function DashboardPlugin( + props: DashboardPluginComponentProps +): JSX.Element | null { + const { id, layout } = props; + const [pluginData, setPluginData] = useDashboardPluginData( id, - DASHBOARD_ELEMENT - ) as unknown as [DashboardPluginData]; + PLUGIN_NAME + ) as unknown as [DashboardPluginData, (data: DashboardPluginData) => void]; + const [initialPluginData] = useState(pluginData); const objectFetcher = useObjectFetcher(); // Keep track of the widgets we've got opened. const [widgetMap, setWidgetMap] = useState< - ReadonlyMap + ReadonlyMap >(new Map()); const handleWidgetOpen = useCallback( @@ -61,17 +90,19 @@ export function DashboardPlugin({ widgetId = shortid.generate(), widget, }: { - fetch: () => Promise; + fetch: () => Promise; widgetId: string; widget: WidgetDescriptor; }) => { log.info('Opening widget with ID', widgetId, widget); setWidgetMap(prevWidgetMap => { - const newWidgetMap = new Map(prevWidgetMap); + const newWidgetMap = new Map(prevWidgetMap); + const oldWidget = newWidgetMap.get(widgetId); newWidgetMap.set(widgetId, { fetch, id: widgetId, widget, + data: getPreservedData(oldWidget?.data), }); return newWidgetMap; }); @@ -80,22 +111,19 @@ export function DashboardPlugin({ ); const handleDashboardOpen = useCallback( - ({ widget }: { widget: WidgetDescriptor }) => { - const { id: dashboardId, type, name: title = 'Untitled' } = widget; - if (dashboardId == null) { - log.error("Can't open dashboard without an ID", widget); - return; - } - log.debug('Emitting create dashboard event for', widget); + ({ + widget, + dashboardId, + }: { + widget: WidgetDescriptor; + dashboardId: string; + }) => { + const { name: title } = widget; + log.debug('Emitting create dashboard event for', dashboardId, widget); emitCreateDashboard(layout.eventHub, { - pluginId: DASHBOARD_ELEMENT, - title, - data: { - type, - title, - id: dashboardId, - widget, - } satisfies DashboardPluginData, + pluginId: PLUGIN_NAME, + title: title ?? 'Untitled', + data: { openWidgets: { [dashboardId]: { descriptor: widget } } }, }); }, [layout.eventHub] @@ -106,7 +134,7 @@ export function DashboardPlugin({ fetch, panelId: widgetId = shortid.generate(), widget, - }: PanelOpenEventDetail) => { + }: PanelOpenEventDetail) => { const { type } = widget; switch (type) { @@ -116,11 +144,11 @@ export function DashboardPlugin({ break; } case DASHBOARD_ELEMENT: { - handleDashboardOpen({ widget }); + handleDashboardOpen({ widget, dashboardId: widgetId }); break; } default: { - log.error('Unknown widget type', type); + break; } } }, @@ -128,83 +156,162 @@ export function DashboardPlugin({ ); useEffect( - function loadDashboard() { - if (pluginData == null) { + function loadInitialPluginData() { + if (initialPluginData == null) { + log.debug('loadInitialPluginData no data'); return; } - log.info('Loading dashboard', pluginData); + log.debug('loadInitialPluginData', initialPluginData); setWidgetMap(prevWidgetMap => { - const newWidgetMap = new Map(prevWidgetMap); - // We need to create a new definition object, otherwise the layout will think it's already open - // Can't use a spread operator because the widget definition uses property accessors - - const { widget } = pluginData; - newWidgetMap.set(id, { - fetch: () => objectFetcher(widget), - id, - widget, - }); + const newWidgetMap = new Map(prevWidgetMap); + const { openWidgets } = initialPluginData; + if (openWidgets != null) { + Object.entries(openWidgets).forEach( + ([widgetId, { descriptor, data }]) => { + newWidgetMap.set(widgetId, { + fetch: () => objectFetcher(descriptor), + id: widgetId, + widget: descriptor, + data, + }); + } + ); + } return newWidgetMap; }); }, - [objectFetcher, pluginData, id] + [objectFetcher, initialPluginData, id] ); - const handlePanelClose = useCallback((panelId: string) => { - setWidgetMap(prevWidgetMap => { - if (!prevWidgetMap.has(panelId)) { - return prevWidgetMap; + const handlePanelClose = useCallback( + (panelId: string) => { + log.debug2('handlePanelClose', panelId); + setWidgetMap(prevWidgetMap => { + if (!prevWidgetMap.has(panelId)) { + return prevWidgetMap; + } + const newWidgetMap = new Map(prevWidgetMap); + newWidgetMap.delete(panelId); + return newWidgetMap; + }); + // We may need to clean up some panels for this widget if it hasn't actually loaded yet + // We should be able to always be able to do this even if it does load, so just remove any panels from the initial load + if (initialPluginData != null) { + const { openWidgets } = initialPluginData; + const openWidget = openWidgets?.[panelId]; + if (openWidget?.data?.panelIds != null) { + const { panelIds } = openWidget.data; + for (let i = 0; i < panelIds.length; i += 1) { + LayoutUtils.closeComponent(layout.root, { id: panelIds[i] }); + } + } } - const newWidgetMap = new Map(prevWidgetMap); - newWidgetMap.delete(panelId); - return newWidgetMap; - }); - }, []); + }, + [initialPluginData, layout] + ); const handleWidgetClose = useCallback((widgetId: string) => { - log.debug('Closing widget', widgetId); + log.debug('handleWidgetClose', widgetId); setWidgetMap(prevWidgetMap => { - const newWidgetMap = new Map(prevWidgetMap); + const newWidgetMap = new Map(prevWidgetMap); newWidgetMap.delete(widgetId); return newWidgetMap; }); }, []); - useEffect(() => { - const cleanups = [registerComponent(PortalPanel.displayName, PortalPanel)]; + useDashboardPanel({ + dashboardProps: props, + componentName: PortalPanel.displayName, + component: PortalPanel, - return () => { - cleanups.forEach(cleanup => cleanup()); - }; - }, [registerComponent]); + // We don't want these panels to be triggered by a widget opening, we want to control how it is opened later + supportedTypes: [], + }); // TODO: We need to change up the event system for how objects are opened, since in this case it could be opening multiple panels useListener(layout.eventHub, PanelEvent.OPEN, handlePanelOpen); useListener(layout.eventHub, PanelEvent.CLOSE, handlePanelClose); + const sendPluginDataUpdate = useCallback( + (newPluginData: DashboardPluginData) => { + log.debug('sendPluginDataUpdate', newPluginData); + setPluginData(newPluginData); + }, + [setPluginData] + ); + + const debouncedSendPluginDataUpdate = useDebouncedCallback( + sendPluginDataUpdate, + 500 + ); + + useEffect( + function updatePluginData() { + // Updates the plugin data with the widgets that are now open in this dashboard + const openWidgets: DashboardPluginData['openWidgets'] = {}; + widgetMap.forEach((widgetWrapper, widgetId) => { + openWidgets[widgetId] = { + descriptor: widgetWrapper.widget, + data: widgetWrapper.data, + }; + }); + const newPluginData = { openWidgets }; + debouncedSendPluginDataUpdate(newPluginData); + }, + [widgetMap, debouncedSendPluginDataUpdate] + ); + + const handleWidgetDataChange = useCallback( + (widgetId: string, data: WidgetDataUpdate) => { + log.debug('handleWidgetDataChange', widgetId, data); + setWidgetMap(prevWidgetMap => { + const newWidgetMap = new Map(prevWidgetMap); + const oldWidget = newWidgetMap.get(widgetId); + if (oldWidget == null) { + throw new Error(`Widget not found: ${widgetId}`); + } + newWidgetMap.set(widgetId, { + ...oldWidget, + data: { + ...oldWidget.data, + ...data, + }, + }); + return newWidgetMap; + }); + }, + [] + ); + const widgetHandlers = useMemo( () => - [...widgetMap.entries()].map(([widgetId, widget]) => ( + [...widgetMap.entries()].map(([widgetId, wrapper]) => ( // Fallback to an empty array in default dashboard so we don't display errors over code studio - - + + )), - [handleWidgetClose, widgetMap, id] + [handleWidgetClose, handleWidgetDataChange, widgetMap, id] ); return ( - // We'll need to change up how the layout is provided once we have widgets that can open other dashboards... - {widgetHandlers} + {widgetHandlers} ); } diff --git a/plugins/ui/src/js/src/elements/ElementConstants.ts b/plugins/ui/src/js/src/elements/ElementConstants.ts new file mode 100644 index 000000000..0ff501ac3 --- /dev/null +++ b/plugins/ui/src/js/src/elements/ElementConstants.ts @@ -0,0 +1,42 @@ +import { ReactHTML } from 'react'; +import type * as icons from '@deephaven/icons'; + +/** Namespaces */ +export const UI_COMPONENTS_NAMESPACE = 'deephaven.ui.components'; +export const UI_ELEMENTS_NAMESPACE = 'deephaven.ui.elements'; + +/** Table */ +export const UITABLE_ELEMENT_TYPE = `${UI_ELEMENTS_NAMESPACE}.UITable` as const; +export type UITableElementName = typeof UITABLE_ELEMENT_TYPE; + +/** Layout */ +export const PANEL_ELEMENT_NAME = `${UI_COMPONENTS_NAMESPACE}.Panel` as const; +export const ROW_ELEMENT_NAME = `${UI_COMPONENTS_NAMESPACE}.Row` as const; +export const COLUMN_ELEMENT_NAME = `${UI_COMPONENTS_NAMESPACE}.Column` as const; +export const STACK_ELEMENT_NAME = `${UI_COMPONENTS_NAMESPACE}.Stack` as const; +export const DASHBOARD_ELEMENT_NAME = + `${UI_COMPONENTS_NAMESPACE}.Dashboard` as const; + +export type PanelElementType = typeof PANEL_ELEMENT_NAME; +export type RowElementType = typeof ROW_ELEMENT_NAME; +export type ColumnElementType = typeof COLUMN_ELEMENT_NAME; +export type StackElementType = typeof STACK_ELEMENT_NAME; +export type DashboardElementType = typeof DASHBOARD_ELEMENT_NAME; + +/** Icons */ +export const ICON_ELEMENT_TYPE_PREFIX = 'deephaven.ui.icons.'; +export type IconElementName = + `${typeof ICON_ELEMENT_TYPE_PREFIX}${keyof typeof icons}`; + +/** HTML */ +export const HTML_ELEMENT_NAME_PREFIX = 'deephaven.ui.html.'; +export type HTMLElementType = + `${typeof HTML_ELEMENT_NAME_PREFIX}${keyof ReactHTML}`; + +/** Specific Components */ +export const FRAGMENT_ELEMENT_NAME = + `${UI_COMPONENTS_NAMESPACE}.Fragment` as const; +export const ITEM_ELEMENT_NAME = `${UI_COMPONENTS_NAMESPACE}.Item` as const; +export const PICKER_ELEMENT_NAME = `${UI_COMPONENTS_NAMESPACE}.Picker` as const; +export const SECTION_ELEMENT_NAME = + `${UI_COMPONENTS_NAMESPACE}.Section` as const; diff --git a/plugins/ui/src/js/src/elements/ElementUtils.test.tsx b/plugins/ui/src/js/src/elements/ElementUtils.test.tsx new file mode 100644 index 000000000..e01c13501 --- /dev/null +++ b/plugins/ui/src/js/src/elements/ElementUtils.test.tsx @@ -0,0 +1,156 @@ +import React from 'react'; +import { Text } from '@adobe/react-spectrum'; +import type { dh } from '@deephaven/jsapi-types'; +import { TestUtils } from '@deephaven/utils'; +import { + ELEMENT_KEY, + fetchReexportedTable, + isPrimitive, + wrapElementChildren, +} from './ElementUtils'; +import ObjectView from './ObjectView'; +import { ITEM_ELEMENT_NAME } from './ElementConstants'; + +const { asMock, createMockProxy } = TestUtils; + +describe('fetchReexportedTable', () => { + it('should return null for null object', async () => { + const actual = await fetchReexportedTable(null); + expect(actual).toBeNull(); + }); + + it('should return table for non-null object', async () => { + const table = createMockProxy(); + + const reexported = createMockProxy(); + asMock(reexported.fetch).mockResolvedValue(table); + + const exported = createMockProxy(); + asMock(exported.reexport).mockResolvedValue(reexported); + + const actual = await fetchReexportedTable(exported); + expect(actual).toBe(table); + }); +}); + +describe('isPrimitive', () => { + it.each(['test', 444, true, false])( + 'should return true primitive values: %s', + value => { + const actual = isPrimitive(value); + expect(actual).toBe(true); + } + ); + + it('should return false for non-primitive values', () => { + const actual = isPrimitive({}); + expect(actual).toBe(false); + }); +}); + +describe('wrapElementChildren', () => { + const mock = { + exportedA1: createMockProxy({ + type: 'mock.exported.a', + }), + exportedA2: createMockProxy({ + type: 'mock.exported.a', + }), + exportedB1: createMockProxy({ + type: 'mock.exported.b', + }), + }; + + it('should return given element if it has no children', () => { + const actual = wrapElementChildren({ [ELEMENT_KEY]: 'mock.element' }); + expect(actual).toBe(actual); + }); + + it.each([ + [ + mock.exportedA1, + , + ], + [ + [mock.exportedA1, mock.exportedA2, mock.exportedB1], + [ + , + , + , + ], + ], + ])( + 'should wrap exported object children in ObjectView: %s, %s', + (children, expectedChildren) => { + const actual = wrapElementChildren({ + [ELEMENT_KEY]: 'mock.element', + props: { children }, + }); + + expect(actual.props?.children).toEqual(expectedChildren); + } + ); + + describe.each([ + ['Some text value', undefined], + [undefined, 'itemKey'], + ])('Item element `textValue`:`%s`, `key`:`%s`', (textValue, itemKey) => { + it.each([ + ['String', String], + [999, 999], + [true, true], + [false, false], + [ + ['String', 999, true, false], + [ + String, + 999, + true, + false, + ], + ], + ])( + 'should wrap primitive item element children in Text elements: %s, %s', + (children, expectedChildren) => { + const givenProps: Record = { children }; + if (textValue != null) { + givenProps.textValue = textValue; + } + + if (itemKey != null) { + givenProps.key = itemKey; + } + + const expectedTextValue = + textValue == null && isPrimitive(children) + ? String(children) + : textValue; + + const expected = { + [ELEMENT_KEY]: ITEM_ELEMENT_NAME, + props: { + key: itemKey ?? textValue, + textValue: expectedTextValue, + children: expectedChildren, + }, + }; + + const actual = wrapElementChildren({ + [ELEMENT_KEY]: ITEM_ELEMENT_NAME, + props: givenProps, + }); + + expect(actual).toEqual(expected); + } + ); + }); +}); diff --git a/plugins/ui/src/js/src/elements/ElementUtils.ts b/plugins/ui/src/js/src/elements/ElementUtils.ts deleted file mode 100644 index 9fd1357a6..000000000 --- a/plugins/ui/src/js/src/elements/ElementUtils.ts +++ /dev/null @@ -1,100 +0,0 @@ -import type { WidgetExportedObject } from '@deephaven/jsapi-types'; - -export const CALLABLE_KEY = '__dhCbid'; -export const OBJECT_KEY = '__dhObid'; -export const ELEMENT_KEY = '__dhElemName'; - -export type CallableNode = { - /** The name of the callable to call */ - [CALLABLE_KEY]: string; -}; - -export type ObjectNode = { - /** The index of the object in the exported objects array */ - [OBJECT_KEY]: number; -}; - -/** - * Describes an element that can be rendered in the UI. - * Extend this type with stricter rules on the element key type to provide types. - * See `SpectrumElementNode` for an example. - */ -export type ElementNode< - K extends string = string, - P extends Record = Record -> = { - /** - * The type of this element. Can be something like `deephaven.ui.components.Panel`, or - * a custom component type defined by the user in their plugin. - */ - [ELEMENT_KEY]: K; - props?: P; -}; - -export type ElementNodeWithChildren< - K extends string = string, - P extends Record = Record -> = ElementNode & { - props: React.PropsWithChildren

; -}; - -export function isObjectNode(obj: unknown): obj is ObjectNode { - return obj != null && typeof obj === 'object' && OBJECT_KEY in obj; -} - -export function isElementNode(obj: unknown): obj is ElementNode { - return obj != null && typeof obj === 'object' && ELEMENT_KEY in obj; -} - -export function isCallableNode(obj: unknown): obj is CallableNode { - return obj != null && typeof obj === 'object' && CALLABLE_KEY in obj; -} - -export function isExportedObject(obj: unknown): obj is WidgetExportedObject { - return ( - obj != null && - typeof obj === 'object' && - typeof (obj as WidgetExportedObject).fetch === 'function' && - typeof (obj as WidgetExportedObject).type === 'string' - ); -} - -/** - * Gets the type of an element object, or `unknown` if it is not an element. - * @param node A node in a document, element or unknown object. - * @returns The type of the element - */ -export function getElementType(node: unknown): string { - return isElementNode(node) ? node[ELEMENT_KEY] : 'unknown'; -} - -export function getElementKey(node: unknown, defaultKey: string): string { - if (!isElementNode(node) || node.props?.key == null) { - return defaultKey; - } - return `${node.props?.key}`; -} - -export const FRAGMENT_ELEMENT_NAME = 'deephaven.ui.components.Fragment'; - -export type FragmentElementType = typeof FRAGMENT_ELEMENT_NAME; - -/** - * Describes a fragment element that can be rendered in the UI. - * Will be placed in the current dashboard, or within a user created dashboard if specified. - */ -export type FragmentElementNode = ElementNode; - -/** - * Check if an object is a FragmentElementNode - * @param obj Object to check - * @returns True if the object is a FragmentElementNode - */ -export function isFragmentElementNode( - obj: unknown -): obj is FragmentElementNode { - return ( - isElementNode(obj) && - (obj as ElementNode)[ELEMENT_KEY] === FRAGMENT_ELEMENT_NAME - ); -} diff --git a/plugins/ui/src/js/src/elements/ElementUtils.tsx b/plugins/ui/src/js/src/elements/ElementUtils.tsx new file mode 100644 index 000000000..3058ec267 --- /dev/null +++ b/plugins/ui/src/js/src/elements/ElementUtils.tsx @@ -0,0 +1,214 @@ +import React from 'react'; +import { Text } from '@adobe/react-spectrum'; +import type { dh } from '@deephaven/jsapi-types'; +import { ITEM_ELEMENT_NAME } from './ElementConstants'; +import ObjectView from './ObjectView'; + +export const CALLABLE_KEY = '__dhCbid'; +export const OBJECT_KEY = '__dhObid'; +export const ELEMENT_KEY = '__dhElemName'; + +export type CallableNode = { + /** The name of the callable to call */ + [CALLABLE_KEY]: string; +}; + +export type ObjectNode = { + /** The index of the object in the exported objects array */ + [OBJECT_KEY]: number; +}; + +/** + * Describes an element that can be rendered in the UI. + * Extend this type with stricter rules on the element key type to provide types. + * See `SpectrumElementNode` for an example. + */ +export type ElementNode< + K extends string = string, + P extends Record = Record +> = { + /** + * The type of this element. Can be something like `deephaven.ui.components.Panel`, or + * a custom component type defined by the user in their plugin. + */ + [ELEMENT_KEY]: K; + props?: P; +}; + +export type ElementNodeWithChildren< + K extends string = string, + P extends Record = Record +> = ElementNode & { + props: React.PropsWithChildren

; +}; + +export function isObjectNode(obj: unknown): obj is ObjectNode { + return obj != null && typeof obj === 'object' && OBJECT_KEY in obj; +} + +/** + * Re-export and fetch the table from the given exported object. + * @param exportedObject + * @returns Promise that resolves to the table or null if given + * object is null + */ +export async function fetchReexportedTable( + exportedObject: dh.WidgetExportedObject | null +): Promise { + if (exportedObject == null) { + return null; + } + + const reexportedTable = await exportedObject.reexport(); + return reexportedTable.fetch(); +} + +/** + * Type guard for `ElementNode` objects. If `name` is provided, it will also check + * that the element name matches the provided name. + * @param obj The object to check + * @param name Optional name to check + * @returns `true` if the object matches the `ElementNode` type and optionally + * a given element name + */ +export function isElementNode(obj: unknown, name?: string): obj is ElementNode { + const isElement = + obj != null && typeof obj === 'object' && ELEMENT_KEY in obj; + + if (name == null) { + return isElement; + } + + return isElement && obj[ELEMENT_KEY] === name; +} + +export function isCallableNode(obj: unknown): obj is CallableNode { + return obj != null && typeof obj === 'object' && CALLABLE_KEY in obj; +} + +export function isExportedObject(obj: unknown): obj is dh.WidgetExportedObject { + return ( + obj != null && + typeof obj === 'object' && + typeof (obj as dh.WidgetExportedObject).fetch === 'function' && + typeof (obj as dh.WidgetExportedObject).type === 'string' + ); +} + +/** + * Typeguard for primitive values. + * @param value The value to check + * @returns True if given value is a string, number, or boolean + */ +export function isPrimitive( + value: unknown +): value is string | number | boolean { + return ( + typeof value === 'string' || + typeof value === 'number' || + typeof value === 'boolean' + ); +} + +/** + * Gets the type of an element object, or `unknown` if it is not an element. + * @param node A node in a document, element or unknown object. + * @returns The type of the element + */ +export function getElementType(node: unknown): string { + return isElementNode(node) ? node[ELEMENT_KEY] : 'unknown'; +} + +export function getElementKey(node: unknown, defaultKey: string): string { + if (!isElementNode(node) || node.props?.key == null) { + return defaultKey; + } + return `${node.props?.key}`; +} + +export function mapItemOrArray(itemOrArray: T, mapItem: (item: T) => T): T; +export function mapItemOrArray( + itemOrArray: T[], + mapItem: (item: T) => T +): T[]; +export function mapItemOrArray( + itemOrArray: T | T[], + mapItem: (item: T) => T +): T | T[] { + if (Array.isArray(itemOrArray)) { + return itemOrArray.map(mapItem); + } + + return mapItem(itemOrArray); +} + +/** + * Wrap certain children of an element node with the appropriate React components. + * 1. Exported objects are wrapped with `ObjectView` + * 2. Primitive children of `Item` elements are wrapped with `Text`, and the + * `textValue` prop of `Item` element is set if it doesn't exist and the + * original had a single primitive child + * @param element The element node to wrap children for + * @returns A new element node with wrapped children or the original if no + * children are present + */ +export function wrapElementChildren(element: ElementNode): ElementNode { + if (element.props?.children == null) { + return element; + } + + const newProps = { ...element.props }; + + const isItemElement = isElementNode(element, ITEM_ELEMENT_NAME); + + // We will be wrapping all primitive `Item` children in a `Text` element to + // ensure proper layout. Since `Item` components require a `textValue` prop + // if they don't contain exactly 1 `string` child, this will trigger a11y + // warnings. We can set a default `textValue` prop in cases where the + // original had a single primitive child. + if (isItemElement) { + if (!('textValue' in newProps) && isPrimitive(newProps.children)) { + newProps.textValue = String(newProps.children); + } + + if (!('key' in newProps)) { + newProps.key = newProps.textValue; + } + } + + // Derive child keys based on type + index of the occurrence of the type + const typeMap = new Map(); + const getChildKey = (type: string | null | undefined): string => { + const typeCount = typeMap.get(String(type)) ?? 0; + typeMap.set(String(type), typeCount + 1); + return `${type}-${typeCount}`; + }; + + const children = Array.isArray(newProps.children) + ? newProps.children + : [newProps.children]; + + const wrappedChildren = children.map(child => { + // Exported objects need to be converted to `ObjectView` to be rendered + if (isExportedObject(child)) { + return ; + } + + // Auto wrap primitive children of `Item` elements in `Text` elements + if (isItemElement && isPrimitive(child)) { + return {String(child)}; + } + + return child; + }); + + // Keep the children as an array or single item based on the original value + newProps.children = Array.isArray(newProps.children) + ? wrappedChildren + : wrappedChildren[0]; + + return { + ...element, + props: newProps, + }; +} diff --git a/plugins/ui/src/js/src/elements/HTMLElementUtils.ts b/plugins/ui/src/js/src/elements/HTMLElementUtils.ts index e01124feb..d7926c48c 100644 --- a/plugins/ui/src/js/src/elements/HTMLElementUtils.ts +++ b/plugins/ui/src/js/src/elements/HTMLElementUtils.ts @@ -1,11 +1,7 @@ import { ReactHTML } from 'react'; +import { HTMLElementType, HTML_ELEMENT_NAME_PREFIX } from './ElementConstants'; import { ELEMENT_KEY, ElementNode, isElementNode } from './ElementUtils'; -export const HTML_ELEMENT_NAME_PREFIX = 'deephaven.ui.html.'; - -export type HTMLElementType = - `${typeof HTML_ELEMENT_NAME_PREFIX}${keyof ReactHTML}`; - /** * Describes an HTML element that can be rendered in the UI. * The tag used for the HTML element is the name of the element without the prefix. diff --git a/plugins/ui/src/js/src/elements/IconElementUtils.ts b/plugins/ui/src/js/src/elements/IconElementUtils.ts index 9a6fc2980..871d23a25 100644 --- a/plugins/ui/src/js/src/elements/IconElementUtils.ts +++ b/plugins/ui/src/js/src/elements/IconElementUtils.ts @@ -1,11 +1,7 @@ import * as icons from '@deephaven/icons'; +import { IconElementName, ICON_ELEMENT_TYPE_PREFIX } from './ElementConstants'; import { ELEMENT_KEY, ElementNode, isElementNode } from './ElementUtils'; -export const ICON_ELEMENT_TYPE_PREFIX = 'deephaven.ui.icons.'; - -export type IconElementName = - `${typeof ICON_ELEMENT_TYPE_PREFIX}${keyof typeof icons}`; - /** * Describes an icon element that can be rendered in the UI. * The name of the icon is the name of the element without the prefix. diff --git a/plugins/ui/src/js/src/elements/ObjectView.tsx b/plugins/ui/src/js/src/elements/ObjectView.tsx index 630110c89..cc6083283 100644 --- a/plugins/ui/src/js/src/elements/ObjectView.tsx +++ b/plugins/ui/src/js/src/elements/ObjectView.tsx @@ -1,36 +1,34 @@ import React, { useCallback, useMemo } from 'react'; import Log from '@deephaven/log'; import { isWidgetPlugin, usePlugins } from '@deephaven/plugin'; -import type { Widget, WidgetExportedObject } from '@deephaven/jsapi-types'; +import type { dh } from '@deephaven/jsapi-types'; const log = Log.module('@deephaven/js-plugin-ui/ObjectView'); -export type ObjectViewProps = { object: WidgetExportedObject }; +export type ObjectViewProps = { object: dh.WidgetExportedObject }; function ObjectView(props: ObjectViewProps) { const { object } = props; log.info('Object is', object); + const { type } = object; const fetch = useCallback(async () => { // We re-export the object in case this object is used in multiple places or closed/opened multiple times const reexportedObject = await object.reexport(); - return reexportedObject.fetch() as Promise; + return reexportedObject.fetch() as Promise; }, [object]); const plugins = usePlugins(); const plugin = useMemo( () => - [...plugins.values()] - .filter(isWidgetPlugin) - .find(p => [p.supportedTypes].flat().includes(object.type)), - [plugins, object.type] + type == null + ? null + : [...plugins.values()] + .filter(isWidgetPlugin) + .find(p => [p.supportedTypes].flat().includes(type)), + [plugins, type] ); - if (object == null) { - // Still loading - return null; - } - if (plugin != null) { const Component = plugin.component; // eslint-disable-next-line react/jsx-props-no-spreading diff --git a/plugins/ui/src/js/src/elements/Picker.tsx b/plugins/ui/src/js/src/elements/Picker.tsx new file mode 100644 index 000000000..d7b1b74ef --- /dev/null +++ b/plugins/ui/src/js/src/elements/Picker.tsx @@ -0,0 +1,48 @@ +import React, { ReactElement } from 'react'; +import { + Picker as DHPicker, + PickerProps as DHPickerProps, +} from '@deephaven/components'; +import { + Picker as DHPickerJSApi, + PickerProps as DHPickerJSApiProps, + useTableClose, +} from '@deephaven/jsapi-components'; +import { isElementOfType, usePromiseFactory } from '@deephaven/react-hooks'; +import { SerializedPickerEventProps, usePickerProps } from './usePickerProps'; +import ObjectView, { ObjectViewProps } from './ObjectView'; +import { fetchReexportedTable } from './ElementUtils'; + +type WrappedDHPickerJSApiProps = Omit & { + children: ReactElement; +}; + +export type PickerProps = (DHPickerProps | WrappedDHPickerJSApiProps) & + SerializedPickerEventProps; + +function Picker({ children, ...props }: PickerProps) { + const pickerProps = usePickerProps(props); + + const isObjectView = isElementOfType(children, ObjectView); + + const maybeExportedTable = + isObjectView && children.props.object.type === 'Table' + ? children.props.object + : null; + + const { data: table } = usePromiseFactory(fetchReexportedTable, [ + maybeExportedTable, + ]); + + useTableClose(table); + + if (isObjectView) { + // eslint-disable-next-line react/jsx-props-no-spreading + return table && ; + } + + // eslint-disable-next-line react/jsx-props-no-spreading + return {children}; +} + +export default Picker; diff --git a/plugins/ui/src/js/src/elements/SpectrumElementUtils.ts b/plugins/ui/src/js/src/elements/SpectrumElementUtils.ts index 9cd44b1d0..1f3131040 100644 --- a/plugins/ui/src/js/src/elements/SpectrumElementUtils.ts +++ b/plugins/ui/src/js/src/elements/SpectrumElementUtils.ts @@ -12,7 +12,6 @@ import { Switch, Tabs, TabList, - TabPanels, Text, ToggleButton, View, @@ -25,6 +24,7 @@ import { Form, RangeSlider, Slider, + TabPanels, TextField, } from './spectrum'; import { ELEMENT_KEY, ElementNode, isElementNode } from './ElementUtils'; @@ -89,9 +89,16 @@ export function isSpectrumElementNode( export function getSpectrumComponent( name: SpectrumElementName ): ValueOf { - return SpectrumSupportedTypes[ - name.substring( - SPECTRUM_ELEMENT_TYPE_PREFIX.length - ) as keyof typeof SpectrumSupportedTypes - ]; + const Component = + SpectrumSupportedTypes[ + name.substring( + SPECTRUM_ELEMENT_TYPE_PREFIX.length + ) as keyof typeof SpectrumSupportedTypes + ]; + + if (Component == null) { + throw new Error(`Unknown Spectrum component '${name}'`); + } + + return Component; } diff --git a/plugins/ui/src/js/src/elements/SpectrumElementView.tsx b/plugins/ui/src/js/src/elements/SpectrumElementView.tsx index a83ef2daf..a610a21a3 100644 --- a/plugins/ui/src/js/src/elements/SpectrumElementView.tsx +++ b/plugins/ui/src/js/src/elements/SpectrumElementView.tsx @@ -14,10 +14,13 @@ export function SpectrumElementView({ element, }: SpectrumElementViewProps): JSX.Element | null { const { [ELEMENT_KEY]: name, props = {} } = element; - const Component = getSpectrumComponent(name); + + const Component = getSpectrumComponent(name) as React.ComponentType; + if (Component == null) { throw new Error(`Unknown Spectrum component ${name}`); } + return ( // eslint-disable-next-line react/jsx-props-no-spreading, @typescript-eslint/no-explicit-any diff --git a/plugins/ui/src/js/src/elements/UITable.tsx b/plugins/ui/src/js/src/elements/UITable.tsx index 75daf611d..9d901f4df 100644 --- a/plugins/ui/src/js/src/elements/UITable.tsx +++ b/plugins/ui/src/js/src/elements/UITable.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useMemo, useState } from 'react'; +import { useSelector } from 'react-redux'; import { DehydratedQuickFilter, IrisGrid, @@ -8,13 +9,21 @@ import { IrisGridUtils, } from '@deephaven/iris-grid'; import { useApi } from '@deephaven/jsapi-bootstrap'; -import type { Table } from '@deephaven/jsapi-types'; +import type { dh } from '@deephaven/jsapi-types'; import Log from '@deephaven/log'; +import { getSettings, RootState } from '@deephaven/redux'; +import { EMPTY_ARRAY } from '@deephaven/utils'; import { UITableProps } from './UITableUtils'; +import UITableMouseHandler from './UITableMouseHandler'; const log = Log.module('@deephaven/js-plugin-ui/UITable'); function UITable({ + onCellPress, + onCellDoublePress, + onColumnPress, + onColumnDoublePress, + onRowPress, onRowDoublePress, canSearch, filters, @@ -24,8 +33,9 @@ function UITable({ }: UITableProps) { const dh = useApi(); const [model, setModel] = useState(); - const [columns, setColumns] = useState(); + const [columns, setColumns] = useState(); const utils = useMemo(() => new IrisGridUtils(dh), [dh]); + const settings = useSelector(getSettings); const hydratedSorts = useMemo(() => { if (sorts !== undefined && columns !== undefined) { @@ -59,7 +69,7 @@ function UITable({ let isCancelled = false; async function loadModel() { const reexportedTable = await exportedTable.reexport(); - const newTable = (await reexportedTable.fetch()) as Table; + const newTable = (await reexportedTable.fetch()) as dh.Table; const newModel = await IrisGridModelFactory.makeModel(dh, newTable); if (!isCancelled) { setColumns(newTable.columns); @@ -74,20 +84,48 @@ function UITable({ }; }, [dh, exportedTable]); + const mouseHandlers = useMemo( + () => + model + ? [ + new UITableMouseHandler( + model, + onCellPress, + onCellDoublePress, + onColumnPress, + onColumnDoublePress, + onRowPress, + onRowDoublePress + ), + ] + : EMPTY_ARRAY, + [ + model, + onCellPress, + onCellDoublePress, + onColumnPress, + onColumnDoublePress, + onRowPress, + onRowDoublePress, + ] + ); + const irisGridProps: Partial = useMemo( () => ({ - onDataSelected: onRowDoublePress, + mouseHandlers, alwaysFetchColumns, showSearchBar: canSearch, sorts: hydratedSorts, quickFilters: hydratedQuickFilters, + settings, }), [ - onRowDoublePress, + mouseHandlers, alwaysFetchColumns, canSearch, hydratedSorts, hydratedQuickFilters, + settings, ] ); diff --git a/plugins/ui/src/js/src/elements/UITableMouseHandler.ts b/plugins/ui/src/js/src/elements/UITableMouseHandler.ts new file mode 100644 index 000000000..c8ba66d20 --- /dev/null +++ b/plugins/ui/src/js/src/elements/UITableMouseHandler.ts @@ -0,0 +1,127 @@ +import { + EventHandlerResult, + GridMouseHandler, + GridPoint, + isExpandableGridModel, +} from '@deephaven/grid'; +import { IrisGridModel, RowIndex } from '@deephaven/iris-grid'; +import { + CellData, + ColumnIndex, + RowDataMap, + UITableProps, +} from './UITableUtils'; + +function getCellData( + columnIndex: ColumnIndex, + rowIndex: RowIndex, + model: IrisGridModel +): CellData { + const column = model.columns[columnIndex]; + const { type } = column; + const value = model.valueForCell(columnIndex, rowIndex); + const text = model.textForCell(columnIndex, rowIndex); + return { + value, + text, + type, + }; +} + +/** + * Get the data map for the given row + * @param rowIndex Row to get the data map for + * @returns Data map for the row + */ +function getRowDataMap(rowIndex: RowIndex, model: IrisGridModel): RowDataMap { + const { columns, groupedColumns } = model; + const dataMap: RowDataMap = {}; + for (let i = 0; i < columns.length; i += 1) { + const column = columns[i]; + const { name } = column; + const isExpandable = + isExpandableGridModel(model) && model.isRowExpandable(rowIndex); + const isGrouped = groupedColumns.find(c => c.name === name) != null; + dataMap[name] = { + ...getCellData(i, rowIndex, model), + isGrouped, + isExpandable, + }; + } + return dataMap; +} + +/** + * Mouse handler for UITable. Will call the appropriate callbacks when a cell, row, or column is clicked or double clicked with the data structure expected. + */ +class UITableMouseHandler extends GridMouseHandler { + private model: IrisGridModel; + + private onCellPress: UITableProps['onCellPress']; + + private onCellDoublePress: UITableProps['onCellDoublePress']; + + private onColumnPress: UITableProps['onColumnPress']; + + private onColumnDoublePress: UITableProps['onColumnDoublePress']; + + private onRowPress: UITableProps['onRowPress']; + + private onRowDoublePress: UITableProps['onRowDoublePress']; + + constructor( + model: IrisGridModel, + onCellPress: UITableProps['onCellPress'], + onCellDoublePress: UITableProps['onCellDoublePress'], + onColumnPress: UITableProps['onColumnPress'], + onColumnDoublePress: UITableProps['onColumnDoublePress'], + onRowPress: UITableProps['onRowPress'], + onRowDoublePress: UITableProps['onRowDoublePress'] + ) { + super(890); + this.model = model; + this.onCellPress = onCellPress; + this.onCellDoublePress = onCellDoublePress; + this.onColumnPress = onColumnPress; + this.onColumnDoublePress = onColumnDoublePress; + this.onRowPress = onRowPress; + this.onRowDoublePress = onRowDoublePress; + } + + onClick(gridPoint: GridPoint): EventHandlerResult { + const { column, row } = gridPoint; + const { model, onCellPress, onRowPress, onColumnPress } = this; + if (onCellPress != null && column != null && row != null) { + const cellData = getCellData(column, row, model); + onCellPress([column, row], cellData); + } + if (onRowPress != null && row != null) { + const rowData = getRowDataMap(row, model); + onRowPress(row, rowData); + } + if (onColumnPress && column != null) { + onColumnPress(model.columns[column].name); + } + return false; + } + + onDoubleClick(gridPoint: GridPoint): EventHandlerResult { + const { column, row } = gridPoint; + const { model, onCellDoublePress, onRowDoublePress, onColumnDoublePress } = + this; + if (onCellDoublePress != null && column != null && row != null) { + const cellData = getCellData(column, row, model); + onCellDoublePress([column, row], cellData); + } + if (onRowDoublePress != null && row != null) { + const rowData = getRowDataMap(row, model); + onRowDoublePress(row, rowData); + } + if (onColumnDoublePress && column != null) { + onColumnDoublePress(model.columns[column].name); + } + return false; + } +} + +export default UITableMouseHandler; diff --git a/plugins/ui/src/js/src/elements/UITableUtils.tsx b/plugins/ui/src/js/src/elements/UITableUtils.tsx index 4bc6a2c11..b86dc7bb4 100644 --- a/plugins/ui/src/js/src/elements/UITableUtils.tsx +++ b/plugins/ui/src/js/src/elements/UITableUtils.tsx @@ -1,17 +1,34 @@ -import type { WidgetExportedObject } from '@deephaven/jsapi-types'; -import { DehydratedSort } from '@deephaven/iris-grid'; +import type { dh } from '@deephaven/jsapi-types'; +import { ColumnName, DehydratedSort, RowIndex } from '@deephaven/iris-grid'; import { ELEMENT_KEY, ElementNode, isElementNode } from './ElementUtils'; +import { UITableElementName, UITABLE_ELEMENT_TYPE } from './ElementConstants'; -export const UITABLE_ELEMENT_TYPE = 'deephaven.ui.elements.UITable'; +export type CellData = { + type: string; + text: string; + value: unknown; +}; -export type UITableElementName = typeof UITABLE_ELEMENT_TYPE; +export type RowDataValue = CellData & { + isExpandable: boolean; + isGrouped: boolean; +}; + +export type ColumnIndex = number; + +export type RowDataMap = Record; export interface UITableProps { - table: WidgetExportedObject; - onRowDoublePress?: ( - rowIndex: number, - rowData: Record + table: dh.WidgetExportedObject; + onCellPress?: (cellIndex: [ColumnIndex, RowIndex], data: CellData) => void; + onCellDoublePress?: ( + cellIndex: [ColumnIndex, RowIndex], + data: CellData ) => void; + onRowPress?: (rowIndex: RowIndex, rowData: RowDataMap) => void; + onRowDoublePress?: (rowIndex: RowIndex, rowData: RowDataMap) => void; + onColumnPress?: (columnName: ColumnName) => void; + onColumnDoublePress?: (columnName: ColumnName) => void; alwaysFetchColumns?: string[]; canSearch?: boolean; filters?: Record; diff --git a/plugins/ui/src/js/src/elements/spectrum/TabPanels.tsx b/plugins/ui/src/js/src/elements/spectrum/TabPanels.tsx new file mode 100644 index 000000000..b13310dc5 --- /dev/null +++ b/plugins/ui/src/js/src/elements/spectrum/TabPanels.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { + TabPanels as SpectrumTabPanels, + SpectrumTabPanelsProps, +} from '@adobe/react-spectrum'; + +function TabPanels(props: SpectrumTabPanelsProps) { + const { UNSAFE_style: unsafeStyle, ...otherProps } = props; + + return ( + + ); +} + +TabPanels.displayName = 'TabPanels'; + +export default TabPanels; diff --git a/plugins/ui/src/js/src/elements/spectrum/index.ts b/plugins/ui/src/js/src/elements/spectrum/index.ts index 27c96d7f3..c7b144d93 100644 --- a/plugins/ui/src/js/src/elements/spectrum/index.ts +++ b/plugins/ui/src/js/src/elements/spectrum/index.ts @@ -10,4 +10,5 @@ export { default as Flex } from './Flex'; export { default as Form } from './Form'; export { default as RangeSlider } from './RangeSlider'; export { default as Slider } from './Slider'; +export { default as TabPanels } from './TabPanels'; export { default as TextField } from './TextField'; diff --git a/plugins/ui/src/js/src/elements/usePickerProps.ts b/plugins/ui/src/js/src/elements/usePickerProps.ts new file mode 100644 index 000000000..5261f3de6 --- /dev/null +++ b/plugins/ui/src/js/src/elements/usePickerProps.ts @@ -0,0 +1,48 @@ +import { + SerializedFocusEventCallback, + useFocusEventCallback, +} from './spectrum/useFocusEventCallback'; +import { + SerializedKeyboardEventCallback, + useKeyboardEventCallback, +} from './spectrum/useKeyboardEventCallback'; + +export interface SerializedPickerEventProps { + /** Handler that is called when the element receives focus. */ + onFocus?: SerializedFocusEventCallback; + + /** Handler that is called when the element loses focus. */ + onBlur?: SerializedFocusEventCallback; + + /** Handler that is called when a key is pressed */ + onKeyDown?: SerializedKeyboardEventCallback; + + /** Handler that is called when a key is released */ + onKeyUp?: SerializedKeyboardEventCallback; +} + +/** + * Wrap Picker props with the appropriate serialized event callbacks. + * @param props Props to wrap + * @returns Wrapped props + */ +export function usePickerProps(props: SerializedPickerEventProps & T) { + const { onFocus, onBlur, onKeyDown, onKeyUp, ...otherProps } = props; + + const serializedOnFocus = useFocusEventCallback(onFocus); + const serializedOnBlur = useFocusEventCallback(onBlur); + const serializedOnKeyDown = useKeyboardEventCallback(onKeyDown); + const serializedOnKeyUp = useKeyboardEventCallback(onKeyUp); + + return { + onFocus: serializedOnFocus, + onBlur: serializedOnBlur, + onKeyDown: serializedOnKeyDown, + onKeyUp: serializedOnKeyUp, + // The @deephaven/components `Picker` has its own normalization logic that + // handles primitive children types (string, number, boolean). It also + // handles nested children inside of `Item` and `Section` components, so + // we are intentionally not wrapping `otherProps` in `mapSpectrumProps` + ...otherProps, + }; +} diff --git a/plugins/ui/src/js/src/layout/LayoutUtils.test.tsx b/plugins/ui/src/js/src/layout/LayoutUtils.test.tsx index 14c52e889..da8535034 100644 --- a/plugins/ui/src/js/src/layout/LayoutUtils.test.tsx +++ b/plugins/ui/src/js/src/layout/LayoutUtils.test.tsx @@ -3,14 +3,10 @@ import React from 'react'; import { TestUtils } from '@deephaven/utils'; import Column from './Column'; import { - PANEL_ELEMENT_NAME, - ROW_ELEMENT_NAME, - COLUMN_ELEMENT_NAME, isPanelElementNode, isRowElementNode, isColumnElementNode, isStackElementNode, - STACK_ELEMENT_NAME, normalizeDashboardChildren, normalizeColumnChildren, normalizeRowChildren, @@ -19,6 +15,12 @@ import { import Row from './Row'; import Stack from './Stack'; import ReactPanel from './ReactPanel'; +import { + PANEL_ELEMENT_NAME, + ROW_ELEMENT_NAME, + COLUMN_ELEMENT_NAME, + STACK_ELEMENT_NAME, +} from '../elements/ElementConstants'; beforeEach(() => { TestUtils.disableConsoleOutput(); diff --git a/plugins/ui/src/js/src/layout/LayoutUtils.tsx b/plugins/ui/src/js/src/layout/LayoutUtils.tsx index 230c276d9..459565c05 100644 --- a/plugins/ui/src/js/src/layout/LayoutUtils.tsx +++ b/plugins/ui/src/js/src/layout/LayoutUtils.tsx @@ -13,18 +13,18 @@ import Column from './Column'; import Row from './Row'; import Stack from './Stack'; import ReactPanel from './ReactPanel'; - -export const PANEL_ELEMENT_NAME = 'deephaven.ui.components.Panel'; -export const ROW_ELEMENT_NAME = 'deephaven.ui.components.Row'; -export const COLUMN_ELEMENT_NAME = 'deephaven.ui.components.Column'; -export const STACK_ELEMENT_NAME = 'deephaven.ui.components.Stack'; -export const DASHBOARD_ELEMENT_NAME = 'deephaven.ui.components.Dashboard'; - -export type PanelElementType = typeof PANEL_ELEMENT_NAME; -export type RowElementType = typeof ROW_ELEMENT_NAME; -export type ColumnElementType = typeof COLUMN_ELEMENT_NAME; -export type StackElementType = typeof STACK_ELEMENT_NAME; -export type DashboardElementType = typeof DASHBOARD_ELEMENT_NAME; +import { + ColumnElementType, + COLUMN_ELEMENT_NAME, + DashboardElementType, + DASHBOARD_ELEMENT_NAME, + PanelElementType, + PANEL_ELEMENT_NAME, + RowElementType, + ROW_ELEMENT_NAME, + StackElementType, + STACK_ELEMENT_NAME, +} from '../elements/ElementConstants'; export type GoldenLayoutParent = RowOrColumn | GLStack | Root; diff --git a/plugins/ui/src/js/src/layout/PortalPanel.tsx b/plugins/ui/src/js/src/layout/PortalPanel.tsx index 6556720c1..642d7b090 100644 --- a/plugins/ui/src/js/src/layout/PortalPanel.tsx +++ b/plugins/ui/src/js/src/layout/PortalPanel.tsx @@ -1,14 +1,7 @@ import React, { useEffect, useRef } from 'react'; import { DashboardPanelProps } from '@deephaven/dashboard'; import { Panel } from '@deephaven/dashboard-core-plugins'; - -export interface PortalPanelProps extends DashboardPanelProps { - /** Listener for when the portal panel is unmounted/closed */ - onClose: () => void; - - /** Listener for when the portal panel is opened and ready */ - onOpen: (element: HTMLElement) => void; -} +import { emitPortalClosed, emitPortalOpened } from './PortalPanelEvent'; /** * Adds and tracks a panel to the GoldenLayout. @@ -17,9 +10,7 @@ export interface PortalPanelProps extends DashboardPanelProps { function PortalPanel({ glContainer, glEventHub, - onClose, - onOpen, -}: PortalPanelProps): JSX.Element { +}: DashboardPanelProps): JSX.Element { const ref = useRef(null); useEffect(() => { @@ -27,12 +18,12 @@ function PortalPanel({ if (current == null) { return; } - onOpen(current); + emitPortalOpened(glEventHub, { container: glContainer, element: current }); return () => { - onClose(); + emitPortalClosed(glEventHub, { container: glContainer }); }; - }, [onClose, onOpen]); + }, [glContainer, glEventHub]); return ( diff --git a/plugins/ui/src/js/src/layout/PortalPanelEvent.ts b/plugins/ui/src/js/src/layout/PortalPanelEvent.ts new file mode 100644 index 000000000..d187c76fd --- /dev/null +++ b/plugins/ui/src/js/src/layout/PortalPanelEvent.ts @@ -0,0 +1,119 @@ +import { DashboardPanelProps } from '@deephaven/dashboard'; +import { useEffect } from 'react'; + +/** + * Emitted when a portal panel is opened + */ +export const PORTAL_OPENED = 'PortalPanelEvent.PORTAL_OPENED'; + +/** + * Emitted when a portal panel is closed + */ +export const PORTAL_CLOSED = 'PortalPanelEvent.PORTAL_CLOSED'; + +export type EventListenerRemover = () => void; +export type EventListenFunction = ( + eventHub: DashboardPanelProps['glEventHub'], + handler: (p: TPayload) => void +) => EventListenerRemover; + +export type EventEmitFunction = ( + eventHub: DashboardPanelProps['glEventHub'], + payload: TPayload +) => void; + +export type EventListenerHook = ( + eventHub: DashboardPanelProps['glEventHub'], + handler: (p: TPayload) => void +) => void; + +/** + * Listen for an event + * @param eventHub The event hub to listen to + * @param event The event to listen for + * @param handler The handler to call when the event is emitted + * @returns A function to stop listening for the event + */ +export function listenForEvent( + eventHub: DashboardPanelProps['glEventHub'], + event: string, + handler: (p: TPayload) => void +): EventListenerRemover { + eventHub.on(event, handler); + return () => { + eventHub.off(event, handler); + }; +} + +export function makeListenFunction( + event: string +): EventListenFunction { + return (eventHub, handler) => listenForEvent(eventHub, event, handler); +} + +export function makeEmitFunction( + event: string +): EventEmitFunction { + return (eventHub, payload) => { + eventHub.emit(event, payload); + }; +} + +export function makeUseListenerFunction( + event: string +): EventListenerHook { + return (eventHub, handler) => { + useEffect( + () => listenForEvent(eventHub, event, handler), + [eventHub, handler] + ); + }; +} + +/** + * Create listener, emitter, and hook functions for an event + * @param event Name of the event to create functions for + * @returns Listener, Emitter, and Hook functions for the event + */ +export function makeEventFunctions(event: string): { + listen: EventListenFunction; + emit: EventEmitFunction; + useListener: EventListenerHook; +} { + return { + listen: makeListenFunction(event), + emit: makeEmitFunction(event), + useListener: makeUseListenerFunction(event), + }; +} + +export interface PortalOpenedPayload { + /** + * Golden Layout Container object. + * Can get the ID of the container using `LayoutUtils.getIdFromContainer` to identify this container. + */ + container: DashboardPanelProps['glContainer']; + + /** Element to use for the portal */ + element: HTMLElement; +} + +export interface PortalClosedPayload { + /** + * Golden Layout Container object. + * Can get the ID of the container using `LayoutUtils.getIdFromContainer` to identify this container. + */ + container: DashboardPanelProps['glContainer']; +} + +export const { + listen: listenForPortalOpened, + emit: emitPortalOpened, + useListener: usePortalOpenedListener, +} = makeEventFunctions(PORTAL_OPENED); + +export const { + listen: listenForPortalClosed, + emit: emitPortalClosed, + useListener: usePortalClosedListener, +} = makeEventFunctions(PORTAL_CLOSED); diff --git a/plugins/ui/src/js/src/layout/PortalPanelManager.test.tsx b/plugins/ui/src/js/src/layout/PortalPanelManager.test.tsx new file mode 100644 index 000000000..62e7a9292 --- /dev/null +++ b/plugins/ui/src/js/src/layout/PortalPanelManager.test.tsx @@ -0,0 +1,129 @@ +import React from 'react'; +import { act, render } from '@testing-library/react'; +import PortalPanelManager from './PortalPanelManager'; + +// Mock the usePortalOpenedListener and usePortalClosedListener functions +const mockUsePortalOpenedListener = jest.fn(); +const mockUsePortalClosedListener = jest.fn(); +jest.mock('./PortalPanelEvent', () => ({ + usePortalClosedListener: jest.fn((...args) => { + mockUsePortalClosedListener(...args); + }), + usePortalOpenedListener: jest.fn((...args) => { + mockUsePortalOpenedListener(...args); + }), +})); + +const mockProvider = jest.fn(({ children }) => children); +jest.mock('./PortalPanelManagerContext', () => ({ + PortalPanelManagerContext: { + Provider: jest.fn(props => mockProvider(props)), + }, +})); + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('PortalPanelManager', () => { + it('should call the usePortalOpenedListener and usePortalClosedListener with the correct callbacks', () => { + // Render the PortalPanelManager component + render( + +

Test
+ + ); + + // Verify that the usePortalOpenedListener and usePortalClosedListener functions are called with the correct callbacks + expect(mockUsePortalOpenedListener).toHaveBeenCalledTimes(1); + expect(mockUsePortalClosedListener).toHaveBeenCalledTimes(1); + }); + + it('should render the children wrapped in the PortalPanelManagerContext.Provider', () => { + // Render the PortalPanelManager component with children + const { getByText } = render( + +
Test
+
+ ); + + // Verify that the children are rendered and wrapped in the PortalPanelManagerContext.Provider + expect(getByText('Test')).toBeInTheDocument(); + }); + + it('should add portals to the context when they are opened', () => { + const mockContainer1 = { _config: { id: 'test-container-1' } }; + const mockElement1 = document.createElement('div'); + const mockContainer2 = { _config: { id: 'test-container-2' } }; + const mockElement2 = document.createElement('div'); + + // Render the PortalPanelManager component + render( + +
Test
+
+ ); + + // Verify that the setPortals function is called when a portal is opened + expect(mockProvider).toHaveBeenCalledWith( + expect.objectContaining({ value: new Map() }) + ); + mockProvider.mockClear(); + + act(() => { + mockUsePortalOpenedListener.mock.calls[0][1]({ + container: mockContainer1, + element: mockElement1, + }); + }); + + expect(mockProvider).toHaveBeenCalledWith( + expect.objectContaining({ + value: new Map([[mockContainer1, mockElement1]]), + }) + ); + mockProvider.mockClear(); + + act(() => { + mockUsePortalOpenedListener.mock.calls[0][1]({ + container: mockContainer2, + element: mockElement2, + }); + }); + + expect(mockProvider).toHaveBeenCalledWith( + expect.objectContaining({ + value: new Map([ + [mockContainer1, mockElement1], + [mockContainer2, mockElement2], + ]), + }) + ); + mockProvider.mockClear(); + + // Verify the mock provider gets updated portals when portals are closed + act(() => { + mockUsePortalClosedListener.mock.calls[0][1]({ + container: mockContainer1, + }); + }); + + expect(mockProvider).toHaveBeenCalledWith( + expect.objectContaining({ + value: new Map([[mockContainer2, mockElement2]]), + }) + ); + mockProvider.mockClear(); + + // Close the final portal + act(() => { + mockUsePortalClosedListener.mock.calls[0][1]({ + container: mockContainer2, + }); + }); + + expect(mockProvider).toHaveBeenCalledWith( + expect.objectContaining({ value: new Map() }) + ); + }); +}); diff --git a/plugins/ui/src/js/src/layout/PortalPanelManager.tsx b/plugins/ui/src/js/src/layout/PortalPanelManager.tsx new file mode 100644 index 000000000..4533ac9d6 --- /dev/null +++ b/plugins/ui/src/js/src/layout/PortalPanelManager.tsx @@ -0,0 +1,60 @@ +import React, { useCallback, useState } from 'react'; +import { LayoutUtils, useLayoutManager } from '@deephaven/dashboard'; +import { + PortalPanelMap, + PortalPanelManagerContext, +} from './PortalPanelManagerContext'; +import { + usePortalClosedListener, + usePortalOpenedListener, +} from './PortalPanelEvent'; + +/** + * Listens for PortalPanels being opened and closed, and maintains a map of currently open portal elements. + * Sets this in the PortalPanelManagerContext for downstream consumption. + */ +function PortalPanelManager({ + children, +}: React.PropsWithChildren): JSX.Element { + const { eventHub } = useLayoutManager(); + const [portals, setPortals] = useState(new Map()); + + const handlePortalOpened = useCallback(({ container, element }) => { + setPortals(prevPortals => { + const containerId = LayoutUtils.getIdFromContainer(container); + if (containerId == null) { + throw new Error('Invalid panel ID'); + } + + const panelId = Array.isArray(containerId) ? containerId[0] : containerId; + const newPortals = new Map(prevPortals); + newPortals.set(panelId, element); + return newPortals; + }); + }, []); + + const handlePortalClosed = useCallback(({ container }) => { + setPortals(prevPortals => { + const containerId = LayoutUtils.getIdFromContainer(container); + if (containerId == null) { + throw new Error('Invalid panel ID'); + } + + const panelId = Array.isArray(containerId) ? containerId[0] : containerId; + const newPortals = new Map(prevPortals); + newPortals.delete(panelId); + return newPortals; + }); + }, []); + + usePortalOpenedListener(eventHub, handlePortalOpened); + usePortalClosedListener(eventHub, handlePortalClosed); + + return ( + + {children} + + ); +} + +export default PortalPanelManager; diff --git a/plugins/ui/src/js/src/layout/PortalPanelManagerContext.ts b/plugins/ui/src/js/src/layout/PortalPanelManagerContext.ts new file mode 100644 index 000000000..7ecc58902 --- /dev/null +++ b/plugins/ui/src/js/src/layout/PortalPanelManagerContext.ts @@ -0,0 +1,14 @@ +import React from 'react'; +import { useContextOrThrow } from '@deephaven/react-hooks'; + +/** Map from the panel IDs to the element for that panel */ +export type PortalPanelMap = ReadonlyMap; + +export const PortalPanelManagerContext = + React.createContext(null); + +export function usePortalPanelManager() { + return useContextOrThrow(PortalPanelManagerContext, 'PortalPanelManager'); +} + +export default PortalPanelManagerContext; diff --git a/plugins/ui/src/js/src/layout/ReactPanel.test.tsx b/plugins/ui/src/js/src/layout/ReactPanel.test.tsx index 52f21857c..793d29014 100644 --- a/plugins/ui/src/js/src/layout/ReactPanel.test.tsx +++ b/plugins/ui/src/js/src/layout/ReactPanel.test.tsx @@ -7,24 +7,27 @@ import { ReactPanelManagerContext, } from './ReactPanelManager'; import { ReactPanelProps } from './LayoutUtils'; +import PortalPanelManager from './PortalPanelManager'; +import PortalPanelManagerContext from './PortalPanelManagerContext'; const mockPanelId = 'test-panel-id'; -jest.mock('shortid', () => jest.fn(() => mockPanelId)); beforeEach(() => { jest.clearAllMocks(); }); -function makeReactPanel({ +function makeReactPanelManager({ children, metadata = { name: 'test-name', type: 'test-type' }, onClose = jest.fn(), onOpen = jest.fn(), + getPanelId = jest.fn(() => mockPanelId), title = 'test title', }: Partial & Partial = {}) { return ( mockPanelId), + title = 'test title', +}: Partial & Partial = {}) { + return ( + + {makeReactPanelManager({ + children, + metadata, + onClose, + onOpen, + getPanelId, + title, + })} + + ); +} + /** * Simulate the panel CLOSED event. Assumes the `useListener` has only been called with that event listener. */ @@ -42,10 +67,10 @@ function simulatePanelClosed() { (useListener as jest.Mock).mock.calls[0][2](mockPanelId); } -it('opens panel on mount, and closes panel on unmount', async () => { +it('opens panel on mount, and closes panel on unmount', () => { const onOpen = jest.fn(); const onClose = jest.fn(); - const { unmount } = render(makeReactPanel({ onOpen, onClose })); + const { unmount } = render(makeTestComponent({ onOpen, onClose })); expect(LayoutUtils.openComponent).toHaveBeenCalledTimes(1); expect(LayoutUtils.closeComponent).not.toHaveBeenCalled(); expect(onOpen).toHaveBeenCalledTimes(1); @@ -59,20 +84,20 @@ it('opens panel on mount, and closes panel on unmount', async () => { expect(onClose).toHaveBeenCalledTimes(1); }); -it('only calls open once if the panel has not closed and only children change', async () => { +it('only calls open once if the panel has not closed and only children change', () => { const onOpen = jest.fn(); const onClose = jest.fn(); - const metadata = { foo: 'bar' }; + const metadata = { type: 'bar' }; const children = 'hello'; const { rerender } = render( - makeReactPanel({ children, onOpen, onClose, metadata }) + makeTestComponent({ children, onOpen, onClose, metadata }) ); expect(LayoutUtils.openComponent).toHaveBeenCalledTimes(1); expect(LayoutUtils.closeComponent).not.toHaveBeenCalled(); expect(onOpen).toHaveBeenCalledTimes(1); expect(onClose).not.toHaveBeenCalled(); - rerender(makeReactPanel({ children: 'world', onOpen, onClose, metadata })); + rerender(makeTestComponent({ children: 'world', onOpen, onClose, metadata })); expect(LayoutUtils.openComponent).toHaveBeenCalledTimes(1); expect(LayoutUtils.closeComponent).not.toHaveBeenCalled(); @@ -80,13 +105,13 @@ it('only calls open once if the panel has not closed and only children change', expect(onClose).not.toHaveBeenCalled(); }); -it('calls openComponent again after panel is closed only if the metadata changes', async () => { +it('calls openComponent again after panel is closed only if the metadata changes', () => { const onOpen = jest.fn(); const onClose = jest.fn(); - const metadata = { foo: 'bar' }; + const metadata = { type: 'bar' }; const children = 'hello'; const { rerender } = render( - makeReactPanel({ + makeTestComponent({ children, onOpen, onClose, @@ -108,7 +133,7 @@ it('calls openComponent again after panel is closed only if the metadata changes // Should not re-open if just the children change but the metadata stays the same rerender( - makeReactPanel({ + makeTestComponent({ children: 'world', onOpen, onClose, @@ -123,11 +148,11 @@ it('calls openComponent again after panel is closed only if the metadata changes // Should re-open after the metadata change rerender( - makeReactPanel({ + makeTestComponent({ children, onOpen, onClose, - metadata: { fiz: 'baz' }, + metadata: { type: 'baz' }, }) ); @@ -136,3 +161,102 @@ it('calls openComponent again after panel is closed only if the metadata changes expect(onOpen).toHaveBeenCalledTimes(2); expect(onClose).toHaveBeenCalledTimes(1); }); + +// Case when rehydrating a widget +it('does not call openComponent or setActiveContentItem if panel already exists when created', () => { + const onOpen = jest.fn(); + const onClose = jest.fn(); + const mockStack = { + setActiveContentItem: jest.fn(), + }; + const mockContentItem = {}; + (LayoutUtils.getStackForConfig as jest.Mock).mockReturnValue(mockStack); + (LayoutUtils.getContentItemInStack as jest.Mock).mockReturnValue( + mockContentItem + ); + const portal = document.createElement('div'); + const portals = new Map([[mockPanelId, portal]]); + + const metadata = { type: 'bar' }; + const children = 'hello'; + const { rerender } = render( + + {makeReactPanelManager({ + children, + onOpen, + onClose, + metadata, + })} + + ); + expect(LayoutUtils.openComponent).not.toHaveBeenCalled(); + expect(LayoutUtils.closeComponent).not.toHaveBeenCalled(); + expect(LayoutUtils.getStackForConfig).toHaveBeenCalled(); + expect(mockStack.setActiveContentItem).not.toHaveBeenCalled(); + + expect(onOpen).toHaveBeenCalledTimes(1); + expect(onClose).not.toHaveBeenCalled(); + + // Now check that it focuses it if it's called after the metadata changes + rerender( + + {makeReactPanelManager({ + children: 'world', + onOpen, + onClose, + metadata: { type: 'baz' }, + })} + + ); + + expect(LayoutUtils.openComponent).not.toHaveBeenCalled(); + expect(LayoutUtils.closeComponent).not.toHaveBeenCalled(); + expect(onOpen).toHaveBeenCalledTimes(1); + expect(onClose).not.toHaveBeenCalled(); + + expect(mockStack.setActiveContentItem).toHaveBeenCalledTimes(1); + expect(mockStack.setActiveContentItem).toHaveBeenCalledWith(mockContentItem); +}); + +it('calls setActiveContentItem if metadata changed while the panel already exists', () => { + const onOpen = jest.fn(); + const onClose = jest.fn(); + const metadata = { type: 'bar' }; + const children = 'hello'; + const { rerender } = render( + makeTestComponent({ + children, + onOpen, + onClose, + metadata, + }) + ); + expect(LayoutUtils.openComponent).not.toHaveBeenCalled(); + expect(LayoutUtils.closeComponent).not.toHaveBeenCalled(); + expect(onOpen).toHaveBeenCalledTimes(1); + expect(onClose).not.toHaveBeenCalled(); + expect(useListener).toHaveBeenCalledTimes(1); + + const mockStack = { + setActiveContentItem: jest.fn(), + }; + const mockContentItem = {}; + (LayoutUtils.getStackForConfig as jest.Mock).mockReturnValue(mockStack); + (LayoutUtils.getContentItemInStack as jest.Mock).mockReturnValue( + mockContentItem + ); + rerender( + makeTestComponent({ + children: 'world', + onOpen, + onClose, + metadata: { type: 'baz' }, + }) + ); + + expect(LayoutUtils.openComponent).not.toHaveBeenCalled(); + expect(LayoutUtils.closeComponent).not.toHaveBeenCalled(); + expect(onOpen).toHaveBeenCalledTimes(1); + expect(onClose).not.toHaveBeenCalled(); + expect(mockStack.setActiveContentItem).toHaveBeenCalledTimes(1); +}); diff --git a/plugins/ui/src/js/src/layout/ReactPanel.tsx b/plugins/ui/src/js/src/layout/ReactPanel.tsx index a96f4f771..17165eade 100644 --- a/plugins/ui/src/js/src/layout/ReactPanel.tsx +++ b/plugins/ui/src/js/src/layout/ReactPanel.tsx @@ -1,10 +1,4 @@ -import React, { - useCallback, - useEffect, - useMemo, - useRef, - useState, -} from 'react'; +import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import ReactDOM from 'react-dom'; import shortid from 'shortid'; import { @@ -15,27 +9,40 @@ import { } from '@deephaven/dashboard'; import Log from '@deephaven/log'; import PortalPanel from './PortalPanel'; -import { useReactPanelManager } from './ReactPanelManager'; +import { ReactPanelControl, useReactPanel } from './ReactPanelManager'; import { ReactPanelProps } from './LayoutUtils'; import { useParentItem } from './ParentItemContext'; import { ReactPanelContext } from './ReactPanelContext'; +import { usePortalPanelManager } from './PortalPanelManagerContext'; const log = Log.module('@deephaven/js-plugin-ui/ReactPanel'); /** * Adds and tracks a panel to the GoldenLayout. When the child element is updated, the contents of the panel will also be updated. When unmounted, the panel will be removed. + * Will trigger an `onOpen` when the portal is opened, and `onClose` when closed. + * Note that because the `PortalPanel` will be saved with the GoldenLayout config, it's possible there is already a panel that exists with the same ID. + * In that case, the existing panel will be re-used. */ function ReactPanel({ children, title }: ReactPanelProps) { const layoutManager = useLayoutManager(); - const panelManager = useReactPanelManager(); - const { metadata, onClose, onOpen } = panelManager; - const panelId = useMemo(() => shortid(), []); - const [element, setElement] = useState(); + const { metadata, onClose, onOpen, panelId } = useReactPanel(); + const portalManager = usePortalPanelManager(); + const portal = portalManager.get(panelId); + + // Tracks whether the panel is open and that we have emitted the onOpen event const isPanelOpenRef = useRef(false); - const openedMetadataRef = useRef>(); - const parent = useParentItem(); + // If there is already a portal that exists, then we're rehydrating from a dehydrated state + // Initialize the `openedWidgetRef` accordingly on initialization + const openedMetadataRef = useRef( + portal == null ? undefined : metadata + ); - log.debug2('Rendering panel', panelId); + // We want to regenerate the key every time the metadata changes, so that the portal is re-rendered + // eslint-disable-next-line react-hooks/exhaustive-deps + const contentKey = useMemo(() => shortid.generate(), [metadata]); + + const parent = useParentItem(); + const { eventHub } = layoutManager; useEffect( () => () => { @@ -43,7 +50,7 @@ function ReactPanel({ children, title }: ReactPanelProps) { log.debug('Closing panel', panelId); LayoutUtils.closeComponent(parent, { id: panelId }); isPanelOpenRef.current = false; - onClose(panelId); + onClose(); } }, [parent, onClose, panelId] @@ -51,55 +58,69 @@ function ReactPanel({ children, title }: ReactPanelProps) { const handlePanelClosed = useCallback( closedPanelId => { - if (closedPanelId === panelId) { + if (closedPanelId === panelId && isPanelOpenRef.current) { log.debug('Panel closed', panelId); isPanelOpenRef.current = false; - onClose(panelId); + onClose(); } }, [onClose, panelId] ); - useListener(layoutManager.eventHub, PanelEvent.CLOSED, handlePanelClosed); + useListener(eventHub, PanelEvent.CLOSED, handlePanelClosed); - useEffect(() => { - if ( - isPanelOpenRef.current === false || - openedMetadataRef.current !== metadata - ) { - const panelTitle = - title ?? (typeof metadata?.name === 'string' ? metadata.name : ''); - const config = { - type: 'react-component' as const, - component: PortalPanel.displayName, - props: { + useEffect( + /** + * Opens a panel in the layout if necessary. There are a few cases this is triggered: + * 1. Panel has not been opened yet: we need to open the panel in this case. + * 2. Panel metadata changes: we need to update the panel with the new metadata, show the panel in its current stack, + * and refresh the content with new state. + * 3. Widget is being re-hydrated: we need to check if the panel ID is already open, and then use that existing portal. + * We don't need to focus in this case, as this is when a whole dashboard is being re-hydrated - not when the user is + * opening this widget in particular. + */ + function openIfNecessary() { + const itemConfig = { id: panelId }; + const existingStack = LayoutUtils.getStackForConfig(parent, itemConfig); + if (existingStack == null) { + const panelTitle = title ?? metadata?.name ?? ''; + const config = { + type: 'react-component' as const, + component: PortalPanel.displayName, + props: {}, + title: panelTitle, id: panelId, - onClose: () => { - isPanelOpenRef.current = false; - setElement(undefined); - }, - onOpen: setElement, - metadata, - }, - title: panelTitle, - id: panelId, - }; + }; - LayoutUtils.openComponent({ root: parent, config }); - log.debug('Opened panel', panelId, config); - isPanelOpenRef.current = true; - openedMetadataRef.current = metadata; + LayoutUtils.openComponent({ root: parent, config }); + log.debug('Opened panel', panelId, config); + } else if (openedMetadataRef.current !== metadata) { + const contentItem = LayoutUtils.getContentItemInStack( + existingStack, + itemConfig + ); + if (contentItem != null) { + existingStack.setActiveContentItem(contentItem); + } + } - onOpen(panelId); - } - }, [parent, metadata, onOpen, panelId, title]); + openedMetadataRef.current = metadata; + if (!isPanelOpenRef.current) { + // We don't need to send an opened signal again + isPanelOpenRef.current = true; + onOpen(); + } + }, + [parent, metadata, onOpen, panelId, title] + ); - return element + return portal ? ReactDOM.createPortal( {children} , - element + portal, + contentKey ) : null; } diff --git a/plugins/ui/src/js/src/layout/ReactPanelManager.ts b/plugins/ui/src/js/src/layout/ReactPanelManager.ts index 53db36f60..2bee80f44 100644 --- a/plugins/ui/src/js/src/layout/ReactPanelManager.ts +++ b/plugins/ui/src/js/src/layout/ReactPanelManager.ts @@ -1,26 +1,71 @@ -import { createContext, useContext } from 'react'; +import { PanelProps } from '@deephaven/dashboard'; +import { useContextOrThrow } from '@deephaven/react-hooks'; +import { createContext, useCallback, useMemo } from 'react'; -export type ReactPanelManager = { +/** + * Manager for panels within a widget. This is used to manage the lifecycle of panels within a widget. + */ +export interface ReactPanelManager { /** - * Metadata to pass to all the panels. + * Metadata stored with the panel. Typically a descriptor of the widget opening the panel and used for hydration. * Updating the metadata will cause the panel to be re-opened, or replaced if it is closed. * Can also be used for rehydration. */ - metadata: Record; + metadata: PanelProps['metadata']; /** Triggered when a panel is opened */ onOpen: (panelId: string) => void; /** Triggered when a panel is closed */ onClose: (panelId: string) => void; -}; -export const ReactPanelManagerContext = createContext({ - metadata: { name: '', type: '' }, - onOpen: () => undefined, - onClose: () => undefined, -}); + /** + * Get a unique panelId from the panel manager. This should be used to identify the panel in the layout. + */ + getPanelId: () => string; +} + +/** Interface for using a react panel */ +export interface ReactPanelControl { + /** + * Metadata stored with the panel. Typically a descriptor of the widget opening the panel and used for hydration. + * Updating the metadata will cause the panel to be re-opened, or replaced if it is closed. + * Can also be used for rehydration. + */ + metadata: PanelProps['metadata']; + + /** Must be called when the panel is opened */ + onOpen: () => void; + + /** Must be called when the panel is closed */ + onClose: () => void; + + /** The panelId for this react panel */ + panelId: string; +} + +export const ReactPanelManagerContext = createContext( + null +); export function useReactPanelManager(): ReactPanelManager { - return useContext(ReactPanelManagerContext); + return useContextOrThrow( + ReactPanelManagerContext, + 'No ReactPanelManager found, did you wrap in a ReactPanelManagerProvider.Context?' + ); +} + +/** + * Use the controls for a single react panel. + */ +export function useReactPanel(): ReactPanelControl { + const { metadata, onClose, onOpen, getPanelId } = useReactPanelManager(); + const panelId = useMemo(() => getPanelId(), [getPanelId]); + + return { + metadata, + onClose: useCallback(() => onClose(panelId), [onClose, panelId]), + onOpen: useCallback(() => onOpen(panelId), [onOpen, panelId]), + panelId, + }; } diff --git a/plugins/ui/src/js/src/layout/ReactPanelManagerProvider.tsx b/plugins/ui/src/js/src/layout/ReactPanelManagerProvider.tsx new file mode 100644 index 000000000..990341f75 --- /dev/null +++ b/plugins/ui/src/js/src/layout/ReactPanelManagerProvider.tsx @@ -0,0 +1,30 @@ +import React, { useMemo } from 'react'; +import { + ReactPanelManager, + ReactPanelManagerContext, +} from './ReactPanelManager'; + +export function ReactPanelManagerProvider({ + children, + metadata, + onOpen, + onClose, + getPanelId, +}: React.PropsWithChildren): JSX.Element { + const manager = useMemo( + () => ({ + metadata, + onOpen, + onClose, + getPanelId, + }), + [metadata, onOpen, onClose, getPanelId] + ); + return ( + + {children} + + ); +} + +export default ReactPanelManagerProvider; diff --git a/plugins/ui/src/js/src/widget/DashboardWidgetHandler.tsx b/plugins/ui/src/js/src/widget/DashboardWidgetHandler.tsx new file mode 100644 index 000000000..e5e2f81cb --- /dev/null +++ b/plugins/ui/src/js/src/widget/DashboardWidgetHandler.tsx @@ -0,0 +1,65 @@ +/** + * Handles document events for one widget. + */ +import React, { useCallback } from 'react'; +import { WidgetDescriptor } from '@deephaven/dashboard'; +import type { dh } from '@deephaven/jsapi-types'; +import Log from '@deephaven/log'; +import { ReadonlyWidgetData, WidgetDataUpdate, WidgetId } from './WidgetTypes'; +import WidgetHandler from './WidgetHandler'; + +const log = Log.module('@deephaven/js-plugin-ui/DashboardWidgetHandler'); + +export interface DashboardWidgetHandlerProps { + /** ID of this widget */ + id: WidgetId; + + /** Widget for this to handle */ + widget: WidgetDescriptor; + + /** Fetch the widget instance */ + fetch: () => Promise; + + /** Widget data to display */ + initialData?: ReadonlyWidgetData; + + /** Triggered when all panels opened from this widget have closed */ + onClose?: (widgetId: WidgetId) => void; + + /** Triggered when the data in the widget changes */ + onDataChange?: (widgetId: WidgetId, data: WidgetDataUpdate) => void; +} + +function DashboardWidgetHandler({ + id, + onClose, + onDataChange, + ...otherProps +}: DashboardWidgetHandlerProps) { + const handleClose = useCallback(() => { + log.debug('handleClose', id); + onClose?.(id); + }, [onClose, id]); + + const handleDataChange = useCallback( + (data: WidgetDataUpdate) => { + log.debug('handleDataChange', id, data); + onDataChange?.(id, data); + }, + [onDataChange, id] + ); + + return ( + + ); +} + +DashboardWidgetHandler.displayName = + '@deephaven/js-plugin-ui/DashboardWidgetHandler'; + +export default DashboardWidgetHandler; diff --git a/plugins/ui/src/js/src/widget/DocumentHandler.test.tsx b/plugins/ui/src/js/src/widget/DocumentHandler.test.tsx index c00b3286d..5b7023f23 100644 --- a/plugins/ui/src/js/src/widget/DocumentHandler.test.tsx +++ b/plugins/ui/src/js/src/widget/DocumentHandler.test.tsx @@ -3,13 +3,13 @@ import { WidgetDescriptor } from '@deephaven/dashboard'; import { TestUtils } from '@deephaven/utils'; import { render } from '@testing-library/react'; import DocumentHandler, { DocumentHandlerProps } from './DocumentHandler'; +import { ReactPanelProps } from '../layout/LayoutUtils'; +import { MixedPanelsError, NoChildrenError } from '../errors'; +import { getComponentForElement } from './WidgetUtils'; import { DASHBOARD_ELEMENT_NAME, PANEL_ELEMENT_NAME, - ReactPanelProps, -} from '../layout/LayoutUtils'; -import { MixedPanelsError, NoChildrenError } from '../errors'; -import { getComponentForElement } from './WidgetUtils'; +} from '../elements/ElementConstants'; const mockReactPanel = jest.fn((props: ReactPanelProps) => (
ReactPanel
diff --git a/plugins/ui/src/js/src/widget/DocumentHandler.tsx b/plugins/ui/src/js/src/widget/DocumentHandler.tsx index 0419f5e30..449e00da7 100644 --- a/plugins/ui/src/js/src/widget/DocumentHandler.tsx +++ b/plugins/ui/src/js/src/widget/DocumentHandler.tsx @@ -1,15 +1,33 @@ -import React, { useCallback, useMemo, useRef } from 'react'; +import React, { useCallback, useMemo, useRef, useState } from 'react'; +import shortid from 'shortid'; import { WidgetDescriptor } from '@deephaven/dashboard'; import Log from '@deephaven/log'; +import { EMPTY_FUNCTION } from '@deephaven/utils'; import { ReactPanelManagerContext } from '../layout/ReactPanelManager'; import { getRootChildren } from './DocumentUtils'; +import { + ReadonlyWidgetData, + WidgetData, + WidgetDataUpdate, +} from './WidgetTypes'; const log = Log.module('@deephaven/js-plugin-ui/DocumentHandler'); +const EMPTY_OBJECT = Object.freeze({}); + export type DocumentHandlerProps = React.PropsWithChildren<{ /** Definition of the widget used to create this document. Used for titling panels if necessary. */ widget: WidgetDescriptor; + /** + * Data state to use when loading the widget. + * When the data state is updated, the new state is emitted via the `onDataChange` callback. + */ + initialData?: ReadonlyWidgetData; + + /** Triggered when the data in the document changes */ + onDataChange?: (data: WidgetDataUpdate) => void; + /** Triggered when all panels opened from this document have closed */ onClose?: () => void; }>; @@ -20,41 +38,82 @@ export type DocumentHandlerProps = React.PropsWithChildren<{ * or all non-panels, which will automatically be wrapped in one panel. * Responsible for opening any panels or dashboards specified in the document. */ -function DocumentHandler({ children, widget, onClose }: DocumentHandlerProps) { +function DocumentHandler({ + children, + widget, + initialData: data = EMPTY_OBJECT, + onDataChange = EMPTY_FUNCTION, + onClose, +}: DocumentHandlerProps) { log.debug('Rendering document', widget); const panelOpenCountRef = useRef(0); + const panelIdIndex = useRef(0); - const metadata = useMemo( - () => ({ - name: widget.name ?? 'Unknown', - type: widget.type, - }), - [widget] + // Using `useState` here to initialize the data only once. + // We don't want to use `useMemo`, because we only want it to be initialized once with the `initialData` (uncontrolled) + // We don't want to use `useRef`, because we only want to run `structuredClone` once, and you can't pass an + // initialization function into `useRef` like you can with `useState` + const [widgetData] = useState(() => structuredClone(data)); + + // panelIds that are currently opened within this document. This list is tracked by the `onOpen`/`onClose` call on the `ReactPanelManager` from a child component. + // Note that the initial widget data provided will be the `panelIds` for this document to use; this array is what is actually opened currently. + const [panelIds] = useState([]); + + const handleOpen = useCallback( + (panelId: string) => { + if (panelIds.includes(panelId)) { + throw new Error('Duplicate panel opens received'); + } + + panelOpenCountRef.current += 1; + log.debug('Panel opened, open count', panelOpenCountRef.current); + + panelIds.push(panelId); + onDataChange({ ...widgetData, panelIds }); + }, + [onDataChange, panelIds, widgetData] + ); + + const handleClose = useCallback( + (panelId: string) => { + const panelIndex = panelIds.indexOf(panelId); + if (panelIndex === -1) { + throw new Error('Panel close received for unknown panel'); + } + panelOpenCountRef.current -= 1; + if (panelOpenCountRef.current < 0) { + throw new Error('Panel open count is negative'); + } + log.debug('Panel closed, open count', panelOpenCountRef.current); + if (panelOpenCountRef.current === 0) { + onClose?.(); + return; + } + + panelIds.splice(panelIndex, 1); + onDataChange({ ...widgetData, panelIds }); + }, + [onClose, onDataChange, panelIds, widgetData] ); - const handleOpen = useCallback(() => { - panelOpenCountRef.current += 1; - log.debug('Panel opened, open count', panelOpenCountRef.current); - }, []); - - const handleClose = useCallback(() => { - panelOpenCountRef.current -= 1; - if (panelOpenCountRef.current < 0) { - throw new Error('Panel open count is negative'); - } - log.debug('Panel closed, open count', panelOpenCountRef.current); - if (panelOpenCountRef.current === 0) { - onClose?.(); - } - }, [onClose]); + const getPanelId = useCallback(() => { + // On rehydration, yield known IDs first + // If there are no more known IDs, generate a new one. + // This can happen if the document hasn't been opened before, or if it's rehydrated and a new panel is added. + // Note that if the order of panels changes, the worst case scenario is that panels appear in the wrong location in the layout. + const panelId = widgetData.panelIds?.[panelIdIndex.current] ?? shortid(); + panelIdIndex.current += 1; + return panelId; + }, [widgetData]); const panelManager = useMemo( () => ({ - metadata, + metadata: widget, onOpen: handleOpen, onClose: handleClose, + getPanelId, }), - [metadata, handleClose, handleOpen] + [widget, getPanelId, handleClose, handleOpen] ); return ( diff --git a/plugins/ui/src/js/src/widget/WidgetHandler.test.tsx b/plugins/ui/src/js/src/widget/WidgetHandler.test.tsx index cd12df8ad..adf999a7a 100644 --- a/plugins/ui/src/js/src/widget/WidgetHandler.test.tsx +++ b/plugins/ui/src/js/src/widget/WidgetHandler.test.tsx @@ -1,13 +1,12 @@ import React from 'react'; import { act, render } from '@testing-library/react'; -import type { Widget } from '@deephaven/jsapi-types'; +import type { dh } from '@deephaven/jsapi-types'; import WidgetHandler, { WidgetHandlerProps } from './WidgetHandler'; import { DocumentHandlerProps } from './DocumentHandler'; import { makeDocumentUpdatedJsonRpcString, makeWidget, makeWidgetDescriptor, - makeWidgetWrapper, } from './WidgetTestUtils'; const mockApi = { Widget: { EVENT_MESSAGE: 'message' } }; @@ -24,10 +23,11 @@ jest.mock( ); function makeWidgetHandler({ - widget = makeWidgetWrapper(), + fetch = () => Promise.resolve(makeWidget()), + widget = makeWidgetDescriptor(), onClose = jest.fn(), }: Partial = {}) { - return ; + return ; } beforeEach(() => { @@ -40,8 +40,8 @@ it('mounts and unmounts', async () => { }); it('updates the document when event is received', async () => { - let fetchResolve: (value: Widget | PromiseLike) => void; - const fetchPromise = new Promise(resolve => { + let fetchResolve: (value: dh.Widget | PromiseLike) => void; + const fetchPromise = new Promise(resolve => { fetchResolve = resolve; }); const fetch = jest.fn(() => fetchPromise); @@ -55,8 +55,8 @@ it('updates the document when event is received', async () => { makeDocumentUpdatedJsonRpcString(initialDocument) ), }); - const wrapper = makeWidgetWrapper({ widget, fetch }); - const { unmount } = render(makeWidgetHandler({ widget: wrapper })); + + const { unmount } = render(makeWidgetHandler({ widget, fetch })); expect(fetch).toHaveBeenCalledTimes(1); expect(mockAddEventListener).not.toHaveBeenCalled(); expect(mockDocumentHandler).not.toHaveBeenCalled(); diff --git a/plugins/ui/src/js/src/widget/WidgetHandler.tsx b/plugins/ui/src/js/src/widget/WidgetHandler.tsx index f7841860d..057be65b7 100644 --- a/plugins/ui/src/js/src/widget/WidgetHandler.tsx +++ b/plugins/ui/src/js/src/widget/WidgetHandler.tsx @@ -14,8 +14,10 @@ import { JSONRPCServer, JSONRPCServerAndClient, } from 'json-rpc-2.0'; -import type { Widget, WidgetExportedObject } from '@deephaven/jsapi-types'; +import { WidgetDescriptor } from '@deephaven/dashboard'; +import type { dh } from '@deephaven/jsapi-types'; import Log from '@deephaven/log'; +import { EMPTY_FUNCTION } from '@deephaven/utils'; import { CALLABLE_KEY, OBJECT_KEY, @@ -23,7 +25,11 @@ import { isElementNode, isObjectNode, } from '../elements/ElementUtils'; -import { WidgetMessageEvent, WidgetWrapper } from './WidgetTypes'; +import { + ReadonlyWidgetData, + WidgetDataUpdate, + WidgetMessageEvent, +} from './WidgetTypes'; import DocumentHandler from './DocumentHandler'; import { getComponentForElement } from './WidgetUtils'; @@ -31,20 +37,36 @@ const log = Log.module('@deephaven/js-plugin-ui/WidgetHandler'); export interface WidgetHandlerProps { /** Widget for this to handle */ - widget: WidgetWrapper; + widget: WidgetDescriptor; + + /** Fetch the widget instance */ + fetch: () => Promise; + + /** Widget data to display */ + initialData?: ReadonlyWidgetData; /** Triggered when all panels opened from this widget have closed */ - onClose?: (widgetId: string) => void; + onClose?: () => void; + + /** Triggered when the data in the widget changes. Only the changed data is provided. */ + onDataChange?: (data: WidgetDataUpdate) => void; } -function WidgetHandler({ onClose, widget: wrapper }: WidgetHandlerProps) { - const [widget, setWidget] = useState(); +function WidgetHandler({ + onClose, + onDataChange = EMPTY_FUNCTION, + fetch, + widget: descriptor, + initialData: initialDataProp, +}: WidgetHandlerProps) { + const [widget, setWidget] = useState(); const [document, setDocument] = useState(); + const [initialData] = useState(initialDataProp); // When we fetch a widget, the client is then responsible for the exported objects. // These objects could stay alive even after the widget is closed if we wanted to, // but for our use case we want to close them when the widget is closed, so we close them all on unmount. - const exportedObjectMap = useRef>( + const exportedObjectMap = useRef>( new Map() ); const exportedObjectCount = useRef(0); @@ -134,7 +156,7 @@ function WidgetHandler({ onClose, widget: wrapper }: WidgetHandlerProps) { ); const updateExportedObjects = useCallback( - (newExportedObjects: WidgetExportedObject[]) => { + (newExportedObjects: dh.WidgetExportedObject[]) => { for (let i = 0; i < newExportedObjects.length; i += 1) { const exportedObject = newExportedObjects[i]; const exportedObjectKey = exportedObjectCount.current; @@ -152,79 +174,121 @@ function WidgetHandler({ onClose, widget: wrapper }: WidgetHandlerProps) { } log.debug('Adding methods to jsonClient'); - jsonClient.addMethod('documentUpdated', async (params: [string]) => { - log.debug2('documentUpdated', params[0]); - const newDocument = parseDocument(params[0]); - setDocument(newDocument); - }); + jsonClient.addMethod( + 'documentUpdated', + async (params: [string, string]) => { + log.debug2('documentUpdated', params); + const [documentParam, stateParam] = params; + const newDocument = parseDocument(documentParam); + setDocument(newDocument); + if (stateParam != null) { + try { + const newState = JSON.parse(stateParam); + onDataChange({ state: newState }); + } catch (e) { + log.warn( + 'Error parsing state, widget state may not be persisted.', + e + ); + } + } + } + ); return () => { jsonClient.rejectAllPendingRequests('Widget was changed'); }; }, - [jsonClient, parseDocument] + [jsonClient, onDataChange, parseDocument] ); - useEffect(() => { - if (widget == null) { - return; - } - // Need to reset the exported object map and count - const widgetExportedObjectMap = new Map(); - exportedObjectMap.current = widgetExportedObjectMap; - exportedObjectCount.current = 0; - function receiveData( - data: string, - newExportedObjects: WidgetExportedObject[] - ) { - log.debug2('Data received', data, newExportedObjects); - updateExportedObjects(newExportedObjects); - jsonClient?.receiveAndSend(JSON.parse(data)); - } + /** + * Triggered when the widget object is loaded. Initializes the state of the widget and/or receives initial data. + */ + useEffect( + function initializeWidget() { + if (widget == null || jsonClient == null) { + return; + } + // Need to reset the exported object map and count + const widgetExportedObjectMap = new Map< + number, + dh.WidgetExportedObject + >(); + exportedObjectMap.current = widgetExportedObjectMap; + exportedObjectCount.current = 0; - const cleanup = widget.addEventListener( - // This is defined as dh.Widget.EVENT_MESSAGE in Core, but that constant doesn't exist on the Enterprise API - // Dashboard plugins in Enterprise are loaded with the Enterprise API in the context of the dashboard, so trying to fetch the constant fails - // Just use the constant value here instead. Another option would be to add the Widget constants to Enterprise, but we don't want to port over all that functionality. - 'message', - (event: WidgetMessageEvent) => { - receiveData( - event.detail.getDataAsString(), - event.detail.exportedObjects - ); + // Set a var to the client that we know will not be null in the closure below + const activeClient = jsonClient; + function receiveData( + data: string, + newExportedObjects: dh.WidgetExportedObject[] + ) { + log.debug2('Data received', data, newExportedObjects); + updateExportedObjects(newExportedObjects); + if (data.length > 0) { + activeClient.receiveAndSend(JSON.parse(data)); + } } - ); - log.debug('Receiving initial data'); - // We need to get the initial data and process it. It should be a documentUpdated command. - receiveData(widget.getDataAsString(), widget.exportedObjects); + const cleanup = widget.addEventListener( + // This is defined as dh.Widget.EVENT_MESSAGE in Core, but that constant doesn't exist on the Enterprise API + // Dashboard plugins in Enterprise are loaded with the Enterprise API in the context of the dashboard, so trying to fetch the constant fails + // Just use the constant value here instead. Another option would be to add the Widget constants to Enterprise, but we don't want to port over all that functionality. + 'message', + (event: WidgetMessageEvent) => { + receiveData( + event.detail.getDataAsString(), + event.detail.exportedObjects + ); + } + ); - return () => { - log.debug('Cleaning up widget', widget); - cleanup(); - widget.close(); + log.debug('Receiving initial data'); + // We need to get the initial data and process it. If it's an old version of the plugin, it could be a documentUpdated command. + receiveData(widget.getDataAsString(), widget.exportedObjects); - // Clean up any exported objects that haven't been closed yet - Array.from(widgetExportedObjectMap.values()).forEach(exportedObject => { - exportedObject.close(); - }); - }; - }, [jsonClient, parseDocument, updateExportedObjects, widget]); + // We set the initial state of the widget. We'll then get a documentUpdated as a response. + activeClient.request('setState', [initialData?.state ?? {}]).then( + result => { + log.debug('Set state result', result); + }, + e => { + log.error('Error setting initial state: ', e); + } + ); + + return () => { + log.debug('Cleaning up widget', widget); + cleanup(); + widget.close(); + + // Clean up any exported objects that haven't been closed yet + Array.from(widgetExportedObjectMap.values()).forEach(exportedObject => { + exportedObject.close(); + }); + }; + }, + [jsonClient, initialData, parseDocument, updateExportedObjects, widget] + ); useEffect( function loadWidget() { - log.debug('loadWidget', wrapper.id, wrapper.widget); + log.debug('loadWidget', descriptor); let isCancelled = false; async function loadWidgetInternal() { - const newWidget = await wrapper.fetch(); + const newWidget = await fetch(); if (isCancelled) { + log.debug2('loadWidgetInternal cancelled', descriptor, newWidget); newWidget.close(); - newWidget.exportedObjects.forEach(exportedObject => { - exportedObject.close(); - }); + newWidget.exportedObjects.forEach( + (exportedObject: dh.WidgetExportedObject) => { + exportedObject.close(); + } + ); return; } - log.debug('newWidget', wrapper.id, wrapper.widget, newWidget); + log.debug('loadWidgetInternal done', descriptor, newWidget); setWidget(newWidget); } loadWidgetInternal(); @@ -232,22 +296,22 @@ function WidgetHandler({ onClose, widget: wrapper }: WidgetHandlerProps) { isCancelled = true; }; }, - [wrapper] + [fetch, descriptor] ); - const handleDocumentClose = useCallback(() => { - log.debug('Widget document closed', wrapper.id); - onClose?.(wrapper.id); - }, [onClose, wrapper.id]); - return useMemo( () => document != null ? ( - + {document} ) : null, - [document, handleDocumentClose, wrapper] + [document, descriptor, initialData, onClose, onDataChange] ); } diff --git a/plugins/ui/src/js/src/widget/WidgetTestUtils.ts b/plugins/ui/src/js/src/widget/WidgetTestUtils.ts index 60e776620..f7cec022e 100644 --- a/plugins/ui/src/js/src/widget/WidgetTestUtils.ts +++ b/plugins/ui/src/js/src/widget/WidgetTestUtils.ts @@ -1,7 +1,6 @@ import { WidgetDescriptor } from '@deephaven/dashboard'; import { TestUtils } from '@deephaven/utils'; -import type { Widget } from '@deephaven/jsapi-types'; -import { WidgetWrapper } from './WidgetTypes'; +import type { dh } from '@deephaven/jsapi-types'; export function makeDocumentUpdatedJsonRpc( document: Record = {} @@ -35,21 +34,10 @@ export function makeWidget({ addEventListener = jest.fn(() => jest.fn()), getDataAsString = () => makeDocumentUpdatedJsonRpcString(), exportedObjects = [], -}: Partial = {}): Widget { - return TestUtils.createMockProxy({ +}: Partial = {}): dh.Widget { + return TestUtils.createMockProxy({ addEventListener, getDataAsString, exportedObjects, }); } - -export function makeWidgetWrapper({ - widget = makeWidgetDescriptor(), - fetch = () => Promise.resolve(makeWidget()), -}: Partial = {}): WidgetWrapper { - return { - id: widget.id ?? 'widget-id', - widget, - fetch, - }; -} diff --git a/plugins/ui/src/js/src/widget/WidgetTypes.ts b/plugins/ui/src/js/src/widget/WidgetTypes.ts index ab935c763..8c870cb53 100644 --- a/plugins/ui/src/js/src/widget/WidgetTypes.ts +++ b/plugins/ui/src/js/src/widget/WidgetTypes.ts @@ -1,18 +1,26 @@ -import { WidgetDescriptor } from '@deephaven/dashboard'; -import { Widget, WidgetExportedObject } from '@deephaven/jsapi-types'; +import type { dh } from '@deephaven/jsapi-types'; + +export type WidgetId = string; export interface WidgetMessageDetails { getDataAsBase64(): string; getDataAsString(): string; - exportedObjects: WidgetExportedObject[]; + exportedObjects: dh.WidgetExportedObject[]; } export type WidgetMessageEvent = CustomEvent; -export type WidgetFetch = (takeOwnership?: boolean) => Promise; +export type WidgetFetch = (takeOwnership?: boolean) => Promise; + +export type WidgetData = { + /** Panel IDs that are opened by this widget */ + panelIds?: string[]; -export type WidgetWrapper = { - fetch: WidgetFetch; - id: string; - widget: WidgetDescriptor; + /** State of the widget on the Python side */ + state?: Record; }; + +export type ReadonlyWidgetData = Readonly; + +/** Contains an update for widget data. Only the keys that are updated are passed. */ +export type WidgetDataUpdate = Partial; diff --git a/plugins/ui/src/js/src/widget/WidgetUtils.test.tsx b/plugins/ui/src/js/src/widget/WidgetUtils.test.tsx new file mode 100644 index 000000000..40a5621ef --- /dev/null +++ b/plugins/ui/src/js/src/widget/WidgetUtils.test.tsx @@ -0,0 +1,98 @@ +import React from 'react'; +import { Text } from '@adobe/react-spectrum'; +import { + FRAGMENT_ELEMENT_NAME, + ITEM_ELEMENT_NAME, + HTML_ELEMENT_NAME_PREFIX, + ICON_ELEMENT_TYPE_PREFIX, +} from '../elements/ElementConstants'; +import { ElementNode, ELEMENT_KEY } from '../elements/ElementUtils'; +import HTMLElementView from '../elements/HTMLElementView'; +import IconElementView from '../elements/IconElementView'; +import { SPECTRUM_ELEMENT_TYPE_PREFIX } from '../elements/SpectrumElementUtils'; +import SpectrumElementView from '../elements/SpectrumElementView'; +import { + elementComponentMap, + getComponentForElement, + getComponentTypeForElement, + getPreservedData, +} from './WidgetUtils'; + +describe('getComponentTypeForElement', () => { + it.each( + Object.keys(elementComponentMap) as (keyof typeof elementComponentMap)[] + )( + 'should return the correct component type for a given key: %s', + elementKey => { + const actual = getComponentTypeForElement({ [ELEMENT_KEY]: elementKey }); + expect(actual).toBe(elementComponentMap[elementKey]); + } + ); +}); + +describe('getComponentForElement', () => { + it.each([ + /* eslint-disable react/jsx-key */ + [`${HTML_ELEMENT_NAME_PREFIX}div`, HTMLElementView], + [`${SPECTRUM_ELEMENT_TYPE_PREFIX}ActionButton`, SpectrumElementView], + [`${ICON_ELEMENT_TYPE_PREFIX}vsAdd`, IconElementView], + /* eslint-enable react/jsx-key */ + ] as [string, ({ element }: { element: unknown }) => JSX.Element][])( + 'should use expected element factory function: %s', + (elementKey, factory) => { + const actual = getComponentForElement({ [ELEMENT_KEY]: elementKey }); + expect(actual).toEqual( + factory({ element: { [ELEMENT_KEY]: elementKey } }) + ); + } + ); + + it.each( + Object.keys(elementComponentMap) as (keyof typeof elementComponentMap)[] + )('should spread props for element nodes: %s', elementKey => { + let element: ElementNode = { [ELEMENT_KEY]: elementKey }; + + if (elementKey === FRAGMENT_ELEMENT_NAME) { + element = { + ...element, + props: { key: 'mock.key', children: ['Some child'] }, + }; + } else if (elementKey === ITEM_ELEMENT_NAME) { + element = { + ...element, + props: { children: Some child }, + }; + } + + const actual = getComponentForElement(element); + + const Expected = elementComponentMap[elementKey] as ( + props: Record + ) => JSX.Element; + + expect(actual).toEqual( + // eslint-disable-next-line react/jsx-props-no-spreading + [0])} /> + ); + }); +}); + +describe('getPreservedData', () => { + it('should handle undefined widget data', () => { + const actual = getPreservedData(undefined); + expect(actual).toEqual({}); + }); + it('should handle empty widget data', () => { + const actual = getPreservedData({}); + expect(actual).toEqual({}); + }); + it('should return only the panelIds from the widget data', () => { + const widgetData = { + panelIds: ['1', '2', '3'], + state: { foo: 'bar' }, + }; + + const actual = getPreservedData(widgetData); + expect(actual).toEqual({ panelIds: widgetData.panelIds }); + }); +}); diff --git a/plugins/ui/src/js/src/widget/WidgetUtils.tsx b/plugins/ui/src/js/src/widget/WidgetUtils.tsx index dbe4d5493..3848b365d 100644 --- a/plugins/ui/src/js/src/widget/WidgetUtils.tsx +++ b/plugins/ui/src/js/src/widget/WidgetUtils.tsx @@ -1,10 +1,15 @@ /* eslint-disable react/jsx-props-no-spreading */ /* eslint-disable import/prefer-default-export */ -import React from 'react'; +import React, { ComponentType } from 'react'; +// Importing `Item` and `Section` compnents directly since they should not be +// wrapped due to how Spectrum collection components consume them. +import { Item, Section } from '@deephaven/components'; +import { ReadonlyWidgetData } from './WidgetTypes'; import { ElementNode, - isExportedObject, - isFragmentElementNode, + ELEMENT_KEY, + isElementNode, + wrapElementChildren, } from '../elements/ElementUtils'; import HTMLElementView from '../elements/HTMLElementView'; import { isHTMLElementNode } from '../elements/HTMLElementUtils'; @@ -12,44 +17,53 @@ import { isSpectrumElementNode } from '../elements/SpectrumElementUtils'; import SpectrumElementView from '../elements/SpectrumElementView'; import { isIconElementNode } from '../elements/IconElementUtils'; import IconElementView from '../elements/IconElementView'; -import { isUITable } from '../elements/UITableUtils'; import UITable from '../elements/UITable'; import { - isColumnElementNode, - isDashboardElementNode, - isPanelElementNode, - isRowElementNode, - isStackElementNode, -} from '../layout/LayoutUtils'; + COLUMN_ELEMENT_NAME, + DASHBOARD_ELEMENT_NAME, + FRAGMENT_ELEMENT_NAME, + ITEM_ELEMENT_NAME, + PANEL_ELEMENT_NAME, + PICKER_ELEMENT_NAME, + ROW_ELEMENT_NAME, + SECTION_ELEMENT_NAME, + STACK_ELEMENT_NAME, + UITABLE_ELEMENT_TYPE, +} from '../elements/ElementConstants'; import ReactPanel from '../layout/ReactPanel'; -import ObjectView from '../elements/ObjectView'; import Row from '../layout/Row'; import Stack from '../layout/Stack'; import Column from '../layout/Column'; import Dashboard from '../layout/Dashboard'; +import Picker from '../elements/Picker'; + +/* + * Map element node names to their corresponding React components + */ +export const elementComponentMap = { + [PANEL_ELEMENT_NAME]: ReactPanel, + [ROW_ELEMENT_NAME]: Row, + [COLUMN_ELEMENT_NAME]: Column, + [FRAGMENT_ELEMENT_NAME]: React.Fragment, + [STACK_ELEMENT_NAME]: Stack, + [DASHBOARD_ELEMENT_NAME]: Dashboard, + [ITEM_ELEMENT_NAME]: Item, + [PICKER_ELEMENT_NAME]: Picker, + [SECTION_ELEMENT_NAME]: Section, + [UITABLE_ELEMENT_TYPE]: UITable, +} as const; + +export function getComponentTypeForElement

>( + element: ElementNode +): ComponentType

| null { + return (elementComponentMap[ + element[ELEMENT_KEY] as keyof typeof elementComponentMap + ] ?? null) as ComponentType

| null; +} export function getComponentForElement(element: ElementNode): React.ReactNode { - // Need to convert the children of the element if they are exported objects to an ObjectView - // Else React won't be able to render them - const newElement = { ...element }; - if (newElement.props?.children != null) { - const { children } = newElement.props; - if (Array.isArray(children)) { - const typeMap = new Map(); - newElement.props.children = children.map((child, i) => { - if (isExportedObject(child)) { - const { type } = child; - const typeCount = typeMap.get(type) ?? 0; - typeMap.set(type, typeCount + 1); - const key = `${type}-${typeCount}`; - return ; - } - return child; - }); - } else if (isExportedObject(children)) { - newElement.props.children = ; - } - } + const newElement = wrapElementChildren({ ...element }); + if (isHTMLElementNode(newElement)) { return HTMLElementView({ element: newElement }); } @@ -59,28 +73,33 @@ export function getComponentForElement(element: ElementNode): React.ReactNode { if (isIconElementNode(newElement)) { return IconElementView({ element: newElement }); } - if (isUITable(newElement)) { - return ; - } - if (isPanelElementNode(newElement)) { - return ; - } - if (isFragmentElementNode(newElement)) { - // eslint-disable-next-line react/jsx-no-useless-fragment - return <>{newElement.props?.children}; - } - if (isRowElementNode(newElement)) { - return ; - } - if (isColumnElementNode(newElement)) { - return ; - } - if (isStackElementNode(newElement)) { - return ; - } - if (isDashboardElementNode(newElement)) { - return ; + if (isElementNode(newElement)) { + const Component = getComponentTypeForElement(newElement); + + if (Component != null) { + return ; + } } return newElement.props?.children; } + +/** Data keys of a widget to preserve across re-opening. */ +const PRESERVED_DATA_KEYS: (keyof ReadonlyWidgetData)[] = ['panelIds']; +const PRESERVED_DATA_KEYS_SET = new Set(PRESERVED_DATA_KEYS); + +/** + * Returns an object with only the data preserved that should be preserved when re-opening a widget (e.g. opening it again from console). + * For example, if you re-open a widget, you want to keep the `panelIds` data because that will re-open the widget to where it was before. + * However, we do _not_ want to preserve the `state` in this case - we want to widget to start from a fresh state. + * Similar to how when you re-open a table, it'll open in the same spot, but all UI applied filters/operations will be reset. + * @param oldData The old data to get the preserved data from + * @returns The data to preserve + */ +export function getPreservedData( + oldData: ReadonlyWidgetData = {} +): ReadonlyWidgetData { + return Object.fromEntries( + Object.entries(oldData).filter(([key]) => PRESERVED_DATA_KEYS_SET.has(key)) + ); +} diff --git a/plugins/ui/test/deephaven/ui/test_hooks.py b/plugins/ui/test/deephaven/ui/test_hooks.py index 3fdc94a8c..dce874bb1 100644 --- a/plugins/ui/test/deephaven/ui/test_hooks.py +++ b/plugins/ui/test/deephaven/ui/test_hooks.py @@ -140,6 +140,12 @@ def _test_memo(fn=lambda: "foo", a=1, b=2): self.assertEqual(result, "biz") self.assertEqual(mock.call_count, 1) + def _test_memo_set(fn=lambda: "foo"): + return use_memo(fn, {}) + + # passing in a non-list/tuple for dependencies should raise a TypeError + self.assertRaises(TypeError, render_hook, _test_memo_set) + def verify_table_updated(self, table_writer, table, update): from deephaven.ui.hooks import use_table_listener from deephaven.table_listener import TableUpdate @@ -151,7 +157,7 @@ def listener(update: TableUpdate, is_replay: bool) -> None: event.set() def _test_table_listener(replayed_table_val=table, listener_val=listener): - use_table_listener(replayed_table_val, listener_val) + use_table_listener(replayed_table_val, listener_val, []) render_hook(_test_table_listener) @@ -171,7 +177,7 @@ def listener(update: TableUpdate, is_replay: bool) -> None: event.set() def _test_table_listener(replay_table=table, listener_val=listener): - use_table_listener(replay_table, listener_val, do_replay=True) + use_table_listener(replay_table, listener_val, [], do_replay=True) render_hook(_test_table_listener) @@ -595,7 +601,7 @@ def _test_reused_tables(): a, set_a = use_state(lambda: table.where("X=1")) # When "a" changes, recompute table - don't return or otherwise track this table w.r.t. liveness - replace_a = use_liveness_scope(lambda: set_a(table.where("X=2"))) + replace_a = use_liveness_scope(lambda: set_a(table.where("X=2")), []) return a.size @@ -664,7 +670,7 @@ def helper(): now = dh_now() return table.where("Timestamp > now").last_by(by=["X"]) - local_rows = use_memo(helper, {a}) + local_rows = use_memo(helper, [a]) return local_rows.size diff --git a/plugins/ui/test/deephaven/ui/test_render.py b/plugins/ui/test/deephaven/ui/test_render.py index ef544a23b..1992b4e82 100644 --- a/plugins/ui/test/deephaven/ui/test_render.py +++ b/plugins/ui/test/deephaven/ui/test_render.py @@ -119,3 +119,134 @@ def test_context(self): self.assertEqual(child_context1.get_state(0), 3) # Shouldn't have triggered a change self.assertEqual(on_change.call_count, 2) + + +class RenderExportTestCase(BaseTestCase): + def test_export_empty_context(self): + from deephaven.ui._internal.RenderContext import RenderContext + + rc = make_render_context() + + with rc.open(): + pass + + state = rc.export_state() + self.assertEqual(state, {}) + + def test_export_basic_state(self): + from deephaven.ui._internal.RenderContext import RenderContext + + rc = make_render_context() + + with rc.open(): + rc.init_state(0, 1) + rc.init_state(1, 2) + rc.init_state(2, 3) + + state = rc.export_state() + self.assertEqual(state, {"state": {0: 1, 1: 2, 2: 3}}) + + def test_export_nested_state(self): + from deephaven.ui._internal.RenderContext import RenderContext + + rc = make_render_context() + + with rc.open(): + rc.init_state(0, 1) + child_context0 = rc.get_child_context(0) + with child_context0.open(): + child_context0.init_state(0, 2) + child_context0.init_state(1, 3) + child_context1 = child_context0.get_child_context(0) + with child_context1.open(): + child_context1.init_state(0, 4) + child_context1.init_state(1, 5) + + state = rc.export_state() + self.assertEqual( + state, + { + "state": {0: 1}, + "children": { + 0: {"state": {0: 2, 1: 3}, "children": {0: {"state": {0: 4, 1: 5}}}} + }, + }, + ) + + def test_ignore_empty_state(self): + from deephaven.ui._internal.RenderContext import RenderContext + + rc = make_render_context() + + with rc.open(): + rc.init_state(0, 1) + rc.init_state(1, 2) + rc.init_state(2, 3) + rc.set_state(0, None) + rc.set_state(1, None) + rc.set_state(2, None) + + child_context0 = rc.get_child_context(0) + with child_context0.open(): + child_context1 = child_context0.get_child_context(0) + with child_context1.open(): + child_context1.init_state(0, None) + + state = rc.export_state() + self.assertEqual(state, {}) + + +class RenderImportTestCase(BaseTestCase): + def test_import_empty_context(self): + from deephaven.ui._internal.RenderContext import RenderContext + + on_change = Mock(side_effect=lambda x: x()) + rc = make_render_context(on_change) + + # Empty context should reset the state if there was one + with rc.open(): + rc.init_state(0, 2) + self.assertEqual(rc.has_state(0), True) + self.assertEqual(rc.get_state(0), 2) + + state = {} + rc.import_state(state) + with rc.open(): + self.assertEqual(rc.has_state(0), False) + + def test_import_basic_state(self): + from deephaven.ui._internal.RenderContext import RenderContext + + rc = make_render_context() + state = {"state": {0: 3}} + rc.import_state(state) + with rc.open(): + self.assertEqual(rc.has_state(0), True) + self.assertEqual(rc.get_state(0), 3) + + def test_import_nested_state(self): + from deephaven.ui._internal.RenderContext import RenderContext + + rc = make_render_context() + state = { + "state": {0: 1}, + "children": { + 0: {"state": {0: 2, 1: 3}, "children": {0: {"state": {0: 4, 1: 5}}}} + }, + } + rc.import_state(state) + with rc.open(): + self.assertEqual(rc.has_state(0), True) + self.assertEqual(rc.get_state(0), 1) + child_context0 = rc.get_child_context(0) + with child_context0.open(): + self.assertEqual(child_context0.has_state(0), True) + self.assertEqual(child_context0.get_state(0), 2) + self.assertEqual(child_context0.has_state(1), True) + self.assertEqual(child_context0.get_state(1), 3) + child_context1 = child_context0.get_child_context(0) + with child_context1.open(): + self.assertEqual(child_context1.has_state(0), True) + self.assertEqual(child_context1.get_state(0), 4) + self.assertEqual(child_context1.has_state(1), True) + self.assertEqual(child_context1.get_state(1), 5) diff --git a/plugins/ui/test/deephaven/ui/test_ui_table.py b/plugins/ui/test/deephaven/ui/test_ui_table.py index 7311d3840..d832bf243 100644 --- a/plugins/ui/test/deephaven/ui/test_ui_table.py +++ b/plugins/ui/test/deephaven/ui/test_ui_table.py @@ -34,7 +34,7 @@ def test_on_row_double_press(self): def callback(row): pass - t = ui.table(self.source).on_row_double_press(callback) + t = ui.table(self.source, on_row_double_press=callback) self.expect_render( t, diff --git a/plugins/utilities/.gitignore b/plugins/utilities/.gitignore new file mode 100644 index 000000000..3356dc1ce --- /dev/null +++ b/plugins/utilities/.gitignore @@ -0,0 +1,8 @@ +build/ +dist/ +.venv/ +/venv +*.egg-info/ +.idea +.DS_store +__pycache__/ \ No newline at end of file diff --git a/plugins/utilities/LICENSE b/plugins/utilities/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/plugins/utilities/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/plugins/utilities/README.md b/plugins/utilities/README.md new file mode 100644 index 000000000..48f8ac1c0 --- /dev/null +++ b/plugins/utilities/README.md @@ -0,0 +1,27 @@ +# Deephaven Plugin Utilities + +This is a Python package that stores cross-plugin utilities for building Deephaven plugins. +If the functions are only used during the build process, they should be added to `packaging` instead. +This is not a plugin on its own. + +## Build + +To create your build / development environment (skip the first two lines if you already have a venv): + +```sh +python -m venv .venv +source .venv/bin/activate +pip install --upgrade pip setuptools +pip install build deephaven-plugin +``` + +To build: + +```sh +python -m build --wheel +``` + +The wheel is stored in `dist/`. + +To test within [deephaven-core](https://github.com/deephaven/deephaven-core), note where this wheel is stored (using `pwd`, for example). +Then, follow the directions in the top-level README.md to install the wheel into your Deephaven environment. diff --git a/plugins/utilities/pyproject.toml b/plugins/utilities/pyproject.toml new file mode 100644 index 000000000..62df2b006 --- /dev/null +++ b/plugins/utilities/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools>=43.0.0", "wheel"] +build-backend = "setuptools.build_meta" diff --git a/plugins/utilities/setup.cfg b/plugins/utilities/setup.cfg new file mode 100644 index 000000000..78b1efcd4 --- /dev/null +++ b/plugins/utilities/setup.cfg @@ -0,0 +1,31 @@ +[metadata] +name = deephaven-plugin-utilities +description = Deephaven Plugin Utilities +long_description = file: README.md +long_description_content_type = text/markdown +version = 0.0.1.dev0 +url = https://github.com/deephaven/deephaven-plugins +project_urls = + Source Code = https://github.com/deephaven/deephaven-plugins + Bug Tracker = https://github.com/deephaven/deephaven-plugins/issues +classifiers = + Programming Language :: Python :: 3 + License :: OSI Approved :: Apache Software License + Operating System :: OS Independent + Environment :: Plugins + Development Status :: 3 - Alpha +keywords = deephaven, plugin, utilities +author = Joe Numainville +author_email = josephnumainville@deephaven.io +platforms = any + +[options] +package_dir= + =src +packages=find_namespace: +install_requires = + deephaven-plugin>=0.6.0 +include_package_data = True + +[options.packages.find] +where=src diff --git a/plugins/utilities/src/deephaven/plugin/utilities/__init__.py b/plugins/utilities/src/deephaven/plugin/utilities/__init__.py new file mode 100644 index 000000000..1b2cca4e7 --- /dev/null +++ b/plugins/utilities/src/deephaven/plugin/utilities/__init__.py @@ -0,0 +1,2 @@ +from .utils import * +from .dhe_safe_callback_wrapper import * diff --git a/plugins/utilities/src/deephaven/plugin/utilities/dhe_safe_callback_wrapper.py b/plugins/utilities/src/deephaven/plugin/utilities/dhe_safe_callback_wrapper.py new file mode 100644 index 000000000..21c9034e8 --- /dev/null +++ b/plugins/utilities/src/deephaven/plugin/utilities/dhe_safe_callback_wrapper.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +from typing import Type +import logging +from deephaven.plugin import Callback, Plugin +from deephaven.plugin.js import JsPlugin +from .utils import is_enterprise_environment + +logger = logging.getLogger(__name__) + +__all__ = ["DheSafeCallbackWrapper"] + + +class DheSafeCallbackWrapper(Callback): + """ + + A wrapper around the Callback class that provides a safe way to register plugins. + + """ + + def __init__(self, callback: Callback): + self._callback = callback + + def register(self, plugin: Plugin | Type[Plugin]) -> None: + """ + Register a plugin with the provided callback + + Args: + plugin: The plugin to register + + """ + if isinstance(plugin, JsPlugin) or ( + isinstance(plugin, type) and issubclass(plugin, JsPlugin) + ): + self._register_js(plugin) + else: + self._callback.register(plugin) + + def _register_js(self, js_plugin: JsPlugin | Type[JsPlugin]) -> None: + """ + Attempt to register a JS plugin. + If failed and enterprise is detected, a debug message will be logged. + If failed and enterprise is not detected, an exception will be raised. + + Args: + js_plugin: + The JS plugin to register + """ + try: + self._callback.register(js_plugin) + except RuntimeError as e: + if is_enterprise_environment(): + logger.debug( + f"Failed to register {js_plugin} embedded in Python plugin. Skipping." + ) + else: + raise RuntimeError( + f"Failed to register {js_plugin} embedded in Python plugin: {e}" + ) diff --git a/plugins/utilities/src/deephaven/plugin/utilities/utils.py b/plugins/utilities/src/deephaven/plugin/utilities/utils.py new file mode 100644 index 000000000..62bbe0a0f --- /dev/null +++ b/plugins/utilities/src/deephaven/plugin/utilities/utils.py @@ -0,0 +1,109 @@ +import abc +import logging +from functools import partial +from typing import Callable, ContextManager +import importlib.resources +import json +import pathlib +import sys +from deephaven.plugin.js import JsPlugin + +logger = logging.getLogger(__name__) + +__all__ = ["is_enterprise_environment", "create_js_plugin"] + + +def is_enterprise_environment() -> bool: + """ + Check if the environment is an enterprise environment. + + Returns: + True if the environment is an enterprise environment, False otherwise + """ + # TODO: better implementation after https://deephaven.atlassian.net/browse/DH-16573 + return any("coreplus" in path or "dnd" in path for path in sys.path) + + +def _create_from_npm_package_json( + path_provider: Callable[[], ContextManager[pathlib.Path]], plugin_class: abc.ABCMeta +) -> JsPlugin: + """ + Create a JsPlugin from an npm package.json file. + + Args: + path_provider: + A function that returns a context manager that provides a pathlib.Path to the package.json file + plugin_class: + The class to create. It must be a subclass of JsPlugin. + """ + with path_provider() as tmp_js_path: + js_path = tmp_js_path + if not js_path.exists(): + raise Exception( + f"Package is not installed in a normal python filesystem, '{js_path}' does not exist" + ) + with (js_path / "package.json").open("rb") as f: + package_json = json.load(f) + return plugin_class( + package_json["name"], + package_json["version"], + package_json["main"], + js_path, + ) + + +def _resource_js_path_provider( + package_namespace: str, js_name: str +) -> Callable[[], ContextManager[pathlib.Path]]: + """ + Get the path to a resource in a package. + + Args: + package_namespace: + The package namespace + js_name: + The resource name + """ + return partial(_resource_js_path, package_namespace, js_name) + + +def _resource_js_path( + package_namespace: str, js_name: str +) -> ContextManager[pathlib.Path]: + """ + Get the path to a resource in a package. + + Args: + package_namespace: + The package namespace + js_name: + The resource name + """ + + if sys.version_info < (3, 9): + return importlib.resources.path(package_namespace, js_name) + else: + return importlib.resources.as_file( + importlib.resources.files(package_namespace).joinpath(js_name) + ) + + +def create_js_plugin( + package_namespace: str, js_name: str, plugin_class: abc.ABCMeta +) -> JsPlugin: + """ + Create a JsPlugin from an npm package.json file. + + Args: + package_namespace: + The package namespace + js_name: + The resource name + plugin_class: + The class to create. It must be a subclass of JsPlugin. + + Returns: + The created JsPlugin + """ + js_path = _resource_js_path_provider(package_namespace, js_name) + return _create_from_npm_package_json(js_path, plugin_class) diff --git a/tests/Dockerfile b/tests/Dockerfile new file mode 100644 index 000000000..ce77733aa --- /dev/null +++ b/tests/Dockerfile @@ -0,0 +1,9 @@ +# syntax=docker/dockerfile:1 + +# Dockerfile for running and updating snapshots locally and on CI +FROM mcr.microsoft.com/playwright:v1.41.2-jammy AS playwright +WORKDIR /work/ + +RUN npm install @playwright/test@1.41.2 +COPY playwright.config.ts . +COPY playwright-docker.config.ts . diff --git a/tests/app.d/express.py b/tests/app.d/express.py new file mode 100644 index 000000000..6d46099a5 --- /dev/null +++ b/tests/app.d/express.py @@ -0,0 +1,14 @@ +from deephaven.column import int_col, string_col +from deephaven import new_table +import deephaven.plot.express as dx +import plotly.express as px + +express_source = new_table( + [ + string_col("Categories", ["A", "B", "C"]), + int_col("Values", [1, 3, 5]), + ] +) +express_fig = dx.bar(table=express_source, x="Categories", y="Values") + +plotly_fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16]) diff --git a/tests/app.d/matplotlib.py b/tests/app.d/matplotlib.py new file mode 100644 index 000000000..8617ed23d --- /dev/null +++ b/tests/app.d/matplotlib.py @@ -0,0 +1,5 @@ +import matplotlib.pyplot as plt + +matplotlib_fig = plt.figure() +ax = matplotlib_fig.subplots() +ax.plot([1, 2, 3, 4], [4, 2, 6, 7]) diff --git a/tests/app.d/tests.app b/tests/app.d/tests.app new file mode 100644 index 000000000..43694c37f --- /dev/null +++ b/tests/app.d/tests.app @@ -0,0 +1,8 @@ +type=script +scriptType=python +enabled=true +id=web.test +name=Plugins Test Application +file_0=express.py +file_1=matplotlib.py +file_2=ui.py diff --git a/tests/app.d/ui.py b/tests/app.d/ui.py new file mode 100644 index 000000000..30eb89f1d --- /dev/null +++ b/tests/app.d/ui.py @@ -0,0 +1,20 @@ +import deephaven.ui as ui +from deephaven.ui import use_state + + +@ui.component +def my_component(): + count, set_count = use_state(0) + text, set_text = use_state("hello") + + return ui.flex( + ui.action_button( + f"You pressed me {count} times", on_press=lambda _: set_count(count + 1) + ), + ui.text_field(value=text, on_change=set_text), + ui.text(f"You typed {text}"), + direction="column", + ) + + +ui_component = my_component() diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml new file mode 100644 index 000000000..7d9f728f1 --- /dev/null +++ b/tests/docker-compose.yml @@ -0,0 +1,39 @@ +version: '3' + +services: + deephaven-plugins: + container_name: deephaven-plugins + build: + context: ../ + dockerfile: ./Dockerfile + expose: + - 10000 + volumes: + - ../docker/data/:/data + - ../tests/app.d:/app.d + environment: + - START_OPTS=-Xmx4g -DAuthHandlers=io.deephaven.auth.AnonymousAuthenticationHandler -Ddeephaven.console.type=python -Ddeephaven.application.dir=./app.d + + e2e-tests: + build: + context: ../ + dockerfile: ./tests/Dockerfile + ports: + - '9323:9323' + ipc: host + volumes: + - ../tests:/work/tests + - ../test-results:/work/test-results + - ../playwright-report:/work/playwright-report + entrypoint: "npx playwright test --config=playwright-docker.config.ts" + depends_on: + deephaven-plugins: + condition: service_healthy + + update-snapshots: + extends: + service: e2e-tests + entrypoint: 'npx playwright test --config=playwright-docker.config.ts --update-snapshots' + depends_on: + deephaven-plugins: + condition: service_healthy diff --git a/tests/express.spec.ts b/tests/express.spec.ts new file mode 100644 index 000000000..2fbadfeae --- /dev/null +++ b/tests/express.spec.ts @@ -0,0 +1,14 @@ +import { expect, test } from '@playwright/test'; +import { openPanel, gotoPage } from './utils'; + +test('Express loads', async ({ page }) => { + await gotoPage(page, ''); + await openPanel(page, 'express_fig', '.js-plotly-plot'); + await expect(page.locator('.iris-chart-panel')).toHaveScreenshot(); +}); + +test('Plotly loads', async ({ page }) => { + await gotoPage(page, ''); + await openPanel(page, 'plotly_fig', '.js-plotly-plot'); + await expect(page.locator('.iris-chart-panel')).toHaveScreenshot(); +}); \ No newline at end of file diff --git a/tests/express.spec.ts-snapshots/Express-loads-1-chromium-linux.png b/tests/express.spec.ts-snapshots/Express-loads-1-chromium-linux.png new file mode 100644 index 000000000..11a9903c2 Binary files /dev/null and b/tests/express.spec.ts-snapshots/Express-loads-1-chromium-linux.png differ diff --git a/tests/express.spec.ts-snapshots/Express-loads-1-firefox-linux.png b/tests/express.spec.ts-snapshots/Express-loads-1-firefox-linux.png new file mode 100644 index 000000000..3947384a9 Binary files /dev/null and b/tests/express.spec.ts-snapshots/Express-loads-1-firefox-linux.png differ diff --git a/tests/express.spec.ts-snapshots/Express-loads-1-webkit-linux.png b/tests/express.spec.ts-snapshots/Express-loads-1-webkit-linux.png new file mode 100644 index 000000000..e60915a1b Binary files /dev/null and b/tests/express.spec.ts-snapshots/Express-loads-1-webkit-linux.png differ diff --git a/tests/express.spec.ts-snapshots/Plotly-loads-1-chromium-linux.png b/tests/express.spec.ts-snapshots/Plotly-loads-1-chromium-linux.png new file mode 100644 index 000000000..bc6a3bf83 Binary files /dev/null and b/tests/express.spec.ts-snapshots/Plotly-loads-1-chromium-linux.png differ diff --git a/tests/express.spec.ts-snapshots/Plotly-loads-1-firefox-linux.png b/tests/express.spec.ts-snapshots/Plotly-loads-1-firefox-linux.png new file mode 100644 index 000000000..6a6fd892c Binary files /dev/null and b/tests/express.spec.ts-snapshots/Plotly-loads-1-firefox-linux.png differ diff --git a/tests/express.spec.ts-snapshots/Plotly-loads-1-webkit-linux.png b/tests/express.spec.ts-snapshots/Plotly-loads-1-webkit-linux.png new file mode 100644 index 000000000..bc49757c3 Binary files /dev/null and b/tests/express.spec.ts-snapshots/Plotly-loads-1-webkit-linux.png differ diff --git a/tests/matplotlib.spec.ts b/tests/matplotlib.spec.ts new file mode 100644 index 000000000..335a97ebd --- /dev/null +++ b/tests/matplotlib.spec.ts @@ -0,0 +1,10 @@ +import { expect, test } from '@playwright/test'; +import { openPanel, gotoPage } from './utils'; + +test('Matplotlib loads', async ({ page }) => { + await gotoPage(page, ''); + await openPanel(page, 'matplotlib_fig', '.matplotlib-view'); + await expect( + page.getByRole('img', { name: 'Matplotlib render' }) + ).toHaveScreenshot(); +}); diff --git a/tests/matplotlib.spec.ts-snapshots/Matplotlib-loads-1-chromium-linux.png b/tests/matplotlib.spec.ts-snapshots/Matplotlib-loads-1-chromium-linux.png new file mode 100644 index 000000000..55cb9766a Binary files /dev/null and b/tests/matplotlib.spec.ts-snapshots/Matplotlib-loads-1-chromium-linux.png differ diff --git a/tests/matplotlib.spec.ts-snapshots/Matplotlib-loads-1-firefox-linux.png b/tests/matplotlib.spec.ts-snapshots/Matplotlib-loads-1-firefox-linux.png new file mode 100644 index 000000000..128337c76 Binary files /dev/null and b/tests/matplotlib.spec.ts-snapshots/Matplotlib-loads-1-firefox-linux.png differ diff --git a/tests/matplotlib.spec.ts-snapshots/Matplotlib-loads-1-webkit-linux.png b/tests/matplotlib.spec.ts-snapshots/Matplotlib-loads-1-webkit-linux.png new file mode 100644 index 000000000..3f0bfee77 Binary files /dev/null and b/tests/matplotlib.spec.ts-snapshots/Matplotlib-loads-1-webkit-linux.png differ diff --git a/tests/ui.spec.ts b/tests/ui.spec.ts new file mode 100644 index 000000000..ddc2897ff --- /dev/null +++ b/tests/ui.spec.ts @@ -0,0 +1,8 @@ +import { expect, test } from '@playwright/test'; +import { openPanel, gotoPage } from './utils'; + +test('UI loads', async ({ page }) => { + await gotoPage(page, ''); + await openPanel(page, 'ui_component', '.ui-portal-panel'); + await expect(page.locator('.ui-portal-panel')).toHaveScreenshot(); +}); diff --git a/tests/ui.spec.ts-snapshots/UI-loads-1-chromium-linux.png b/tests/ui.spec.ts-snapshots/UI-loads-1-chromium-linux.png new file mode 100644 index 000000000..30c17ce6c Binary files /dev/null and b/tests/ui.spec.ts-snapshots/UI-loads-1-chromium-linux.png differ diff --git a/tests/ui.spec.ts-snapshots/UI-loads-1-firefox-linux.png b/tests/ui.spec.ts-snapshots/UI-loads-1-firefox-linux.png new file mode 100644 index 000000000..a6bf6f6df Binary files /dev/null and b/tests/ui.spec.ts-snapshots/UI-loads-1-firefox-linux.png differ diff --git a/tests/ui.spec.ts-snapshots/UI-loads-1-webkit-linux.png b/tests/ui.spec.ts-snapshots/UI-loads-1-webkit-linux.png new file mode 100644 index 000000000..183a38341 Binary files /dev/null and b/tests/ui.spec.ts-snapshots/UI-loads-1-webkit-linux.png differ diff --git a/tests/utils.ts b/tests/utils.ts new file mode 100644 index 000000000..579e27f4a --- /dev/null +++ b/tests/utils.ts @@ -0,0 +1,57 @@ +import test, { Page, expect } from '@playwright/test'; + +/** + * Goes to a page and waits for the progress bar to disappear + * @param page The page + * @param url The URL to navigate to + * @param options Options for navigation + */ +export async function gotoPage( + page: Page, + url: string, + options?: { + referer?: string; + timeout?: number; + waitUntil?: 'load' | 'domcontentloaded' | 'networkidle' | 'commit'; + } +): Promise { + await test.step(`Go to page (${url})`, async () => { + await page.goto(url, options); + await expect( + page.getByRole('progressbar', { name: 'Loading...', exact: true }) + ).not.toBeVisible(); + }); +} + +/** + * Opens a panel by clicking on the Panels button and then the panel button + * @param page The page + * @param name The name of the panel + * @param panelLocator The locator for the panel, passed to `page.locator` + */ +export async function openPanel( + page: Page, + name: string, + panelLocator = '.dh-panel' +) { + await test.step(`Open panel (${name})`, async () => { + const panelCount = await page.locator(panelLocator).count(); + + // open app panels menu + const appPanels = page.getByRole('button', { + name: 'Panels', + exact: true, + }); + await expect(appPanels).toBeEnabled(); + await appPanels.click(); + + // open panel + const targetPanel = page.getByRole('button', { name, exact: true }); + expect(targetPanel).toBeEnabled(); + await targetPanel.click(); + + // check for panel to be loaded + await expect(page.locator(panelLocator)).toHaveCount(panelCount + 1); + await expect(page.locator('.loading-spinner')).toHaveCount(0); + }); +} diff --git a/tools/run_docker.sh b/tools/run_docker.sh new file mode 100755 index 000000000..f930b0295 --- /dev/null +++ b/tools/run_docker.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Set pwd to this directory +pushd "$(dirname "$0")" + +# Start the containers +if [[ -z "${CI}" ]]; then + docker compose -f ../tests/docker-compose.yml run --service-ports --rm --build "$@" + exit_code=$? + docker compose -f ../tests/docker-compose.yml down +else + docker compose -f ../tests/docker-compose.yml run --service-ports --rm --build -e CI=true "$@" + exit_code=$? + # stop instead of down to preserve container logs + docker compose -f ../tests/docker-compose.yml stop deephaven-plugins +fi + +# Reset pwd +popd +exit $exit_code diff --git a/tools/update-dh-packages.mjs b/tools/update-dh-packages.mjs new file mode 100644 index 000000000..a7c1b5bef --- /dev/null +++ b/tools/update-dh-packages.mjs @@ -0,0 +1,79 @@ +/** + * Update all Deephaven Community packages to the latest version. + * + * This script is intended to be run from a script named "update-dh-packages" in + * the package.json of JS plugins. + * + * e.g. in `plugins/ui/src/js/package.json`: + * + * "scripts": { + * "update-dh-packages": "node ../../../../tools/update-dh-packages.mjs" + * } + * + * The script can then be run for all plugins from the root of the repo via: + * `npm run update-dh-packages`. + * + * Or for a specific plugin via: + * `npm run update-dh-packages -- --scope=@deephaven/js-plugin-ui` + * + * To target a specific version, pass the version as an argument: + * `npm run update-dh-packages -- --scope=@deephaven/js-plugin-ui -- 0.70.1-alpha-picker-table.34` + */ + +/* eslint-disable no-console */ +import { execSync } from 'child_process'; +import { promises as fs } from 'fs'; +import path from 'path'; +import process from 'process'; + +// Optional targetVersionOverride argument +const targetVersionOverride = process.argv[2]; +const targetVersionDefault = 'latest'; + +console.log('targetVersion:', { + default: targetVersionDefault, + override: targetVersionOverride, +}); + +// Read package.json to get dependency lists +const packageJsonPath = path.join(process.cwd(), 'package.json'); +const { dependencies = {}, devDependencies = {} } = JSON.parse( + String(await fs.readFile(packageJsonPath, 'utf8')) +); + +// Get distinct dh package names in the dependencies and devDependencies +const dhPackageNames = [ + ...new Set( + [...Object.keys(dependencies), ...Object.keys(devDependencies)].filter( + name => name.startsWith('@deephaven') + ) + ), +]; + +const dhPackageUpdates = new Map( + dhPackageNames.map(name => [ + name, + // If targetVersionOverride is set, use it for all packages except for + // `@deephaven/jsapi-types` since it has it's own versioning cadence. + targetVersionOverride == null || name === '@deephaven/jsapi-types' + ? targetVersionDefault + : targetVersionOverride, + ]) +); + +if (dhPackageNames.length === 0) { + console.log( + 'No @deephaven packages found in dependencies or devDependencies.' + ); + process.exit(0); +} + +console.log('Updating packages:', dhPackageUpdates); + +const cmd = `npm i --save ${[...dhPackageUpdates.entries()] + .map(([name, version]) => `${name}@${version}`) + .join(' ')}`; + +console.log(cmd); + +execSync(cmd, { stdio: 'inherit' }); diff --git a/tools/update_version.sh b/tools/update_version.sh index 3892a1873..8a5f00277 100755 --- a/tools/update_version.sh +++ b/tools/update_version.sh @@ -107,37 +107,17 @@ function update_file() { else sed -e "s/${prefix}.*/${expected}/g" -i "$ROOT_DIR/plugins/$file" fi - git add "$ROOT_DIR/plugins/$file" fi } extra= [ "$dev" = true ] && extra=".dev0" case "$package" in - auth-keycloak) - update_file auth-keycloak/src/js/package.json '"version": "' '",' + json | matplotlib | plotly | plotly-express | ui | utilities | packaging) + update_file "${package}/setup.cfg" 'version = ' '' "$extra" ;; - dashboard-object-viewer) - update_file dashboard-object-viewer/src/js/package.json '"version": "' '",' - ;; - json) - update_file json/src/deephaven/plugin/json/__init__.py '__version__ = "' '"' "$extra" - ;; - matplotlib) - update_file matplotlib/setup.cfg 'version = ' '' "$extra" - ;; - plotly) - update_file plotly/src/deephaven/plugin/plotly/__init__.py '__version__ = "' '"' "$extra" - ;; - plotly-express) - update_file plotly-express/setup.cfg 'version = ' '' "$extra" - ;; - table-example) - update_file table-example/src/js/package.json '"version": "' '",' - ;; - ui) - update_file ui/src/js/package.json '"version": "' '",' - update_file ui/src/deephaven/ui/__init__.py '__version__ = "' '"' "$extra" + auth-keycloak | dashboard-object-viewer | table-example) + # Packages that don't have any Python to publish, just ignore ;; *) { @@ -146,4 +126,23 @@ case "$package" in } esac +# We still need to bump these JS packages for Enterprise legacy reasons, even though they're packaged with Python +npm_version="${version}" +if [ "$dev" != true ]; then + case "$package" in + auth-keycloak | dashboard-object-viewer | matplotlib | plotly | plotly-express | table-example | ui) + # The working directory is already `plugins/`, so we just specify workspace as `src/js` and it does the right thing + npm version "$npm_version" --workspace=src/js + ;; + json | packaging | utilities) + # Packages that don't have any JS to publish, just ignore + ;; + *) + { + log_error "Unhandled JS plugin $package. You will need to add JS wiring in $SCRIPT_NAME" + exit 90 + } + esac +fi + log_info "Done updating $package version to $version${extra}" diff --git a/tsconfig.json b/tsconfig.json index 6a66086f6..cd20a0503 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,8 @@ "plugins/**/**.ts", "plugins/**/**.tsx", "plugins/**/**.js", - "plugins/**/**.jsx" + "plugins/**/**.jsx", + "tests/**/**.ts" ], "exclude": ["plugins/*/src/js/dist/**/*"], "watchOptions": {